[med-svn] [openmolar] 01/01: Imported Upstream version 0.5.5
Dmitry Smirnov
onlyjob at moszumanska.debian.org
Thu May 22 14:13:30 UTC 2014
This is an automated email from the git hooks/post-receive script.
onlyjob pushed a commit to branch upstream
in repository openmolar.
commit 552d9bb (upstream)
Author: Dmitry Smirnov <onlyjob at member.fsf.org>
Date: Thu May 22 13:17:13 2014
Imported Upstream version 0.5.5
---
.gitignore | 2 -
COPYING | 191 -
INSTALL.txt | 4 +-
LICENSE | 28 +
MANIFEST.in | 4 +-
README | 7 +-
TODO.txt | 1 +
bin/openmolar.1 | 18 +
build_scripts/Makefile | 211 +-
build_scripts/code_cleaner.py | 228 +
build_scripts/deb_maker.py | 158 -
.../debian_packaging/dh_python2/debian/changelog | 606 --
.../debian_packaging/dh_python2/debian/compat | 1 -
.../debian_packaging/dh_python2/debian/control | 18 -
.../debian_packaging/dh_python2/debian/copyright | 40 -
.../debian_packaging/dh_python2/debian/docs | 1 -
.../debian_packaging/dh_python2/debian/rules | 3 -
.../dh_python2/debian/source/format | 1 -
.../debian_packaging/py_central/debian/changelog | 555 --
.../debian_packaging/py_central/debian/compat | 1 -
.../debian_packaging/py_central/debian/control | 19 -
.../debian_packaging/py_central/debian/copyright | 40 -
.../debian_packaging/py_central/debian/docs | 1 -
.../debian_packaging/py_central/debian/files | 1 -
.../debian_packaging/py_central/debian/pycompat | 1 -
.../debian_packaging/py_central/debian/rules | 8 -
build_scripts/get_git_branch.py | 30 +-
build_scripts/get_version.py | 13 -
.../qt-designer => build_scripts}/om_pyuic4.py | 65 +-
build_scripts/update_messages.py | 53 +
build_scripts/version_name.py | 42 -
openmolar | 27 +-
openmolar.spec | 41 -
setup.py | 173 +-
src/openmolar/GPLv3.txt | 865 ++-
src/openmolar/__init__.py | 56 +-
src/openmolar/backports/__init__.py | 26 +-
src/openmolar/backports/ordered_dict.py | 24 +
src/openmolar/backports/printed_form.py | 65 +-
src/openmolar/connect.py | 66 +-
src/openmolar/createdemodatabase.py | 60 +-
src/openmolar/dbtools/__init__.py | 23 +
src/openmolar/dbtools/accounts.py | 31 +-
src/openmolar/dbtools/appointments.py | 395 +-
src/openmolar/dbtools/appt_prefs.py | 78 +-
src/openmolar/dbtools/brief_patient.py | 43 +-
src/openmolar/dbtools/calldurr.py | 33 +-
src/openmolar/dbtools/cashbook.py | 146 +-
src/openmolar/dbtools/courseHistory.py | 176 +-
src/openmolar/dbtools/day_class.py | 41 +-
src/openmolar/dbtools/daybook.py | 330 +-
src/openmolar/dbtools/daybookHistory.py | 143 +-
src/openmolar/dbtools/db_notes.py | 29 +-
src/openmolar/dbtools/db_patients.py | 33 +-
src/openmolar/dbtools/db_settings.py | 59 +-
src/openmolar/dbtools/distinct_statuses.py | 34 +-
src/openmolar/dbtools/docsimported.py | 56 +-
src/openmolar/dbtools/docsprinted.py | 51 +-
src/openmolar/dbtools/est_logger.py | 59 +-
src/openmolar/dbtools/estimate_synopsis.py | 36 +-
src/openmolar/dbtools/estimatesHistory.py | 42 +-
src/openmolar/dbtools/extend_books.py | 49 +-
src/openmolar/dbtools/families.py | 172 +
src/openmolar/dbtools/feescales.py | 70 +-
src/openmolar/dbtools/forum.py | 120 +-
src/openmolar/dbtools/memos.py | 36 +-
src/openmolar/dbtools/nhs_claims.py | 45 +-
src/openmolar/dbtools/patient_class.py | 421 +-
src/openmolar/dbtools/patient_write_changes.py | 243 +-
src/openmolar/dbtools/paymentHistory.py | 157 +-
src/openmolar/dbtools/phrasebook.py | 41 +-
src/openmolar/dbtools/plan_data.py | 61 +-
src/openmolar/dbtools/queries.py | 28 +-
src/openmolar/dbtools/recall.py | 69 +-
src/openmolar/dbtools/schema_version.py | 36 +-
src/openmolar/dbtools/search.py | 85 +-
src/openmolar/dbtools/treatment_course.py | 110 +-
src/openmolar/dbtools/updateMH.py | 75 +-
src/openmolar/dbtools/writeNewCourse.py | 34 +-
src/openmolar/dbtools/writeNewPatient.py | 56 +-
src/openmolar/firstRun.py | 341 +-
src/openmolar/locale/de.po | 10 +-
src/openmolar/locale/en_GB.po | 2917 ++++---
src/openmolar/locale/messages.pot | 8140 ++++++++++++--------
src/openmolar/locale/update_messages.py | 37 -
src/openmolar/main.py | 200 +-
src/openmolar/ptModules/__init__.py | 23 +
src/openmolar/ptModules/debug_html.py | 55 +-
src/openmolar/ptModules/dec_perm.py | 85 +-
src/openmolar/ptModules/estimates.py | 85 +-
src/openmolar/ptModules/formatted_notes.py | 106 +-
src/openmolar/ptModules/hidden_notes.py | 43 +-
src/openmolar/ptModules/nhsDetails.py | 78 +-
src/openmolar/ptModules/notes.py | 451 +-
src/openmolar/ptModules/patientDetails.py | 104 +-
src/openmolar/ptModules/perio.py | 91 +-
src/openmolar/ptModules/plan.py | 136 +-
src/openmolar/ptModules/planDetails.py | 67 +-
src/openmolar/ptModules/reception_summary.py | 71 +-
src/openmolar/ptModules/referral.py | 159 +-
src/openmolar/ptModules/standardletter.py | 102 +-
src/openmolar/ptModules/tooth_history.py | 58 +-
src/openmolar/qt-designer/main.ui | 516 +-
src/openmolar/qt-designer/newSetup.ui | 1322 ++--
src/openmolar/qt-designer/saveDiscardCancel.ui | 122 -
src/openmolar/qt4gui/__init__.py | 23 +
.../qt4gui/appointment_gui_modules/__init__.py | 23 +-
.../clinician_select_model.py | 61 +-
.../appointment_gui_modules/draggable_list.py | 33 +-
.../qt4gui/appointment_gui_modules/list_models.py | 65 +-
.../appointment_gui_modules/pt_diary_treemodel.py | 95 +-
src/openmolar/qt4gui/charts/__init__.py | 23 +
src/openmolar/qt4gui/charts/charts_gui.py | 150 +-
src/openmolar/qt4gui/colours.py | 89 +-
.../compiled_uis/Ui_activeDentStartFinish.py | 9 +-
.../qt4gui/compiled_uis/Ui_addTreatment.py | 25 +-
.../qt4gui/compiled_uis/Ui_appointment_length.py | 24 +-
.../qt4gui/compiled_uis/Ui_apptOpenDay.py | 87 +-
src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py | 23 +-
src/openmolar/qt4gui/compiled_uis/Ui_apptWizard.py | 22 +-
.../qt4gui/compiled_uis/Ui_apptWizardItem.py | 13 +-
src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py | 44 +-
src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py | 48 +-
.../qt4gui/compiled_uis/Ui_block_wizard.py | 58 +-
.../qt4gui/compiled_uis/Ui_bridge_denture.py | 30 +-
.../qt4gui/compiled_uis/Ui_bulkmail_options.py | 34 +-
.../qt4gui/compiled_uis/Ui_choose_clinicians.py | 13 +-
.../qt4gui/compiled_uis/Ui_choose_language.py | 39 +-
.../qt4gui/compiled_uis/Ui_choose_tooth.py | 19 +-
.../qt4gui/compiled_uis/Ui_codeChecker.py | 20 +-
.../qt4gui/compiled_uis/Ui_completionDate.py | 33 +-
.../qt4gui/compiled_uis/Ui_customTreatment.py | 40 +-
.../qt4gui/compiled_uis/Ui_daylist_print.py | 65 +-
.../qt4gui/compiled_uis/Ui_diary_widget.py | 309 +-
src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py | 19 +-
.../qt4gui/compiled_uis/Ui_enter_letter_text.py | 19 +-
.../qt4gui/compiled_uis/Ui_exam_wizard.py | 22 +-
.../qt4gui/compiled_uis/Ui_finalise_appt_time.py | 25 +-
src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py | 31 +-
.../qt4gui/compiled_uis/Ui_hygenist_wizard.py | 40 +-
src/openmolar/qt4gui/compiled_uis/Ui_initialise.py | 93 +-
src/openmolar/qt4gui/compiled_uis/Ui_main.py | 2384 ++++--
src/openmolar/qt4gui/compiled_uis/Ui_medhist.py | 73 +-
src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py | 10 +-
src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py | 23 +-
src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py | 25 +-
src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py | 342 +-
.../qt4gui/compiled_uis/Ui_ortho_ref_wizard.py | 69 +-
.../qt4gui/compiled_uis/Ui_patient_diary.py | 148 +-
.../qt4gui/compiled_uis/Ui_patient_finder.py | 81 +-
src/openmolar/qt4gui/compiled_uis/Ui_payments.py | 69 +-
.../qt4gui/compiled_uis/Ui_permissions.py | 18 +-
.../qt4gui/compiled_uis/Ui_quick_daylist_print.py | 16 +-
.../qt4gui/compiled_uis/Ui_record_tools.py | 166 +-
.../qt4gui/compiled_uis/Ui_saveDiscardCancel.py | 82 -
src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py | 34 +-
.../qt4gui/compiled_uis/Ui_select_patient.py | 19 +-
src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py | 16 +-
.../qt4gui/compiled_uis/Ui_specify_appointment.py | 60 +-
.../qt4gui/compiled_uis/Ui_staff_diary.py | 49 +-
.../qt4gui/compiled_uis/Ui_startscreen.py | 57 +-
.../qt4gui/compiled_uis/Ui_surgeryNumber.py | 27 +-
.../qt4gui/compiled_uis/Ui_toothPerioProps.py | 40 +-
src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py | 51 +-
.../qt4gui/compiled_uis/Ui_toothprops_full_edit.py | 16 +-
.../qt4gui/compiled_uis/Ui_treatmentItemWidget.py | 13 +-
src/openmolar/qt4gui/compiled_uis/__init__.py | 2 +
src/openmolar/qt4gui/contract_gui_module.py | 65 +-
src/openmolar/qt4gui/customwidgets/__init__.py | 23 +
.../customwidgets/appointment_overviewwidget.py | 360 +-
.../qt4gui/customwidgets/appointmentwidget.py | 438 +-
src/openmolar/qt4gui/customwidgets/aptOVcontrol.py | 82 +-
src/openmolar/qt4gui/customwidgets/calendars.py | 626 +-
src/openmolar/qt4gui/customwidgets/chainLabel.py | 51 +-
src/openmolar/qt4gui/customwidgets/chartwidget.py | 488 +-
.../qt4gui/customwidgets/confirming_check_box.py | 65 +-
.../qt4gui/customwidgets/currency_label.py | 60 +-
.../qt4gui/customwidgets/dent_hyg_selector.py | 63 +-
.../qt4gui/customwidgets/diary_view_controller.py | 41 +-
.../qt4gui/customwidgets/estimate_item_widget.py | 130 +-
.../qt4gui/customwidgets/estimate_widget.py | 151 +-
.../qt4gui/customwidgets/fiveminutetimeedit.py | 48 +-
.../qt4gui/customwidgets/money_line_edit.py | 102 +-
.../qt4gui/customwidgets/notification_widget.py | 62 +-
.../qt4gui/customwidgets/perioChartWidget.py | 276 +-
.../qt4gui/customwidgets/perioToothProps.py | 298 +-
src/openmolar/qt4gui/customwidgets/resources_rc.py | 27 +-
.../qt4gui/customwidgets/schedule_control.py | 107 +-
.../qt4gui/customwidgets/simple_chartwidget.py | 87 +-
.../qt4gui/customwidgets/static_control_panel.py | 47 +-
src/openmolar/qt4gui/customwidgets/toothProps.py | 533 +-
.../qt4gui/customwidgets/upper_case_line_edit.py | 48 +-
src/openmolar/qt4gui/dialogs/__init__.py | 77 +
.../qt4gui/dialogs/account_severity_dialog.py | 71 +
.../qt4gui/dialogs/add_treatment_dialog.py | 42 +-
.../qt4gui/dialogs/address_match_dialog.py | 169 +-
.../qt4gui/dialogs/advanced_tx_planning_dialog.py | 74 +-
src/openmolar/qt4gui/dialogs/alterAday.py | 90 +-
.../qt4gui/dialogs/alter_cashbook_dialog.py | 91 +-
.../qt4gui/dialogs/alter_denture_dialog.py | 98 +-
src/openmolar/qt4gui/dialogs/alter_todays_notes.py | 69 +-
.../qt4gui/dialogs/appointment_card_dialog.py | 50 +-
src/openmolar/qt4gui/dialogs/apptOpenDay.py | 237 +-
src/openmolar/qt4gui/dialogs/appt_mode_dialog.py | 61 +-
src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py | 105 +-
src/openmolar/qt4gui/dialogs/appt_wizard_dialog.py | 74 +-
.../qt4gui/dialogs/assistant_select_dialog.py | 63 +-
.../qt4gui/dialogs/auto_address_dialog.py | 78 +-
src/openmolar/qt4gui/dialogs/base_dialogs.py | 64 +-
.../qt4gui/dialogs/begin_make_appt_dialog.py | 96 +-
src/openmolar/qt4gui/dialogs/block_wizard.py | 59 +-
src/openmolar/qt4gui/dialogs/blockslot.py | 82 +-
src/openmolar/qt4gui/dialogs/bridge_denture.py | 160 +-
src/openmolar/qt4gui/dialogs/bridge_dialog.py | 52 +-
.../qt4gui/dialogs/chart_tx_choice_dialog.py | 61 +-
src/openmolar/qt4gui/dialogs/child_smile_dialog.py | 165 +-
src/openmolar/qt4gui/dialogs/choose_clinicians.py | 31 +-
.../qt4gui/dialogs/choose_tooth_dialog.py | 32 +-
.../qt4gui/dialogs/clinician_select_dialog.py | 70 +-
.../qt4gui/dialogs/complete_treatment_dialog.py | 84 +-
.../qt4gui/dialogs/crown_choice_dialog.py | 69 +-
.../qt4gui/dialogs/daybook_edit_dialog.py | 128 +
.../qt4gui/dialogs/daybook_item_dialog.py | 184 +
src/openmolar/qt4gui/dialogs/denture_dialog.py | 50 +-
src/openmolar/qt4gui/dialogs/document_dialog.py | 86 +-
.../qt4gui/dialogs/duplicate_receipt_dialog.py | 69 +-
src/openmolar/qt4gui/dialogs/exam_wizard.py | 102 +-
.../qt4gui/dialogs/family_manage_dialog.py | 302 +-
src/openmolar/qt4gui/dialogs/finalise_appt_time.py | 83 +-
.../qt4gui/dialogs/find_patient_dialog.py | 76 +-
src/openmolar/qt4gui/dialogs/gp17_printdialog.py | 145 +-
src/openmolar/qt4gui/dialogs/hygTreatWizard.py | 67 +-
.../qt4gui/dialogs/implant_choice_dialog.py | 49 +-
src/openmolar/qt4gui/dialogs/medNotes.py | 106 -
src/openmolar/qt4gui/dialogs/med_notes_dialog.py | 145 +
src/openmolar/qt4gui/dialogs/newBPE.py | 78 +-
src/openmolar/qt4gui/dialogs/newCourse.py | 59 +-
src/openmolar/qt4gui/dialogs/new_bridge_dialog.py | 102 +-
src/openmolar/qt4gui/dialogs/new_denture_dialog.py | 86 +-
.../qt4gui/dialogs/nhs_forms_config_dialog.py | 83 +-
src/openmolar/qt4gui/dialogs/payment_dialog.py | 130 +-
src/openmolar/qt4gui/dialogs/permissions.py | 53 +-
src/openmolar/qt4gui/dialogs/post_choice_dialog.py | 56 +-
.../qt4gui/dialogs/print_record_dialog.py | 50 +-
src/openmolar/qt4gui/dialogs/recall_dialog.py | 59 +-
src/openmolar/qt4gui/dialogs/saveDiscardCancel.py | 98 -
src/openmolar/qt4gui/dialogs/saveMemo.py | 61 +-
.../qt4gui/dialogs/save_discard_cancel.py | 100 +
src/openmolar/qt4gui/dialogs/select_language.py | 99 +-
src/openmolar/qt4gui/dialogs/toothprop_fulledit.py | 66 +-
src/openmolar/qt4gui/diary_widget.py | 461 +-
src/openmolar/qt4gui/fees/__init__.py | 23 +
src/openmolar/qt4gui/fees/cashbook_module.py | 50 +-
src/openmolar/qt4gui/fees/course_module.py | 117 +-
src/openmolar/qt4gui/fees/daybook_module.py | 96 +-
src/openmolar/qt4gui/fees/fee_table_model.py | 78 +-
src/openmolar/qt4gui/fees/fees_module.py | 154 +-
src/openmolar/qt4gui/fees/feescale_tester.py | 60 +-
src/openmolar/qt4gui/fees/manipulate_plan.py | 485 +-
src/openmolar/qt4gui/fees/treatment_list_models.py | 57 +-
src/openmolar/qt4gui/feescale_editor/__init__.py | 24 +
.../feescale_editor/feescale_choice_dialog.py | 42 +-
.../feescale_compare_items_dockwidget.py | 49 +-
.../qt4gui/feescale_editor/feescale_diff_dialog.py | 85 +-
.../qt4gui/feescale_editor/feescale_editor.py | 171 +-
.../feescale_editor/feescale_input_dialogs.py | 64 +-
.../qt4gui/feescale_editor/feescale_list_model.py | 45 +-
.../qt4gui/feescale_editor/feescale_parser.py | 126 +-
.../qt4gui/feescale_editor/feescale_xml_editor.py | 52 +-
src/openmolar/qt4gui/forum_gui_module.py | 112 +-
src/openmolar/qt4gui/maingui.py | 1086 +--
src/openmolar/qt4gui/new_patient_gui.py | 141 +-
src/openmolar/qt4gui/phrasebook/__init__.py | 23 +
.../qt4gui/phrasebook/phrasebook_dialog.py | 120 +-
.../qt4gui/phrasebook/phrasebook_editor.py | 103 +-
.../qt4gui/phrasebook/phrasebook_model.py | 44 +-
src/openmolar/qt4gui/printing/__init__.py | 23 +
src/openmolar/qt4gui/printing/accountPrint.py | 218 +-
src/openmolar/qt4gui/printing/apptcardPrint.py | 65 +-
src/openmolar/qt4gui/printing/bookprint.py | 39 +-
src/openmolar/qt4gui/printing/bulk_mail.py | 181 +-
src/openmolar/qt4gui/printing/chartPrint.py | 33 +-
src/openmolar/qt4gui/printing/daylistprint.py | 159 +-
src/openmolar/qt4gui/printing/estimatePrint.py | 103 +-
src/openmolar/qt4gui/printing/gp17/__init__.py | 24 +
src/openmolar/qt4gui/printing/gp17/gp17_back.py | 179 +-
src/openmolar/qt4gui/printing/gp17/gp17_config.py | 74 +-
src/openmolar/qt4gui/printing/gp17/gp17_data.py | 178 +-
src/openmolar/qt4gui/printing/gp17/gp17_front.py | 345 +-
src/openmolar/qt4gui/printing/gp17/gp17_printer.py | 64 +-
src/openmolar/qt4gui/printing/gp17/gp17v1_back.py | 111 +-
src/openmolar/qt4gui/printing/gp17/gp17v1_front.py | 239 +-
src/openmolar/qt4gui/printing/letterprint.py | 38 +-
src/openmolar/qt4gui/printing/mh_print.py | 376 +-
src/openmolar/qt4gui/printing/multiDayListPrint.py | 193 +-
src/openmolar/qt4gui/printing/om_printing.py | 172 +-
src/openmolar/qt4gui/printing/recallprint.py | 108 +-
src/openmolar/qt4gui/printing/receiptPrint.py | 174 +-
src/openmolar/qt4gui/pt_diary_widget.py | 183 +-
src/openmolar/qt4gui/resources_rc.py | 886 ++-
src/openmolar/qt4gui/schema_updater.py | 139 +-
src/openmolar/qt4gui/tools/__init__.py | 23 +
src/openmolar/qt4gui/tools/apptTools.py | 113 +-
src/openmolar/qt4gui/tools/new_setup.py | 206 +-
src/openmolar/qt4gui/tools/recordtools.py | 105 +-
src/openmolar/resources/Makefile | 4 -
.../resources/feescales/feescale_schema.xsd | 8 +
src/openmolar/resources/icons/down.jpg | Bin 4318 -> 0 bytes
src/openmolar/resources/icons/expand.png | Bin 6439 -> 0 bytes
src/openmolar/resources/icons/pin.png | Bin 0 -> 10776 bytes
src/openmolar/resources/phrasebook/phrasebook.xsd | 9 +-
src/openmolar/resources/resources.qrc | 2 +-
src/openmolar/schema_upgrades/__init__.py | 22 +
.../schema_upgrades/formatted_notes1_9.py | 39 +-
src/openmolar/schema_upgrades/schema1_0to1_1.py | 98 +-
src/openmolar/schema_upgrades/schema1_1to1_2.py | 92 +-
src/openmolar/schema_upgrades/schema1_2to1_3.py | 83 +-
src/openmolar/schema_upgrades/schema1_3to1_4.py | 221 +-
src/openmolar/schema_upgrades/schema1_4to1_5.py | 105 +-
src/openmolar/schema_upgrades/schema1_5to1_6.py | 184 +-
src/openmolar/schema_upgrades/schema1_6to1_7.py | 416 +-
src/openmolar/schema_upgrades/schema1_7to1_8.py | 75 +-
src/openmolar/schema_upgrades/schema1_8to1_9.py | 66 +-
src/openmolar/schema_upgrades/schema1_9to2_0.py | 64 +-
src/openmolar/schema_upgrades/schema2_0to2_1.py | 160 +-
src/openmolar/schema_upgrades/schema2_1to2_2.py | 142 +-
src/openmolar/schema_upgrades/schema2_2to2_3.py | 78 +-
src/openmolar/schema_upgrades/schema2_3to2_4.py | 65 +-
src/openmolar/settings/__init__.py | 22 +
src/openmolar/settings/allowed.py | 207 +-
src/openmolar/settings/appointment_shortcuts.py | 45 +-
src/openmolar/settings/fee_tables.py | 230 +-
src/openmolar/settings/images.py | 38 +-
src/openmolar/settings/localsettings.py | 438 +-
src/openmolar/settings/urls.py | 47 +-
src/openmolar/settings/utilities.py | 36 +-
src/openmolar/settings/version.py | 72 +-
src/standalone_chart/lib_om_chart/__init__.py | 23 +
src/standalone_chart/lib_om_chart/chart_colours.py | 30 +-
src/standalone_chart/lib_om_chart/chart_widget.py | 441 +-
src/standalone_chart/lib_om_chart/config.py | 63 +-
src/standalone_chart/lib_om_chart/config_dialog.py | 65 +-
src/standalone_chart/lib_om_chart/connect.py | 47 +-
src/standalone_chart/lib_om_chart/main_window.py | 90 +-
src/standalone_chart/lib_om_chart/patient.py | 103 +-
.../lib_om_chart/restorable_app.py | 43 +-
src/standalone_chart/om_chart.py | 89 +-
src/tests/appt_drag_test.py | 72 +-
348 files changed, 29810 insertions(+), 20942 deletions(-)
diff --git a/.gitignore b/.gitignore
index a17020c..aba5e9f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,5 @@
*.pyc
*~
-tmp/*
builds/*
dist/*
MANIFEST
-local_branches/
diff --git a/COPYING b/COPYING
deleted file mode 100644
index 131e828..0000000
--- a/COPYING
+++ /dev/null
@@ -1,191 +0,0 @@
-
-
-GNU GENERAL PUBLIC LICENSE
-
-Version 3, 29 June 2007
-
-Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
-
-Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
-Preamble
-
-The GNU General Public License is a free, copyleft license for software and other kinds of works.
-
-The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it [...]
-
-When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
-
-To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
-
-For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
-
-Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
-
-For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
-
-Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If [...]
-
-Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
-
-The precise terms and conditions for copying, distribution and modification follow.
-TERMS AND CONDITIONS
-0. Definitions.
-
-“This License” refers to version 3 of the GNU General Public License.
-
-“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
-
-“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
-
-To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
-
-A “covered work” means either the unmodified Program or a work based on the Program.
-
-To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
-
-To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
-
-An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominen [...]
-1. Source Code.
-
-The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
-
-A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
-
-The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window syst [...]
-
-The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes int [...]
-
-The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
-
-The Corresponding Source for a work in source code form is that same work.
-2. Basic Permissions.
-
-All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
-
-You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you mus [...]
-
-Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
-3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
-
-When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
-4. Conveying Verbatim Copies.
-
-You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
-
-You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
-5. Conveying Modified Source Versions.
-
-You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
-
- * a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
- * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
- * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
- * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
-
-A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregat [...]
-6. Conveying Non-Source Forms.
-
-You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
-
- * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
- * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software inte [...]
- * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
- * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying f [...]
- * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
-
-A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
-
-A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the [...]
-
-“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
-
-If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neithe [...]
-
-The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
-
-Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
-7. Additional Terms.
-
-“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License [...]
-
-When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
-
-Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
-
- * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
- * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
- * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
- * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
- * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
- * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
-
-All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license [...]
-
-If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
-
-Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
-8. Termination.
-
-You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
-
-However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
-
-Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
-
-Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
-9. Acceptance Not Required for Having Copies.
-
-You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you in [...]
-10. Automatic Licensing of Downstream Recipients.
-
-Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
-
-An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source o [...]
-
-You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
-11. Patents.
-
-A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.
-
-A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a [...]
-
-Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
-
-In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
-
-If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent w [...]
-
-If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
-
-A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and un [...]
-
-Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
-12. No Surrender of Others' Freedom.
-
-If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to [...]
-13. Use with the GNU Affero General Public License.
-
-Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination [...]
-14. Revised Versions of this License.
-
-The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
-
-If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
-
-Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
-15. Disclaimer of Warranty.
-
-THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE C [...]
-16. Limitation of Liability.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WIT [...]
-17. Interpretation of Sections 15 and 16.
-
-If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
-
-END OF TERMS AND CONDITIONS
diff --git a/INSTALL.txt b/INSTALL.txt
index 514844d..97cb33e 100644
--- a/INSTALL.txt
+++ b/INSTALL.txt
@@ -8,7 +8,7 @@ I will give instructions tested debian jessie
----------------------------------------------------------------------------------------------------------------
##CLIENT MACHINE##
ensure depenencies are met on the client machine
-~$sudo apt-get install python-mysqldb python-qt4
+~$sudo apt-get install python-mysqldb python-qt4 python-qscintilla2 xdg-utils
that's it!
@@ -28,7 +28,7 @@ You are ready to try openmolar (you can do this without installing ANYTHING)
cd into the src directory and type
./main.py
-on first run of openMolar, you set a password for the app, you are given an opportunity to install a test database.
+on first run of openMolar, you set a password for the app, you are given an opportunity to install a test database.
NB - The test database is currently very limited with only 1 patient. (serial no 1)
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a8d7260
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,28 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: OpenMolar
+Upstream-Contact: Neil Wallace <neil at openmolar.com>
+Source: http://www.openmolar.com
+
+Files: *
+Copyright: 2009-2014 Neil Wallace <neil at openmolar.com>
+License: GPL-3+
+ This program is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later
+ version.
+ .
+ This program is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the GNU General Public License for more
+ details.
+ .
+ You should have received a copy of the GNU General Public
+ License along with this package; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ Boston, MA 02110-1301 USA
+ .
+ On Debian systems, the full text of the GNU General Public
+ License version 2 can be found in the file
+ `/usr/share/common-licenses/GPL-3'.
diff --git a/MANIFEST.in b/MANIFEST.in
index 290ca5a..79028e2 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,9 +1,9 @@
-include COPYING MANIFEST MANIFEST.in README openmolar
+include LICENSE MANIFEST MANIFEST.in README openmolar INSTALL.txt
recursive-include bin *.svg *.desktop
recursive-include src/openmolar/schema_upgrades *.py
recursive-include src/openmolar/dbtools *.py
recursive-include src/openmolar/ptModules *.py
recursive-include src/openmolar/qt4gui *.py
-recursive-include src/openmolar/resources *.xml *.png *.pdf *.css *.sql *.svg
+recursive-include src/openmolar/resources *.qrc *.xsd *.xml *.html *.css *.sql *.svg *.png
recursive-include src/openmolar/settings *.py
recursive-include src/openmolar/locale *.po *.pot
diff --git a/README b/README
deleted file mode 120000
index 42061c0..0000000
--- a/README
+++ /dev/null
@@ -1 +0,0 @@
-README.md
\ No newline at end of file
diff --git a/README b/README
new file mode 100644
index 0000000..84379c5
--- /dev/null
+++ b/README
@@ -0,0 +1,6 @@
+openmolar1
+==========
+
+Dental Practice Management Software.
+
+see www.openmolar.com for description
diff --git a/TODO.txt b/TODO.txt
index 6edce6b..4570074 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -1,6 +1,7 @@
0.5.00
Issues and code now tracked on github.
This release is imminent, barring a few release blocking bugs.
+ All debian and rpm work has been removed from git repository.
0.4.10
TODO incisal angles, max per tooth, extraction visits, special tray,
diff --git a/bin/openmolar.1 b/bin/openmolar.1
new file mode 100644
index 0000000..b6b2035
--- /dev/null
+++ b/bin/openmolar.1
@@ -0,0 +1,18 @@
+.TH OPENMOLAR "1" "March 2014" "OpenMolar 0.5.0" "User Commands"
+.SH NAME
+OpenMolar \- dental practice management software.
+.SH DESCRIPTION
+dental practice management software.
+.SH OPTIONS
+.TP
+\fB\-\-help\fR
+show this text
+.TP
+\fB\-\-firstrun\fR
+offer the firstrun config and demodatabase generation
+.TP
+\fB\-\-setup\fR
+takes you to the admin page
+.TP
+\fB\-\-version\fR
+show the versioning and exit
diff --git a/build_scripts/Makefile b/build_scripts/Makefile
index 4ddc819..08286c6 100755
--- a/build_scripts/Makefile
+++ b/build_scripts/Makefile
@@ -1,59 +1,46 @@
define USEAGE
-This is the build script for openmolar packages and tarballs.
+This is the build script for openmolar tarballs.
USAGE
make [options] target
-OPTIONS
- DIST (the target distribution - eg. unstable, testing, lucid etc.)
- default=unstable
- allowed values - anything..
- but if building a deb, have a pbuilder environment with this name
- NEW_CHANGELOG (run a gui to modify the changelog)
- default=true
-
TARGETS
+ version
+ git_tag
tarball
- deb_src
- deb_binary
- all_tarballs
- all_deb_srcs
- all_deb_binaries
-
-EXAMPLES are available.
- make examples
-endef
-
-define EXAMPLES
+
EXAMPLES
-make tarball
- create a tarball
-
-make changelog
- update the changelog in the template debian directory
-
-make deb DIST=stable
- debian packages for debian stable (squeeze)
-make deb DIST=precise
- create a debian binary package for ubuntu precise (12.04).
-make debs
- makes debian package for all distributions and architectures
+ make NEW_VERSION=0.5.0-beta1 version
+ this will update version.py, but will not update the git tag
+
+ make git-tag
+ this will tag the git repo with the version number set in version.py
+ performs the following
+ git tag -a v0.5.0-beta1 -m "v0.5.0-beta1"
+
+ make FORCE=true git-tag
+ as above, but deleting any other reference to the tag
+ performsthe following
+ git tag -f -a v0.5.0-beta1 -m "v0.5.0-beta1"
+
+ make tarball
+ create a tarball
+ needn't be a tagged (or even clean repo) for this
+
+usual steps for a release would be as follows.
+ export NEW_VERION=0.5.1
+ make version
+ git commit -a
+ git push
+ make git_tag
+ make tarball
+ make sign_tarball
endef
export USEAGE
-export EXAMPLES
-
-ifeq ($(DIST), )
- DIST=unstable
-endif
-
-ifeq ($(NEW_CHANGELOG), )
- NEW_CHANGELOG=true
-endif
PACKAGE=openmolar
-
CURRENT_MAKEFILE_LIST := $(MAKEFILE_LIST)
BUILD_SCRIPTS_DIR := $(abspath $(dir $(firstword $(CURRENT_MAKEFILE_LIST))))/
HEAD = $(shell $(BUILD_SCRIPTS_DIR)get_git_branch.py)/
@@ -61,25 +48,21 @@ BUILDS_DIR=$(HEAD)builds/
DIST_DIR=$(HEAD)dist/
-VERSION=`$(BUILD_SCRIPTS_DIR)get_version.py`
+#VERSION=`git describe | sed s/v//`
+VERSION=`python $(HEAD)setup.py --version`
-TARBALL = $(PACKAGE)-$(VERSION).tar.gz
-TARBALL_DIR=$(HEAD)builds/tarballs/
-
-TMP_DIR=$(HEAD)tmp/
-
-################### Debian Packaging Stuff ####################################
-# #
-DEB_CONF_DIR=$(BUILD_SCRIPTS_DIR)debian_packaging/dh_python2/debian/
-DEB_BUILDS_DIR=$(BUILDS_DIR)debs/$(DIST)/
+ifeq ($(NEW_VERSION), )
+ NEW_VERSION=$(VERSION)
+endif
-DEBDISTS = unstable testing stable oldstable saucy raring quantal precise
+ifeq ($(FORCE), true)
+ FORCE_TAG=-f
+endif
-CHANGELOG=$(DEB_BUILDS_DIR)$(shell ls -t $(DEB_BUILDS_DIR) | grep changes | head -n1)
-# #
-################## Debian packaging ends #####################################
+TARBALL = $(PACKAGE)-$(VERSION).tar.gz
+TMP_DIR=$(HEAD)tmp/
.phony:
make help
@@ -94,106 +77,42 @@ clean_tmp:
mkdir -p $(TMP_DIR)
rm -rf $(TMP_DIR)*
+resources:
+ pyrcc4 -py2 $(HEAD)/src/openmolar/resources/resources.qrc > $(HEAD)/src/openmolar/qt4gui/resources_rc.py
+
+ui_files:
+ ./om_pyuic4.py
+
+clean_codebase:
+ ./code_cleaner.py
+
+git_tag:
+ @echo "writing git tag - if this fails and you haven't pushed tags to parent repo, try 'make FORCE=true git_tag'"
+ git tag $(FORCE_TAG) -a v$(NEW_VERSION) -m "$(NEW_VERSION)"
+
+version:
+ @echo "modding version.py"
+ echo "sed -i 0,/VERSION/s/VERSION = \".*\"/VERSION = \"$(NEW_VERSION)\"/ src/openmolar/settings/version.py"
+ cd $(HEAD) ;\
+ sed -i 0,/VERSION/s/VERSION\ =\ \".*\"/VERSION\ =\ \"$(NEW_VERSION)\"/ src/openmolar/settings/version.py
+ @echo "version updated"
+
tarball:
echo "making tarball (using setup.py sdist)"
make clean_tmp
cd $(HEAD) ;\
python setup.py sdist ;\
echo "tarball created!"
- mkdir -p $(TARBALL_DIR)
- echo "moving tarball to $(TARBALL_DIR)"
- cp -av $(DIST_DIR)$(TARBALL) $(TARBALL_DIR);
- @echo "tarball is located $(TARBALL_DIR)$(TARBALL)"
+ mkdir -p $(BUILDS_DIR)
+ echo "moving tarball to $(BUILDS_DIR)"
+ cp -av $(DIST_DIR)$(TARBALL) $(BUILDS_DIR);
+ @echo "tarball is located $(BUILDS_DIR)$(TARBALL)"
- @if [ -e "$(TARBALL_DIR)$(TARBALL)" ]; then echo "SUCCESS!"; fi
+ @if [ -e "$(BUILDS_DIR)$(TARBALL)" ]; then echo "SUCCESS!"; fi
sign_tarball:
- cd $(TARBALL_DIR) ;\
+ cd $(BUILDS_DIR) ;\
gpg --armor --sign --detach-sig -u rowinggolfer at googlemail.com $(TARBALL) ;\
md5sum $(TARBALL) | sed "s/ .*//" > $(PACKAGE)-$(VERSION)_md5.txt
-changelog:
- # call my changelog gui
- @echo $(BUILD_SCRIPTS_DIR)deb_maker.py -s$(TARBALL_DIR) -d$(DEB_CONF_DIR)
- $(BUILD_SCRIPTS_DIR)deb_maker.py -p$(PACKAGE) -s$(TARBALL_DIR) -d$(DEB_CONF_DIR)
-
-deb:
- @if [ ! -e "$(TARBALL_DIR)$(TARBALL)" ]; then make tarball; fi
-
- make clean_tmp
-
- @echo "Making debian packages target distro = $(DIST)"
-
- @if [ "$(NEW_CHANGELOG)" = 'true' ]; then make changelog; fi
-
- cp -av $(TARBALL_DIR)$(TARBALL) $(TMP_DIR)
-
- cd $(TMP_DIR) ;\
- tar -zxf $(TARBALL); \
- mv $(TARBALL) `python $(BUILD_SCRIPTS_DIR)version_name.py $(DEB_CONF_DIR)`.orig.tar.gz
-
- cd $(TMP_DIR)$(PACKAGE)-$(VERSION) ; \
- cp -av $(DEB_CONF_DIR) . ;\
- echo "modding changelog" ;\
- sed -i s/__DIST__/$(DIST)/g debian/changelog ;\
- sudo pdebuild --buildresult $(DEB_BUILDS_DIR) --pbuilderroot "sudo DIST=$(DIST)"
-
-debsign:
- debsign $(DEB_BUILDS_DIR)*$(VERSION)*.changes -kF230408E
-
-debsigns:
- #make debsign DIST=<unstable|testing|stable|raring|quantal|precise|lucid>
-
- $(foreach dist,$(DEBDISTS), \
- make debsign DIST=$(dist) ;\
- )
-
-notes:
- #pdebuild --architecture <i386|amd64> --buildresult /tmp --pbuilderroot "sudo DIST=<unstable|stable|testing|raring|quantal|precise|lucid> ARCH=<i386|amd64>"
-
-debs:
- @echo "making all debian based packages.. first we need to update the changelogs for the 2 build systems"
- make changelog
-
- $(foreach dist,$(DEBDISTS), \
- make deb DIST=$(dist) NEW_CHANGELOG=False;\
- )
-
-pushdeb:
- cd ~/www/repos/apt/debian ;\
- reprepro include $(DIST) $(CHANGELOG) ; \
- #reprepro export
-
-pushdebs:
- @echo "updating the local repo"
- $(foreach dist,$(DEBDISTS), \
- make DIST=$(dist) pushdeb; \
- )
- cd ~/www/repos/apt/debian ;\
- reprepro export
-
-update_pbuilder:
- $(foreach dist, $(DEBDISTS), \
- sudo DIST=${dist} ARCH=amd64 pbuilder --update --architecture amd64 \
- --distribution ${dist} --http-proxy http://localhost:3142 ; \
- )
-
-create_pbuilder:
- $(foreach dist, $(DEBDISTS), \
- sudo DIST=${dist} ARCH=amd64 pbuilder --create --architecture amd64 \
- --distribution ${dist} --http-proxy http://localhost:3142 ; \
- )
-
-test:
- @echo chosen package $(PACKAGE)
- @echo targetting distro $(DIST)
- @if [ $(NEW_CHANGELOG) = 'true' ]; then \
- echo changelog WILL be updated; \
- fi
- @echo debconfdir = $(DEB_CONF_DIR)
- @echo Head = $(HEAD)
- @echo Dist = $(DIST)
- @echo DEB_BUILDS_DIR = $(DEB_BUILDS_DIR)
- @echo changelog = $(CHANGELOG)
-
diff --git a/build_scripts/code_cleaner.py b/build_scripts/code_cleaner.py
new file mode 100755
index 0000000..cfd1933
--- /dev/null
+++ b/build_scripts/code_cleaner.py
@@ -0,0 +1,228 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+'''
+This module cleans and standardises the openmolar code.
+autopep8 should be installed for full functionality
+
+USEAGE is ./code_cleaner.py
+
+OPTIONS:
+ ALL - modify all python files above the git repository
+ no-pep8 - do not apply autopep8
+
+EXAMPLES:
+ ./code_cleaner.py
+ this will check formatting of any file marked as new or modified
+ in the git repo this should be done before each commit!
+
+ ./code_cleaner.py ALL
+ check and modify all files.
+
+ ./code_cleaner.py ALL no-pep8
+ does not apply the autopep8 tool, so only changes will be the
+ shebang lines and license.
+'''
+
+import git
+import logging
+import os
+import re
+import subprocess
+import sys
+
+logging.basicConfig(level=logging.INFO)
+LOGGER = logging.getLogger("code_cleaner")
+
+SHEBANG_LINE = "#! /usr/bin/env python"
+ENCODING_LINE = "# -*- coding: utf-8 -*-"
+LICENSE = '''
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+'''
+
+
+class CodeCleaner(object):
+
+ '''
+ A class which takes a git repository, and cleans up python code within.
+ '''
+ pep8 = True
+ license_lines = set([])
+
+ def __init__(self, repository, all_files=False):
+ self.repo = repository
+ self.root_path = self.repo.working_dir
+
+ self.files = self._all_files if all_files else self._changed_files
+ LOGGER.info("CodeCleaner object created")
+
+ def _valid_file(self, filename):
+ '''
+ check to see if file is a python file
+ '''
+ if filename.endswith("resources_rc.py"):
+ return False
+ return filename == "openmolar" or re.match(".*.py$", filename)
+
+ def _changed_files(self):
+ '''
+ use git to get only those files which have been altered.
+ files object will be in this form
+
+ M src/standalone_chart/om_chart.py
+ M src/tests/appt_drag_test.py
+ ?? build_scripts/code_cleaner.py
+
+ so some regex work is required to pull the filename.
+ '''
+ files = self.repo.git.status("--porcelain")
+ LOGGER.debug(files)
+ for info in files.split("\n"):
+ operation = info[:3].strip(" ")
+ file_ = info[3:]
+ if operation in ("M", "A") and self._valid_file(file_):
+ yield os.path.join(self.root_path, file_)
+
+ def _all_files(self):
+ '''
+ an iterator returning all files in child directories of the git repo
+ which conform with _valid_file
+ '''
+ for root, dir_, files in os.walk(self.root_path):
+ for file_ in files:
+ if self._valid_file(file_):
+ file_path = os.path.join(root, file_)
+ yield file_path
+
+ def autopep8(self, file_path):
+ '''
+ apply the wonderful autopep8 tool
+ '''
+ if self.pep8:
+ LOGGER.debug("applying autopep8")
+ p = subprocess.Popen(
+ ["autopep8", "-v", "--in-place", "-a", "-a", file_path])
+ p.wait()
+
+ def clean_files(self):
+ count = 0
+ changed = 0
+ for file_path in self.files():
+ count += 1
+ LOGGER.info("cleaning %s" % file_path)
+
+ self.autopep8(file_path)
+
+ f = open(file_path)
+ data = f.read()
+ f.close()
+
+ new_data = self._check_shebang(data)
+ new_data = self._check_encoding(new_data)
+ if not "compiled_uis" in file_path:
+ new_data = self._change_license(new_data)
+
+ if new_data != data:
+ changed += 1
+ f = open(file_path, "w")
+ f.write(new_data)
+ f.close()
+
+ LOGGER.info("changed %d out of %d files" % (changed, count))
+
+ def _check_shebang(self, data):
+ '''
+ apply the python shebang line if not present
+ '''
+ if data.split("\n")[0] == SHEBANG_LINE:
+ return data
+ return "%s\n%s" % (SHEBANG_LINE, data)
+
+ def _check_encoding(self, data):
+ '''
+ apply the encoding shebang line if not present
+ '''
+ lines = data.split("\n")
+ if lines[1] == ENCODING_LINE:
+ return data
+ lines.insert(1, ENCODING_LINE)
+ return "\n".join(lines)
+
+ def _change_license(self, data):
+ '''
+ remove any old license present, and replace with LICENSE
+ '''
+ lines = data.split("\n")
+ removals = []
+ for i, line in enumerate(lines[2:]):
+ if line.startswith("#") or line.strip(" ") == "":
+ removals.append(i + 2)
+ else:
+ break
+ for i in sorted(removals, reverse=True):
+ line = lines.pop(i)
+ self.license_lines.add(line)
+
+ for i, new_line in enumerate(LICENSE.split("\n")):
+ lines.insert(i + 2, new_line)
+ return "\n".join(lines)
+
+
+def help_():
+ '''
+ print a help message and exit
+ '''
+ print __doc__
+ sys.exit(0)
+
+if __name__ == "__main__":
+ if "help" in sys.argv:
+ help_()
+ LOGGER.setLevel(logging.DEBUG)
+ repo = git.Repo(os.getcwd())
+ cc = CodeCleaner(repo, "ALL" in sys.argv)
+ cc.pep8 = not "no-pep8" in sys.argv
+ cc.clean_files()
+
+ LOGGER.warning(
+ "removed the following license lines!%s" % "\n".join(cc.license_lines))
diff --git a/build_scripts/deb_maker.py b/build_scripts/deb_maker.py
deleted file mode 100755
index 80920ef..0000000
--- a/build_scripts/deb_maker.py
+++ /dev/null
@@ -1,158 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-###############################################################################
-## ##
-## Copyright 2011, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
-
-'''
-this script parses a debian directory, and updates the changelog
-command line args determine the behaviour.
---auto = just alter the changelog with defaults (eg for nightly builds)
-'''
-
-import commands
-import logging
-import optparse
-import os
-import re
-import sys
-
-from PyQt4 import QtGui, QtCore
-
-class DebMakerGui(QtGui.QDialog):
- def __init__(self, changelog, sources, parent=None):
- QtGui.QDialog.__init__(self, parent)
- self.setWindowTitle("Deb Maker")
-
- label1 = QtGui.QLabel("available sources")
- self.list_widget = QtGui.QListWidget()
- self.list_widget.setMaximumHeight(120)
- for tarball in sources:
- self.list_widget.addItem(tarball)
- self.list_widget.setCurrentRow(0)
-
- label2 = QtGui.QLabel("changelog")
- self.text_edit = QtGui.QTextEdit()
- self.text_edit.setText(changelog)
-
- frame = QtGui.QFrame()
- layout = QtGui.QGridLayout(frame)
- layout.addWidget(label1, 0,0)
- layout.addWidget(self.list_widget, 0,1)
- layout.addWidget(label2, 1,0)
- layout.addWidget(self.text_edit, 1,1)
-
- butbox = QtGui.QDialogButtonBox(self)
- butbox.setStandardButtons(butbox.Ok|butbox.Cancel)
-
- butbox.accepted.connect(self.accept)
- butbox.rejected.connect(self.reject)
-
- layout = QtGui.QVBoxLayout(self)
- layout.addWidget(frame)
- layout.addWidget(butbox)
-
- def sizeHint(self):
- return QtCore.QSize(600,400)
-
- @property
- def changelog(self):
- return self.text_edit.toPlainText()
-
-class Parser(optparse.OptionParser):
- def __init__(self):
- optparse.OptionParser.__init__(self,
- prog="deb_maker",
- version="0.1")
-
- option = self.add_option("-a", "--auto",
- dest = "auto",
- action="store_true", default=False,
- help = "perform default actions with no user input"
- )
-
- option = self.add_option("-d", "--directory",
- dest="deb_dir",
- help = "debian directory (ie. where your changelog lives)"
- )
-
- option = self.add_option("-s", "--sources",
- dest="sources_dir",
- help = "sources directory (ie. where your *.tar.gz *.dsc files are)"
- )
-
- option = self.add_option("-p", "--package-name",
- dest="package",
- help = "package name (eg. openmolar-common)"
- )
-
-def raise_gui(changelog, sources):
- app = QtGui.QApplication(sys.argv)
- dl = DebMakerGui(changelog, sources)
- result = dl.exec_()
- return result, dl.changelog
-
-def new_changelog(package, version, author, package_no=0, dist="__DIST__", urgency="low"):
- return '''%s (%s-%d~%s0) %s; urgency=%s
-
- * {COMMENTS}
-
- -- %s %s
-'''% (package, version, package_no, dist, dist, urgency, author, commands.getoutput("date -R"))
-
-def main():
- parser = Parser()
- options, args = parser.parse_args()
-
- f = open(os.path.join(options.deb_dir, "changelog"))
- changelog = f.read()
- f.close()
-
- tarballs = []
- print "looking in %s"% options.sources_dir
- for file_ in os.listdir(options.sources_dir):
- if re.match("%s-(.*)\.tar\.gz$"% options.package, file_) :
- tarballs.append(file_)
- tarballs = sorted(tarballs, reverse=True)
-
- chosen = tarballs[0]
- version = re.match(
- "%s-(.*)\.tar\.gz$"% options.package, chosen).groups()[0]
-
- new_changes = new_changelog(options.package, version,
- "Neil Wallace <rowinggolfer at googlemail.com>", 0)
-
- changelog = "%s\n\n%s"% (new_changes, changelog)
-
- if not options.auto:
- result, changelog = raise_gui(changelog, tarballs)
- if not result:
- sys.exit("User aborted the changelog gui")
- else:
- comments = changelog.replace("{COMMENTS}", "auto build", 1)
-
- f = open(os.path.join(options.deb_dir, "changelog"), "w")
- f.write(changelog)
- f.close()
-
- logging.info("succesfully written new changelog")
-
-if __name__ == "__main__":
- logging.basicConfig(level=logging.DEBUG)
- main()
diff --git a/build_scripts/debian_packaging/dh_python2/debian/changelog b/build_scripts/debian_packaging/dh_python2/debian/changelog
deleted file mode 100644
index b2d604f..0000000
--- a/build_scripts/debian_packaging/dh_python2/debian/changelog
+++ /dev/null
@@ -1,606 +0,0 @@
-openmolar (0.5.0-beta18-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream (removes pdf files from resources)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 26 Mar 2014 17:18:44 +0000
-
-
-openmolar (0.5.0-beta17-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 14 Mar 2014 12:24:30 +0000
-
-
-openmolar (0.5.0-beta16-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 28 Jan 2014 16:44:38 +0000
-
-
-openmolar (0.5.0-beta15-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 22 Jan 2014 15:42:53 +0000
-
-
-openmolar (0.5.0-beta14-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 22 Jan 2014 14:51:41 +0000
-
-
-openmolar (0.5.0-beta13-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 24 Dec 2013 00:53:40 +0000
-
-
-openmolar (0.5.0-beta12-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 17 Dec 2013 11:41:05 +0000
-
-
-openmolar (0.5.0-beta11-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 16 Dec 2013 23:58:03 +0000
-
-
-openmolar (0.5.0-beta10-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 16 Dec 2013 12:36:29 +0000
-
-
-openmolar (0.5.0-beta09-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 06 Dec 2013 15:17:21 +0000
-
-
-openmolar (0.5.0-beta08-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 06 Dec 2013 12:26:23 +0000
-
-
-openmolar (0.5.0-beta07-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 04 Dec 2013 22:43:41 +0000
-
-
-openmolar (0.5.0-beta06-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 02 Dec 2013 23:36:42 +0000
-
-
-openmolar (0.5.0-beta05-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream (fixes #74 and #73)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 02 Dec 2013 09:53:32 +0000
-
-
-openmolar (0.5.0-beta04-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 02 Dec 2013 00:24:34 +0000
-
-
-openmolar (0.5.0-beta03-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 29 Nov 2013 09:48:56 +0000
-
-
-openmolar (0.5.0-beta02-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 29 Nov 2013 08:59:59 +0000
-
-
-openmolar (0.5.0-beta01-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 28 Nov 2013 22:49:57 +0000
-
-
-openmolar (0.5.0-alpha9-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 27 Nov 2013 02:43:03 +0000
-
-
-openmolar (0.5.0-alpha8-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream Release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 26 Nov 2013 09:28:00 +0000
-
-
-openmolar (0.5.0-alpha7-0~__DIST__0) __DIST__; urgency=low
-
- * New Upstream Release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 25 Nov 2013 23:48:19 +0000
-
-
-openmolar (0.5.0-alpha5-0~__DIST__0) __DIST__; urgency=low
-
- * New upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 25 Nov 2013 16:07:26 +0000
-
-
-openmolar (0.5.0-alpha4-0~__DIST__0) __DIST__; urgency=low
-
- * New upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 25 Nov 2013 12:30:00 +0000
-
-
-openmolar (0.5.0-alpha3-0~__DIST__0) __DIST__; urgency=low
-
- * Upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 25 Nov 2013 11:07:08 +0000
-
-
-openmolar (0.5.0-alpha2-0~__DIST__0) __DIST__; urgency=low
-
- * New upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 24 Nov 2013 19:50:46 +0000
-
-
-openmolar (0.5.0-alpha1-1~__DIST__0) __DIST__; urgency=low
-
- * modded control to include new dependency on python-qscintilla2
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 24 Nov 2013 18:51:46 +0000
-
-
-openmolar (0.5.0-alpha1-0~__DIST__0) __DIST__; urgency=low
-
- * New upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 24 Nov 2013 14:20:23 +0000
-
-openmolar (0.4.09+bzr0843-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 28 Jun 2013 12:50:23 +0100
-
-
-openmolar (0.4.09+bzr0842-0~__DIST__0) __DIST__; urgency=low
-
- * upstream bugfix
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 28 Jun 2013 10:30:30 +0100
-
-
-openmolar (0.4.09+bzr0840-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 27 Jun 2013 00:03:09 +0100
-
-
-openmolar (0.4.07+bzr0839-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 26 Jun 2013 10:55:33 +0100
-
-
-openmolar (0.4.07+bzr0837-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 24 Jun 2013 16:14:40 +0100
-
-
-openmolar (0.4.06+bzr0836-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 24 Jun 2013 10:00:49 +0100
-
-
-openmolar (0.4.06+bzr0833-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 13 Jun 2013 22:29:30 +0100
-
-
-openmolar (0.4.06+bzr0832-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 13 Jun 2013 15:21:47 +0100
-
-
-openmolar (0.4.05+bzr0832-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 10 Jun 2013 13:41:09 +0100
-
-
-openmolar (0.4.04+bzr0831-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 10 Jun 2013 10:06:54 +0100
-
-
-openmolar (0.4.03+bzr0830-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 07 Jun 2013 12:45:53 +0100
-
-
-openmolar (0.4.02+bzr0829-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 04 Jun 2013 18:01:24 +0100
-
-
-openmolar (0.4.01+bzr0828-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 27 May 2013 22:07:08 +0100
-
-
-openmolar (0.4.0+bzr0827-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 27 May 2013 16:13:31 +0100
-
-
-openmolar (0.3.9+bzr0825-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 24 May 2013 10:50:59 +0100
-
-
-openmolar (0.3.9+bzr0824-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 23 May 2013 11:30:51 +0100
-
-
-openmolar (0.3.8+bzr0822-0~__DIST__0) __DIST__; urgency=low
-
- * reinstated address search when no relatives linked
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 21 May 2013 23:17:37 +0100
-
-
-openmolar (0.3.8+bzr0820-0~__DIST__0) __DIST__; urgency=low
-
- * bugfix for 0.3.8
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 21 May 2013 15:23:34 +0100
-
-
-openmolar (0.3.8+bzr0819-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 21 May 2013 11:23:56 +0100
-
-
-openmolar (0.3.7+bzr0818-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sat, 11 May 2013 00:09:39 +0100
-
-
-openmolar (0.3.7+bzr0816-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 30 Apr 2013 18:19:43 +0100
-
-
-openmolar (0.3.7+bzr0815-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 30 Apr 2013 16:44:16 +0100
-
-
-openmolar (0.3.6+bzr0814-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 25 Apr 2013 23:01:17 +0100
-
-
-openmolar (0.3.5+bzr0813-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 25 Apr 2013 00:28:05 +0100
-
-
-openmolar (0.3.5+bzr0812-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 25 Apr 2013 00:01:28 +0100
-
-
-openmolar (0.3.4+bzr0807-1~__DIST__0) __DIST__; urgency=low
-
- * rebuild
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 17 Apr 2013 21:16:10 +0100
-
-
-openmolar (0.3.4+bzr0807-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 17 Apr 2013 21:00:13 +0100
-
-
-openmolar (0.3.3+bzr0805-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 04 Mar 2013 11:09:10 +0000
-
-
-openmolar (0.3.2+bzr0804-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 01 Mar 2013 13:35:31 +0000
-
-
-openmolar (0.3.2+bzr0802-1~__DIST__0) __DIST__; urgency=low
-
- * upstream tweaks
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 28 Feb 2013 23:20:39 +0000
-
-
-openmolar (0.3.2+bzr0799-0~__DIST__0) __DIST__; urgency=low
-
- * bug fixes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 04 Feb 2013 12:24:01 +0000
-
-
-openmolar (0.3.2+bzr0798-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release (invokes a schema change)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sat, 02 Feb 2013 21:39:33 +0000
-
-
-openmolar (0.3.1+bzr0776-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 28 Oct 2012 19:59:40 +0000
-
-
-openmolar (0.3.1+bzr0775-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 26 Oct 2012 01:32:11 +0100
-
-
-openmolar (0.3.1+bzr0774-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 26 Oct 2012 00:21:25 +0100
-
-
-openmolar (0.3.0+bzr0773-0~__DIST__0) __DIST__; urgency=low
-
- * python2.6 fix (cursor.executemany is broken?)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 23 Oct 2012 14:31:05 +0100
-
-
-openmolar (0.3.0+bzr0772-0~__DIST__0) __DIST__; urgency=low
-
- * ability to edit today's notes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 22 Oct 2012 18:39:15 +0100
-
-
-openmolar (0.3.0+bzr0771-0~__DIST__0) __DIST__; urgency=low
-
- * re-introduced system dat into the formatted notes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 22 Oct 2012 10:29:18 +0100
-
-
-openmolar (0.3.0+bzr0770-0~__DIST__0) __DIST__; urgency=low
-
- * ui tweaks
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sat, 20 Oct 2012 01:50:56 +0100
-
-
-openmolar (0.2.3+bzr0769-0~__DIST__0) __DIST__; urgency=low
-
- * upstream tweak
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 19 Oct 2012 17:52:37 +0100
-
-
-openmolar (0.2.3+bzr0768-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version with a significant schema change
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 19 Oct 2012 17:36:59 +0100
-
-
-openmolar (0.2.2+bzr0766-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 03 Oct 2012 23:04:56 +0100
-
-
-openmolar (0.2.2+bzr0765-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 28 Sep 2012 12:32:00 +0100
-
-
-openmolar (0.2.2+bzr0763-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 19 Sep 2012 22:54:16 +0100
-
-
-openmolar (0.2.2+bzr0762-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 05 Aug 2012 09:44:33 +0100
-
-
-openmolar (0.2.2+bzr0761-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 05 Aug 2012 00:33:21 +0100
-
-
-openmolar (0.2.2+bzr0760-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sat, 04 Aug 2012 23:29:27 +0100
-
-
-openmolar (0.2.1+bzr0755-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (bzr 755)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 26 Jun 2012 17:43:01 +0100
-
-
-openmolar (0.2.1+bzr0754-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (bzr 754)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 26 Jun 2012 15:17:35 +0100
-
-
-openmolar (0.2.1+bzr0753-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (bzr 753)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 26 Jun 2012 12:37:38 +0100
-
-
-openmolar (0.2.1+bzr0752-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (bzr 752)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 26 Jun 2012 11:30:55 +0100
-
-
-openmolar (0.2.1+bzr0751-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (bzr 751)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 25 Jun 2012 23:21:24 +0100
-
-
-openmolar (0.2.1+bzr0750-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (bzr 750)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 25 Jun 2012 10:04:33 +0100
-
-
-openmolar (0.2.1+bzr0749-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (ability to specify dentist for recall)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 21 Jun 2012 18:27:55 +0100
-
-
-openmolar (0.2.1+bzr0748-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (uses **kwargs for connection, thus avoiding passing a blank dict in for ssl_settings)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 19 Jun 2012 23:37:07 +0100
-
-
-openmolar (0.2.1+bzr0746-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (fixes the translation problem)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 08 Jun 2012 13:36:36 +0100
-
-
-openmolar (0.2.1+bzr0745-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 08 Jun 2012 09:34:30 +0100
-
-
-openmolar (0.2.1+bzr0744-2~__DIST__2) __DIST__; urgency=low
-
- * new build script envoking pbuilder
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 06 Jun 2012 13:56:37 +0100
-
-
-openmolar (0.2.1+bzr0744-1~__DIST__1) __DIST__; urgency=low
-
- * trial build with new pbuilder environment
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 06 Jun 2012 10:46:47 +0100
-
-
-openmolar (0.2.1+bzr0744-0~__DIST__0) __DIST__; urgency=low
-
- * trial build
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 01 Jun 2012 15:30:44 +0100
diff --git a/build_scripts/debian_packaging/dh_python2/debian/compat b/build_scripts/debian_packaging/dh_python2/debian/compat
deleted file mode 100644
index 7f8f011..0000000
--- a/build_scripts/debian_packaging/dh_python2/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-7
diff --git a/build_scripts/debian_packaging/dh_python2/debian/control b/build_scripts/debian_packaging/dh_python2/debian/control
deleted file mode 100644
index 502f4bd..0000000
--- a/build_scripts/debian_packaging/dh_python2/debian/control
+++ /dev/null
@@ -1,18 +0,0 @@
-Source: openmolar
-Section: misc
-Priority: extra
-Maintainer: Neil Wallace <rowinggolfer at googlemail.com>
-Build-Depends: python, debhelper (>= 7)
-Homepage: http://www.openmolar.com
-Vcs-browser: https://code.launchpad.net/openmolar
-Standards-Version: 3.9.3
-
-Package: openmolar-orig
-Architecture: all
-Depends: ${misc:Depends}, ${python:Depends}, python-qt4 (>=4.4.0), python-mysqldb, xdg-utils, python-qscintilla2
-Replaces: openmolar
-XB-Python-Version: ${python:Versions}
-Description: Dental Practice Management Software
- see https://launchpad.net/openmolar for project description and links
- .
- irc channel (for devs and users) is #openmolar on freenode.net
diff --git a/build_scripts/debian_packaging/dh_python2/debian/copyright b/build_scripts/debian_packaging/dh_python2/debian/copyright
deleted file mode 100644
index 8254a6c..0000000
--- a/build_scripts/debian_packaging/dh_python2/debian/copyright
+++ /dev/null
@@ -1,40 +0,0 @@
-This package was debianized by:
-
- Neil Wallace <rowinggolfer at googlemail.com> on Tues, 5 Dec 2011 13:20:09 +0000
-
-It was downloaded from:
-
- http://www.openmolar.com
-
-Upstream Author(s):
-
- Neil Wallace (rowinggolfer)
-
-Copyright:
-
- Copyright (C) 2009-2011 Neil Wallace
-
-License:
-
- This package is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This package is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this package; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-On Debian systems, the complete text of the GNU General
-Public License can be found in `/usr/share/common-licenses/GPL-3'.
-
-The Debian packaging is:
-
- Copyright C) 2009-2011, Neil Wallace <rowinggolfer at googlemail.com>
-
-and is licensed under the GPL, see above.
diff --git a/build_scripts/debian_packaging/dh_python2/debian/docs b/build_scripts/debian_packaging/dh_python2/debian/docs
deleted file mode 100644
index e845566..0000000
--- a/build_scripts/debian_packaging/dh_python2/debian/docs
+++ /dev/null
@@ -1 +0,0 @@
-README
diff --git a/build_scripts/debian_packaging/dh_python2/debian/rules b/build_scripts/debian_packaging/dh_python2/debian/rules
deleted file mode 100755
index dec3f11..0000000
--- a/build_scripts/debian_packaging/dh_python2/debian/rules
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/make -f
-%:
- dh $@ --buildsystem=python_distutils --with=python2
diff --git a/build_scripts/debian_packaging/dh_python2/debian/source/format b/build_scripts/debian_packaging/dh_python2/debian/source/format
deleted file mode 100644
index 163aaf8..0000000
--- a/build_scripts/debian_packaging/dh_python2/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (quilt)
diff --git a/build_scripts/debian_packaging/py_central/debian/changelog b/build_scripts/debian_packaging/py_central/debian/changelog
deleted file mode 100644
index 6b618b1..0000000
--- a/build_scripts/debian_packaging/py_central/debian/changelog
+++ /dev/null
@@ -1,555 +0,0 @@
-openmolar (0.4.09+bzr0843-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 28 Jun 2013 12:50:09 +0100
-
-
-openmolar (0.4.09+bzr0842-0~__DIST__0) __DIST__; urgency=low
-
- * upstream bugfix
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 28 Jun 2013 10:30:07 +0100
-
-
-openmolar (0.4.09+bzr0840-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 27 Jun 2013 00:02:55 +0100
-
-
-openmolar (0.4.07+bzr0839-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 26 Jun 2013 10:55:19 +0100
-
-
-openmolar (0.4.07+bzr0837-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 24 Jun 2013 16:14:26 +0100
-
-
-openmolar (0.4.06+bzr0836-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 24 Jun 2013 10:00:12 +0100
-
-
-openmolar (0.4.06+bzr0833-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 13 Jun 2013 22:29:04 +0100
-
-
-openmolar (0.4.06+bzr0832-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 13 Jun 2013 15:21:27 +0100
-
-
-openmolar (0.4.05+bzr0832-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 10 Jun 2013 13:40:57 +0100
-
-
-openmolar (0.4.04+bzr0831-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 10 Jun 2013 10:06:41 +0100
-
-
-openmolar (0.4.03+bzr0830-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 07 Jun 2013 12:45:39 +0100
-
-
-openmolar (0.4.02+bzr0829-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 04 Jun 2013 18:01:09 +0100
-
-
-openmolar (0.4.01+bzr0828-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 27 May 2013 22:06:47 +0100
-
-
-openmolar (0.4.0+bzr0827-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 27 May 2013 16:13:13 +0100
-
-
-openmolar (0.3.9+bzr0825-0~__DIST__0) __DIST__; urgency=low
-
- * upstream changes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 24 May 2013 10:50:41 +0100
-
-
-openmolar (0.3.9+bzr0824-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 23 May 2013 11:30:36 +0100
-
-
-openmolar (0.3.8+bzr0822-0~__DIST__0) __DIST__; urgency=low
-
- * reinstated address search when no relatives linked
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 21 May 2013 23:17:09 +0100
-
-
-openmolar (0.3.8+bzr0820-0~__DIST__0) __DIST__; urgency=low
-
- * bugfix for 0.3.8
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 21 May 2013 15:19:56 +0100
-
-
-openmolar (0.3.8+bzr0819-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 21 May 2013 11:23:42 +0100
-
-
-openmolar (0.3.7+bzr0818-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sat, 11 May 2013 00:09:22 +0100
-
-
-openmolar (0.3.7+bzr0816-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 30 Apr 2013 18:19:29 +0100
-
-
-openmolar (0.3.7+bzr0815-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 30 Apr 2013 16:41:13 +0100
-
-
-openmolar (0.3.6+bzr0814-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 25 Apr 2013 23:01:03 +0100
-
-
-openmolar (0.3.5+bzr0813-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 25 Apr 2013 00:27:49 +0100
-
-
-openmolar (0.3.5+bzr0812-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 25 Apr 2013 00:01:09 +0100
-
-
-openmolar (0.3.4+bzr0807-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 17 Apr 2013 20:59:59 +0100
-
-
-openmolar (0.3.3+bzr0805-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 04 Mar 2013 11:08:52 +0000
-
-
-openmolar (0.3.2+bzr0804-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 01 Mar 2013 13:34:46 +0000
-
-
-openmolar (0.3.2+bzr0802-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 28 Feb 2013 23:32:10 +0000
-
-
-openmolar (0.3.2+bzr0799-0~__DIST__0) __DIST__; urgency=low
-
- * bug fixes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 04 Feb 2013 12:23:50 +0000
-
-
-openmolar (0.3.2+bzr0798-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release (invokes a schema change)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sat, 02 Feb 2013 21:39:01 +0000
-
-
-openmolar (0.3.1+bzr0776-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 28 Oct 2012 19:59:14 +0000
-
-
-openmolar (0.3.1+bzr0775-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 26 Oct 2012 01:31:51 +0100
-
-
-openmolar (0.3.1+bzr0774-0~__DIST__0) __DIST__; urgency=low
-
- * upstream release
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 26 Oct 2012 00:21:08 +0100
-
-
-openmolar (0.3.0+bzr0773-0~__DIST__0) __DIST__; urgency=low
-
- * patched for python2.6
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 23 Oct 2012 14:25:30 +0100
-
-
-openmolar (0.3.0+bzr0772-0~__DIST__0) __DIST__; urgency=low
-
- * ability to edit today's notes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 22 Oct 2012 18:38:53 +0100
-
-
-openmolar (0.3.0+bzr0771-0~__DIST__0) __DIST__; urgency=low
-
- * re-introduced system date into the new formatted_notes
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 22 Oct 2012 10:28:49 +0100
-
-
-openmolar (0.3.0+bzr0770-0~__DIST__0) __DIST__; urgency=low
-
- * ui tweaks
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sat, 20 Oct 2012 01:50:13 +0100
-
-
-openmolar (0.2.3+bzr0769-0~__DIST__0) __DIST__; urgency=low
-
- * upstream tweak
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 19 Oct 2012 17:52:14 +0100
-
-
-openmolar (0.2.3+bzr0768-0~__DIST__0) __DIST__; urgency=low
-
- * New upstream version with a significant schema change
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 19 Oct 2012 17:36:08 +0100
-
-
-openmolar (0.2.2+bzr0766-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 03 Oct 2012 23:04:44 +0100
-
-
-openmolar (0.2.2+bzr0765-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 28 Sep 2012 12:31:40 +0100
-
-
-openmolar (0.2.2+bzr0763-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 19 Sep 2012 22:53:58 +0100
-
-
-openmolar (0.2.2+bzr0762-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 05 Aug 2012 09:44:22 +0100
-
-
-openmolar (0.2.2+bzr0761-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 05 Aug 2012 00:33:09 +0100
-
-
-openmolar (0.2.2+bzr0760-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sat, 04 Aug 2012 23:29:13 +0100
-
-
-openmolar (0.2.1+bzr0755-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (bzr 755)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 26 Jun 2012 17:42:46 +0100
-
-
-openmolar (0.2.1+bzr0754-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (bzr 754)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 26 Jun 2012 15:17:18 +0100
-
-
-openmolar (0.2.1+bzr0753-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (bzr 753)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 26 Jun 2012 12:37:18 +0100
-
-
-openmolar (0.2.1+bzr0752-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (bzr 752)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 26 Jun 2012 11:30:31 +0100
-
-
-openmolar (0.2.1+bzr0751-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (bzr 751)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 25 Jun 2012 23:21:04 +0100
-
-
-openmolar (0.2.1+bzr0750-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (bzr 750)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 25 Jun 2012 10:04:06 +0100
-
-
-openmolar (0.2.1+bzr0749-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (ability to specify dentist for recall)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 21 Jun 2012 18:27:16 +0100
-
-
-openmolar (0.2.1+bzr0748-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (uses **kwargs for connection, thus avoiding passing a blank dict in for ssl_settings)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 19 Jun 2012 23:36:24 +0100
-
-
-openmolar (0.2.1+bzr0746-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version (fixes the translation problem)
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 08 Jun 2012 13:36:06 +0100
-
-
-openmolar (0.2.1+bzr0745-0~__DIST__0) __DIST__; urgency=low
-
- * new upstream version
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 08 Jun 2012 09:34:02 +0100
-
-
-openmolar (0.2.1+bzr0744-1~__DIST__1) __DIST__; urgency=low
-
- * new lucid build using a local pbuilder
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 06 Jun 2012 14:04:15 +0100
-
-
-openmolar (0.2.1+bzr0744-0~__DIST__0) __DIST__; urgency=low
-
- * trial build
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 01 Jun 2012 14:06:38 +0100
-
-
-openmolar (0.2.0-8~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 722 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 19 Aug 2010 07:54:04 +0100
-
-openmolar (0.2.0-7~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 715 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 07 June 2010 11:55:40 +0100
-
-openmolar (0.2.0-6~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 715 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Mon, 07 June 2010 11:55:40 +0100
-
-openmolar (0.2.0-5~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 713 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 06 June 2010 10:25:39 +0100
-
-openmolar (0.2.0-4~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 711 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 03 June 2010 20:37:03 +0100
-
-openmolar (0.2.0-3~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 710 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 01 June 2010 22:36:29 +0100
-
-openmolar (0.2.0-2~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 707 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 01 June 2010 01:23:12 +0100
-
-openmolar (0.2.0-1~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 707 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 01 June 2010 01:23:12 +0100
-
-openmolar (0.2.0-0~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 707 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 01 June 2010 01:23:12 +0100
-
-openmolar (0.1.9-17~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 639 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 24 Mar 2010 13:27:53 +0000
-
-openmolar (0.1.9-16~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 637 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 24 Mar 2010 11:44:04 +0000
-
-openmolar (0.1.9-15~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 635 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 23 Mar 2010 14:19:28 +0000
-
-openmolar (0.1.9-14~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 635 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 23 Mar 2010 14:19:28 +0000
-
-openmolar (0.1.9-13~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 631 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 23 Mar 2010 01:12:50 +0000
-
-openmolar (0.1.9-12~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 604 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 02 Mar 2010 15:00:37 +0000
-
-openmolar (0.1.9-11~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 604 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 02 Mar 2010 15:00:37 +0000
-
-openmolar (0.1.9-10~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 604 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 02 Mar 2010 15:00:37 +0000
-
-openmolar (0.1.9-9~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 600 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 28 Feb 2010 11:10:34 +0000
-
-openmolar (0.1.9-8~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 600 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 28 Feb 2010 11:10:34 +0000
-
-openmolar (0.1.9-7~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 600 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Sun, 28 Feb 2010 11:10:34 +0000
-
-openmolar (0.1.9-6~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 597 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Fri, 26 Feb 2010 02:12:25 +0000
-
-openmolar (0.1.9-5~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 589 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 17 Feb 2010 03:10:27 +0000
-
-openmolar (0.1.9-4~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 589 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Wed, 17 Feb 2010 03:10:27 +0000
-
-openmolar (0.1.9-3~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 580 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Thu, 11 Feb 2010 13:22:02 +0000
-
-openmolar (0.1.9-2~__DIST__1) __DIST__; urgency=low
-
- * as per bzr version 575 see https://launchpad.net/openmolar for details
-
- -- Neil Wallace <rowinggolfer at googlemail.com> Tue, 09 Feb 2010 12:23:19 +0000
diff --git a/build_scripts/debian_packaging/py_central/debian/compat b/build_scripts/debian_packaging/py_central/debian/compat
deleted file mode 100644
index 7f8f011..0000000
--- a/build_scripts/debian_packaging/py_central/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-7
diff --git a/build_scripts/debian_packaging/py_central/debian/control b/build_scripts/debian_packaging/py_central/debian/control
deleted file mode 100644
index d84b85d..0000000
--- a/build_scripts/debian_packaging/py_central/debian/control
+++ /dev/null
@@ -1,19 +0,0 @@
-Source: openmolar
-Section: misc
-Priority: extra
-Maintainer: Neil Wallace <rowinggolfer at googlemail.com>
-Build-Depends: cdbs (>=0.4.49), debhelper (>= 5), python-central (>=0.5.6), python
-XS-Python-Version: >=2.5
-Standards-Version: 3.8.0
-Homepage: https://launchpad.net/openmolar
-
-Package: openmolar-orig
-Architecture: all
-Depends: ${misc:Depends}, ${python:Depends}, python-qt4 (>=4.4.0), python-mysqldb, xdg-utils
-Replaces: openmolar
-XB-Python-Version: ${python:Versions}
-Description: Dental Practice Management Software
- see https://launchpad.net/openmolar for project description and links
- .
- irc channel (for devs and users) is #openmolar on freenode.net
-
diff --git a/build_scripts/debian_packaging/py_central/debian/copyright b/build_scripts/debian_packaging/py_central/debian/copyright
deleted file mode 100644
index c971a8e..0000000
--- a/build_scripts/debian_packaging/py_central/debian/copyright
+++ /dev/null
@@ -1,40 +0,0 @@
-This package was debianized by:
-
- Neil Wallace <rowinggolfer at googlemail.com> on Tues, 1 Jun 2010 01:20:09 +0100
-
-It was downloaded from:
-
- https://launchpad.net/openmolar
-
-Upstream Author(s):
-
- Neil Wallace (rowinggolfer)
-
-Copyright:
-
- Copyright (C) 2009 Neil Wallace
-
-License:
-
- This package is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This package is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this package; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-On Debian systems, the complete text of the GNU General
-Public License can be found in `/usr/share/common-licenses/GPL-3'.
-
-The Debian packaging is:
-
- Copyright C) 2009, Neil Wallace <rowinggolfer at googlemail.com>
-
-and is licensed under the GPL, see above.
diff --git a/build_scripts/debian_packaging/py_central/debian/docs b/build_scripts/debian_packaging/py_central/debian/docs
deleted file mode 100644
index e845566..0000000
--- a/build_scripts/debian_packaging/py_central/debian/docs
+++ /dev/null
@@ -1 +0,0 @@
-README
diff --git a/build_scripts/debian_packaging/py_central/debian/files b/build_scripts/debian_packaging/py_central/debian/files
deleted file mode 100644
index f806733..0000000
--- a/build_scripts/debian_packaging/py_central/debian/files
+++ /dev/null
@@ -1 +0,0 @@
-<openmolar-orig>.deb misc extra
diff --git a/build_scripts/debian_packaging/py_central/debian/pycompat b/build_scripts/debian_packaging/py_central/debian/pycompat
deleted file mode 100644
index 0cfbf08..0000000
--- a/build_scripts/debian_packaging/py_central/debian/pycompat
+++ /dev/null
@@ -1 +0,0 @@
-2
diff --git a/build_scripts/debian_packaging/py_central/debian/rules b/build_scripts/debian_packaging/py_central/debian/rules
deleted file mode 100755
index 528517d..0000000
--- a/build_scripts/debian_packaging/py_central/debian/rules
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/make -f
-
-DEB_PYTHON_SYSTEM=pycentral
-
-include /usr/share/cdbs/1/rules/debhelper.mk
-include /usr/share/cdbs/1/class/python-distutils.mk
-
-# Add here any variable or target overrides you need.
diff --git a/build_scripts/get_git_branch.py b/build_scripts/get_git_branch.py
index 53579c8..8422e28 100755
--- a/build_scripts/get_git_branch.py
+++ b/build_scripts/get_git_branch.py
@@ -1,4 +1,27 @@
-#! /usr/bin/python
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
'''
usage is:
'get_git_branch.py' to return the repo working directory
@@ -14,7 +37,7 @@ userdir = os.path.expanduser("~")
file_path = os.path.abspath(os.curdir)
if not file_path.startswith(userdir):
- sys.exit("command not run from a subdirectory of %s"% userdir)
+ sys.exit("command not run from a subdirectory of %s" % userdir)
try:
repo = git.Repo(file_path)
@@ -33,4 +56,5 @@ elif "main" in sys.argv:
else:
print (repo.working_dir)
-sys.exit(0)
+if __name__ == "__main__":
+ sys.exit(0)
diff --git a/build_scripts/get_version.py b/build_scripts/get_version.py
deleted file mode 100755
index b68715c..0000000
--- a/build_scripts/get_version.py
+++ /dev/null
@@ -1,13 +0,0 @@
-#! /usr/bin/env python
-
-import os
-import sys
-
-base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-
-sys.path.insert(0, os.path.join(base_dir, "src"))
-
-from openmolar.settings.version import VERSION
-
-if __name__ == "__main__":
- print (VERSION)
diff --git a/src/openmolar/qt-designer/om_pyuic4.py b/build_scripts/om_pyuic4.py
similarity index 51%
rename from src/openmolar/qt-designer/om_pyuic4.py
rename to build_scripts/om_pyuic4.py
index 7060d84..f007b58 100755
--- a/src/openmolar/qt-designer/om_pyuic4.py
+++ b/build_scripts/om_pyuic4.py
@@ -1,4 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
Use this in preference to pyuic4, because it adapts the files to utilise
@@ -17,16 +39,16 @@ logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("om_pyuic4")
-## can be switched off so generated files are not executable
+# can be switched off so generated files are not executable
MAKE_EX = True
-## change the commented line if you want all redone!!
+# change the commented line if you want all redone!!
CHANGED_ONLY = True
if "ALL" in sys.argv:
CHANGED_ONLY = False
REMOVALS = [
-'''try:
+ '''try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
@@ -37,40 +59,41 @@ except AttributeError:
]
REPLACEMENT1 = (
-"import resources_rc",
-"from openmolar.qt4gui import resources_rc"
+ "import resources_rc",
+ "from openmolar.qt4gui import resources_rc"
)
REPLACEMENT2 = (
-'''if __name__ == "__main__":
+ '''if __name__ == "__main__":
''',
-'''if __name__ == "__main__":
+ '''if __name__ == "__main__":
import gettext
gettext.install("openmolar")
''')
def translate_middle(match):
- return '_(%s)'% match.groups()[0].strip(" ")
+ return '_(%s)' % match.groups()[0].strip(" ")
+
def compile_ui(ui_fname, outdir=""):
if outdir == "":
outdir = os.path.dirname(ui_fname)
name = os.path.basename(ui_fname)
- outname = "Ui_%s.py"% name.rstrip(".ui")
+ outname = "Ui_%s.py" % name.rstrip(".ui")
pyfile = os.path.join(outdir, outname)
- logger.info("compiling %s"% ui_fname)
+ logger.info("compiling %s" % ui_fname)
try:
- f = open(pyfile,"w")
- uic.compileUi(ui_fname, f, execute=MAKE_EX)
- except IOError: #ui has been removed by git?
+ f = open(pyfile, "w")
+ uic.compileUi(ui_fname, f, execute=MAKE_EX)
+ except IOError: # ui has been removed by git?
pass
- finally:
+ finally:
f.close()
- f = open(pyfile,"r")
+ f = open(pyfile, "r")
data = f.read()
f.close()
@@ -79,7 +102,7 @@ def compile_ui(ui_fname, outdir=""):
newdata = newdata.replace(removal, "")
newdata = re.sub('_translate\(".*?", (".*?"), None\)', translate_middle,
- newdata, 0, re.DOTALL)
+ newdata, 0, re.DOTALL)
orig, new = REPLACEMENT1
newdata = newdata.replace(orig, new)
@@ -88,8 +111,8 @@ def compile_ui(ui_fname, outdir=""):
orig, new = REPLACEMENT2
newdata = newdata.replace(orig, new)
- #some hacks for 4.5/4.6 compatibility
- #newdata = newdata.replace('setShowSortIndicator',"setSortIndicatorShown")
+ # some hacks for 4.5/4.6 compatibility
+ # newdata = newdata.replace('setShowSortIndicator',"setSortIndicatorShown")
if newdata != data:
f = open(pyfile, "w")
@@ -100,12 +123,14 @@ def compile_ui(ui_fname, outdir=""):
return pyfile
+
def get_changed_ui_files(repo):
files = repo.git.status("--porcelain")
for file_ in files.split("\n"):
- if re.match(".*.ui$", file_):
+ if re.match(".*.ui$", file_):
yield file_[3:]
+
def get_all_ui_files(dirname):
for ui_file in os.listdir(dirname):
if re.match(".*.ui$", ui_file):
diff --git a/build_scripts/update_messages.py b/build_scripts/update_messages.py
new file mode 100755
index 0000000..19b3b5c
--- /dev/null
+++ b/build_scripts/update_messages.py
@@ -0,0 +1,53 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+'''
+get all translatable strings into a single messages.pot
+requires pygettext available on the command line - i.e. NOT windows friendly.
+'''
+
+import os
+import subprocess
+from get_git_branch import module_path
+
+def source_files():
+
+ for root, dir_, files in os.walk(module_path):
+ for file_ in files:
+ if file_.endswith('.py'):
+ yield os.path.abspath(os.path.join(root, file_))
+
+
+def main():
+ files = list(source_files())
+ print "%d py files found" % len(files)
+ outdir = os.path.join(module_path, "openmolar", "locale")
+ print "using pygettext to create messages.pot in directory %s"% outdir
+ pr = subprocess.Popen(["pygettext", "-p", outdir] + files)
+ pr.wait()
+ print "ALL DONE!"
+
+if __name__ == "__main__":
+
+ main()
diff --git a/build_scripts/version_name.py b/build_scripts/version_name.py
deleted file mode 100755
index e84ea15..0000000
--- a/build_scripts/version_name.py
+++ /dev/null
@@ -1,42 +0,0 @@
-#! /usr/bin/env python
-
-'''
-read a changelog, and get the package name
-
-parses a changelog with this 1st line
-"openmolar-namespace (2.0.5+hg007-2~unstable0) unstable; urgency=low"
-
-usage python version_name.py [DEBFOLDER]
-
-output is "openmolar-namespace_2.0.5+hg007"
-'''
-
-
-import os
-import re
-import sys
-
-try:
- debian_directory = sys.argv[1]
-except IndexError:
- sys.exit("version_name script called with no arguments")
-
-if not os.path.isdir(debian_directory):
- sys.exit("'%s' is not a directory"% debian_directory)
-
-filepath = os.path.join(debian_directory, "changelog")
-
-try:
- f = open(filepath)
- data = f.read()
- f.close()
-
- matches = re.match("(.*) \((.*)-", data).groups()
-
- debname = "%s_%s"% (matches[0], matches[1])
-
- print (debname)
-
-except:
- sys.exit("unable to parse changelog %s"% filepath)
-
diff --git a/openmolar b/openmolar
index 17420dc..020b3ee 100755
--- a/openmolar
+++ b/openmolar
@@ -1,11 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from openmolar import main
diff --git a/openmolar.spec b/openmolar.spec
deleted file mode 100644
index 79701cc..0000000
--- a/openmolar.spec
+++ /dev/null
@@ -1,41 +0,0 @@
-%define name openmolar
-%define version 0.1.9
-%define unmangled_version 0.1.9
-%define release 1
-
-Summary: Open Source Dental Practice Management Software
-Name: %{name}
-Version: %{version}
-Release: %{release}
-Source0: %{name}-%{unmangled_version}.tar.gz
-License: GPL v3
-Group: Office
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
-Prefix: %{_prefix}
-BuildArch: noarch
-BuildRequires: python-devel, -post-build-checks
-Requires: PyQt4, MySQL-python
-Vendor: Neil Wallace <rowinggolfer at googlemail.com>
-Url: https://launchpad.net/openmolar
-
-%description
-Dental Practice Management Suite, using a Mysql database server to maintain patient records, accounts, and correspondence.
-
-%prep
-%setup -n %{name}-%{unmangled_version}
-
-%build
-python setup.py build
-
-%install
-python setup.py install --prefix=/usr --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-
-%files -f INSTALLED_FILES
-%defattr(-,root,root)
-
-%changelog
-* Sun Feb 7 2010 rowinggolfer at googlemail.com
-- packaged openmolar version 0.1.9
diff --git a/setup.py b/setup.py
index e4c3ad5..1232ac2 100755
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,34 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+'''
+distutils script for openmolar1.
+see https://docs.python.org/2/distutils/configfile.html for explanation
+'''
from distutils.command.install_data import install_data
+from distutils.command.sdist import sdist as _sdist
from distutils.core import setup
from distutils.dep_util import newer
from distutils.log import info
@@ -8,59 +36,102 @@ from distutils.log import info
import glob
import os
import re
+import shutil
import sys
-
OM_PATH = os.path.join(os.path.abspath(os.path.dirname(__file__)), "src")
sys.path.insert(0, OM_PATH)
-# quieten down the logger!
-sys.argv.append("-q")
-from openmolar.settings.localsettings import VERSION
+
+from openmolar.settings import version
+
+VERSION = version.VERSION
+
+
+class sdist(_sdist):
+
+ '''
+ overwrite distutils standard source code builder to remove
+ extraneous code from version.py
+ '''
+ version_filepath = re.sub("\.pyc$", ".py", version.__file__)
+ backup_version_filepath = version_filepath + "_orig"
+
+ def run(self, *args, **kwargs):
+ self.tear_down()
+ _sdist.run(self, *args, **kwargs)
+ self.clean_up()
+
+ def tear_down(self):
+ print "rewriting version.py"
+ f = open(self.version_filepath, "r")
+ new_data = ""
+ add_line = True
+ for line_ in f:
+ if line_.startswith("VERSION ="):
+ print "Forcing version number of '%s'" % VERSION
+ new_data += 'VERSION = "%s"\n\n\n' % VERSION
+ add_line = False
+ elif line_.startswith("if __name__"):
+ add_line = True
+ if add_line:
+ new_data += line_
+
+ shutil.move(self.version_filepath, self.backup_version_filepath)
+ f = open(self.version_filepath, "w")
+ f.write(new_data)
+ f.close()
+
+ def clean_up(self):
+ os.remove(self.version_filepath)
+ shutil.move(self.backup_version_filepath, self.version_filepath)
+
class InstallData(install_data):
- def run(self):
- self.data_files.extend(self._compile_po_files())
- install_data.run(self)
- def _compile_po_files(self):
+ '''
+ re-implement class distutils.install_data install_data
+ compile binary translation files for gettext
+ '''
+
+ def run(self):
print "COMPILING PO FILES"
i18nfiles = []
if not os.path.isdir("src/openmolar/locale/"):
print "WARNING - language files are missing!"
- for po in glob.glob("src/openmolar/locale/*.po"):
- directory, file = os.path.split(po)
- lang = file.replace(".po","")
- mo = os.path.join(directory, lang)
+ for po_file in glob.glob("src/openmolar/locale/*.po"):
+ directory, file_ = os.path.split(po_file)
+ lang = file_.replace(".po", "")
+ mo_dir = os.path.join(directory, lang)
try:
- os.mkdir(mo)
+ os.mkdir(mo_dir)
except OSError:
pass
- mo = os.path.join(mo, "openmolar.mo")
- if not os.path.exists(mo) or newer(po, mo):
- cmd = 'msgfmt -o %s %s' % (mo, po)
- info ('compiling %s -> %s' % (po, mo))
+ mo_file = os.path.join(mo_dir, "openmolar.mo")
+ if not os.path.exists(mo_file) or newer(po_file, mo_file):
+ cmd = 'msgfmt -o %s %s' % (mo_file, po_file)
+ info('compiling %s -> %s' % (po_file, mo_file))
if os.system(cmd) != 0:
- info('Error while running msgfmt on %s'% po)
+ info('Error while running msgfmt on %s' % po_file)
- destdir = os.path.join ("/usr","share", "locale", lang,
- "LC_MESSAGES")
+ destdir = os.path.join("/usr", "share", "locale", lang,
+ "LC_MESSAGES")
- i18nfiles.append((destdir, [mo]))
- return i18nfiles
+ i18nfiles.append((destdir, [mo_file]))
+
+ self.data_files.extend(i18nfiles)
+ install_data.run(self)
-if os.path.isfile("MANIFEST"):
- os.unlink("MANIFEST")
setup(
- name = 'openmolar',
- version = VERSION,
- description = 'Open Source Dental Practice Management Software',
- author = 'Neil Wallace',
- author_email = 'rowinggolfer at googlemail.com',
- url = 'https://launchpad.net/openmolar',
- license = 'GPL v3',
- package_dir = {'openmolar' : 'src/openmolar'},
- packages = ['openmolar',
+ name='openmolar',
+ version=VERSION,
+ description='Open Source Dental Practice Management Software',
+ author='Neil Wallace',
+ author_email='neil at openmolar.com',
+ url='https://www.openmolar.com',
+ license='GPL v3',
+ package_dir={'openmolar': 'src/openmolar'},
+ packages=['openmolar',
'openmolar.backports',
'openmolar.dbtools',
'openmolar.schema_upgrades',
@@ -79,20 +150,22 @@ setup(
'openmolar.qt4gui.tools',
'openmolar.settings',
'openmolar.ptModules'],
- package_data = {'openmolar' : ['resources/icons/*.*',
- 'resources/teeth/*.png',
- 'resources/gp17/*.jpg',
- 'resources/gp17-1/*.png',
- 'resources/feescales/*.xml',
- 'resources/feescales/*.xsd',
- 'resources/phrasebook/*.*',
- 'resources/*.*',
- 'html/*.*',
- 'html/images/*.*',
- 'html/firstrun/*.*',] },
- data_files = [
+ package_data={'openmolar': ['resources/icons/*.*',
+ 'resources/teeth/*.png',
+ 'resources/gp17/*.jpg',
+ 'resources/gp17-1/*.png',
+ 'resources/feescales/*.xml',
+ 'resources/feescales/*.xsd',
+ 'resources/phrasebook/*.*',
+ 'resources/*.*',
+ 'html/*.*',
+ 'html/images/*.*',
+ 'html/firstrun/*.*', ]},
+ data_files=[
+ ('/usr/share/man/man1', ['bin/openmolar.1']),
('/usr/share/icons/hicolor/scalable/apps', ['bin/openmolar.svg']),
- ('/usr/share/applications', ['bin/openmolar.desktop']),],
- cmdclass = {'install_data': InstallData},
- scripts = ['openmolar'],
- )
+ ('/usr/share/applications', ['bin/openmolar.desktop']), ],
+ cmdclass={'sdist': sdist,
+ 'install_data': InstallData},
+ scripts=['openmolar'],
+)
diff --git a/src/openmolar/GPLv3.txt b/src/openmolar/GPLv3.txt
index 131e828..94a9ed0 100644
--- a/src/openmolar/GPLv3.txt
+++ b/src/openmolar/GPLv3.txt
@@ -1,191 +1,674 @@
-
-
-GNU GENERAL PUBLIC LICENSE
-
-Version 3, 29 June 2007
-
-Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
-
-Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
-Preamble
-
-The GNU General Public License is a free, copyleft license for software and other kinds of works.
-
-The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it [...]
-
-When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
-
-To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
-
-For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
-
-Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
-
-For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
-
-Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If [...]
-
-Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
-
-The precise terms and conditions for copying, distribution and modification follow.
-TERMS AND CONDITIONS
-0. Definitions.
-
-“This License” refers to version 3 of the GNU General Public License.
-
-“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
-
-“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
-
-To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
-
-A “covered work” means either the unmodified Program or a work based on the Program.
-
-To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
-
-To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
-
-An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominen [...]
-1. Source Code.
-
-The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
-
-A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
-
-The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window syst [...]
-
-The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes int [...]
-
-The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
-
-The Corresponding Source for a work in source code form is that same work.
-2. Basic Permissions.
-
-All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
-
-You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you mus [...]
-
-Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
-3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
-
-When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
-4. Conveying Verbatim Copies.
-
-You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
-
-You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
-5. Conveying Modified Source Versions.
-
-You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
-
- * a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
- * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
- * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
- * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
-
-A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregat [...]
-6. Conveying Non-Source Forms.
-
-You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
-
- * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
- * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software inte [...]
- * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
- * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying f [...]
- * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
-
-A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
-
-A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the [...]
-
-“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
-
-If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neithe [...]
-
-The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
-
-Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
-7. Additional Terms.
-
-“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License [...]
-
-When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
-
-Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
-
- * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
- * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
- * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
- * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
- * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
- * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
-
-All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license [...]
-
-If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
-
-Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
-8. Termination.
-
-You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
-
-However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
-
-Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
-
-Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
-9. Acceptance Not Required for Having Copies.
-
-You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you in [...]
-10. Automatic Licensing of Downstream Recipients.
-
-Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
-
-An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source o [...]
-
-You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
-11. Patents.
-
-A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.
-
-A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a [...]
-
-Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
-
-In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
-
-If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent w [...]
-
-If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
-
-A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and un [...]
-
-Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
-12. No Surrender of Others' Freedom.
-
-If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to [...]
-13. Use with the GNU Affero General Public License.
-
-Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination [...]
-14. Revised Versions of this License.
-
-The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
-
-If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
-
-Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
-15. Disclaimer of Warranty.
-
-THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE C [...]
-16. Limitation of Liability.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WIT [...]
-17. Interpretation of Sections 15 and 16.
-
-If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
-
-END OF TERMS AND CONDITIONS
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/src/openmolar/__init__.py b/src/openmolar/__init__.py
index 3eda4a5..f61f321 100755
--- a/src/openmolar/__init__.py
+++ b/src/openmolar/__init__.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import os
import sys
@@ -27,14 +29,14 @@ import gettext
if "neil" in os.path.expanduser("~"):
FORMAT = \
- '%(levelname)s {%(filename)s:%(lineno)d} %(funcName)s - %(message)s'
+ '%(levelname)s {%(filename)s:%(lineno)d} %(funcName)s - %(message)s'
else:
FORMAT = '%(levelname)s - %(message)s'
stream_handler = logging.StreamHandler()
formatter = logging.Formatter(FORMAT)
stream_handler.setFormatter(formatter)
-#logging.basicConfig(level = logging.INFO, format=FORMAT)
+# logging.basicConfig(level = logging.INFO, format=FORMAT)
LOGGER = logging.getLogger("openmolar")
LOGGER.addHandler(stream_handler)
@@ -46,20 +48,18 @@ elif "-v" in sys.argv:
else:
LOGGER.setLevel(logging.INFO)
-LOGGER.debug("running openmolar base module = %s"% os.path.dirname(__file__))
+LOGGER.debug("running openmolar base module = %s" % os.path.dirname(__file__))
lang = os.environ.get("LANG")
if lang:
try:
- LOGGER.debug("trying to install your environment language", lang)
- lang1 = gettext.translation('openmolar', languages=[lang,])
+ LOGGER.debug("trying to install your environment language %s" % lang)
+ lang1 = gettext.translation('openmolar', languages=[lang, ])
lang1.install(unicode=True)
except IOError:
- LOGGER.warning("%s not found, using default"% lang)
+ LOGGER.warning("%s not found, using default" % lang)
gettext.install('openmolar', unicode=True)
else:
#-- on windows.. os.environ.get("LANG") is None
- LOGGER("no language environment found")
+ LOGGER.warning("no language environment found (windows?)")
gettext.install('openmolar', unicode=True)
-
-
diff --git a/src/openmolar/backports/__init__.py b/src/openmolar/backports/__init__.py
index 72c1670..7d372c5 100644
--- a/src/openmolar/backports/__init__.py
+++ b/src/openmolar/backports/__init__.py
@@ -1 +1,25 @@
-from ordered_dict import OrderedDict
\ No newline at end of file
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+from ordered_dict import OrderedDict
diff --git a/src/openmolar/backports/ordered_dict.py b/src/openmolar/backports/ordered_dict.py
index 5b3b199..33c3ab3 100644
--- a/src/openmolar/backports/ordered_dict.py
+++ b/src/openmolar/backports/ordered_dict.py
@@ -1,4 +1,27 @@
#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
'''
Ordered Dict came in python 2.7 and 3.1
@@ -7,6 +30,7 @@ taken from http://code.activestate.com/recipes/576669/
from collections import MutableMapping
+
class OrderedDict(dict, MutableMapping):
# Methods with direct access to underlying attributes
diff --git a/src/openmolar/backports/printed_form.py b/src/openmolar/backports/printed_form.py
index 8f80e52..b9a05ee 100644
--- a/src/openmolar/backports/printed_form.py
+++ b/src/openmolar/backports/printed_form.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
Provides a Class for printing on an A4 Sheet
@@ -32,7 +34,9 @@ from openmolar.settings import localsettings
LOGGER = logging.getLogger("openmolar")
+
class PrintedForm(object):
+
'''
a class to set up and print an a4 form
'''
@@ -40,7 +44,7 @@ class PrintedForm(object):
print_background = False
rects = {}
- off_set = QtCore.QPoint(0,0)
+ off_set = QtCore.QPoint(0, 0)
scale_x = 1
scale_y = 1
@@ -69,7 +73,7 @@ class PrintedForm(object):
'''
offsets all printing by x,y
'''
- self.off_set = QtCore.QPointF(x,y)
+ self.off_set = QtCore.QPointF(x, y)
def set_scaling(self, scale_x, scale_y):
'''
@@ -108,7 +112,7 @@ class PrintedForm(object):
note - this functions return the active painter so that classes which
inherit from PrintedForm can finalise the printing.
'''
- LOGGER.info("printing to %s"% self.chosen_printer.printerName())
+ LOGGER.info("printing to %s" % self.chosen_printer.printerName())
if painter is None:
painter = QtGui.QPainter(self.chosen_printer)
@@ -119,7 +123,7 @@ class PrintedForm(object):
painter.translate(
-self.printer.pageRect().x(),
-self.printer.pageRect().y()
- )
+ )
painter.drawPixmap(self.printer.paperRect(), pm, pm.rect())
painter.restore()
@@ -127,16 +131,16 @@ class PrintedForm(object):
LOGGER.warning("background image is null")
painter.translate(self.off_set)
- LOGGER.info("translating form by %s"% self.off_set)
+ LOGGER.info("translating form by %s" % self.off_set)
painter.scale(self.scale_x, self.scale_y)
- LOGGER.info("scaling output by %s x %s"% (self.scale_x, self.scale_y))
+ LOGGER.info("scaling output by %s x %s" % (self.scale_x, self.scale_y))
- if self.testing_mode: #outline the boxes
+ if self.testing_mode: # outline the boxes
painter.save()
painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
painter.setBrush(QtGui.QBrush(QtCore.Qt.black))
- painter.drawRect(0,0,20,5)
- painter.drawRect(0,0,5,20)
+ painter.drawRect(0, 0, 20, 5)
+ painter.drawRect(0, 0, 5, 20)
painter.restore()
# put down a marker at position 0 (for alignment purposes)
@@ -151,13 +155,12 @@ class PrintedForm(object):
if __name__ == "__main__":
import os
- os.chdir(os.path.expanduser("~")) # for print to file
+ os.chdir(os.path.expanduser("~")) # for print to file
app = QtGui.QApplication([])
form = PrintedForm()
form.testing_mode = True
- form.rects = {"test":QtCore.QRect(100,100,100,100)}
+ form.rects = {"test": QtCore.QRect(100, 100, 100, 100)}
form.controlled_print()
-
diff --git a/src/openmolar/connect.py b/src/openmolar/connect.py
index 4b3f1f6..0b4e4fc 100755
--- a/src/openmolar/connect.py
+++ b/src/openmolar/connect.py
@@ -1,11 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009-2013 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''this module has one purpose... provide a connection to the mysqldatabase
using 3rd party MySQLdb module'''
@@ -43,7 +58,7 @@ for command_node in command_nodes:
for command in commands:
command_list.append(command.firstChild.data)
if command_list:
- LOGGER.info("executing"% str(command_list))
+ LOGGER.info("executing %s" % str(command_list))
subprocess.Popen(command_list)
myHost = xmlnode.getElementsByTagName("location")[0].firstChild.data
@@ -58,20 +73,21 @@ if settingsversion == "1.1":
myDb = xmlnode.getElementsByTagName("dbname")[0].firstChild.data
+
def database_name():
- return "%s %s:%s"% (myDb, myHost, myPort)
+ return "%s %s:%s" % (myDb, myHost, myPort)
kwargs = {
- "host":myHost,
- "port":myPort,
- "user":myUser,
- "passwd":myPassword,
- "db":myDb,
- "use_unicode":True,
- "charset":"utf8"
- }
-
-if sslnode and sslnode[0].firstChild.data=="True":
+ "host": myHost,
+ "port": myPort,
+ "user": myUser,
+ "passwd": myPassword,
+ "db": myDb,
+ "use_unicode": True,
+ "charset": "utf8"
+}
+
+if sslnode and sslnode[0].firstChild.data == "True":
#-- to enable ssl... add <ssl>True</ssl> to the conf file
LOGGER.debug("using ssl")
#-- note, dictionary could have up to 5 params.
@@ -88,10 +104,13 @@ ProgrammingError = MySQLdb.ProgrammingError
IntegrityError = MySQLdb.IntegrityError
OperationalError = MySQLdb.OperationalError
+
class omSQLresult(object):
+
'''
a class used in returning the result of sql queries
'''
+
def __init__(self):
self.message = ""
self.number = 0
@@ -128,6 +147,7 @@ class omSQLresult(object):
'''
return self.number
+
def connect():
'''
returns a MySQLdb object, connected to the database specified in the
@@ -140,7 +160,7 @@ def connect():
if not (mainconnection and mainconnection.open):
LOGGER.info("New database connection needed")
LOGGER.debug(
- "connecting to %s on %s port %s"% (myDb, myHost, myPort))
+ "connecting to %s on %s port %s" % (myDb, myHost, myPort))
mainconnection = MySQLdb.connect(**kwargs)
mainconnection.autocommit(True)
@@ -164,19 +184,19 @@ if __name__ == "__main__":
LOGGER.setLevel(logging.DEBUG)
- LOGGER.debug("using conffile - %s"% localsettings.cflocation)
+ LOGGER.debug("using conffile - %s" % localsettings.cflocation)
for i in range(1, 11):
try:
LOGGER.debug("connecting....")
dbc = connect()
LOGGER.info(dbc.info())
LOGGER.debug('ok... we can make Mysql connections!!')
- LOGGER.debug(" loop no %d "% i)
+ LOGGER.debug(" loop no %d " % i)
if i == 2:
- #close the db... let's check it reconnects
+ # close the db... let's check it reconnects
dbc.close()
if i == 4:
- #make a slightly bad query... let's check we get a warning
+ # make a slightly bad query... let's check we get a warning
c = dbc.cursor()
c.execute(
'update patients set dob="196912091" where serialno=4')
diff --git a/src/openmolar/createdemodatabase.py b/src/openmolar/createdemodatabase.py
index 3c2b9ef..75aa53e 100644
--- a/src/openmolar/createdemodatabase.py
+++ b/src/openmolar/createdemodatabase.py
@@ -1,14 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 2 of the License, or
-# version 3 of the License, or (at your option) any later version. It is
-# provided for educational purposes and is distributed in the hope that
-# it will be useful, but WITHOUT ANY WARRANTY; without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
-# the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module takes the demo dump and creates a database from it with the
@@ -17,30 +29,31 @@ correct user permissions.
import MySQLdb
import os
-from openmolar.settings import localsettings
+from openmolar.settings import localsettings
+
def create_database(myhost, myport, myuser, mypassword, databaseName,
-rootMySQLpassword):
+ rootMySQLpassword):
#-- connect as mysqlroot to create the database
db = MySQLdb.connect(
- host = myhost, port=myport, user="root", passwd=rootMySQLpassword)
+ host=myhost, port=myport, user="root", passwd=rootMySQLpassword)
cursor = db.cursor()
try:
print "deleting any existing openmolar_demo database....",
- print cursor.execute("DROP DATABASE IF EXISTS %s"% databaseName)
+ print cursor.execute("DROP DATABASE IF EXISTS %s" % databaseName)
except:
print "non found... skipping"
pass
print "creating database...",
- print cursor.execute("CREATE DATABASE %s"% databaseName)
-
+ print cursor.execute("CREATE DATABASE %s" % databaseName)
+
#-- note for production deployments, only grant
#-- select,insert,update,delete privileges
- query = 'GRANT ALL PRIVILEGES ON %s.* TO %s@%s IDENTIFIED BY "%s"'% (
- databaseName, myuser, myhost, mypassword)
- print "setting privileges for '%s'"% myuser
+ query = 'GRANT ALL PRIVILEGES ON %s.* TO %s@%s IDENTIFIED BY "%s"' % (
+ databaseName, myuser, myhost, mypassword)
+ print "setting privileges for '%s'" % myuser
cursor.execute(query)
cursor.close()
db.commit()
@@ -48,14 +61,15 @@ rootMySQLpassword):
print "db created sucessfully"
return True
+
def loadTables(myhost, myport, myuser, mypassword, databaseName):
wkdir = localsettings.determine_path()
- f = open(os.path.join(wkdir,"resources","demodump.sql"),"r")
+ f = open(os.path.join(wkdir, "resources", "demodump.sql"), "r")
dumpString = f.read()
f.close()
print myhost, myport, myuser, databaseName, mypassword
- db = MySQLdb.connect(host = myhost, port = myport,
- user = myuser, db = databaseName, passwd = mypassword)
+ db = MySQLdb.connect(host=myhost, port=myport,
+ user=myuser, db=databaseName, passwd=mypassword)
cursor = db.cursor()
cursor.execute(dumpString)
@@ -67,7 +81,7 @@ def loadTables(myhost, myport, myuser, mypassword, databaseName):
if __name__ == "__main__":
rootpass = raw_input("please enter your MySQL root users password :")
if create_database("localhost", 3306, "OMuser", "password",
- "openmolar_demo", rootpass):
+ "openmolar_demo", rootpass):
print "New database created sucessfully"
loadTables("localhost", 3306, "OMuser", "password", "openmolar_demo")
diff --git a/src/openmolar/dbtools/__init__.py b/src/openmolar/dbtools/__init__.py
index e69de29..c701215 100755
--- a/src/openmolar/dbtools/__init__.py
+++ b/src/openmolar/dbtools/__init__.py
@@ -0,0 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/openmolar/dbtools/accounts.py b/src/openmolar/dbtools/accounts.py
index d83c642..3f43597 100644
--- a/src/openmolar/dbtools/accounts.py
+++ b/src/openmolar/dbtools/accounts.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
module to retrieve a list of patients who owe money
@@ -13,6 +29,7 @@ module to retrieve a list of patients who owe money
from openmolar.settings import localsettings
from openmolar.connect import connect
+
def details():
'''
get all patients owing money where the debt has not been written off
@@ -28,7 +45,7 @@ def details():
cursor.execute(query)
rows = cursor.fetchall()
cursor.close()
- #db.close()
+ # db.close()
return rows
if __name__ == "__main__":
diff --git a/src/openmolar/dbtools/appointments.py b/src/openmolar/dbtools/appointments.py
index 3e4bf16..76c1b96 100755
--- a/src/openmolar/dbtools/appointments.py
+++ b/src/openmolar/dbtools/appointments.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import datetime
import logging
@@ -15,12 +31,15 @@ from openmolar.connect import (connect,
LOGGER = logging.getLogger("openmolar")
+
class FreeSlot(object):
+
'''
a custom data object to represent a slot
(ie. a free space in dentists book)
'''
is_slot = True
+
def __init__(self, date_time=None, dent=0, length=0):
self.dent = dent
self.date_time = date_time
@@ -50,32 +69,36 @@ class FreeSlot(object):
def __lt__(self, other):
return self.date_time < other.date_time
+
def __le__(self, other):
return self.date_time <= other.date_time
+
def __eq__(self, other):
try:
return self.__dict__ == other.__dict__
except AttributeError:
return False
+
def __ne__(self, other):
return self.__dict__ != other.__dict__
+
def __gt__(self, other):
return self.date_time > other.date_time
+
def __ge__(self, other):
return self.date_time >= other.date_time
def __repr__(self):
- return "%s , dent %s, %s mins SLOT"% (self.date_time, self.dent,
+ return "%s , dent %s, %s mins SLOT" % (self.date_time, self.dent,
self.length)
-
def wait_time(self, appt1_length, appt2_length, slot):
'''
how long would a patient be kept waiting?
this is a complex bit of logic!!!!
'''
- #step one get appointment bounds
+ # step one get appointment bounds
appt1_earliest_start = self.date_time
appt1_latest_start = \
@@ -91,19 +114,19 @@ class FreeSlot(object):
slot.date_time + datetime.timedelta(minutes=appt2_length)
appt2_latest_finish = slot.finish_time
- #step two - calcuate wait times.
+ # step two - calcuate wait times.
# appt1 first
max_wait = appt2_latest_start - appt1_earliest_finish
min_wait = appt2_earliest_start - appt1_latest_finish
waiting_time = None
if min_wait.days == 0:
- waiting_time = min_wait.seconds//60
- else: # minimum wait is negative!!
+ waiting_time = min_wait.seconds // 60
+ else: # minimum wait is negative!!
if max_wait.days == 0:
waiting_time = 0
- #if waiting_time == 0:
+ # if waiting_time == 0:
# return waiting_time
# appt2 first
@@ -112,19 +135,19 @@ class FreeSlot(object):
other_waiting_time = None
if min_wait.days == 0:
- other_waiting_time = min_wait.seconds//60
- else: # minimum wait is negative!!
+ other_waiting_time = min_wait.seconds // 60
+ else: # minimum wait is negative!!
if max_wait.days == 0:
other_waiting_time = 0
- #print "EARLIEST APPT 1 ", appt1_earliest_start, appt1_earliest_finish
- #print "LATEST APPT 1 ", appt1_latest_start, appt1_latest_finish
- #print "EARLIEST APPT 2 ", appt2_earliest_start, appt2_earliest_finish
- #print "LATEST APPT 2 ", appt2_latest_start, appt2_latest_finish
- #print "MIN WAIT ", min_wait
- #print "MAX WAIT ", max_wait
- #print "WAITING TIME IF APPT1 first = %s MINUTES"% waiting_time
- #print "WAITING TIME IF APPT2 first = %s MINUTES"% other_waiting_time
+ # print "EARLIEST APPT 1 ", appt1_earliest_start, appt1_earliest_finish
+ # print "LATEST APPT 1 ", appt1_latest_start, appt1_latest_finish
+ # print "EARLIEST APPT 2 ", appt2_earliest_start, appt2_earliest_finish
+ # print "LATEST APPT 2 ", appt2_latest_start, appt2_latest_finish
+ # print "MIN WAIT ", min_wait
+ # print "MAX WAIT ", max_wait
+ # print "WAITING TIME IF APPT1 first = %s MINUTES"% waiting_time
+ # print "WAITING TIME IF APPT2 first = %s MINUTES"% other_waiting_time
if waiting_time == other_waiting_time:
# print "waiting_time == other_waiting_time"
@@ -142,7 +165,6 @@ class FreeSlot(object):
# print "else"
return other_waiting_time
-
def best_joint(self, appt1_length, appt2_length, slots):
'''
the idea here is a list of slots is checked and the best one returned
@@ -150,7 +172,7 @@ class FreeSlot(object):
returns a tuple (best_slot, wait)
'''
chosen_slot = None
- chosen_wait = 60*24 # number of minutes in a day!
+ chosen_wait = 60 * 24 # number of minutes in a day!
for slot in slots:
wait = self.wait_time(appt1_length, appt2_length, slot)
@@ -160,14 +182,18 @@ class FreeSlot(object):
return (chosen_slot, chosen_wait)
+
class AgendaAppointment(FreeSlot):
text = ""
is_slot = False
+
def __repr__(self):
- return "%s , dent %s, %s mins %s"% (self.date_time, self.dent,
+ return "%s , dent %s, %s mins %s" % (self.date_time, self.dent,
self.length, self.text)
+
class WeekViewAppointment(object):
+
'''
a custom data object to contain data relevant to the painting of
the appointment_overviewwidget
@@ -187,25 +213,33 @@ class WeekViewAppointment(object):
def __lt__(self, other):
return self.mpm < other.mpm
+
def __le__(self, other):
return self.mpm <= other.mpm
+
def __eq__(self, other):
return self.mpm == other.mpm
+
def __ne__(self, other):
return self.mpm != other.mpm
+
def __gt__(self, other):
return self.mpm > other.mpm
+
def __ge__(self, other):
return self.mpm >= other.mpm
def __repr__(self):
- return "WeekViewAppointment.%s %s %d mins past midnight for %d mins"% (
- self.name, self.cset, self.mpm, self.length)
+ return "WeekViewAppointment.%s %s %d mins past midnight for %d mins" % (
+ self.name, self.cset, self.mpm, self.length)
+
class APR_Appointment(object):
+
'''
a class to hold data about a patient's appointment
'''
+
def __init__(self):
self.serialno = 0
self.aprix = 0
@@ -228,11 +262,11 @@ class APR_Appointment(object):
@property
def dent_inits(self):
- return localsettings.apptix_reverse.get(self.dent,"?")
+ return localsettings.apptix_reverse.get(self.dent, "?")
@property
def readableDate(self):
- #return localsettings.readableDate(self.date)
+ # return localsettings.readableDate(self.date)
return localsettings.formatDate(self.date)
@property
@@ -241,7 +275,7 @@ class APR_Appointment(object):
@property
def treatment(self):
- return "%s %s %s"% (self.trt1, self.trt2, self.trt3)
+ return "%s %s %s" % (self.trt1, self.trt2, self.trt3)
@property
def unscheduled(self):
@@ -262,16 +296,16 @@ class APR_Appointment(object):
@property
def html(self):
- return "%s %s with %s for %s"% (self.readableTime,
+ return "%s %s with %s for %s" % (self.readableTime,
self.readableDate, self.dent_inits, self.treatment)
def __repr__(self):
- return "serialno=%s %s scheduled=%s dent=%s trt=%s length= %s ix=%s"%(
- self.serialno, self.date, not self.unscheduled, self.dent_inits,
- self.trt1, self.length, self.aprix)
+ return "serialno=%s %s scheduled=%s dent=%s trt=%s length= %s ix=%s" % (
+ self.serialno, self.date, not self.unscheduled, self.dent_inits,
+ self.trt1, self.length, self.aprix)
def __cmp__(self, other):
- eq = type(self) == type(other)
+ eq = isinstance(self, type(other))
if eq:
for key in self.__dict__.keys():
if self.__dict__[key] != other.__dict__[key]:
@@ -282,12 +316,15 @@ class APR_Appointment(object):
else:
return 1
+
class DaySummary(object):
+
'''
a data structure to hold just summary data for a day
'''
+
def __init__(self):
- self.date = datetime.date(1900,1,1)
+ self.date = datetime.date(1900, 1, 1)
self.earliest_start = 2359
self.latest_end = 0
self.workingDents = ()
@@ -308,7 +345,7 @@ class DaySummary(object):
self.endTimes = {}
self.earliest_start = 2359
self.latest_end = 0
- self.memo = "%s %s"% (localsettings.readableDate(date), self.header())
+ self.memo = "%s %s" % (localsettings.readableDate(date), self.header())
for dent in getWorkingDents(self.date):
self.memos[dent.ix] = dent.memo
@@ -323,7 +360,9 @@ class DaySummary(object):
self.latest_end = dent.end
self.workingDents = tuple(workingDents)
+
class DayAppointmentData(DaySummary):
+
'''
a data structure to hold all data for a day
'''
@@ -340,10 +379,10 @@ class DayAppointmentData(DaySummary):
retarg = ""
bh = getBankHol(self.date)
if bh != "":
- retarg += " <i>'%s'</i>"% bh
+ retarg += " <i>'%s'</i>" % bh
gm = getGlobalMemo(self.date)
if gm != "":
- retarg += " - %s"% gm
+ retarg += " - %s" % gm
return retarg
def getMemo(self, dent):
@@ -380,7 +419,7 @@ class DayAppointmentData(DaySummary):
working_dents = []
for dent in localsettings.activedents + localsettings.activehygs:
apptix = localsettings.apptix[dent]
- if dents=="ALL" or apptix in dents:
+ if dents == "ALL" or apptix in dents:
working_dents.append(apptix)
if dents != "ALL":
@@ -405,7 +444,7 @@ class DayAppointmentData(DaySummary):
return slots for this day
'''
slotlist = []
- if dents == None:
+ if dents is None:
dents = self.workingDents
for dent in dents:
@@ -414,7 +453,7 @@ class DayAppointmentData(DaySummary):
for app in self.dentAppointments(dent):
if (not ignore_emergency or
not(app[4] == 0 and app[3].lower() == "emergency")
- ):
+ ):
appt_times_list.append((app[1], app[2]))
if appt_times_list:
slotlist += slots(self.date, dent, self.getStart(dent),
@@ -422,7 +461,9 @@ class DayAppointmentData(DaySummary):
return getLengthySlots(slotlist, minlength)
+
class DentistDay():
+
'''
a small class to store data about a dentist's day
'''
@@ -434,13 +475,13 @@ class DentistDay():
def __init__(self, apptix=0):
self.date = datetime.date.today()
self.ix = apptix
- self.initials = localsettings.apptix_reverse.get(apptix,"???")
- #a boolean showing if day is in use? (stored as a tiny int though)
+ self.initials = localsettings.apptix_reverse.get(apptix, "???")
+ # a boolean showing if day is in use? (stored as a tiny int though)
def __repr__(self):
- retarg = "DentistDay %s %s %s %s - %s '%s'"% (
- self.initials, "IN" if self.flag else "FALSE",
- self.date, self.start, self.end, self.memo)
+ retarg = "DentistDay %s %s %s %s - %s '%s'" % (
+ self.initials, "IN" if self.flag else "FALSE",
+ self.date, self.start, self.end, self.memo)
return retarg
def length(self):
@@ -449,7 +490,7 @@ class DentistDay():
'''
time1 = localsettings.minutesPastMidnight(self.start)
time2 = localsettings.minutesPastMidnight(self.end)
- return time2-time1
+ return time2 - time1
@property
def start_mpm(self):
@@ -461,9 +502,11 @@ class DentistDay():
class PrintableAppointment():
+
'''
a class to store data used when printing a daylist
'''
+
def __init__(self):
self.start = 0
self.end = 0
@@ -487,32 +530,32 @@ class PrintableAppointment():
arg2="Wallace N"
'''
name = arg2
- if name == None:
+ if name is None:
name = arg1
- if name != None and self.serialno != 0:
+ if name is not None and self.serialno != 0:
name = name.title()
- if name != None:
+ if name is not None:
self.name = name
def setSerialno(self, arg):
'''
set serialno
'''
- if arg != None:
+ if arg is not None:
self.serialno = arg
def setTreat(self, arg):
'''
set what is planned for the appointment
'''
- if arg != None:
+ if arg is not None:
self.treat = arg.strip()
def setCset(self, arg):
'''
cset is the TYPE of patient (P,N,I....)
'''
- if arg != None:
+ if arg is not None:
self.cset = arg
def length(self):
@@ -521,10 +564,10 @@ class PrintableAppointment():
'''
time1 = localsettings.minutesPastMidnight(self.start)
time2 = localsettings.minutesPastMidnight(self.end)
- return time2-time1
+ return time2 - time1
def __repr__(self):
- return "%s %s %s %s %s %s %s %s"% (self.start, self.end, self.name,
+ return "%s %s %s %s %s %s %s %s" % (self.start, self.end, self.name,
self.serialno, self.treat, self.note, self.cset, self.length())
@@ -543,7 +586,7 @@ class AgendaData(object):
length = (localsettings.minutesPastMidnight(appt[2]) -
localsettings.minutesPastMidnight(appt[1]))
ag_appt = AgendaAppointment(date_time, dent, length)
- ag_appt.text = "%s %s %s %s %s %s"% appt[3:9]
+ ag_appt.text = "%s %s %s %s %s %s" % appt[3:9]
self._items.append(ag_appt)
def add_slot(self, slot):
@@ -559,14 +602,14 @@ class AgendaData(object):
def to_html(self):
text = '''<html><head><link rel="stylesheet"
href="%s" type="text/css"></head>
- <body><ul>'''% localsettings.stylesheet
+ <body><ul>''' % localsettings.stylesheet
for item in self.items(self):
if self._active_slot and item == self._active_slot:
- text += '<li class="active_slot">%s</li>'% item
+ text += '<li class="active_slot">%s</li>' % item
elif item.is_slot:
- text += '<li class="slot">%s</li>'% item
+ text += '<li class="slot">%s</li>' % item
else:
- text += "<li>%s</li>"% item
+ text += "<li>%s</li>" % item
return text + "</ul></body></html>"
@@ -590,8 +633,8 @@ def slots(adate, apptix, start, apdata, fin):
for ap in apdata:
sMin = localsettings.minutesPastMidnight(ap[0])
fMin = localsettings.minutesPastMidnight(ap[1])
- slength = sMin-aptstart
- if slength > 0:
+ slength = sMin - aptstart
+ if slength > 0:
date_time = datetime.datetime.combine(adate,
localsettings.minutesPastMidnightToPyTime(aptstart))
@@ -603,7 +646,7 @@ def slots(adate, apptix, start, apdata, fin):
if aptstart >= dayfin:
break
- slength = dayfin-aptstart
+ slength = dayfin - aptstart
if slength > 0:
date_time = datetime.datetime.combine(adate,
localsettings.minutesPastMidnightToPyTime(aptstart))
@@ -613,6 +656,7 @@ def slots(adate, apptix, start, apdata, fin):
return results
+
def getLengthySlots(slots, length):
'''
sort through the list of slots, and filter out those with inadequate length
@@ -640,7 +684,7 @@ def updateAday(uddate, arg):
update memo=%s, adate=%s, apptix=%s, start=%s, end=%s, flag=%s'''
values = (arg.memo, uddate, arg.apptix, arg.sqlStart(), arg.sqlFinish(),
- arg.active)*2
+ arg.active) * 2
result.setNumber(cursor.execute(query, values))
@@ -648,6 +692,7 @@ def updateAday(uddate, arg):
db.commit()
return result
+
def alterDay(arg):
'''
takes a DentistDay object tries to change the aday table
@@ -658,8 +703,8 @@ def alterDay(arg):
db = connect()
cursor = db.cursor()
result = omSQLresult()
- query = 'SELECT flag FROM aday WHERE adate="%s" and apptix=%d'% (
- arg.date, arg.apptix)
+ query = 'SELECT flag FROM aday WHERE adate="%s" and apptix=%d' % (
+ arg.date, arg.apptix)
if cursor.execute(query):
#-- dentists diary includes this date
@@ -668,24 +713,25 @@ def alterDay(arg):
values = (arg.start, arg.end, arg.flag, arg.memo, arg.date,
arg.ix)
- result.setNumber(cursor.execute(query,values))
+ result.setNumber(cursor.execute(query, values))
if result.getNumber() == 1:
result.setMessage("Date sucessfully modified")
else:
result.setMessage(
- "No changes applied - the values you supplied " + \
- "are the same as the existing.")
+ "No changes applied - the values you supplied " +
+ "are the same as the existing.")
db.commit()
else:
- result.setMessage("The date you have tried to modify is " + \
- "beyond the dates opened for dentist %s"%(
- localsettings.ops.get(arg.ix),))
+ result.setMessage("The date you have tried to modify is " +
+ "beyond the dates opened for dentist %s" % (
+ localsettings.ops.get(arg.ix),))
return result
+
def todays_patients(dents):
'''
get todays patients for dents supplied as a tuple such as (4,5)
@@ -696,14 +742,14 @@ def todays_patients(dents):
cursor = db.cursor()
if 0 in dents:
- cond=""
+ cond = ""
values = (localsettings.currentDay(),)
else:
- cond = "and (" + "apptix=%s or " * (len(dents)-1) + "apptix=%s )"
+ cond = "and (" + "apptix=%s or " * (len(dents) - 1) + "apptix=%s )"
values = (localsettings.currentDay(),) + dents
query = 'SELECT serialno,name FROM aslot WHERE adate=%s ' + cond + \
- ' and serialno!=0 ORDER BY name'
+ ' and serialno!=0 ORDER BY name'
cursor.execute(query, values)
rows = cursor.fetchall()
@@ -723,21 +769,21 @@ def getWorkingDents(adate, dents=(0,), include_non_working=True):
cond = "AND apptix != 0 "
values = (adate,)
else:
- cond = "and (" + "apptix=%s or " * (len(dents)-1) + "apptix=%s ) "
+ cond = "and (" + "apptix=%s or " * (len(dents) - 1) + "apptix=%s ) "
values = (adate,) + dents
if not include_non_working:
cond += " AND (flag=1 or flag=2)"
query = 'SELECT apptix,start,end,memo,flag FROM aday WHERE adate=%s ' \
- + cond
+ + cond
cursor.execute(query, values)
rows = cursor.fetchall()
cursor.close()
- ##originally I just return the rows here...
+ # originally I just return the rows here...
for apptix, start, end, memo, flag in rows:
d_day = DentistDay(apptix)
d_day.start = start
@@ -754,7 +800,7 @@ def getAllClinicians(adate):
wds = list(getWorkingDents(adate))
start = DentistDay.start
end = DentistDay.end
- for wd in wds:
+ for wd in wds:
if start < wd.start:
start = wd.start
if end > wd.end:
@@ -762,7 +808,7 @@ def getAllClinicians(adate):
for dent in localsettings.activedent_ixs + localsettings.activehyg_ixs:
found = False
- for wd in wds:
+ for wd in wds:
found = wd.ix == dent
if found:
yield wd
@@ -772,7 +818,7 @@ def getAllClinicians(adate):
yield d_day
-def getDayInfo(startdate, enddate, dents=() ):
+def getDayInfo(startdate, enddate, dents=()):
'''
get any day memo's for a range of dents and tuple of dentists
if month = 0, return all memos for the given year
@@ -781,7 +827,7 @@ def getDayInfo(startdate, enddate, dents=() ):
'''
dents = (0,) + dents
- cond = "and (" + "apptix=%s or " * (len(dents)-1) + "apptix=%s ) "
+ cond = "and (" + "apptix=%s or " * (len(dents) - 1) + "apptix=%s ) "
query = '''SELECT adate, apptix, start, end, memo, flag FROM aday
WHERE adate>=%s AND adate<%s ''' + cond
@@ -797,19 +843,20 @@ def getDayInfo(startdate, enddate, dents=() ):
cursor.close()
data = {}
for adate, apptix, start, end, memo, flag in rows:
- key = "%d%02d"% (adate.month, adate.day)
+ key = "%d%02d" % (adate.month, adate.day)
dent = DentistDay(apptix)
dent.start = start
dent.end = end
dent.memo = memo
dent.flag = bool(flag)
- if data.has_key(key):
+ if key in data:
data[key].append(dent)
else:
data[key] = [dent]
return data
+
def getBankHol(adate):
'''
get Bank Hol for one specific date
@@ -826,12 +873,13 @@ def getBankHol(adate):
rows = cursor.fetchall()
cursor.close()
for row in rows:
- retarg += "%s "% row
- except ProgrammingError, e:
- #in case their is no bank holiday table.
- retarg = "couldn't get Bank Holiday details"
+ retarg += "%s " % row
+ except ProgrammingError as e:
+ # in case their is no bank holiday table.
+ retarg = "couldn't get Bank Holiday details"
return retarg
+
def getGlobalMemo(date):
'''
get global memo for one specific date
@@ -848,9 +896,10 @@ def getGlobalMemo(date):
retarg = ""
for row in rows:
- retarg += "%s "% row
+ retarg += "%s " % row
return retarg
+
def getBankHols(startdate, enddate):
'''
useage is getBankHols(pydate,pydate)
@@ -870,12 +919,13 @@ def getBankHols(startdate, enddate):
cursor.close()
for row in rows:
- key = "%d%02d"% (row[0].month, row[0].day)
+ key = "%d%02d" % (row[0].month, row[0].day)
data[key] = row[1]
- except ProgrammingError, e:
+ except ProgrammingError as e:
print "couldn't get Bank Holiday details"
return data
+
def setMemos(adate, memos):
'''
updates the aday table with memos
@@ -895,6 +945,7 @@ def setMemos(adate, memos):
cursor.execute(query, values)
cursor.close()
+
def get_appt_note(sno, adate, atime, dentist):
db = connect()
cursor = db.cursor()
@@ -910,6 +961,7 @@ def get_appt_note(sno, adate, atime, dentist):
note = rows[0][0]
return (note, True)
+
def set_appt_note(sno, adate, atime, dentist, note):
db = connect()
cursor = db.cursor()
@@ -923,6 +975,7 @@ def set_appt_note(sno, adate, atime, dentist, note):
cursor.close()
db.commit()
+
def setPubHol(adate, arg):
'''
updates the aday table with memos
@@ -950,21 +1003,22 @@ def allAppointmentData(adate, dents=()):
if dents == ():
cond = ""
else:
- cond = "and (" + "apptix=%s or " * (len(dents)-1) + "apptix=%s ) "
+ cond = "and (" + "apptix=%s or " * (len(dents) - 1) + "apptix=%s ) "
db = connect()
cursor = db.cursor()
query = '''select apptix,start,end,name,serialno,code0,
code1,code2,note,flag0,flag1,flag2,flag3, timestamp from aslot
where adate=%s'''
- query += " %s order by apptix, start"% cond
- cursor.execute(query, (adate,)+dents)
+ query += " %s order by apptix, start" % cond
+ cursor.execute(query, (adate,) + dents)
data = cursor.fetchall()
cursor.close()
return data
+
def convertResults(results):
'''
changes
@@ -989,6 +1043,7 @@ def convertResults(results):
return tuple(aptlist)
+
def printableDaylistData(adate, dent):
'''
gets start,finish and booked appointments for this date
@@ -1008,14 +1063,14 @@ def printableDaylistData(adate, dent):
#--dentist is working!!
#--add any memo
retlist.append(daydata[0][2])
- dayend=daydata[0][1]
+ dayend = daydata[0][1]
#--now get data for those days so that we can find slots within
query = '''SELECT start,end,name,
concat(patients.title," ",patients.fname," ",patients.sname),
patients.serialno,concat(code0," ",code1," ",code2),note,patients.cset
FROM patients right join aslot on patients.serialno=aslot.serialno
WHERE adate = %s and apptix = %s order by start'''
- cursor.execute(query,values)
+ cursor.execute(query, values)
results = cursor.fetchall()
@@ -1025,7 +1080,7 @@ def printableDaylistData(adate, dent):
pa = PrintableAppointment()
pa.start = row[0]
pa.end = row[1]
- pa.setSerialno(row[4]) #--do this BEFORE setting name
+ pa.setSerialno(row[4]) # --do this BEFORE setting name
pa.setName(row[2], row[3])
pa.setTreat(row[5])
pa.note = row[6]
@@ -1034,7 +1089,7 @@ def printableDaylistData(adate, dent):
#--either a gap or a double appointment
extra = PrintableAppointment()
extra.start = current_apttime
- extra.end = pa.start #for length calc
+ extra.end = pa.start # for length calc
retlist.append(extra)
retlist.append(pa)
if current_apttime < pa.end:
@@ -1046,9 +1101,10 @@ def printableDaylistData(adate, dent):
retlist.append(last_pa)
cursor.close()
- #db.close()
+ # db.close()
return retlist
+
def day_summary(adate, dent):
'''
gets start,finish and booked appointments for this date
@@ -1069,7 +1125,7 @@ def day_summary(adate, dent):
if daydata != ():
query = ('SELECT start, end, serialno, name, char(flag1), '
'concat(code0, " ", code1," ", code2) FROM aslot '
- 'WHERE adate = %s and apptix = %s AND flag0!=-128 '
+ 'WHERE adate = %s and apptix = %s AND flag0!=-128 '
'ORDER BY start')
cursor.execute(query, values)
results = cursor.fetchall()
@@ -1077,6 +1133,7 @@ def day_summary(adate, dent):
cursor.close()
return retarg
+
def getBlocks(adate, dent):
'''
get emergencies and blocked bits for date,dent
@@ -1104,6 +1161,7 @@ def getBlocks(adate, dent):
return retarg
+
def getLunch(gbdate, dent):
'''
get lunchtime for date,dent
@@ -1123,6 +1181,7 @@ def getLunch(gbdate, dent):
return convertResults(results)
+
def clearEms(cedate):
'''
a convenience function to remove all EMERGENCY apointments
@@ -1133,16 +1192,16 @@ def clearEms(cedate):
number = 0
try:
query = \
- 'delete from aslot WHERE adate=%s and flag0=%s and name like %s'
+ 'delete from aslot WHERE adate=%s and flag0=%s and name like %s'
values = (cedate, -128, "%Emergency%")
number = cursor.execute(query, values)
db.commit()
- except Exception, ex:
+ except Exception as ex:
print "exception in appointments module, clearEms"
print ex
cursor.close()
- #db.close()
+ # db.close()
return number
@@ -1162,18 +1221,16 @@ def get_pts_appts(pt, printing=False):
if printing:
query += "and adate>=date(NOW())"
-
- #why is aprix added to the sort here? concat of NULL and NULL led to
- #occasional irregularities
-
+ # why is aprix added to the sort here? concat of NULL and NULL led to
+ # occasional irregularities
query += 'order by concat(adate, lpad(atime,4,0)), aprix'
- ## - table also contains flag0,flag1,flag2,flag3,flag4,
+ # - table also contains flag0,flag1,flag2,flag3,flag4,
cursor.execute(query, sno)
rows = cursor.fetchall()
- #return rows
+ # return rows
data = []
cursor.close()
for row in rows:
@@ -1196,6 +1253,7 @@ def get_pts_appts(pt, printing=False):
return data
+
def has_unscheduled(serialno):
'''
return a boolean as to whether the patient has unscheduled appointments
@@ -1207,9 +1265,10 @@ def has_unscheduled(serialno):
rows = cursor.fetchall()
cursor.close()
result = rows[0][0] != 0
- LOGGER.debug ("appointments.has_unscheduled is returning %s"% result)
+ LOGGER.debug("appointments.has_unscheduled is returning %s" % result)
return result
+
def add_pt_appt(serialno, practix, length, code0, aprix=-1, code1="", code2="",
note="", datespec="", ctype="P", flag0=1, flag2=0, flag3=0, flag4=0):
'''
@@ -1217,19 +1276,19 @@ def add_pt_appt(serialno, practix, length, code0, aprix=-1, code1="", code2="",
'''
#--if the patients course type isn't present,
#--we will have issues later
- if ctype == "" or ctype == None:
+ if ctype == "" or ctype is None:
flag1 = 32
else:
flag1 = ord(ctype[0])
- if code0 == None:
+ if code0 is None:
code0 = ""
- if code1 == None:
+ if code1 is None:
code1 = ""
- if code2 == None:
+ if code2 is None:
code2 = ""
- if note == None:
+ if note is None:
note = ""
- if datespec == None:
+ if datespec is None:
datespec = ""
db = connect()
@@ -1237,13 +1296,13 @@ def add_pt_appt(serialno, practix, length, code0, aprix=-1, code1="", code2="",
try:
if aprix == -1:
#--this means put the appointment at the end
- fullquery = 'SELECT max(aprix) FROM apr WHERE serialno=%d'% serialno
+ fullquery = 'SELECT max(aprix) FROM apr WHERE serialno=%d' % serialno
cursor.execute(fullquery)
data = cursor.fetchall()
currentMax = data[0][0]
if currentMax:
- aprix = currentMax+1
+ aprix = currentMax + 1
else:
aprix = 1
@@ -1258,13 +1317,14 @@ def add_pt_appt(serialno, practix, length, code0, aprix=-1, code1="", code2="",
db.commit()
result = aprix
- except Exception, ex:
+ except Exception as ex:
print "exception in appointments.add_pt_appt ", ex
result = False
cursor.close()
- #db.close()
+ # db.close()
return result
+
def modify_pt_appt(aprix, serialno, practix, length, code0, code1="",
code2="", note="", datespec="", flag1=80, flag0=1, flag2=0, flag3=0, flag4=0):
'''
@@ -1273,24 +1333,25 @@ code2="", note="", datespec="", flag1=80, flag0=1, flag2=0, flag3=0, flag4=0):
db = connect()
cursor = db.cursor()
changes = '''practix=%d,code0="%s",code1="%s",code2="%s",note="%s",
- length=%d,flag0=%d,flag1=%d,flag2=%d,flag3=%d,flag4=%d,datespec="%s"'''% (
- practix,code0,code1,code2,note,length,flag0,flag1,flag2,flag3,
- flag4,datespec)
+ length=%d,flag0=%d,flag1=%d,flag2=%d,flag3=%d,flag4=%d,datespec="%s"''' % (
+ practix, code0, code1, code2, note, length, flag0, flag1, flag2, flag3,
+ flag4, datespec)
- fullquery = 'update apr set %s where serialno=%d and aprix=%d'% (
- changes,serialno,aprix)
+ fullquery = 'update apr set %s where serialno=%d and aprix=%d' % (
+ changes, serialno, aprix)
result = True
try:
cursor.execute(fullquery)
db.commit()
- except Exception, ex:
+ except Exception as ex:
print "exception in appointments.modify_pt_appt ", ex
result = False
cursor.close()
- #db.close()
+ # db.close()
return result
+
def pt_appt_made(serialno, aprix, date, time, dent):
'''
modifies the apr table, finding the unscheduled version and
@@ -1301,17 +1362,18 @@ def pt_appt_made(serialno, aprix, date, time, dent):
result = True
try:
fullquery = '''UPDATE apr SET adate="%s" ,atime=%d, practix=%d
- WHERE serialno=%d AND aprix=%d'''% (date, time, dent, serialno, aprix)
+ WHERE serialno=%d AND aprix=%d''' % (date, time, dent, serialno, aprix)
cursor.execute(fullquery)
db.commit()
- except Exception, ex:
+ except Exception as ex:
print "exception in appointments.pt_appt_made ", ex
result = False
cursor.close()
- #db.close()
+ # db.close()
return result
+
def make_appt(make_date, apptix, start, end, name, serialno, code0, code1,
code2, note, flag0, flag1, flag2, flag3):
'''
@@ -1333,8 +1395,8 @@ code2, note, flag0, flag1, flag2, flag3):
try:
result = cursor.execute(query, values)
except OperationalError as exc:
- LOGGER.exception("couldn't insert into aslot %s %s %s serialno %d"% (
- make_date,apptix,start,serialno))
+ LOGGER.exception("couldn't insert into aslot %s %s %s serialno %d" % (
+ make_date, apptix, start, serialno))
cursor.close()
return result
@@ -1354,10 +1416,11 @@ def cancel_emergency_slot(a_date, apptix, a_start, a_end):
values = (a_date, apptix, a_start, a_end)
rows = cursor.execute(query, values)
- LOGGER.warning("deleted %d emergency slots"% rows)
+ LOGGER.warning("deleted %d emergency slots" % rows)
cursor.close()
- return rows>0
+ return rows > 0
+
def fill_appt(bldate, apptix, start, end, bl_start, bl_end, reason, pt):
'''
@@ -1367,7 +1430,7 @@ def fill_appt(bldate, apptix, start, end, bl_start, bl_end, reason, pt):
#- 1st check the block is free
slots = future_slots(bldate, bldate, (apptix,))
- date_time = datetime.datetime.combine(bldate,start)
+ date_time = datetime.datetime.combine(bldate, start)
block_length = (localsettings.pyTimeToMinutesPastMidnight(end) -
localsettings.pyTimeToMinutesPastMidnight(start))
@@ -1383,7 +1446,7 @@ def fill_appt(bldate, apptix, start, end, bl_start, bl_end, reason, pt):
if not found:
return False
- name = "%s %s *"% (pt.fname, pt.sname)
+ name = "%s %s *" % (pt.fname, pt.sname)
try:
cset = ord(pt.cset[0])
except:
@@ -1401,6 +1464,7 @@ def fill_appt(bldate, apptix, start, end, bl_start, bl_end, reason, pt):
return pt_appt_made(pt.serialno, aprix,
bldate, localsettings.pyTimetoWystime(bl_start), apptix)
+
def block_appt(bldate, apptix, start, end, bl_start, bl_end, reason):
'''
put a block in the book, with text set as reason
@@ -1408,7 +1472,7 @@ def block_appt(bldate, apptix, start, end, bl_start, bl_end, reason):
#- 1st check the block is free
slots = future_slots(bldate, bldate, (apptix,))
- date_time = datetime.datetime.combine(bldate,start)
+ date_time = datetime.datetime.combine(bldate, start)
block_length = (localsettings.pyTimeToMinutesPastMidnight(end) -
localsettings.pyTimeToMinutesPastMidnight(start))
@@ -1439,13 +1503,14 @@ def block_appt(bldate, apptix, start, end, bl_start, bl_end, reason):
db.commit()
result = True
else:
- print "couldn't insert into aslot %s %s %s"% (
- bldate,apptix,start)
+ print "couldn't insert into aslot %s %s %s" % (
+ bldate, apptix, start)
result = False
cursor.close()
- #db.close()
+ # db.close()
return result
+
def modify_aslot_appt(moddate, apptix, start, serialno, code0, code1, code2,
note, flag1, flag0, flag2, flag3):
'''
@@ -1454,27 +1519,28 @@ note, flag1, flag0, flag2, flag3):
db = connect()
cursor = db.cursor()
changes = '''code0="%s",code1="%s",code2="%s",note="%s",flag0=%d,
- flag1=%d,flag2=%d,flag3=%d'''% (
- code0,code1,code2,note,flag0,flag1,flag2,flag3)
+ flag1=%d,flag2=%d,flag3=%d''' % (
+ code0, code1, code2, note, flag0, flag1, flag2, flag3)
query = '''update aslot set %s where adate=%%s and apptix=%%s
- and start=%%s and serialno=%%s'''% changes
+ and start=%%s and serialno=%%s''' % changes
values = (moddate, apptix, start, serialno)
try:
cursor.execute(query, values)
db.commit()
result = True
- except Exception, ex:
+ except Exception as ex:
print "exception in appointments.modify_aslot_appt ", ex
- print "couldn't modify aslot %s %s %s serialno %d"% (
- moddate, apptix, start, serialno)
+ print "couldn't modify aslot %s %s %s serialno %d" % (
+ moddate, apptix, start, serialno)
result = False
cursor.close()
- #db.close()
+ # db.close()
return result
+
def delete_appt_from_apr(appt):
'''
this deletes an appointment from the apr table
@@ -1488,12 +1554,12 @@ def delete_appt_from_apr(appt):
query += 'AND aprix=%s'
values.append(appt.aprix)
else:
- if appt.date == None:
+ if appt.date is None:
query += ' and adate is NULL'
else:
query += ' and adate =%s'
values.append(appt.date)
- if appt.atime == None:
+ if appt.atime is None:
query += ' and atime is NULL'
else:
query += ' and atime =%s'
@@ -1502,12 +1568,13 @@ def delete_appt_from_apr(appt):
try:
result = cursor.execute(query, tuple(values))
db.commit()
- except Exception, ex:
+ except Exception as ex:
print "exception in appointments.delete_appt_from_apr ", ex
cursor.close()
return result
+
def made_appt_to_proposed(appt):
'''
modifies the apr table, when an appointment has been postponed,
@@ -1521,7 +1588,7 @@ def made_appt_to_proposed(appt):
adate=%s and practix=%s and atime=%s '''
values = (appt.serialno, appt.date, appt.dent, appt.atime)
if not cursor.execute(query, values):
- LOGGER.warning("unable to get aprix from apr for %s"% appt)
+ LOGGER.warning("unable to get aprix from apr for %s" % appt)
return False
appt.aprix = cursor.fetchone()[0]
@@ -1549,7 +1616,7 @@ def delete_appt_from_aslot(appt):
try:
query = '''DELETE FROM aslot WHERE adate=%s AND serialno=%s
AND apptix=%s AND start=%s'''
- values = (appt.date, appt.serialno, appt.dent, appt.atime)
+ values = (appt.date, appt.serialno, appt.dent, appt.atime)
if cursor.execute(query, values):
result = True
except Exception as ex:
@@ -1575,7 +1642,7 @@ def future_slots(startdate, enddate, dents, override_emergencies=False):
for dent in dents:
mystr += "apptix=%s or "
values.append(dent)
- mystr = mystr[0:mystr.rindex(" or")]+")"
+ mystr = mystr[0:mystr.rindex(" or")] + ")"
if override_emergencies:
emer_sql = ' and name!="emergency" '
@@ -1584,7 +1651,7 @@ def future_slots(startdate, enddate, dents, override_emergencies=False):
fullquery = '''SELECT adate, apptix, start, end FROM aday
WHERE adate>=%%s AND adate<=%%s AND (flag=1 OR flag= 2) %s
- ORDER BY adate'''% mystr
+ ORDER BY adate''' % mystr
cursor.execute(fullquery, values)
@@ -1598,7 +1665,7 @@ def future_slots(startdate, enddate, dents, override_emergencies=False):
values = (adate, apptix)
query = '''select start, end from aslot
where adate = %%s and apptix = %%s and flag0!=72 %s order by start
- '''% emer_sql
+ ''' % emer_sql
#--flag0!=72 necessary to avoid zero length apps like pain/double/fam
cursor.execute(query, values)
@@ -1608,7 +1675,7 @@ def future_slots(startdate, enddate, dents, override_emergencies=False):
adate, apptix, daystart, results, dayfin)
cursor.close()
- #db.close()
+ # db.close()
return slotlist
if __name__ == "__main__":
@@ -1617,6 +1684,7 @@ if __name__ == "__main__":
'''
class duckPt(object):
+
def __init__(self):
self.serialno = 1
self.sname = "Neil"
@@ -1625,21 +1693,20 @@ if __name__ == "__main__":
localsettings.initiate()
- testdate = datetime.date(2013,01,25)
+ testdate = datetime.date(2013, 0o1, 25)
d_a_d = DayAppointmentData()
d_a_d.setDate(testdate)
d_a_d.getAppointments((4,))
print "RESULTS"
- print "\tWORKING DENTS:\n\t%s"% str(d_a_d.workingDents)
+ print "\tWORKING DENTS:\n\t%s" % str(d_a_d.workingDents)
print "\tAPPOINTMENTS:"
for appt in d_a_d.appointments:
- print "\t\t%s"% str(appt)
+ print "\t\t%s" % str(appt)
print "\tSLOTS:"
for slot in d_a_d.slots(30):
- print "\t\t%s"% slot
+ print "\t\t%s" % slot
print "\tSLOTS (ignoring emergencies):"
for slot in d_a_d.slots(15, ignore_emergency=True):
- print "\t\t%s"% slot
+ print "\t\t%s" % slot
cancel_emergency_slot(testdate, 4, 1130, 1210)
-
diff --git a/src/openmolar/dbtools/appt_prefs.py b/src/openmolar/dbtools/appt_prefs.py
index 695d65d..4223094 100644
--- a/src/openmolar/dbtools/appt_prefs.py
+++ b/src/openmolar/dbtools/appt_prefs.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
@@ -15,7 +31,7 @@ from PyQt4.QtCore import QDate
LOGGER = logging.getLogger("openmolar")
-#NOTE - the appt_prefs table has unused columns at this point!
+# NOTE - the appt_prefs table has unused columns at this point!
QUERY = '''SELECT recall_active, recdent_period, recdent,
rechyg_period, rechyg, recall_method, note
@@ -26,15 +42,17 @@ UPDATE_QUERY = '''replace into appt_prefs
rechyg_period, rechyg, recall_method, note)
values (%s,%s,%s,%s,%s,%s,%s,%s)
'''
-
+
class ApptPrefs(object):
+
'''
has a tiny percentage of the footprint (and loading time) of the
main patient class
'''
recall_active = False
note = ""
+
def __init__(self, serialno):
'''
initiate the class with default variables, then load from database
@@ -56,9 +74,9 @@ class ApptPrefs(object):
if not row:
return
- (self.recall_active, self.recdent_period, self.recdent ,
- self.rechyg_period, self.rechyg,
- self.recall_method, self.note) = row
+ (self.recall_active, self.recdent_period, self.recdent,
+ self.rechyg_period, self.rechyg,
+ self.recall_method, self.note) = row
if self.note is None:
self.note = ""
@@ -81,47 +99,47 @@ class ApptPrefs(object):
values = (
self.serialno,
self.recall_active,
- self.recdent_period, self.recdent ,
+ self.recdent_period, self.recdent,
self.rechyg_period, self.rechyg,
self.recall_method,
self.note
- )
+ )
db = connect.connect()
cursor = db.cursor()
cursor.execute(UPDATE_QUERY, values)
cursor.close()
-
+
def __repr__(self):
return self.__str__()
def __str__(self):
- return "%s %s %s %s %s %s %s %s"% (self.serialno,
- self.recdent_period,
- self.recdent,
- self.rechyg_period,
- self.rechyg,
- self.recall_method,
- self.note,
- self.recall_active)
+ return "%s %s %s %s %s %s %s %s" % (self.serialno,
+ self.recdent_period,
+ self.recdent,
+ self.rechyg_period,
+ self.rechyg,
+ self.recall_method,
+ self.note,
+ self.recall_active)
def __eq__(self, other):
- return str(self)== str(other)
+ return str(self) == str(other)
def __ne__(self, other):
- return str(self)!= str(other)
-
-if __name__ =="__main__":
+ return str(self) != str(other)
+
+if __name__ == "__main__":
try:
- serialno=int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
- serialno=11956
+ serialno = 11956
prefs = ApptPrefs(serialno)
for att in prefs.__dict__.keys():
print att, prefs.__dict__[att]
-
+
prefs2 = ApptPrefs(serialno)
-
+
print prefs == prefs2
print prefs != prefs2
diff --git a/src/openmolar/dbtools/brief_patient.py b/src/openmolar/dbtools/brief_patient.py
index 9abb193..200da23 100644
--- a/src/openmolar/dbtools/brief_patient.py
+++ b/src/openmolar/dbtools/brief_patient.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
@@ -18,7 +34,9 @@ LOGGER = logging.getLogger("openmolar")
QUERY = '''SELECT title, fname, sname, dob, cset, dnt1, dnt2
from patients where serialno = %s'''
+
class BriefPatient(object):
+
'''
has a tiny percentage of the footprint (and loading time) of the
main patient class
@@ -50,11 +68,11 @@ class BriefPatient(object):
raise localsettings.PatientNotFoundError
self.title, self.fname, self.sname, \
- self.dob, self.cset, self.dnt1, self.dnt2 = row
+ self.dob, self.cset, self.dnt1, self.dnt2 = row
@property
def name_id(self):
- return u"%s %s %s - %s"% (
+ return u"%s %s %s - %s" % (
self.title, self.fname, self.sname, self.serialno)
@property
@@ -72,7 +90,7 @@ class BriefPatient(object):
return self._appt_memo
def set_appt_memo(self, memo):
- LOGGER.debug("BriefPatient.set_appt_memo(%s"% memo)
+ LOGGER.debug("BriefPatient.set_appt_memo(%s" % memo)
db = connect.connect()
cursor = db.cursor()
query = 'replace into appt_prefs (serialno, note) values (%s, %s)'
@@ -86,12 +104,11 @@ class BriefPatient(object):
return self._appt_prefs
-
-if __name__ =="__main__":
+if __name__ == "__main__":
try:
- serialno=int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
- serialno=11956
+ serialno = 11956
pt = BriefPatient(serialno)
for att in pt.__dict__.keys():
diff --git a/src/openmolar/dbtools/calldurr.py b/src/openmolar/dbtools/calldurr.py
index febc395..6385019 100644
--- a/src/openmolar/dbtools/calldurr.py
+++ b/src/openmolar/dbtools/calldurr.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
update a simple table which stores which records are in use
@@ -12,6 +28,7 @@ update a simple table which stores which records are in use
from openmolar import connect
+
def commit(serialno, surgeryno):
'''
sets a copy of the riu table
@@ -20,13 +37,13 @@ def commit(serialno, surgeryno):
query = "update calldurr set serialno=%s where stn=%s"
values = (serialno, surgeryno)
cursor = db.cursor()
-
+
result = cursor.execute(query, values)
if result:
db.commit()
cursor.close()
- #db.close()
+ # db.close()
return result
if __name__ == "__main__":
diff --git a/src/openmolar/dbtools/cashbook.py b/src/openmolar/dbtools/cashbook.py
index 0204538..08955d9 100644
--- a/src/openmolar/dbtools/cashbook.py
+++ b/src/openmolar/dbtools/cashbook.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
This modules provides functions that read and write to the cashbook
@@ -24,26 +40,29 @@ LOGGER = logging.getLogger("openmolar")
# this variable allows HISTORIC cashbook entries to be altered (by supervisor)
full_edit = False
+
def viewitems(obj):
'''
- provides 2.7 functionality for 2.6 and under
+ provides 2.7 functionality for 2.6 and under
'''
for key in obj.keys():
yield (key, obj[key])
-
+
class CashBookCodesDict(dict):
+
'''
A dictionary of cashbookCodes called at module initialisation
'''
+
def __init__(self):
dict.__init__(self)
self.get_values()
try:
self.viewitems
- except AttributeError: #patched for python <2.7
+ except AttributeError: # patched for python <2.7
self.viewitems = functools.partial(viewitems, self)
-
+
def get_values(self):
db = connect()
cursor = db.cursor()
@@ -58,10 +77,10 @@ class CashBookCodesDict(dict):
LOGGER.exception("error loading cashbook codes")
finally:
cursor.close()
-
+
def paymenttaken(sno, name, dent, csetyp, cash, cheque, card,
-sundry_cash, sundry_cheque, sundry_card, hdp, other, refund):
+ sundry_cash, sundry_cheque, sundry_card, hdp, other, refund):
'''
called when a payment has been taken at the desk
'''
@@ -71,14 +90,14 @@ sundry_cash, sundry_cheque, sundry_card, hdp, other, refund):
codes = (2, 4, 6, 14, 15, 17, 21, 24, 125)
queries = []
for i, amount in enumerate(
- (cash, cheque, card, sundry_cash,
- sundry_cheque, sundry_card, hdp, other, refund)
- ):
+ (cash, cheque, card, sundry_cash,
+ sundry_cheque, sundry_card, hdp, other, refund)
+ ):
if amount != 0:
queries.append('''
insert into cashbook set cbdate = date(NOW()),
ref="%06d", linkid=0, descr="%s", code=%d, dntid=%d, amt=%d
- '''%(sno, name, codes[i], dent, amount))
+ ''' % (sno, name, codes[i], dent, amount))
if queries != []:
db = connect()
cursor = db.cursor()
@@ -87,11 +106,12 @@ sundry_cash, sundry_cheque, sundry_card, hdp, other, refund):
dbOK = dbOK and cursor.execute(query)
db.commit()
cursor.close()
- #db.close()
+ # db.close()
return dbOK
-def details(dent, startdate, enddate,
-treatment_only=False, sundries_only=False):
+
+def details(dent, startdate, enddate,
+ treatment_only=False, sundries_only=False):
'''
retrns an html version of the cashbook table
'''
@@ -99,12 +119,12 @@ treatment_only=False, sundries_only=False):
db = connect()
cursor = db.cursor()
- #note - len(headers) is used writing out the html
+ # note - len(headers) is used writing out the html
headers = ("cbdate", "Serial NO", "Dentist", "Patient", "code", "cash",
- "cheque", "card", "unknown", "amt")
-
- if full_edit or (startdate.toPyDate() <=
- localsettings.currentDay() <= enddate.toPyDate()):
+ "cheque", "card", "unknown", "amt")
+
+ if full_edit or (startdate.toPyDate() <=
+ localsettings.currentDay() <= enddate.toPyDate()):
headers += ("edit",)
if dent == "*ALL*":
@@ -112,7 +132,7 @@ treatment_only=False, sundries_only=False):
dentist = "All Dentists"
else:
dentist = localsettings.ops_reverse[str(dent)]
- cond1 = 'dntid="%s" and '% dentist
+ cond1 = 'dntid="%s" and ' % dentist
restriction_header = ""
if treatment_only:
@@ -123,30 +143,32 @@ treatment_only=False, sundries_only=False):
restriction_header = "SUNDRIES ONLY"
else:
restriction_header = "ALL PAYMENTS"
-
#-- note - mysqldb doesn't play nice with DATE_FORMAT
#-- hence the string is formatted entirely using python formatting
- query = '''select
+ query = '''select
DATE_FORMAT(cbdate, '%s'), ref, dntid, descr, code, amt, cbdate, id
- from cashbook where %s cbdate>='%s' and cbdate<='%s'
- order by cbdate'''%(
- localsettings.OM_DATE_FORMAT, cond1,
- startdate.toPyDate(), enddate.toPyDate())
+ from cashbook where %s cbdate>='%s' and cbdate<='%s'
+ order by cbdate''' % (
+ localsettings.OM_DATE_FORMAT, cond1,
+ startdate.toPyDate(), enddate.toPyDate())
cursor.execute(query)
rows = cursor.fetchall()
retarg = "<h3>Cashbook - "
- retarg += "%s - %s - %s (inclusive) - %s</h3>"% (dentist,
- localsettings.formatDate(startdate.toPyDate()),
- localsettings.formatDate(enddate.toPyDate()),
- restriction_header)
+ retarg += "%s - %s - %s (inclusive) - %s</h3>" % (dentist,
+ localsettings.formatDate(
+ startdate.toPyDate(
+ )),
+ localsettings.formatDate(
+ enddate.toPyDate()),
+ restriction_header)
retarg += '<table width="100%" border="1"> <tr>'
for header in headers:
- retarg += "<th>%s</th>"% header
+ retarg += "<th>%s</th>" % header
retarg += '</tr>'
odd = True
total, cashTOT, chequeTOT, cardTOT, otherTOT = 0, 0, 0, 0, 0
@@ -160,66 +182,66 @@ treatment_only=False, sundries_only=False):
#-- a row is (date,sno,dnt,patient,code,amount)
- retarg += '<td>%s</td><td>%s</td>'% (row[0], row[1])
- retarg += '<td>%s</td>'% localsettings.ops.get(row[2])
- retarg += '<td>%s</td>'% row[3]
+ retarg += '<td>%s</td><td>%s</td>' % (row[0], row[1])
+ retarg += '<td>%s</td>' % localsettings.ops.get(row[2])
+ retarg += '<td>%s</td>' % row[3]
CODE = cashbookCodesDict.get(row[4])
- retarg += '<td>%s</td>'% CODE
+ retarg += '<td>%s</td>' % CODE
amt = row[5]
amt_str = localsettings.formatMoney(amt)
if "CASH" in CODE:
- retarg += '<td align="right">%s</td>'% amt_str
+ retarg += '<td align="right">%s</td>' % amt_str
cashTOT += amt
retarg += "<td> </td>" * 3
elif "CHEQUE" in CODE:
- retarg += '<td> </td><td align="right">%s</td>'% amt_str
+ retarg += '<td> </td><td align="right">%s</td>' % amt_str
chequeTOT += amt
retarg += "<td> </td>" * 2
elif "CARD" in CODE:
retarg += "<td> </td>" * 2
- retarg += '<td align="right">%s</td>'% amt_str
+ retarg += '<td align="right">%s</td>' % amt_str
cardTOT += amt
retarg += "<td> </td>"
else:
retarg += "<td> </td>" * 3
- retarg += '<td align="right">%s</td>'% amt_str
+ retarg += '<td align="right">%s</td>' % amt_str
otherTOT += amt
- retarg += '<td align="right">%s</td>'% amt_str
+ retarg += '<td align="right">%s</td>' % amt_str
if len(headers) == 11:
if full_edit or row[6] == localsettings.currentDay():
retarg += '''<td align="center">
- <a href="edit_%s">edit</a></td>'''% row[7]
+ <a href="edit_%s">edit</a></td>''' % row[7]
else:
retarg += '<td align="center">n/a</a>'
retarg += '</tr>\n'
total += amt
-
- sum_text = "= %s + %s + %s + %s"% (
+
+ sum_text = "= %s + %s + %s + %s" % (
localsettings.pence_to_pounds(cashTOT),
- localsettings.pence_to_pounds(chequeTOT),
- localsettings.pence_to_pounds(cardTOT),
- localsettings.pence_to_pounds(otherTOT)
- )
-
+ localsettings.pence_to_pounds(chequeTOT),
+ localsettings.pence_to_pounds(cardTOT),
+ localsettings.pence_to_pounds(otherTOT)
+ )
+
retarg += '''<tr><td colspan="4">%s</td>
<td><b>TOTAL</b></td>
<td align="right"><b>%s</b></td>
<td align="right"><b>%s</b></td>
<td align="right"><b>%s</b></td>
<td align="right"><b>%s</b></td>
- <td align="right"><b>%s</b></td></tr>'''% (
- sum_text.replace("+ -", "- "),
- localsettings.formatMoney(cashTOT),
- localsettings.formatMoney(chequeTOT),
- localsettings.formatMoney(cardTOT),
- localsettings.formatMoney(otherTOT),
- localsettings.formatMoney(total))
+ <td align="right"><b>%s</b></td></tr>''' % (
+ sum_text.replace("+ -", "- "),
+ localsettings.formatMoney(cashTOT),
+ localsettings.formatMoney(chequeTOT),
+ localsettings.formatMoney(cardTOT),
+ localsettings.formatMoney(otherTOT),
+ localsettings.formatMoney(total))
retarg += '</table>'
cursor.close()
- #db.close()
+ # db.close()
return retarg
#--initiate the cashbook dictionary on module import
@@ -230,4 +252,4 @@ if __name__ == "__main__":
localsettings.initiate()
print cashbookCodesDict
- print cashbookCodesDict.viewitems()
\ No newline at end of file
+ print cashbookCodesDict.viewitems()
diff --git a/src/openmolar/dbtools/courseHistory.py b/src/openmolar/dbtools/courseHistory.py
index b4b55ec..843bf6d 100644
--- a/src/openmolar/dbtools/courseHistory.py
+++ b/src/openmolar/dbtools/courseHistory.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
a module to search for previous course items
@@ -15,104 +31,107 @@ from openmolar.connect import connect
from openmolar.dbtools.treatment_course import CURRTRT_ATTS
from openmolar.dbtools import estimatesHistory
-uppers = ('ur8', 'ur7', 'ur6', 'ur5', 'ur4', 'ur3', 'ur2', 'ur1',
-'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8')
-lowers = ('lr8', 'lr7', 'lr6', 'lr5', 'lr4', 'lr3', 'lr2', 'lr1',
-'ll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8')
+uppers = ('ur8', 'ur7', 'ur6', 'ur5', 'ur4', 'ur3', 'ur2', 'ur1',
+ 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8')
+lowers = ('lr8', 'lr7', 'lr6', 'lr5', 'lr4', 'lr3', 'lr2', 'lr1',
+ 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8')
+
class txCourse():
+
'''
a custom class to hold the data within a currtrtmt row of the database
'''
+
def __init__(self, vals):
i = 0
for att in CURRTRT_ATTS:
val = vals[i]
self.__dict__[att] = val
i += 1
-
+
def toHtml(self):
'''
returns an HTML representation of itself
'''
-
+
retarg = '''<table width = "100%%" border = "2">
<tr><th colspan = "3" bgcolor = "yellow">CourseNo %s</th>
- <//tr>'''% self.courseno
-
+ <//tr>''' % self.courseno
+
headers = [("Acceptance Date", self.accd),
- ("Completion Date", self.cmpd)]
-
+ ("Completion Date", self.cmpd)]
+
for header in headers:
- retarg +='<tr><th colspan = "2">%s</th><td>%s</td></tr>\n'% header
-
+ retarg += '<tr><th colspan = "2">%s</th><td>%s</td></tr>\n' % header
+
#-plan row.
for planned in ("pl", "cmp"):
rows = []
-
+
if planned == "pl":
bgcolor = ' bgcolor = "#eeeeee"'
header = "PLANNED / INCOMPLETE"
else:
bgcolor = ' bgcolor = "#ddeeee"'
header = "COMPLETED"
- if self.examt !="":
+ if self.examt != "":
exam_details = self.examt
if self.examd and self.examd != self.accd:
- exam_details += " dated - %s"% self.examd
- cells = "<th%s>%s</th><td%s>%s</td>"% (bgcolor,
- _("Exam"), bgcolor, exam_details)
+ exam_details += " dated - %s" % self.examd
+ cells = "<th%s>%s</th><td%s>%s</td>" % (bgcolor,
+ _("Exam"), bgcolor, exam_details)
rows.append(cells)
for att, con_att in (
- ("perio",_("perio")),
- ("xray",_('xray')),
- ("anaes",_('anaes')),
- ("other",_('other')),
- ("custom",_("custom"))
- ):
- if self.__dict__[att+planned] != "":
- cells = "<th%s>%s</th><td%s>%s</td>"% (bgcolor,
- con_att, bgcolor, self.__dict__[att+planned])
+ ("perio", _("perio")),
+ ("xray", _('xray')),
+ ("anaes", _('anaes')),
+ ("other", _('other')),
+ ("custom", _("custom"))
+ ):
+ if self.__dict__[att + planned] != "":
+ cells = "<th%s>%s</th><td%s>%s</td>" % (bgcolor,
+ con_att, bgcolor, self.__dict__[att + planned])
rows.append(cells)
dentureWork = ""
for att in ('ndu', 'ndl', 'odu', 'odl'):
- val = self.__dict__[att+planned]
+ val = self.__dict__[att + planned]
if val != "":
- dentureWork += "%s - '%s' "% (att, val)
- if dentureWork != "":
- cells = "<th%s>%s</th><td%s>%s</td>"% (
- bgcolor, _("Denture Work"), bgcolor, dentureWork)
-
+ dentureWork += "%s - '%s' " % (att, val)
+ if dentureWork != "":
+ cells = "<th%s>%s</th><td%s>%s</td>" % (
+ bgcolor, _("Denture Work"), bgcolor, dentureWork)
+
rows.append(cells)
showChart = False
cells = '''<th%s>Chart</th><td>
- <table width = "100%%" border = "1"><tr>'''% bgcolor
+ <table width = "100%%" border = "1"><tr>''' % bgcolor
for att in uppers:
- work = self.__dict__[att+planned]
- cells += '<td align = "center"%s>%s</td>'% (
- bgcolor, work)
- showChart = showChart or work !=""
-
- cells += "</tr><tr>"
+ work = self.__dict__[att + planned]
+ cells += '<td align = "center"%s>%s</td>' % (
+ bgcolor, work)
+ showChart = showChart or work != ""
+
+ cells += "</tr><tr>"
for att in uppers:
- cells += '<td align = "center"%s>%s</td>'% (
- bgcolor, att.upper())
-
+ cells += '<td align = "center"%s>%s</td>' % (
+ bgcolor, att.upper())
+
cells += "</tr><tr>"
for att in lowers:
- cells += '<td align = "center"%s>%s</td>'% (
- bgcolor, att.upper())
+ cells += '<td align = "center"%s>%s</td>' % (
+ bgcolor, att.upper())
cells += "</tr><tr>"
for att in lowers:
- work = self.__dict__[att+planned]
- cells += '<td align = "center"%s>%s</td>'% (
- bgcolor, work)
- showChart = showChart or work !=""
+ work = self.__dict__[att + planned]
+ cells += '<td align = "center"%s>%s</td>' % (
+ bgcolor, work)
+ showChart = showChart or work != ""
cells += "</tr></table></td>"
@@ -120,15 +139,15 @@ class txCourse():
rows.append(cells)
row_span = len(rows)
-
+
if rows != []:
- retarg += '<tr><th rowspan = "%s"%s>%s</th>'% (
- row_span, bgcolor,header)
+ retarg += '<tr><th rowspan = "%s"%s>%s</th>' % (
+ row_span, bgcolor, header)
for row in rows:
if row == rows[0]:
- retarg += "%s</tr>\n"% row
+ retarg += "%s</tr>\n" % row
else:
- retarg += "<tr>%s</tr>\n"% row
+ retarg += "<tr>%s</tr>\n" % row
retarg += '</table>\n'
return retarg
@@ -142,19 +161,19 @@ def details(sno):
cursor = db.cursor()
fields = CURRTRT_ATTS
query = ""
-
+
for field in fields:
if field in ('examd', 'accd', 'cmpd'):
- query += 'DATE_FORMAT(%s, "%s"),'% (
- field, localsettings.OM_DATE_FORMAT)
+ query += 'DATE_FORMAT(%s, "%s"),' % (
+ field, localsettings.OM_DATE_FORMAT)
else:
- query += field+","
+ query += field + ","
query = query.strip(",")
cursor.execute('''SELECT %s from currtrtmt2 where serialno = %d
- order by courseno desc'''% (query, sno))
+ order by courseno desc''' % (query, sno))
rows = cursor.fetchall()
cursor.close()
@@ -165,14 +184,15 @@ def details(sno):
courses.append(course)
claimNo = len(courses)
- retarg = "<h2>Past Courses of Treatment - %d rows found</h2>"% claimNo
+ retarg = "<h2>Past Courses of Treatment - %d rows found</h2>" % claimNo
for course in courses:
retarg += course.toHtml()
retarg += "<br /><hr /><br />"
- #db.close()
+ # db.close()
return retarg
+
def all_details(sno):
'''
returns an html page showing pt's Treatment History
@@ -181,11 +201,11 @@ def all_details(sno):
cursor = db.cursor()
fields = CURRTRT_ATTS
query = ""
-
+
for field in fields:
if field in ('examd', 'accd', 'cmpd'):
- query += 'DATE_FORMAT(%s, "%s"),'% (
- field, localsettings.OM_DATE_FORMAT)
+ query += 'DATE_FORMAT(%s, "%s"),' % (
+ field, localsettings.OM_DATE_FORMAT)
else:
query += field + ","
@@ -193,7 +213,7 @@ def all_details(sno):
query = query.strip(",")
cursor.execute('''SELECT %s from currtrtmt2 where serialno = %d
- order by courseno desc'''% (query, sno))
+ order by courseno desc''' % (query, sno))
rows = cursor.fetchall()
cursor.close()
@@ -204,28 +224,28 @@ def all_details(sno):
courses.append(course)
claimNo = len(courses)
- retarg = "<h2>Past Courses of Treatment - %d rows found</h2>"% claimNo
+ retarg = "<h2>Past Courses of Treatment - %d rows found</h2>" % claimNo
estimatesList = estimatesHistory.getEsts(sno)
-
+
for course in courses:
retarg += course.toHtml()
estTableStarted = False
for est in estimatesList:
if est.courseno == course.courseno:
- if not estTableStarted:
- retarg+='''<h3>Estimate for course number %d</h3>
- <table width="100%%" border="1">'''% est.courseno
+ if not estTableStarted:
+ retarg += '''<h3>Estimate for course number %d</h3>
+ <table width="100%%" border="1">''' % est.courseno
estTableStarted = True
retarg += est.htmlHeader()
retarg += est.toHtmlRow()
-
+
if estTableStarted:
retarg += '</table>\n'
else:
- retarg += "no estimate found for courseno %d"% course.courseno
+ retarg += "no estimate found for courseno %d" % course.courseno
retarg += "<br /><hr /><br />"
- #db.close()
+ # db.close()
return retarg
diff --git a/src/openmolar/dbtools/day_class.py b/src/openmolar/dbtools/day_class.py
index 8ee743e..b850474 100644
--- a/src/openmolar/dbtools/day_class.py
+++ b/src/openmolar/dbtools/day_class.py
@@ -1,4 +1,28 @@
-1# -*- coding: utf-8 -*-
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+1 # -*- coding: utf-8 -*-
# Copyright (c) 2009 Neil Wallace. All rights reserved.
# This program or module is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published
@@ -7,16 +31,19 @@
'''unused module'''
-import MySQLdb,datetime
+import MySQLdb
+import datetime
from openmolar.connect import connect
from openmolar.settings import localsettings
+
class day():
- def init(self,adate,starttime="",endtime=""):
- self.date=adate
- self.starttime=starttime
- self.endtime=endtime
+
+ def init(self, adate, starttime="", endtime=""):
+ self.date = adate
+ self.starttime = starttime
+ self.endtime = endtime
if __name__ == "__main__":
- d=day(datetime.date(1969,12,9),"08:30","18:00")
\ No newline at end of file
+ d = day(datetime.date(1969, 12, 9), "08:30", "18:00")
diff --git a/src/openmolar/dbtools/daybook.py b/src/openmolar/dbtools/daybook.py
index 235c89d..ccdae96 100644
--- a/src/openmolar/dbtools/daybook.py
+++ b/src/openmolar/dbtools/daybook.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module provides read/write tools for the daybook database table
@@ -15,7 +31,9 @@ import logging
from PyQt4.QtCore import QDate
from openmolar.settings import localsettings
-from openmolar.connect import connect
+from openmolar import connect
+
+ALLOW_TX_EDITS = False
LOGGER = logging.getLogger("openmolar")
@@ -26,66 +44,107 @@ values (DATE(NOW()),%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'''
HASH_QUERY = 'insert into daybook_link (daybook_id, tx_hash) values (%s, %s)'
+INSPECT_QUERY = '''select description, fee, ptfee
+from newestimates join est_link2 on newestimates.ix = est_link2.est_id
+where tx_hash in
+(select tx_hash from daybook join daybook_link on daybook.id = daybook_link.daybook_id where id=%s)'''
+
+DETAILS_QUERY = '''select DATE_FORMAT(date,'%s'), daybook.serialno,
+ concat (fname, " ", sname), coursetype, dntid,
+ trtid, diagn, perio, anaes, misc, ndu, ndl, odu, odl, other, chart,
+ feesa, feesb, feesc, id
+ from daybook join patients on daybook.serialno = patients.serialno
+ where {{DENT CONDITIONS}}
+ date >= %%s and date <= %%s {{FILTERS}} order by date''' % (
+ localsettings.OM_DATE_FORMAT.replace("%", "%%"))
+
+FIELD_NAMES_QUERY = '''
+SELECT concat(table_name, ".", column_name) as fieldname FROM
+information_schema.columns
+WHERE table_name='patients' or table_name="daybook" order by fieldname'''
+
+
+UPDATE_ROW_FEES_QUERY = "update daybook set feesa=%s, feesb=%s where id=%s"
+UPDATE_ROW_FEE_QUERY = "update daybook set feesa=%s where id=%s"
+UPDATE_ROW_PTFEE_QUERY = "update daybook set feesb=%s where id=%s"
+DELETE_ROW_QUERY = "delete from daybook where id=%s"
+
+TREATMENTS_QUERY = ('select diagn, perio, anaes, misc, ndu, ndl, '
+ 'odu, odl, other, chart from daybook where id = %s')
+
+UPDATE_TREATMENTS_QUERY = ('update daybook '
+ 'set diagn=%s, perio=%s, anaes=%s, misc=%s, ndu=%s, ndl=%s, '
+ 'odu=%s, odl=%s, other=%s, chart=%s where id = %s')
+
def add(sno, cset, dent, trtid, t_dict, fee, ptfee, tx_hashes):
'''
add a row to the daybook table
'''
- db = connect()
+ db = connect.connect()
cursor = db.cursor()
values = (sno, cset, dent, trtid, t_dict["diagn"], t_dict["perio"],
- t_dict["anaes"], t_dict["misc"], t_dict["ndu"], t_dict["ndl"],
- t_dict["odu"], t_dict["odl"], t_dict["other"], t_dict["chart"],
- fee, ptfee, 0)
+ t_dict["anaes"], t_dict["misc"], t_dict["ndu"], t_dict["ndl"],
+ t_dict["odu"], t_dict["odl"], t_dict["other"], t_dict["chart"],
+ fee, ptfee, 0)
LOGGER.debug('updating daybook with the following values: '
- '%s %s %s %s %s %s %s %s'% (
- sno, cset, dent, trtid, t_dict, fee, ptfee, 0))
+ '%s %s %s %s %s %s %s %s' % (
+ sno, cset, dent, trtid, t_dict, fee, ptfee, 0))
cursor.execute(QUERY, values)
daybook_id = db.insert_id()
for tx_hash in tx_hashes:
- LOGGER.debug("%s %s %s"% (HASH_QUERY, daybook_id, tx_hash))
+ LOGGER.debug("%s %s %s" % (HASH_QUERY, daybook_id, tx_hash))
cursor.execute(HASH_QUERY, (daybook_id, tx_hash))
cursor.close()
-def details(regdent, trtdent, startdate, enddate):
+
+def details(regdent, trtdent, startdate, enddate, filters=""):
'''
returns an html table, for regdent, trtdent,startdate,enddate
'''
- cond1,cond2= "",""
+ dent_conditions = ""
+ dents = []
try:
if regdent != "*ALL*":
- cond1 = 'dntid=%s and'% localsettings.ops_reverse[regdent]
+ dent_conditions = 'dntid=%s and '
+ dents.append(localsettings.ops_reverse[regdent])
if trtdent != "*ALL*":
- cond2 = 'trtid=%s and'% localsettings.ops_reverse[trtdent]
+ dent_conditions += 'trtid=%s and '
+ dents.append(localsettings.ops_reverse[trtdent])
except KeyError:
- print "Key Error - %s or %s unregconised"% (regdent, trtdent)
- return '<html><body>%s</body></html>'% _(
- "Error - unrecognised practioner- sorry")
+ print "Key Error - %s or %s unregconised" % (regdent, trtdent)
+ return '<html><body>%s</body></html>' % _(
+ "Error - unrecognised practioner- sorry")
total, nettotal = 0, 0
iterDate = QDate(startdate.year(), startdate.month(), 1)
- db = connect()
- cursor = db.cursor()
- retarg = '''<html><body>
- <h3>Patients of %s treated by %s between %s and %s (inclusive)</h3>'''% (
- regdent, trtdent,
- localsettings.formatDate(startdate.toPyDate()),
- localsettings.formatDate(enddate.toPyDate()))
+ retarg = '''
+ <html><body><h4>%s %s %s %s %s %s %s %s %s</h4>''' % (
+ _("Patients of"), regdent, _("treated by"), trtdent, _("between"),
+ localsettings.formatDate(startdate.toPyDate()), _("and"),
+ localsettings.formatDate(enddate.toPyDate()), filters)
retarg += '''<table width="100%" border="1"><tr><th>DATE</th>
<th>Dents</th><th>Serial Number</th><th>Name</th>
- <th>Pt Type</th><th>Treatment</th><th>Gross Fee</th><th>Net Fee</th>'''
+ <th>Pt Type</th><th>Treatment</th><th></th>
+ <th>Gross Fee</th><th>Net Fee</th>'''
+
+ db = connect.connect()
+ cursor = db.cursor()
+
+ query = DETAILS_QUERY.replace("{{DENT CONDITIONS}}", dent_conditions)
+ query = query.replace("{{FILTERS}}", filters)
while enddate >= iterDate:
- monthtotal, monthnettotal = 0,0
+ monthtotal, monthnettotal = 0, 0
if startdate > iterDate:
queryStartDate = startdate
@@ -96,84 +155,185 @@ def details(regdent, trtdent, startdate, enddate):
if enddate < queryEndDate:
queryEndDate = enddate
- #-- note - mysqldb doesn't play nice with DATE_FORMAT
- #-- hence the string is formatted entirely using python formatting
- query = '''select DATE_FORMAT(date,'%s'), serialno, coursetype, dntid,
- trtid, diagn, perio, anaes, misc, ndu, ndl, odu, odl, other, chart,
- feesa, feesb, feesc, id from daybook
- where %s %s date >= '%s' and date <= '%s' order by date'''%(
- localsettings.OM_DATE_FORMAT, cond1, cond2,
- queryStartDate.toPyDate(), queryEndDate.toPyDate())
+ values = tuple(
+ dents + [queryStartDate.toPyDate(), queryEndDate.toPyDate()])
- cursor.execute(query)
+ cursor.execute(query, (values))
rows = cursor.fetchall()
- odd = True
- for row in rows:
- if odd:
- retarg += '<tr bgcolor="#eeeeee">'
- odd = False
- else:
- retarg += '<tr>'
- odd = True
- retarg += "<td>'%s' %s</td>"% (row[18], row[0])
+ for i, row in enumerate(rows):
+ retarg += '<tr>' if i % 2 else '<tr bgcolor="#eeeeee">'
+
+ retarg += "<td>%s</td>" % row[0]
try:
- retarg += '<td> %s / '% localsettings.ops[row[3]]
+ retarg += '<td> %s / ' % localsettings.ops[row[4]]
except KeyError:
retarg += "<td>?? / "
try:
- retarg += localsettings.ops[row[4]]
+ retarg += localsettings.ops[row[5]]
except KeyError:
retarg += "??"
- retarg += '</td><td>%s</td>'% row[1]
-
- cursor.execute(
- 'select fname,sname from patients where serialno=%s'% row[1])
-
- names = cursor.fetchall()
- if names != ():
- name = names[0]
- retarg += '<td>%s %s</td>'% (name[0].title(),name[1].title())
- else:
- retarg += "<td>NOT FOUND</td>"
- retarg += '<td>%s</td>'% row[2]
+ retarg += '</td><td>%s</td><td>%s</td><td>%s</td>' % (row[1:4])
tx = ""
- for item in (5, 6, 7, 8, 9, 10, 11, 12, 13, 14):
- if row[item] != None and row[item] != "":
- tx += "%s "% row[item]
-
- retarg += '''<td>%s</td><td align="right">%s</td>
- <td align="right">%s</td></tr>'''% (tx.strip("%s "% chr(0)),
- localsettings.formatMoney(row[15]),
- localsettings.formatMoney(row[16]))
+ for item in (6, 7, 8, 9, 10, 11, 12, 13, 14, 15):
+ if row[item] is not None and row[item] != "":
+ tx += "%s " % row[item]
- total += int(row[15])
- monthtotal += int(row[15])
-
- nettotal += int(row[16])
- monthnettotal += int(row[16])
- retarg += '''<tr><td colspan="5"></td><td><b>%s TOTAL</b></td>
+ if ALLOW_TX_EDITS:
+ extra_link = ' / <a href="daybook_id_edit?%s">%s</a>' % (
+ row[19], _("Edit Tx"))
+ else:
+ extra_link = ""
+ retarg += '''<td>%s</td>
+ <td><a href="daybook_id?%sfeesa=%sfeesb=%s">%s</a>%s</td>
+ <td align="right">%s</td>
+ <td align="right">%s</td></tr>''' % (tx.strip("%s " % chr(0)),
+ row[19], row[16], row[17],
+ _("Ests"),
+ extra_link,
+ localsettings.formatMoney(
+ row[16]),
+ localsettings.formatMoney(row[17]))
+
+ total += int(row[16])
+ monthtotal += int(row[16])
+
+ nettotal += int(row[17])
+ monthnettotal += int(row[17])
+ retarg += '''<tr><td colspan="6"></td><td><b>SUBTOTAL - %s %s</b></td>
<td align="right"><b>%s</b></td>
- <td align="right"><b>%s</b></td></tr>'''% (
- localsettings.monthName(iterDate.toPyDate()),
- localsettings.formatMoney(monthtotal),
- localsettings.formatMoney(monthnettotal))
+ <td align="right"><b>%s</b></td></tr>''' % (
+ localsettings.monthName(iterDate.toPyDate()),
+ iterDate.year(),
+ localsettings.formatMoney(monthtotal),
+ localsettings.formatMoney(monthnettotal))
iterDate = iterDate.addMonths(1)
cursor.close()
- #db.close()
+ # db.close()
- retarg += '''<tr><td colspan="5"></td><td><b>GRAND TOTAL</b></td>
+ retarg += '''<tr><td colspan="6"></td><td><b>GRAND TOTAL</b></td>
<td align="right"><b>%s</b></td>
- <td align="right"><b>%s</b></td></tr></table></body></html>'''% (
- localsettings.formatMoney(total), localsettings.formatMoney(nettotal))
+ <td align="right"><b>%s</b></td></tr></table></body></html>''' % (
+ localsettings.formatMoney(total), localsettings.formatMoney(nettotal))
return retarg
+
+def inspect_item(id):
+ '''
+ get more detailed information (by polling the newestimates table
+ '''
+ db = connect.connect()
+ cursor = db.cursor()
+ cursor.execute(INSPECT_QUERY, (id, ))
+ rows = cursor.fetchall()
+ cursor.close()
+ return rows
+
+
+def get_treatments(id):
+ '''
+ get more detailed information (by polling the newestimates table
+ '''
+ db = connect.connect()
+ cursor = db.cursor()
+ cursor.execute(TREATMENTS_QUERY, (id, ))
+ row = cursor.fetchone()
+ cursor.close()
+ return row
+
+
+def update_treatments(id, treatments):
+ values = list(treatments) + [id]
+ db = connect.connect()
+ cursor = db.cursor()
+ result = cursor.execute(UPDATE_TREATMENTS_QUERY, values)
+ cursor.close()
+ return result
+
+
+def update_row_fees(id, feesa, feesb):
+ db = connect.connect()
+ cursor = db.cursor()
+ result = cursor.execute(UPDATE_ROW_FEES_QUERY, (feesa, feesb, id))
+ cursor.close()
+ return result
+
+
+def update_row_fee(id, feesa):
+ db = connect.connect()
+ cursor = db.cursor()
+ result = cursor.execute(UPDATE_ROW_FEE_QUERY, (feesa, id))
+ cursor.close()
+ return result
+
+
+def update_row_ptfee(id, feesb):
+ db = connect.connect()
+ cursor = db.cursor()
+ result = cursor.execute(UPDATE_ROW_PTFEE_QUERY, (feesb, id))
+ cursor.close()
+ return result
+
+
+def delete_row(id):
+ db = connect.connect()
+ cursor = db.cursor()
+ result = cursor.execute(DELETE_ROW_QUERY, (id,))
+ cursor.close()
+ return result
+
+
+class FilterHelp(object):
+ _field_names = None
+
+ @property
+ def field_names(self):
+ if self._field_names is None:
+ db = connect.connect()
+ cursor = db.cursor()
+ cursor.execute(FIELD_NAMES_QUERY)
+ self._field_names = cursor.fetchall()
+ cursor.close()
+ return self._field_names
+
+ def help_text(self):
+ '''
+ text to be shown in user clicks on the "filter help button"
+ '''
+ html = "<html><body><h4>%s</h4>%s<br />%s<table>" % (
+ _("Filter your results"),
+ _("If this text box is left blank, then results from the daybook are "
+ "returned dependent on the dates and clinicians entered."),
+ _("You can filter using the following fields.")
+ )
+ for i, field in enumerate(self.field_names):
+ if i == 0:
+ html += "<tr>"
+ elif i % 5 == 0:
+ html += "</tr><tr>"
+ html += "<td>%s</td>" % field
+
+ html += "</tr></table><h5>%s</h5><pre>%s</pre></body></html>" % (
+ _("Examples"),
+ 'patients.serialno=1 AND chart REGEXP ".*MOD,CO.*"\n'
+ 'ndu="SR/F"\nexmpt="M"\n')
+ return html
+
+_filter_help = FilterHelp()
+
+def filter_help_text():
+ return _filter_help.help_text()
+
if __name__ == "__main__":
localsettings.initiate()
for combo in (("*ALL*", "NW"), ("NW", "AH"), ("NW", "NW")):
- r = details(combo[0], combo[1], QDate(2008,10,31), QDate(2008,11,11))
+ r = details(combo[0], combo[1], QDate(
+ 2008, 10, 31), QDate(2008, 11, 11))
+ print r.encode("ascii", "replace")
+
+ print filter_help_text()
diff --git a/src/openmolar/dbtools/daybookHistory.py b/src/openmolar/dbtools/daybookHistory.py
index 739893b..526f380 100644
--- a/src/openmolar/dbtools/daybookHistory.py
+++ b/src/openmolar/dbtools/daybookHistory.py
@@ -1,92 +1,113 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
from openmolar.settings import localsettings
from openmolar.connect import connect
+QUERY = '''select DATE_FORMAT(date, '%s'), coursetype,
+ dntid, trtid, concat(diagn,perio,anaes,misc,ndu,ndl,odu,odl),
+ other,chart,feesa,feesb, id from daybook
+ where serialno = %%s order by date desc, id desc
+ ''' % localsettings.OM_DATE_FORMAT.replace("%", "%%")
+
+ALLOW_TX_EDITS = False
+
+
def details(sno):
'''
returns an html page showing pt's Treatment History
'''
- db=connect()
- cursor=db.cursor()
-
- query = '''select DATE_FORMAT(date,'%s'), coursetype,
- dntid, trtid, concat(diagn,perio,anaes,misc,ndu,ndl,odu,odl),
- other,chart,feesa,feesb from daybook
- where serialno = %s order by date desc, id desc'''% (
- localsettings.OM_DATE_FORMAT, sno)
-
-
- ## can't use the preffered query, values
- ## here as the dateformat of %d/%m/%Y stuffs it up!
- cursor.execute(query)
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(QUERY, (sno,))
rows = cursor.fetchall()
cursor.close()
- claimNo=len(rows)
- retarg="<h2>Past Treatments - %d rows found</h2>"%claimNo
- if claimNo==0:
+ claimNo = len(rows)
+ retarg = "<h2>Past Treatments - %d rows found</h2>" % claimNo
+ if claimNo == 0:
return retarg
- headers = ("Date","Csetype","Dentist","Clinician",
- "Treatment","Chart","Fee","PtCharge")
+ headers = ("Date", "Csetype", "Dentist", "Clinician",
+ "Treatment", "Chart", "", "Fee", "PtCharge")
- retarg+='<table width="100%" border="1"><tr>'
+ retarg += '<table width="100%" border="1"><tr>'
for header in headers:
- retarg+="<th>%s</th>"%header
- retarg+='</tr>'
-
- odd=True
- fee_total,ptfee_total=0,0
- for row in rows:
- if odd:
- retarg+='<tr bgcolor="#eeeeee">'
- odd=False
+ retarg += "<th>%s</th>" % header
+ retarg += '</tr>'
+
+ fee_total, ptfee_total = 0, 0
+ for i, (
+ date_, cset, dnt, trt, tx, tx1, tx2, fee, ptfee, id) in enumerate(rows):
+
+ if tx1 is not None:
+ #-- the "other treatment" column allows nulls,
+ #-- which stuffs up the sql concat
+ tx += tx1
+ retarg += ' <tr>' if i % 2 else ' <tr bgcolor="#eeeeee">'
+
+ if ALLOW_TX_EDITS:
+ extra_link = ' / <a href="daybook_id_edit?%s">%s</a>' % (
+ id, _("Edit Tx"))
else:
- retarg+='<tr>'
- odd=True
-
- retarg+='<td>%s</td><td>%s</td>'%(row[0],row[1])
- retarg+='<td>%s</td><td>%s</td>'%(
- localsettings.ops.get(row[2]),localsettings.ops.get(row[3]))
- treatment=row[4]
- if row[5]!=None:
- #-- the "other" column allows nulls, which stuffs up the sql concat
- treatment+=row[5]
- retarg+='<td>%s</td>'%treatment
- treatment=row[6]
- retarg+='<td>%s</td>'%treatment.strip("\x00")
-
- fee = row[7]
- retarg += '<td align="right">%s</td>'% (
- localsettings.formatMoney(fee))
-
- ptfee = row[8]
- retarg += '<td align="right">%s</td>'% (
- localsettings.formatMoney(ptfee))
+ extra_link = ""
+
+ retarg += '''\n <td>%s</td>
+ <td>%s</td>
+ <td>%s</td>
+ <td>%s</td>
+ <td>%s</td>
+ <td>%s</td>
+ <td align="center">
+ <a href="daybook_id?%sfeesa=%sfeesb=%s">%s</a>%s
+ </td>
+ <td align="right">%s</td><td align="right">%s</td>\n</tr>\n''' % (
+ date_, cset,
+ localsettings.ops.get(dnt),
+ localsettings.ops.get(trt),
+ tx, tx2.strip("\x00"),
+ id, fee, ptfee, _("Ests"),
+ extra_link,
+ localsettings.formatMoney(fee),
+ localsettings.formatMoney(ptfee)
+ )
fee_total += fee
ptfee_total += ptfee
- retarg+='</tr>\n'
- retarg+='''<tr><td colspan="5"></td>
- <td><b>TOTALS</b></td><td align="right"><b>%s</b></td>
- <td align="right"><b>%s</b></td></tr>'''% (
+ retarg += '''<tr>
+ <td colspan="6"></td>
+ <td align="right"><b>TOTALS</b></td>
+ <td align="right"><b>%s</b></td>
+ <td align="right"><b>%s</b></td>\n</tr>\n</table>''' % (
localsettings.formatMoney(fee_total),
localsettings.formatMoney(ptfee_total))
- retarg += '</table>'
-
return retarg
if __name__ == "__main__":
localsettings.initiate()
print'<html><body>'
- print details(17322)
+ print details(17322).encode("ascii", errors="replace")
print "</body></html>"
diff --git a/src/openmolar/dbtools/db_notes.py b/src/openmolar/dbtools/db_notes.py
index f912f02..4f53edd 100644
--- a/src/openmolar/dbtools/db_notes.py
+++ b/src/openmolar/dbtools/db_notes.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2012 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
module to retrieve from the new formatted_notes table
@@ -12,6 +28,7 @@ module to retrieve from the new formatted_notes table
from openmolar.connect import connect
+
def notes(serialno, today_only=False):
query = '''SELECT ndate, op1, op2, ntype, note
from formatted_notes where serialno = %s and ndate = DATE(NOW())
diff --git a/src/openmolar/dbtools/db_patients.py b/src/openmolar/dbtools/db_patients.py
index 302ffef..eda3423 100644
--- a/src/openmolar/dbtools/db_patients.py
+++ b/src/openmolar/dbtools/db_patients.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2012 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
module to retrieve from the patients table
@@ -14,6 +30,7 @@ note - PatientClass itself does most of this
from openmolar.connect import connect
from openmolar.settings.localsettings import PatientNotFoundError
+
def name(serialno):
query = 'SELECT title, fname, sname from patients where serialno = %s'
@@ -24,9 +41,9 @@ def name(serialno):
result = cursor.fetchone()
cursor.close()
if not result:
- raise PatientNotFoundError, "Serialno %s not found in database"
+ raise PatientNotFoundError("Serialno %s not found in database")
title, fname, sname = result
- return "%s %s %s (%s)"% (title, fname, sname, serialno)
+ return "%s %s %s (%s)" % (title, fname, sname, serialno)
if __name__ == "__main__":
print name(41)
diff --git a/src/openmolar/dbtools/db_settings.py b/src/openmolar/dbtools/db_settings.py
index 0ee1459..ad754f9 100644
--- a/src/openmolar/dbtools/db_settings.py
+++ b/src/openmolar/dbtools/db_settings.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module reads and write to the settings table of the database
@@ -11,67 +28,71 @@ this module reads and write to the settings table of the database
from openmolar import connect
+
def getData(value):
try:
db = connect.connect()
cursor = db.cursor()
- query = 'select data from settings where value = %s'
+ query = 'select data from settings where value = %s'
cursor.execute(query, value)
rows = cursor.fetchall()
cursor.close()
return rows
except connect.ProgrammingError:
return ()
-
+
+
def insertData(value, data, user):
'''
insert a setting (leaving old values behind)
'''
db = connect.connect()
cursor = db.cursor()
- query = '''insert into settings (value,data,modified_by,time_stamp)
+ query = '''insert into settings (value,data,modified_by,time_stamp)
values (%s, %s, %s, NOW())'''
values = (value, data, user)
-
- print "saving setting (%s, %s) to settings table"% (value, data)
+
+ print "saving setting (%s, %s) to settings table" % (value, data)
cursor.execute(query, values)
db.commit()
return True
+
def updateData(value, data, user):
'''
update a setting
'''
db = connect.connect()
cursor = db.cursor()
- query = '''update settings set data = %s, modified_by = %s,
+ query = '''update settings set data = %s, modified_by = %s,
time_stamp = NOW() where value=%s'''
values = (data, user, value)
-
- print "updating setting (%s, %s) to settings table"% (value, data)
+
+ print "updating setting (%s, %s) to settings table" % (value, data)
if not cursor.execute(query, values):
return insertData(value, data, user)
else:
db.commit()
return True
-def getWikiUrl():
+
+def getWikiUrl():
'''
the database may know of the url (presumably an internally facing ip)
for the practice wiki??
- '''
+ '''
try:
db = connect.connect()
cursor = db.cursor()
- query = 'select data from settings where value = "wikiurl"'
+ query = 'select data from settings where value = "wikiurl"'
cursor.execute(query)
rows = cursor.fetchall()
- except connect.ProgrammingError, ex:
+ except connect.ProgrammingError as ex:
print "no wikiurl loaded as there is no settings table??"
if rows:
return rows[-1][0]
else:
- return "http://openmolar.wikidot.com/"
+ return "http://openmolar.wikidot.com/"
if __name__ == "__main__":
- print getData("enddate")
\ No newline at end of file
+ print getData("enddate")
diff --git a/src/openmolar/dbtools/distinct_statuses.py b/src/openmolar/dbtools/distinct_statuses.py
index 69a5d48..bc8bbf3 100644
--- a/src/openmolar/dbtools/distinct_statuses.py
+++ b/src/openmolar/dbtools/distinct_statuses.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
from openmolar import connect
@@ -13,8 +29,10 @@ LOGGER = logging.getLogger("openmolar")
QUERY = "select distinct status from patients"
+
class DistinctStatuses(object):
_distinct_statuses = None
+
@property
def DISTINCT_STATUSES(self):
if self._distinct_statuses is None:
@@ -31,6 +49,6 @@ class DistinctStatuses(object):
return self._distinct_statuses
-if __name__ =="__main__":
+if __name__ == "__main__":
ds = DistinctStatuses()
- print ds.DISTINCT_STATUSES
\ No newline at end of file
+ print ds.DISTINCT_STATUSES
diff --git a/src/openmolar/dbtools/docsimported.py b/src/openmolar/dbtools/docsimported.py
index 3e8e982..ee8de52 100644
--- a/src/openmolar/dbtools/docsimported.py
+++ b/src/openmolar/dbtools/docsimported.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import os
import mimetypes
@@ -11,14 +28,15 @@ import datetime
from openmolar import connect
from openmolar.settings import localsettings
+
def getData(ix):
'''
- gets the binary data for the file from the database,
+ gets the binary data for the file from the database,
along with the version number
'''
db = connect.connect()
cursor = db.cursor()
- query = '''select filedata from docsimporteddata where masterid=%s'''%ix
+ query = '''select filedata from docsimporteddata where masterid=%s''' % ix
cursor.execute(query)
rows = cursor.fetchall()
cursor.close()
@@ -27,6 +45,7 @@ def getData(ix):
else:
return (("no data found",),)
+
def storedDocs(sno):
'''
find previously printed docs related to the serialno given as the argument
@@ -34,9 +53,9 @@ def storedDocs(sno):
db = connect.connect()
cursor = db.cursor()
query = '''select DATE_FORMAT(filedate,'%s'), name, size, datatype, ix
- from docsimported where serialno=%s order by ix DESC '''%(
- localsettings.OM_DATE_FORMAT, sno)
-
+ from docsimported where serialno=%s order by ix DESC ''' % (
+ localsettings.OM_DATE_FORMAT, sno)
+
cursor.execute(query)
rows = cursor.fetchall()
cursor.close()
@@ -45,7 +64,8 @@ def storedDocs(sno):
docs.append([fdate, fname, sizeof_fmt(fsize), typ, str(ix)])
return docs
-def chunks_from_file(filepath, chunksize = 57344):
+
+def chunks_from_file(filepath, chunksize=57344):
'''
a generator to break a file into chunks
'''
@@ -58,12 +78,14 @@ def chunks_from_file(filepath, chunksize = 57344):
break
f.close()
+
def sizeof_fmt(num):
- for x in ['bytes','KB','MB','GB','TB']:
+ for x in ['bytes', 'KB', 'MB', 'GB', 'TB']:
if num < 1024.0:
return "%3.1f%s" % (num, x)
num /= 1024.0
+
def add(sno, filepath):
'''
add a binary file to the database (broken into chunks)
@@ -71,14 +93,14 @@ def add(sno, filepath):
st = os.stat(filepath)
db = connect.connect()
cursor = db.cursor()
- query = '''insert into docsimported
+ query = '''insert into docsimported
(serialno, datatype, name, size, filedate) values (%s, %s, %s, %s, %s)'''
file_type = mimetypes.guess_type(filepath)[0]
- if file_type == None:
+ if file_type is None:
file_type = "unknown"
- values = (sno, file_type, os.path.basename(filepath), st.st_size,
- datetime.datetime.fromtimestamp (st.st_mtime))
-
+ values = (sno, file_type, os.path.basename(filepath), st.st_size,
+ datetime.datetime.fromtimestamp(st.st_mtime))
+
cursor.execute(query, values)
fileid = db.insert_id()
query = 'INSERT INTO docsimporteddata (masterid, filedata) VALUES (%s, %s)'
diff --git a/src/openmolar/dbtools/docsprinted.py b/src/openmolar/dbtools/docsprinted.py
index 2566cda..25fc4b3 100644
--- a/src/openmolar/dbtools/docsprinted.py
+++ b/src/openmolar/dbtools/docsprinted.py
@@ -1,43 +1,62 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from openmolar import connect
from openmolar.settings import localsettings
+
def getData(ix):
'''
- gets the binary data for the file from the database,
+ gets the binary data for the file from the database,
along with the version number
'''
db = connect.connect()
cursor = db.cursor()
- query='''select data, docversion from newdocsprinted where ix=%d'''%ix
+ query = '''select data, docversion from newdocsprinted where ix=%d''' % ix
cursor.execute(query)
rows = cursor.fetchone()
cursor.close()
return rows
+
def previousDocs(sno):
'''
find previously printed docs related to the serialno given as the argument
'''
db = connect.connect()
cursor = db.cursor()
- query='''select DATE_FORMAT(printdate,'%s'),docname,docversion,ix
- from newdocsprinted where serialno=%s order by ix DESC '''%(
- localsettings.OM_DATE_FORMAT, sno)
-
+ query = '''select DATE_FORMAT(printdate,'%s'),docname,docversion,ix
+ from newdocsprinted where serialno=%s order by ix DESC ''' % (
+ localsettings.OM_DATE_FORMAT, sno)
+
cursor.execute(query)
rows = cursor.fetchall()
cursor.close()
- #db.close()
+ # db.close()
return rows
+
def add(sno, docname, object, version=1):
'''
add a note in the database of stuff which has been printed
@@ -45,7 +64,7 @@ def add(sno, docname, object, version=1):
db = connect.connect()
cursor = db.cursor()
query = '''INSERT INTO newdocsprinted
-(serialno,printdate,docname,docversion,data)
+(serialno,printdate,docname,docversion,data)
VALUES (%s, date(NOW()), %s, %s, %s)'''
values = (sno, docname, version, object)
print "adding letter to newdocsprinted table"
@@ -55,7 +74,5 @@ VALUES (%s, date(NOW()), %s, %s, %s)'''
if __name__ == "__main__":
#- test function
- data, version= getData(80982)
- print data,version
-
-
+ data, version = getData(80982)
+ print data, version
diff --git a/src/openmolar/dbtools/est_logger.py b/src/openmolar/dbtools/est_logger.py
index bc84334..820a95a 100644
--- a/src/openmolar/dbtools/est_logger.py
+++ b/src/openmolar/dbtools/est_logger.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module provides read/write tools for the est_logger database table
@@ -20,15 +36,17 @@ from openmolar.connect import connect
LOGGER = logging.getLogger("openmolar")
SELECT_QUERY = ('select est_data from est_logger '
-'where courseno=%s order by ix desc limit 1')
+ 'where courseno=%s order by ix desc limit 1')
INSERT_QUERY = ('insert into est_logger '
-'(courseno, est_data, operator) values (%s,%s,%s)')
+ '(courseno, est_data, operator) values (%s,%s,%s)')
HISTORY_QUERY = ('select est_data, operator, time_stamp '
-'from est_logger where courseno=%s')
+ 'from est_logger where courseno=%s')
+
class EstLogger(object):
+
def __init__(self, courseno):
self.courseno = courseno
self.est_data = ""
@@ -39,7 +57,7 @@ class EstLogger(object):
cursor = db.cursor()
LOGGER.debug(
'getting last estimate text from est_logger for courseno %s' % (
- self.courseno))
+ self.courseno))
cursor.execute(SELECT_QUERY, (self.courseno,))
@@ -54,7 +72,7 @@ class EstLogger(object):
'''
add a row to the daybook table, and save state.
'''
- if self._write_needed(courseno, est_data):
+ if courseno and self._write_needed(courseno, est_data):
db = connect()
cursor = db.cursor()
@@ -70,7 +88,8 @@ class EstLogger(object):
LOGGER.debug("est_logger up to date")
def _write_needed(self, courseno, est_data):
- return courseno != courseno or est_data != self.est_data
+ return courseno !=self. courseno or est_data != self.est_data
+
def html_history(courseno):
db = connect()
@@ -85,13 +104,13 @@ def html_history(courseno):
<body>
<h1>%s %s</h1>
</body>
- </html>'''% (_("No estimate history found for course"), courseno)
+ </html>''' % (_("No estimate history found for course"), courseno)
html = u'''<html>
<body>
<h1>%s</h1>
<table width = '100%%' border="1">
- '''% _("Current Estimate Version History")
+ ''' % _("Current Estimate Version History")
html += u'''<tr>
<th>%s</th>
@@ -99,20 +118,20 @@ def html_history(courseno):
</tr>''' % (
_("Estimate"),
_("Author")
- )
+ )
for est_data, author, time_stamp in rows:
lines = est_data.split("||\n")
formatted_est = '''<table width="100%%" border="1">
<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th>
- <th>%s</th><th>%s</th></tr>'''%(
- _("No."), _("Itemcode"), _("Description"), "CseTyp", _("Feescale"),
- _("Dentist"), _("Fee"), _("Charge"))
+ <th>%s</th><th>%s</th></tr>''' % (
+ _("No."), _("Itemcode"), _("Description"), "CseTyp", _("Feescale"),
+ _("Dentist"), _("Fee"), _("Charge"))
for line in lines:
formatted_est += "<tr>"
for i, field in enumerate(line.split(" || ")):
align = 'align="center"' if i < 6 else 'align="right"'
- formatted_est += "<td %s>%s</td>"% (align, field)
+ formatted_est += "<td %s>%s</td>" % (align, field)
formatted_est += "</tr>"
html += u'''<tr>
<td>%s</table></td>
@@ -130,4 +149,4 @@ if __name__ == "__main__":
est_logger = EstLogger(1)
est_logger.add_row(1, "test_data")
- print html_history(1)
\ No newline at end of file
+ print html_history(1)
diff --git a/src/openmolar/dbtools/estimate_synopsis.py b/src/openmolar/dbtools/estimate_synopsis.py
index 4372c65..510f113 100644
--- a/src/openmolar/dbtools/estimate_synopsis.py
+++ b/src/openmolar/dbtools/estimate_synopsis.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from openmolar.settings import localsettings
from openmolar.connect import connect
@@ -13,6 +29,7 @@ QUERY = '''SELECT description, ptfee, est_link2.completed
from newestimates right join est_link2 on newestimates.ix = est_link2.est_id
where courseno = %s order by itemcode, description'''
+
def html(courseno):
values = (courseno,)
db = connect()
@@ -29,7 +46,8 @@ def html(courseno):
completed, planned = [], []
for description, fee, comp in rows:
if comp:
- completed.append((description, fee, localsettings.formatMoney(fee)))
+ completed.append(
+ (description, fee, localsettings.formatMoney(fee)))
else:
planned.append((description, fee, localsettings.formatMoney(fee)))
@@ -64,15 +82,15 @@ def html(courseno):
<td />
<td width= '30%%'>%s</td>
<td width= '20%%' align='right'>%s</td>
- </tr>'''% (
+ </tr>''' % (
p_desc, p_fee, c_desc, c_fee)
html_ += '''<tr>
<td colspan="2" align='right'><b>%s</b></td>
<td />
<td colspan="2" align='right'><b>%s</b></td>
- </tr>'''% (
- localsettings.formatMoney(p_tot), localsettings.formatMoney(c_tot))
+ </tr>''' % (
+ localsettings.formatMoney(p_tot), localsettings.formatMoney(c_tot))
return html_ + "</table><br />"
diff --git a/src/openmolar/dbtools/estimatesHistory.py b/src/openmolar/dbtools/estimatesHistory.py
index be5505a..c458497 100644
--- a/src/openmolar/dbtools/estimatesHistory.py
+++ b/src/openmolar/dbtools/estimatesHistory.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from openmolar.settings import localsettings
from openmolar.connect import connect
@@ -15,6 +31,7 @@ fee, ptfee, feescale, csetype, dent, est_link2.completed, tx_hash, courseno
from newestimates right join est_link2 on newestimates.ix = est_link2.est_id
where serialno=%s order by courseno desc, itemcode, ix'''
+
def getEsts(sno):
db = connect()
cursor = db.cursor()
@@ -33,7 +50,7 @@ def getEsts(sno):
ix = row[0]
found = False
- #use existing est if one relates to multiple treatments
+ # use existing est if one relates to multiple treatments
for existing_est in estimates:
if existing_est.ix == ix:
existing_est.tx_hashes.append(tx_hash)
@@ -42,7 +59,7 @@ def getEsts(sno):
if found:
continue
- #initiate a custom data class
+ # initiate a custom data class
est = Estimate()
est.ix = ix
@@ -56,8 +73,8 @@ def getEsts(sno):
est.csetype = row[7]
est.dent = row[8]
- #est.category = "TODO"
- #est.type_ = "TODO"
+ # est.category = "TODO"
+ # est.type_ = "TODO"
est.tx_hashes = [tx_hash]
estimates.append(est)
@@ -66,13 +83,14 @@ def getEsts(sno):
return estimates
+
def details(sno):
'''
returns an html page showing pt's old estimates
'''
estimatesList = getEsts(sno)
claimNo = len(estimatesList)
- retarg = "<h2>Past Estimates - %d rows found</h2>"% claimNo
+ retarg = "<h2>Past Estimates - %d rows found</h2>" % claimNo
if claimNo == 0:
return retarg
courseno = -1
@@ -80,10 +98,10 @@ def details(sno):
for est in estimatesList:
if est.courseno != courseno:
if not firstRow:
- retarg+="</table>"
+ retarg += "</table>"
firstRow = False
retarg += '''</table><h3>Estimate for course number %d</h3>
- <table width="100%%" border="1">'''% est.courseno
+ <table width="100%%" border="1">''' % est.courseno
retarg += est.htmlHeader()
courseno = est.courseno
retarg += est.toHtmlRow()
diff --git a/src/openmolar/dbtools/extend_books.py b/src/openmolar/dbtools/extend_books.py
index 2f45433..c6d7cc9 100644
--- a/src/openmolar/dbtools/extend_books.py
+++ b/src/openmolar/dbtools/extend_books.py
@@ -1,25 +1,42 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import datetime
from openmolar.connect import connect, IntegrityError
from openmolar.settings import localsettings
+
def extend(dents, startdate, enddate):
'''
inserts new days into the aday table for dents
this is like buying next year's diary
'''
-
+
delta = datetime.timedelta(days=1)
query = '''insert into aday (adate, apptix, start, end, flag, memo)
values (%s, %s, %s, %s, %s, %s)'''
-
+
db = connect()
cursor = db.cursor()
@@ -29,10 +46,10 @@ values (%s, %s, %s, %s, %s, %s)'''
values = (curdate, dent, 0, 0, 0, "")
try:
if cursor.execute(query, values):
- print "successfully added %s for dent %s"% (curdate, dent)
+ print "successfully added %s for dent %s" % (curdate, dent)
except IntegrityError:
- print "%s already present for dent %s"% (curdate, dent)
- curdate+=delta
+ print "%s already present for dent %s" % (curdate, dent)
+ curdate += delta
cursor.close()
db.commit()
@@ -40,9 +57,9 @@ values (%s, %s, %s, %s, %s, %s)'''
if __name__ == "__main__":
-
+
#-- test procedures......
-
- startdate = datetime.date(2010,1,1)
- enddate = datetime.date(2010,2,1)
- extend((4,5,6,7,13,14),startdate, enddate)
+
+ startdate = datetime.date(2010, 1, 1)
+ enddate = datetime.date(2010, 2, 1)
+ extend((4, 5, 6, 7, 13, 14), startdate, enddate)
diff --git a/src/openmolar/dbtools/families.py b/src/openmolar/dbtools/families.py
new file mode 100644
index 0000000..17a6555
--- /dev/null
+++ b/src/openmolar/dbtools/families.py
@@ -0,0 +1,172 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+from openmolar.connect import connect
+from openmolar.settings import localsettings
+
+QUERY = '''select serialno, title, fname, sname,
+addr1, addr2, addr3, town, county, pcde, dob, status, tel1 from patients
+where familyno = %s order by dob'''
+
+PATIENT_QUERY = QUERY.replace("familyno", "serialno")
+
+LINK_QUERY = 'update patients set familyno=%s where serialno=%s'
+
+SYNC_QUERY = '''update patients set
+addr1=%s, addr2=%s, addr3=%s, town=%s, county=%s, pcde=%s
+where familyno=%s'''
+
+NEXT_FAMILYNO_QUERY = "select max(familyno)+1 from patients"
+NEW_GROUP_QUERY = "update patients set familyno=%s where serialno=%s"
+
+DELETE_FAMILYNO_QUERY = "update patients set familyno=NULL where familyno=%s"
+
+ADDRESS_MATCH_QUERY = '''select
+ case when addr1 = %s then 4 else 0 end +
+ case when addr1 like %s then 3 else 0 end +
+ case when addr2 like %s then 3 else 0 end +
+ case when addr3 like %s then 1 else 0 end +
+ case when town like %s then 1 else 0 end +
+ case when pcde = %s then 5 else 0 end as matches ,
+ serialno, title, fname, sname, dob, addr1, addr2, addr3, town, pcde
+from patients
+where
+addr1 like %s or
+((addr2 != "" and addr2 is not NULL) and addr2 like %s) or
+((town != "" and town is not NULL) and town like %s)or
+(pcde=%s and pcde != "")
+order by matches desc
+limit 12
+'''
+
+
+def new_group(serialno):
+ '''
+ start a new family with one member - serialno
+ '''
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(NEXT_FAMILYNO_QUERY)
+ family_no = cursor.fetchone()[0]
+ cursor.execute(NEW_GROUP_QUERY, (family_no, serialno))
+ cursor.close()
+ return family_no
+
+
+def delete_group(family_no):
+ '''
+ delete all reference to familyno for all records
+ '''
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(DELETE_FAMILYNO_QUERY, (family_no,))
+ cursor.close()
+
+
+def add_member(family_no, serialno):
+ '''
+ add serialno to group familyno
+ '''
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(LINK_QUERY, (family_no, serialno))
+ cursor.close()
+
+
+def remove_member(serialno):
+ '''
+ remove any family reference for record serialno
+ '''
+ add_member(None, serialno)
+
+
+def get_members(family_no):
+ '''
+ get members of the family with number familyno
+ '''
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(QUERY, (family_no,))
+ members = cursor.fetchall()
+ cursor.close()
+ return members
+
+
+def sync_addresses(family_no, chosen_address):
+ '''
+ set all familyno addresses to this address
+ returns the number of records changed.
+ '''
+ db = connect()
+ cursor = db.cursor()
+ values = tuple(chosen_address) + (family_no,)
+ count = cursor.execute(SYNC_QUERY, values)
+ cursor.close()
+ return count
+
+
+def get_patient_details(serialno):
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(PATIENT_QUERY, (serialno,))
+ member = cursor.fetchone()
+ cursor.close()
+ return member
+
+
+def get_address_matches(address):
+ '''
+ find possible address matches for the address used.
+ '''
+
+ addr1 = address[0]
+ addr2 = address[1]
+ addr3 = address[2]
+ town = address[3]
+ county = address[4]
+ pcde = address[5]
+
+ db = connect()
+ cursor = db.cursor()
+ values = (
+ addr1,
+ addr1[:10],
+ addr2[:10],
+ addr3[:10],
+ town[:10],
+ pcde,
+ addr1[:10],
+ addr2[:10],
+ town[:10],
+ pcde[:10],
+ )
+
+ cursor.execute(ADDRESS_MATCH_QUERY, (values))
+ rows = cursor.fetchall()
+ cursor.close()
+
+ return rows
+
+if __name__ == "__main__":
+ print new_group(1)
diff --git a/src/openmolar/dbtools/feescales.py b/src/openmolar/dbtools/feescales.py
index 8c589aa..b169997 100644
--- a/src/openmolar/dbtools/feescales.py
+++ b/src/openmolar/dbtools/feescales.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import os
@@ -32,8 +34,9 @@ from openmolar.settings import localsettings
LOGGER = logging.getLogger("openmolar")
+
def write_readme():
- LOGGER.info("creating directory %s"% FEESCALE_DIR)
+ LOGGER.info("creating directory %s" % FEESCALE_DIR)
os.makedirs(FEESCALE_DIR)
f = open(os.path.join(FEESCALE_DIR, "README.txt"), "w")
f.write('''
@@ -63,6 +66,7 @@ UPDATE_QUERY = "update feescales set xml_data = %s where ix = %s"
NEW_FEESCALE_QUERY = "insert into feescales (xml_data) values(%s)"
+
class FeescaleHandler(object):
def get_feescale_from_database(self, ix):
@@ -79,7 +83,7 @@ class FeescaleHandler(object):
return ""
def get_feescales_from_database(self,
- in_use_only=True, priority_order=True):
+ in_use_only=True, priority_order=True):
'''
connects and get the data from feetable_key
'''
@@ -93,12 +97,12 @@ class FeescaleHandler(object):
cursor.execute(query)
rows = cursor.fetchall()
cursor.close()
- LOGGER.debug("%d feescales retrieved"% len(rows))
+ LOGGER.debug("%d feescales retrieved" % len(rows))
return rows
def save_file(self, ix, xml_data):
file_path = self.index_to_local_filepath(ix)
- LOGGER.debug("writing %s"% file_path)
+ LOGGER.debug("writing %s" % file_path)
f = open(file_path, "w")
f.write(xml_data)
f.close()
@@ -111,8 +115,8 @@ class FeescaleHandler(object):
yield xml_file
- #self.save_file(ix, xml_data)
- #LOGGER.info("feescales data written to local filesystem")
+ # self.save_file(ix, xml_data)
+ # LOGGER.info("feescales data written to local filesystem")
def non_existant_and_modified_local_files(self):
'''
@@ -132,7 +136,7 @@ class FeescaleHandler(object):
return unwritten, modified
def index_to_local_filepath(self, ix):
- return os.path.join(FEESCALE_DIR, "feescale_%d.xml"% ix)
+ return os.path.join(FEESCALE_DIR, "feescale_%d.xml" % ix)
@property
def local_files(self):
@@ -155,9 +159,9 @@ class FeescaleHandler(object):
def update_db(self, ix):
message = ""
filepath = self.index_to_local_filepath(ix)
- LOGGER.debug("updating database ix %s"% ix)
+ LOGGER.debug("updating database ix %s" % ix)
if not os.path.isfile(filepath):
- message = "FATAL %s does not exist!"% filepath
+ message = "FATAL %s does not exist!" % filepath
else:
db = connect.connect()
cursor = db.cursor()
@@ -167,10 +171,10 @@ class FeescaleHandler(object):
f.close()
values = (data, ix)
- result = cursor.execute(UPDATE_QUERY, values)
+ result = cursor.execute(UPDATE_QUERY, values)
- r_message = "commiting feescale '%s' to database."% filepath
- message = "updating feescale %d result = %s\n"% (
+ r_message = "commiting feescale '%s' to database." % filepath
+ message = "updating feescale %d result = %s\n" % (
ix, "OK" if result else "No Change applied")
db.close()
@@ -180,11 +184,11 @@ class FeescaleHandler(object):
def save_xml(self, ix, xml):
file_path = self.index_to_local_filepath(ix)
- LOGGER.info("saving %s"% file_path)
+ LOGGER.info("saving %s" % file_path)
LOGGER.debug("creating backup")
try:
- shutil.copy(file_path, file_path+"~")
+ shutil.copy(file_path, file_path + "~")
except IOError:
LOGGER.warning("no backup file created")
diff --git a/src/openmolar/dbtools/forum.py b/src/openmolar/dbtools/forum.py
index 61ea9fc..3520505 100644
--- a/src/openmolar/dbtools/forum.py
+++ b/src/openmolar/dbtools/forum.py
@@ -1,101 +1,124 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import sys
from openmolar import connect
from openmolar.settings import localsettings
-headers=[_("Subject"),"db_index",_("From"), _("To"),
-_("Date"),_("Message"), _("Message")] #, "parent"]
+headers = [_("Subject"), "db_index", _("From"), _("To"),
+ _("Date"), _("Message"), _("Message")] # , "parent"]
HIGHESTID = 0
+
class post():
+
def __init__(self):
- self.ix=None
- self.parent_ix=None
- self.inits=""
- self.recipient=None
- self.date=None
- self.topic=""
- self.comment=""
- self.briefcomment=""
- self.open=True
+ self.ix = None
+ self.parent_ix = None
+ self.inits = ""
+ self.recipient = None
+ self.date = None
+ self.topic = ""
+ self.comment = ""
+ self.briefcomment = ""
+ self.open = True
+
def commitPost(post):
- #use a different connection for forum, as it runs in a separate thread
+ # use a different connection for forum, as it runs in a separate thread
- db = connect.connect()
+ db = connect.connect()
cursor = db.cursor()
columns = "parent_ix,inits,recipient,fdate,topic,comment"
-
+
values = (post.parent_ix, post.inits, post.recipient,
- post.topic, post.comment.replace("\n"," "))
+ post.topic, post.comment.replace("\n", " "))
query = \
- "insert into forum (%s) VALUES (%%s,%%s,%%s,NOW(),%%s,%%s)"% columns
+ "insert into forum (%s) VALUES (%%s,%%s,%%s,NOW(),%%s,%%s)" % columns
cursor.execute(query, values)
db.commit()
-
+
+
def deletePost(ix):
- db=connect.connect()
- cursor=db.cursor()
+ db = connect.connect()
+ cursor = db.cursor()
query = "update forum set open=False where ix=%s"
- cursor.execute(query, (ix,))
+ cursor.execute(query, (ix,))
db.commit()
cursor.close()
-
+
+
def setParent(ix, parent_ix):
db = connect.connect()
cursor = db.cursor()
query = "update forum set parent_ix=%s where ix=%s"
- cursor.execute(query, (parent_ix, ix))
+ cursor.execute(query, (parent_ix, ix))
db.commit()
cursor.close()
-
+
+
def newPosts():
result = False
try:
users = localsettings.operator.split("/")
if users == []:
return
- db=connect.connect()
- cursor=db.cursor()
- query='''select max(ix) from forum'''
+ db = connect.connect()
+ cursor = db.cursor()
+ query = '''select max(ix) from forum'''
cursor.execute(query)
row = cursor.fetchone()
- query="select max(id) from forumread where"
+ query = "select max(id) from forumread where"
for user in users:
- query += " op='%s' or"% user
+ query += " op='%s' or" % user
cursor.execute(query.strip("or"))
row2 = cursor.fetchone()
-
+
cursor.close()
result = row[0] > row2[0]
- except connect.ProgrammingError, e:
+ except connect.ProgrammingError as e:
print e
return result
-
+
+
def updateReadHistory():
users = localsettings.operator.split("/")
- #print "updating forumread for new posts for ", users
+ # print "updating forumread for new posts for ", users
if users == []:
return
- db=connect.connect()
- cursor=db.cursor()
- query="insert into forumread set id=%s, op=%s, readdate=NOW()"
+ db = connect.connect()
+ cursor = db.cursor()
+ query = "insert into forumread set id=%s, op=%s, readdate=NOW()"
for user in users:
- values = (HIGHESTID, user)
+ values = (HIGHESTID, user)
cursor.execute(query, values)
-
+
cursor.close()
-
+
def getPosts(user=None, include_closed=False):
'''
@@ -104,7 +127,7 @@ def getPosts(user=None, include_closed=False):
global HIGHESTID
filter = ""
if not include_closed:
- filter += ' open '
+ filter += ' open '
if user:
if filter == "":
filter += "and"
@@ -113,13 +136,13 @@ def getPosts(user=None, include_closed=False):
filter = "where " + filter
db = connect.connect()
cursor = db.cursor()
- query = ('SELECT ix, parent_ix, topic, inits, fdate, recipient, comment '
- 'FROM forum %s ORDER BY parent_ix, ix' % filter)
+ query = ('SELECT ix, parent_ix, topic, inits, fdate, recipient, comment '
+ 'FROM forum %s ORDER BY parent_ix, ix' % filter)
cursor.execute(query)
rows = cursor.fetchall()
cursor.close()
-
+
retarg = []
update = False
for row in rows:
@@ -147,4 +170,3 @@ if __name__ == "__main__":
posts = getPosts()
for post in posts:
print post.parent_ix, post.ix, post.topic
-
\ No newline at end of file
diff --git a/src/openmolar/dbtools/memos.py b/src/openmolar/dbtools/memos.py
index 9c3b1ef..3098ee0 100644
--- a/src/openmolar/dbtools/memos.py
+++ b/src/openmolar/dbtools/memos.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009-2013 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from openmolar.connect import connect
from openmolar.settings import localsettings
@@ -24,6 +41,7 @@ DELETE_QUERY = "update ptmemos set open = 0 where ix=%s"
class Memo(object):
+
def __init__(self):
self.ix = None
self.serialno = 0
@@ -37,6 +55,7 @@ class Memo(object):
def setMessage(self, arg):
self.message = arg
+
def get_memos(serialno):
db = connect()
@@ -65,6 +84,7 @@ def get_memos(serialno):
yield memo
+
def deleteMemo(ix):
db = connect()
cursor = db.cursor()
@@ -72,6 +92,7 @@ def deleteMemo(ix):
cursor.close()
db.commit()
+
def saveMemo(serialno, author, type, expire, message, open):
'''
put a memo into the database
@@ -87,6 +108,7 @@ def saveMemo(serialno, author, type, expire, message, open):
return result
+
def html_history(serialno):
db = connect()
cursor = db.cursor()
@@ -100,13 +122,13 @@ def html_history(serialno):
<body>
<h1>%s</h1>
</body>
- </html>'''% _("No memo history found")
+ </html>''' % _("No memo history found")
html = u'''<html>
<body>
<h1>%s</h1>
<table width = '100%%' border="1">
- '''% _("Memo History")
+ ''' % _("Memo History")
html += u'''<tr>
<th>%s</th>
diff --git a/src/openmolar/dbtools/nhs_claims.py b/src/openmolar/dbtools/nhs_claims.py
index ebdce38..a2aeb17 100644
--- a/src/openmolar/dbtools/nhs_claims.py
+++ b/src/openmolar/dbtools/nhs_claims.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
module for getting/setting information from the claims table
@@ -12,6 +28,7 @@ module for getting/setting information from the claims table
from openmolar.connect import connect
+
def details(sno):
'''returns an html set showing pt name etc...'''
@@ -19,19 +36,19 @@ def details(sno):
headers += 'authdate,dob,sname,fname,addr1,addr2,addr3,pcde,nhsno,'
headers += 'prevsname,exempttext,i0,i1,i2,i3,i4,f0,f1,f2,f3,f4,f5,f6,f7,'
headers += 'f8,f9,submstatus,submcount,submno,archdate,'
- headers += 'town,county,regtype' #claimdata,trtdata,
+ headers += 'town,county,regtype' # claimdata,trtdata,
db = connect()
cursor = db.cursor()
cursor.execute(
- 'select %s from claims where serialno=%d order by proddate DESC'%(
- headers,sno))
+ 'select %s from claims where serialno=%d order by proddate DESC' % (
+ headers, sno))
rows = cursor.fetchall()
cursor.close()
claimNo = len(rows)
- retarg = "<h3>NHS Claims - %d found</h3>"% claimNo
+ retarg = "<h3>NHS Claims - %d found</h3>" % claimNo
if claimNo == 0:
return retarg
retarg += '<table border="1">'
@@ -41,13 +58,13 @@ def details(sno):
bgcolor = ""
if i2 % 2 == 0:
bgcolor = ' bgcolor="#eeffff"'
- retarg += '<td%s>Claim %s</td>'% (bgcolor, i2+1)
+ retarg += '<td%s>Claim %s</td>' % (bgcolor, i2 + 1)
retarg += '</tr>'
headerArray = headers.split(",")
for i in range(len(headerArray)):
retarg += "<tr>"
- retarg += "<th>%s</th>"% headerArray[i]
+ retarg += "<th>%s</th>" % headerArray[i]
for i2 in range(len(rows)):
bgcolor = ""
if i2 % 2 == 0:
@@ -55,12 +72,12 @@ def details(sno):
val = rows[i2][i]
if not val:
val = "-"
- retarg += '<td%s>%s</td>'% (bgcolor, val)
+ retarg += '<td%s>%s</td>' % (bgcolor, val)
retarg += '</tr>\n'
retarg += '</table>'
- #db.close()
+ # db.close()
return retarg
diff --git a/src/openmolar/dbtools/patient_class.py b/src/openmolar/dbtools/patient_class.py
index 28d6bcd..46cd57d 100644
--- a/src/openmolar/dbtools/patient_class.py
+++ b/src/openmolar/dbtools/patient_class.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from copy import deepcopy
import datetime
@@ -26,77 +42,79 @@ from openmolar.dbtools.queries import ESTS_QUERY, PATIENT_QUERY
LOGGER = logging.getLogger("openmolar")
dateFields = ("dob", "pd0", "pd1", "pd2", "pd3", "pd4", "pd5", "pd6",
-"pd7", "pd8", "pd9", "pd10", "pd11", "pd12", "pd13", "pd14", "cnfd",
-"recd", "billdate", "enrolled", "initaccept", "lastreaccept", "lastclaim",
-"expiry", "transfer", "chartdate", "accd", "cmpd", "examd", "bpedate")
+ "pd7", "pd8", "pd9", "pd10", "pd11", "pd12", "pd13", "pd14", "cnfd",
+ "recd", "billdate", "enrolled", "initaccept", "lastreaccept", "lastclaim",
+ "expiry", "transfer", "chartdate", "accd", "cmpd", "examd", "bpedate")
nullDate = None
patientTableAtts = (
-'pf0','pf1','pf2','pf3','pf4','pf5','pf6','pf7','pf8','pf9','pf10','pf11',
-'pf12','pf14','pf15','pf16','pf17','pf18','pf19',
-'money0','money1','money2','money3','money4','money5','money6','money7',
-'money8','money9','money10',
-'pd0','pd1','pd2','pd3','pd4','pd5','pd6','pd7','pd8','pd9','pd10','pd11',
-'pd12','pd13','pd14',
-'sname','fname','title','sex','dob', 'addr1','addr2','addr3','pcde','tel1',
-'tel2','occup',
-'nhsno','cnfd','psn','cset','dnt1','dnt2','courseno0','courseno1',
-'ur8st','ur7st','ur6st','ur5st','ur4st','ur3st','ur2st','ur1st',
-'ul1st','ul2st','ul3st','ul4st','ul5st','ul6st','ul7st','ul8st',
-'ll8st','ll7st','ll6st','ll5st','ll4st','ll3st','ll2st','ll1st',
-'lr1st','lr2st','lr3st','lr4st','lr5st','lr6st','lr7st','lr8st',
-'dent0','dent1','dent2','dent3',
-'dmask','minstart','maxend','billdate','billct',
-'billtype','pf20','money11','pf13','familyno','memo',
-'town','county','mobile','fax','email1','email2','status','source',
-'enrolled','archived',
-'initaccept','lastreaccept','lastclaim','expiry','cstatus','transfer',
-'pstatus','courseno2')
-
-exemptionTableAtts = ('exemption','exempttext')
-
-patientTableVals=(
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,
-nullDate, nullDate, nullDate, nullDate, nullDate, nullDate, nullDate,
-nullDate, nullDate, nullDate, nullDate, nullDate, nullDate, nullDate,nullDate,
-'','','','',nullDate,'','', '','', '','', '',
-'',nullDate, '','',0,0,0,0,
-'','', '','', '','', '','',
-'','', '','', '','', '','',
-'','', '','', '','', '','',
-'','', '','', '','', '','',
-0,0,0,0,
-'YYYYYYY',0,0,nullDate,0,None,
-0,0,0,0,'','',
-'','','','','','','','',
-nullDate,0,
-nullDate,nullDate,nullDate,nullDate,0,nullDate,
-0,0)
-
-bpeTableAtts=('bpedate','bpe')
-bpeTableVals=(nullDate,'',())
-
-perioTableAtts=('chartdate','bpe','chartdata','flag')
-
-mnhistTableAtts=('chgdate','ix','note')
-
-notesTableAtts=('lineno','line')
-
-mouth= ['ul8','ul7','ul6','ul5','ul4','ul3','ul2','ul1',
-'ur1','ur2','ur3','ur4','ur5','ur6','ur7','ur8',
-'lr8','lr7','lr6','lr5','lr4','lr3','lr2','lr1',
-'ll1','ll2','ll3','ll4','ll5','ll6','ll7','ll8']
-
-decidmouth= ['***','***','***','ulE','ulD','ulC','ulB','ulA',
-'urA','urB','urC','urD','urE','***','***','***',
-'***','***','***','lrE','lrD','lrC','lrB','lrA',
-'llA','llB','llC','llD','llE','***','***','***']
+ 'pf0', 'pf1', 'pf2', 'pf3', 'pf4', 'pf5', 'pf6', 'pf7', 'pf8', 'pf9', 'pf10', 'pf11',
+ 'pf12', 'pf14', 'pf15', 'pf16', 'pf17', 'pf18', 'pf19',
+ 'money0', 'money1', 'money2', 'money3', 'money4', 'money5', 'money6', 'money7',
+ 'money8', 'money9', 'money10',
+ 'pd0', 'pd1', 'pd2', 'pd3', 'pd4', 'pd5', 'pd6', 'pd7', 'pd8', 'pd9', 'pd10', 'pd11',
+ 'pd12', 'pd13', 'pd14',
+ 'sname', 'fname', 'title', 'sex', 'dob', 'addr1', 'addr2', 'addr3', 'pcde', 'tel1',
+ 'tel2', 'occup',
+ 'nhsno', 'cnfd', 'psn', 'cset', 'dnt1', 'dnt2', 'courseno0', 'courseno1',
+ 'ur8st', 'ur7st', 'ur6st', 'ur5st', 'ur4st', 'ur3st', 'ur2st', 'ur1st',
+ 'ul1st', 'ul2st', 'ul3st', 'ul4st', 'ul5st', 'ul6st', 'ul7st', 'ul8st',
+ 'll8st', 'll7st', 'll6st', 'll5st', 'll4st', 'll3st', 'll2st', 'll1st',
+ 'lr1st', 'lr2st', 'lr3st', 'lr4st', 'lr5st', 'lr6st', 'lr7st', 'lr8st',
+ 'dent0', 'dent1', 'dent2', 'dent3',
+ 'dmask', 'minstart', 'maxend', 'billdate', 'billct',
+ 'billtype', 'pf20', 'money11', 'pf13', 'familyno', 'memo',
+ 'town', 'county', 'mobile', 'fax', 'email1', 'email2', 'status', 'source',
+ 'enrolled', 'archived',
+ 'initaccept', 'lastreaccept', 'lastclaim', 'expiry', 'cstatus', 'transfer',
+ 'pstatus', 'courseno2')
+
+exemptionTableAtts = ('exemption', 'exempttext')
+
+patientTableVals = (
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ nullDate, nullDate, nullDate, nullDate, nullDate, nullDate, nullDate,
+ nullDate, nullDate, nullDate, nullDate, nullDate, nullDate, nullDate, nullDate,
+ '', '', '', '', nullDate, '', '', '', '', '', '', '',
+ '', nullDate, '', '', 0, 0, 0, 0,
+ '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '',
+ 0, 0, 0, 0,
+ 'YYYYYYY', 0, 0, nullDate, 0, None,
+ 0, 0, 0, 0, '', '',
+ '', '', '', '', '', '', '', '',
+ nullDate, 0,
+ nullDate, nullDate, nullDate, nullDate, 0, nullDate,
+ 0, 0)
+
+bpeTableAtts = ('bpedate', 'bpe')
+bpeTableVals = (nullDate, '', ())
+
+perioTableAtts = ('chartdate', 'chartdata')
+
+mnhistTableAtts = ('chgdate', 'ix', 'note')
+
+notesTableAtts = ('lineno', 'line')
+
+mouth = ['ul8', 'ul7', 'ul6', 'ul5', 'ul4', 'ul3', 'ul2', 'ul1',
+ 'ur1', 'ur2', 'ur3', 'ur4', 'ur5', 'ur6', 'ur7', 'ur8',
+ 'lr8', 'lr7', 'lr6', 'lr5', 'lr4', 'lr3', 'lr2', 'lr1',
+ 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8']
+
+decidmouth = ['***', '***', '***', 'ulE', 'ulD', 'ulC', 'ulB', 'ulA',
+ 'urA', 'urB', 'urC', 'urD', 'urE', '***', '***', '***',
+ '***', '***', '***', 'lrE', 'lrD', 'lrC', 'lrB', 'lrA',
+ 'llA', 'llB', 'llC', 'llD', 'llE', '***', '***', '***']
clinical_memos = ("synopsis",)
+
class patient(object):
+
def __init__(self, sno):
'''
initiate the class with default variables, then load from database
@@ -106,7 +124,7 @@ class patient(object):
self.load_warnings = []
- ## patient table atts
+ # patient table atts
self.courseno0 = None
self.pf0 = 0
self.pf1 = 0
@@ -217,7 +235,7 @@ class patient(object):
self.pf20 = 0
self.money11 = 0
self.pf13 = 0
- self.familyno = 0
+ self.familyno = localsettings.last_family_no
self.memo = ''
self.town = ''
self.county = ''
@@ -238,17 +256,17 @@ class patient(object):
self.pstatus = None
self.courseno2 = 0
- ######TABLE 'mnhist'#######
+ # TABLE 'mnhist'#######
self.chgdate = nullDate # date YES None
- self.ix = 0 #tinyint(3) unsigned YES None
- self.note = '' #varchar(60) YES None
+ self.ix = 0 # tinyint(3) unsigned YES None
+ self.note = '' # varchar(60) YES None
self.estimates = []
- ##from userdata
+ # from userdata
self.plandata = PlanData(self.serialno)
- ###NEIL'S STUFF####
+ # NEIL'S STUFF####
self.exemption = ""
self.exempttext = ""
self.perioData = {}
@@ -270,16 +288,16 @@ class patient(object):
if self.serialno == 0:
return
- ######################################
- ## now load stuff from the database ##
- ######################################
+ #
+ # now load stuff from the database ##
+ #
db = connect.connect()
cursor = db.cursor()
self.getSynopsis()
cursor.execute(PATIENT_QUERY, (self.serialno,))
- values= cursor.fetchall()
+ values = cursor.fetchall()
if values == ():
raise localsettings.PatientNotFoundError
@@ -288,6 +306,8 @@ class patient(object):
value = values[0][i]
if value is not None:
self.__dict__[att] = value
+ elif att == "familyno":
+ self.familyno = 0
query = '''select exemption, exempttext from exemptions
where serialno=%s'''
@@ -317,26 +337,26 @@ class patient(object):
query = 'select chartdate,chartdata from perio where serialno=%s'
cursor.execute(query, self.serialno)
- perioData=cursor.fetchall()
+ perioData = cursor.fetchall()
for data in perioData:
self.perioData[localsettings.formatDate(data[0])] = (
- perio.get_perioData(data[1]))
+ perio.get_perioData(data[1]))
#--perioData is
#--a dictionary (keys=dates) of dictionaries with keys
#--like "ur8" and containing 7 tuples of data
- query = 'select drnm,adrtel,curmed,oldmed,allerg,heart,lungs,'+\
- 'liver,kidney,bleed,anaes,other,alert,chkdate from mednotes'+\
- ' where serialno=%s'
+ query = 'select drnm,adrtel,curmed,oldmed,allerg,heart,lungs,' +\
+ 'liver,kidney,bleed,anaes,other,alert,chkdate from mednotes' +\
+ ' where serialno=%s'
cursor.execute(query, (self.serialno,))
- self.MH=cursor.fetchone()
- if self.MH!=None:
- self.MEDALERT=self.MH[12]
+ self.MH = cursor.fetchone()
+ if self.MH is not None:
+ self.MEDALERT = self.MH[12]
cursor.close()
- #db.close()
+ # db.close()
#-- load from plandata
self.plandata.getFromDB()
@@ -347,7 +367,6 @@ class patient(object):
self.take_snapshot()
-
@property
def appt_memo(self):
return self.appt_prefs.note
@@ -370,12 +389,12 @@ class patient(object):
cursor = db.cursor()
query = 'select date, trtid, chart from daybook where serialno=%s'
cursor.execute(query, self.serialno)
- self._dayBookHistory=cursor.fetchall()
+ self._dayBookHistory = cursor.fetchall()
cursor.close()
return self._dayBookHistory
def __repr__(self):
- return "'Patient_class instance - serialno %d'"% self.serialno
+ return "'Patient_class instance - serialno %d'" % self.serialno
@property
def address(self):
@@ -384,9 +403,9 @@ class patient(object):
'''
address = ""
for line in (self.addr1, self.addr2, self.addr3,
- self.town, self.county, self.pcde):
+ self.town, self.county, self.pcde):
if line.strip(" ") != "":
- address += "%s\n"% line.strip(" ")
+ address += "%s\n" % line.strip(" ")
return address
def getAge(self, on_date=None):
@@ -394,17 +413,17 @@ class patient(object):
return the age in form (year(int), months(int), isToday(bool))
'''
if on_date is None:
- #use today
+ # use today
on_date = localsettings.currentDay()
day = self.dob.day
try:
nextbirthday = datetime.date(on_date.year, self.dob.month,
- self.dob.day)
+ self.dob.day)
except ValueError:
- #catch leap years!!
+ # catch leap years!!
nextbirthday = datetime.date(on_date.year, self.dob.month,
- self.dob.day-1)
+ self.dob.day - 1)
ageYears = on_date.year - self.dob.year
@@ -416,7 +435,7 @@ class patient(object):
if self.dob.day > on_date.day:
months -= 1
- isToday = nextbirthday == localsettings.currentDay()
+ isToday = nextbirthday == localsettings.currentDay()
return (ageYears, months, isToday)
@@ -460,16 +479,16 @@ class patient(object):
cse_accd = self.treatment_course.accd
for table in localsettings.FEETABLES.tables.values():
LOGGER.debug(
- "checking feescale %s to see if suitable a feetable"% (
- table))
+ "checking feescale %s to see if suitable a feetable" % (
+ table))
start, end = table.startDate, table.endDate
- LOGGER.debug("categories, start, end = %s, %s, %s"% (
+ LOGGER.debug("categories, start, end = %s, %s, %s" % (
table.categories, start, end))
if end is None:
end = localsettings.currentDay()
- if self.cset in table.categories and start <= cse_accd <=end:
+ if self.cset in table.categories and start <= cse_accd <= end:
self._fee_table = table
if self._fee_table is None:
@@ -500,7 +519,7 @@ class patient(object):
ix = row[0]
found = False
- #use existing est if one relates to multiple treatments
+ # use existing est if one relates to multiple treatments
for existing_est in self.estimates:
if existing_est.ix == ix:
existing_est.tx_hashes.append(tx_hash)
@@ -509,7 +528,7 @@ class patient(object):
if found:
continue
- #initiate a custom data class
+ # initiate a custom data class
est = estimates.Estimate()
est.ix = ix
@@ -534,23 +553,23 @@ class patient(object):
db = connect.connect()
cursor = db.cursor()
fields = clinical_memos
- query=""
+ query = ""
for field in fields:
- query += field+","
- query=query.strip(",")
+ query += field + ","
+ query = query.strip(",")
try:
if cursor.execute(
- 'SELECT %s from clinical_memos where serialno=%d'% ( query,
- self.serialno)):
+ 'SELECT %s from clinical_memos where serialno=%d' % (query,
+ self.serialno)):
self.synopsis = cursor.fetchall()[-1][0]
- except connect.OperationalError, e:
+ except connect.OperationalError as e:
'necessary because the column is missing is db schema 1.4'
print "WARNING -", e
@property
def underTreatment(self):
return (self.treatment_course is not None and
- self.treatment_course.underTreatment)
+ self.treatment_course.underTreatment)
@property
def max_tx_courseno(self):
@@ -571,42 +590,42 @@ class patient(object):
switches a deciduous tooth to a permanent one,
and viceVersa pass a variable like "ur5"
'''
- quadrant=tooth[:2]
- pos=int(tooth[2])-1 # will be 0-7
- if quadrant=="ul":
- var=self.dent1
- pos=7-pos
- elif quadrant=="ur":
- var=self.dent0
- elif quadrant=="ll":
- var=self.dent2
- else: #lr
- var=self.dent3
- pos=7-pos
- existing=dec_perm.fromSignedByte(var)
- if existing[pos]=="1":
- existing=existing[:pos]+"0"+existing[pos+1:]
+ quadrant = tooth[:2]
+ pos = int(tooth[2]) - 1 # will be 0-7
+ if quadrant == "ul":
+ var = self.dent1
+ pos = 7 - pos
+ elif quadrant == "ur":
+ var = self.dent0
+ elif quadrant == "ll":
+ var = self.dent2
+ else: # lr
+ var = self.dent3
+ pos = 7 - pos
+ existing = dec_perm.fromSignedByte(var)
+ if existing[pos] == "1":
+ existing = existing[:pos] + "0" + existing[pos + 1:]
else:
- existing=existing[:pos]+"1"+existing[pos+1:]
- if quadrant=="ul":
- self.dent1=dec_perm.toSignedByte(existing)
- elif quadrant=="ur":
- self.dent0=dec_perm.toSignedByte(existing)
- elif quadrant=="ll":
- self.dent2=dec_perm.toSignedByte(existing)
- else: #lr
- self.dent3=dec_perm.toSignedByte(existing)
+ existing = existing[:pos] + "1" + existing[pos + 1:]
+ if quadrant == "ul":
+ self.dent1 = dec_perm.toSignedByte(existing)
+ elif quadrant == "ur":
+ self.dent0 = dec_perm.toSignedByte(existing)
+ elif quadrant == "ll":
+ self.dent2 = dec_perm.toSignedByte(existing)
+ else: # lr
+ self.dent3 = dec_perm.toSignedByte(existing)
self.updateChartgrid()
def updateChartgrid(self):
- grid=""
- for quad in (self.dent1,self.dent0,self.dent3,self.dent2):
- grid+=dec_perm.fromSignedByte(quad)
+ grid = ""
+ for quad in (self.dent1, self.dent0, self.dent3, self.dent2):
+ grid += dec_perm.fromSignedByte(quad)
for pos in mouth:
- if grid[mouth.index(pos)]=="0":
- self.chartgrid[pos]=pos
+ if grid[mouth.index(pos)] == "0":
+ self.chartgrid[pos] = pos
else:
- self.chartgrid[pos]=decidmouth[mouth.index(pos)]
+ self.chartgrid[pos] = decidmouth[mouth.index(pos)]
def apply_fees(self):
if "N" in self.cset:
@@ -617,7 +636,7 @@ class patient(object):
@property
def fees(self):
return int(self.money0 + self.money1 + self.money9 + self.money10 +
- self.money11 - self.money2 - self.money3 - self.money8)
+ self.money11 - self.money2 - self.money3 - self.money8)
@property
def fees_accrued(self):
@@ -626,11 +645,11 @@ class patient(object):
old_estimate_charges = self.dbstate.estimate_charges
accrued_fees = self.estimate_charges - old_estimate_charges
- LOGGER.debug("fees_accrued = (new-existing) = %d - %d = %d"%(
- self.estimate_charges,
- old_estimate_charges,
- accrued_fees)
- )
+ LOGGER.debug("fees_accrued = (new-existing) = %d - %d = %d" % (
+ self.estimate_charges,
+ old_estimate_charges,
+ accrued_fees)
+ )
return accrued_fees
@property
@@ -655,7 +674,7 @@ class patient(object):
text += estimate.log_text
total += estimate.fee
p_total += estimate.ptfee
- text += "TOTAL || || || || || || %s || %s"% (total, p_total)
+ text += "TOTAL || || || || || || %s || %s" % (total, p_total)
return text
def resetAllMonies(self):
@@ -670,12 +689,16 @@ class patient(object):
self.money3 = 0
self.money8 = 0
- @property
- def nhs_claims(self):
+ self.dbstate.money0 = 0
+ self.dbstate.money1 = 0
+
+ def nhs_claims(self, completed_only=True):
claims = []
for est in self.estimates:
- if est.csetype == "N" and est.completed == 2:
- #yield est
+ if (est.csetype.startswith("N") and
+ (not completed_only or est.completed == 2)
+ ):
+ # yield est
claims.append(est)
return claims
@@ -684,40 +707,40 @@ class patient(object):
re-written for schema 1.9
'''
LOGGER.info(
- "patient.addHiddenNote(ntype='%s',note='%s', attempt_delete='%s'"% (
- ntype, note, attempt_delete))
+ "patient.addHiddenNote(ntype='%s',note='%s', attempt_delete='%s'" % (
+ ntype, note, attempt_delete))
HN = ()
- if ntype=="payment":
- HN=("RECEIVED: ", note)
- elif ntype=="printed":
- HN=("PRINTED: ", note)
- elif ntype=="exam":
- HN=("TC: EXAM", note)
- elif ntype=="chart_treatment":
- HN=("TC:", note)
- elif ntype=="perio_treatment":
- HN=("TC: PERIO", note)
- elif ntype=="xray_treatment":
- HN=("TC: XRAY", note)
- elif ntype=="treatment":
- HN=("TC: OTHER", note)
- elif ntype=="mednotes": #other treatment
- HN=("UPDATED:Medical Notes", note)
- elif ntype=="close_course":
- HN=("COURSE CLOSED", "="*10)
- elif ntype=="open_course":
- HN=("COURSE OPENED", "= "*5)
- elif ntype=="resume_course":
- HN=("COURSE RE-OPENED", "= "*5)
- elif ntype=="fee":
- HN=("INTERIM: ", note)
+ if ntype == "payment":
+ HN = ("RECEIVED: ", note)
+ elif ntype == "printed":
+ HN = ("PRINTED: ", note)
+ elif ntype == "exam":
+ HN = ("TC: EXAM", note)
+ elif ntype == "chart_treatment":
+ HN = ("TC:", note)
+ elif ntype == "perio_treatment":
+ HN = ("TC: PERIO", note)
+ elif ntype == "xray_treatment":
+ HN = ("TC: XRAY", note)
+ elif ntype == "treatment":
+ HN = ("TC: OTHER", note)
+ elif ntype == "mednotes": # other treatment
+ HN = ("UPDATED:Medical Notes", note)
+ elif ntype == "close_course":
+ HN = ("COURSE CLOSED", "=" * 10)
+ elif ntype == "open_course":
+ HN = ("COURSE OPENED", "= " * 5)
+ elif ntype == "resume_course":
+ HN = ("COURSE RE-OPENED", "= " * 5)
+ elif ntype == "fee":
+ HN = ("INTERIM: ", note)
if not HN:
- print "unable to add Hidden Note notetype '%s' not found"% ntype
+ print "unable to add Hidden Note notetype '%s' not found" % ntype
return
- reversing_note = ("UNCOMPLETED", "{%s}"% note)
+ reversing_note = ("UNCOMPLETED", "{%s}" % note)
if attempt_delete:
try:
@@ -731,9 +754,9 @@ class patient(object):
self.HIDDENNOTES.append(HN)
def clearHiddenNotes(self):
- self.HIDDENNOTES=[]
+ self.HIDDENNOTES = []
- def updateBilling(self,tone):
+ def updateBilling(self, tone):
self.billdate = localsettings.currentDay()
self.billct += 1
self.billtype = tone
@@ -752,12 +775,12 @@ class patient(object):
@property
def name_id(self):
- return u"%s - %s"% (
+ return u"%s - %s" % (
self.name, self.serialno)
@property
def name(self):
- return u"%s %s %s"% (
+ return u"%s %s %s" % (
self.title, self.fname, self.sname)
@property
@@ -777,7 +800,7 @@ class patient(object):
return False
years, months = self.age_course_start
- return years < 17 or ( years == 17 and months < 11)
+ return years < 17 or (years == 17 and months < 11)
def new_tx_course(self, new_courseno):
self.courseno0 = new_courseno
@@ -791,7 +814,7 @@ class patient(object):
return (patientTableAtts +
exemptionTableAtts + bpeTableAtts + mnhistTableAtts +
perioTableAtts + clinical_memos + (
- "fees", "estimate_charges", "serialno", "estimates",
+ "fees", "estimate_charges", "serialno", "estimates",
"appt_prefs", "treatment_course", "chartgrid"))
@property
@@ -802,7 +825,7 @@ class patient(object):
used to determine whether the patient has been edited.
'''
for att in self.COPIED_ATTRIBUTES:
- #if att not in ("treatment_course", "estimates", "chartgrid"):
+ # if att not in ("treatment_course", "estimates", "chartgrid"):
yield att
@property
@@ -811,11 +834,11 @@ class patient(object):
for att in self.USER_CHANGEABLE_ATTRIBUTES:
new_value = self.__dict__.get(att, "")
db_value = self.dbstate.__dict__.get(att, "")
- if new_value != db_value:
- message = "Altered pt.%s"% att.ljust(20)
+ if new_value != db_value:
+ message = "Altered pt.%s" % att.ljust(20)
if att not in ("treatment_course", "estimates"):
message += (
- " ORIG = '%s' NEW = '%s'"% (db_value, new_value))
+ " ORIG = '%s' NEW = '%s'" % (db_value, new_value))
LOGGER.debug(message)
changes.append(att)
return changes
@@ -832,7 +855,7 @@ class patient(object):
setattr(snapshot, att, deepcopy(v, memo))
self.dbstate = snapshot
- LOGGER.debug("snapshot of %s taken"% self)
+ LOGGER.debug("snapshot of %s taken" % self)
@property
def course_dentist(self):
@@ -852,7 +875,7 @@ class patient(object):
if self.treatment_course and self.dbstate.treatment_course is None:
return True
return (self.treatment_course.courseno !=
- self.dbstate.treatment_course.courseno)
+ self.dbstate.treatment_course.courseno)
@property
def tx_hash_tups(self):
@@ -900,10 +923,10 @@ class patient(object):
yield est
-if __name__ =="__main__":
+if __name__ == "__main__":
'''testing stuff'''
try:
- serialno = int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
serialno = 1
@@ -912,12 +935,12 @@ if __name__ =="__main__":
if "-v" in sys.argv:
verbose = True
else:
- verbose = False
+ verbose = False
pt = patient(serialno)
if verbose:
- for att in sorted(pt.__dict__.keys()):
- print "%s '%s'"% (att.ljust(20), pt.__dict__[att])
+ for att in sorted(pt.__dict__.keys()):
+ print "%s '%s'" % (att.ljust(20), pt.__dict__[att])
localsettings.loadFeeTables()
pt.fee_table
@@ -928,4 +951,4 @@ if __name__ =="__main__":
print pt.treatment_course
print pt.ageYears
print pt.age_course_start
- print pt.under_capitation
\ No newline at end of file
+ print pt.under_capitation
diff --git a/src/openmolar/dbtools/patient_write_changes.py b/src/openmolar/dbtools/patient_write_changes.py
index 457f008..f77aa33 100644
--- a/src/openmolar/dbtools/patient_write_changes.py
+++ b/src/openmolar/dbtools/patient_write_changes.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import sys
@@ -23,35 +39,90 @@ BPE_INS_QUERY = '''insert into bpe (serialno, bpedate, bpe)
values (%s, %s, %s) on duplicate key update bpe=%s'''
EXMPT_INS_QUERY = ('insert into exemptions '
-'(serialno, exemption, exempttext, datestamp) '
-'values (%s,%s,%s, NOW())')
+ '(serialno, exemption, exempttext, datestamp) '
+ 'values (%s,%s,%s, NOW())')
ESTS_INS_QUERY = ('insert into newestimates (serialno, '
-'courseno, number, itemcode, description, fee, ptfee, feescale, '
-'csetype, dent, modified_by, time_stamp) values '
-'(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW())')
+ 'courseno, number, itemcode, description, fee, ptfee, feescale, '
+ 'csetype, dent, modified_by, time_stamp) values '
+ '(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW())')
EST_LINK_INS_QUERY = (
-'insert into est_link2 (est_id, tx_hash, completed) values (%s, %s, %s)')
+ 'insert into est_link2 (est_id, tx_hash, completed) values (%s, %s, %s)')
EST_DEL_QUERY = "delete from newestimates where ix=%s"
EST_LINK_DEL_QUERY = "delete from est_link2 where est_id=%s"
+
+# too risky not to check these are unique before updating.
+EST_DAYBOOK_ALTERATION_QUERIES = [
+ 'select daybook_id from daybook_link where tx_hash = %s',
+ '''select sum(fee), sum(ptfee) from newestimates join est_link2 on newestimates.ix = est_link2.est_id
+where tx_hash in (select tx_hash from daybook join daybook_link on daybook.id = daybook_link.daybook_id where id=%s)''',
+ 'update daybook set feesa = %s, feesb = %s where serialno=%s and id=%s'
+]
+
+
SYNOPSIS_INS_QUERY = '''
insert into clinical_memos (serialno, synopsis, author, datestamp)
values (%s, %s, %s, NOW())'''
+
+def update_daybook_after_estimate_change(values):
+ '''
+ if the value of a treatment item has been changed after completion,
+ update the daybook.
+ most common example of this is when an exemption is applied to a course of
+ treatment at reception (altering the charges put into the system in the
+ surgery)
+ note - use of serialno here is purely for precautionary reasons.
+ Hash collisions shouldn't occur... but easy to be cautious here.
+ '''
+ serialno, tx_hash = values
+ result = True
+ db = connect()
+ cursor = db.cursor()
+ try:
+ query = EST_DAYBOOK_ALTERATION_QUERIES[0]
+ cursor.execute(query, (tx_hash.hash,))
+ rows = cursor.fetchall()
+ if len(rows) != 1:
+ LOGGER.warning(
+ "unable to update daybook after estimate change - abandoning")
+ return True
+ daybook_id = rows[0][0]
+ LOGGER.debug("updating daybook row %s" % daybook_id)
+
+ query = EST_DAYBOOK_ALTERATION_QUERIES[1]
+ cursor.execute(query, (daybook_id,))
+ feesa, feesb = cursor.fetchone()
+
+ LOGGER.debug(
+ "updating row with feesa, feesb = %s and %s" %
+ (feesa, feesb))
+ query = EST_DAYBOOK_ALTERATION_QUERIES[2]
+ rows_changed = cursor.execute(
+ query, (feesa, feesb, serialno, daybook_id))
+ LOGGER.info("changes applied = %s" % bool(rows_changed))
+
+ except Exception as exc:
+ LOGGER.exception("error executing query %s" % query)
+ result = False
+
+ return result
+
+
def all_changes(pt, changes):
- LOGGER.debug("writing_changes to patient - %s"% str(changes))
+ LOGGER.debug("writing_changes to patient - %s" % str(changes))
if changes == []:
LOGGER.warning(
- "write changes called, but no changes for patient %d!"% (
- pt.serialno)
+ "write changes called, but no changes for patient %d!" % (
+ pt.serialno)
)
return True
else:
- #set up some booleans to prevent multiple updates of the same data
- #example exemption AND exemption text have changed..
+ # set up some booleans to prevent multiple updates of the same data
+ # example exemption AND exemption text have changed..
exemptionsHandled = False
if pt.HIDDENNOTES != []:
@@ -65,67 +136,70 @@ def all_changes(pt, changes):
estimate_commands = {}
patchanges, patvalues = "", []
trtchanges, trtvalues = "", []
+ post_cleanup_commands = []
+
for change in changes:
if change == "courseno":
- pass #these values should never get munged.
+ pass # these values should never get munged.
elif change in ("money0, money1"):
diff = pt.__dict__[change] - pt.dbstate.__dict__[change]
- patvalues.append (diff)
- patchanges += '%s = %s + %%s,'% (change, change)
+ patvalues.append(diff)
+ patchanges += '%s = %s + %%s,' % (change, change)
elif change in patient_class.patientTableAtts:
patvalues.append(pt.__dict__[change])
- patchanges += '%s = %%s,'% change
+ patchanges += '%s = %%s,' % change
elif (change in patient_class.exemptionTableAtts and
- not exemptionsHandled):
+ not exemptionsHandled):
values = (pt.serialno, pt.exemption, pt.exempttext)
sqlcommands['exemptions'] = ((EXMPT_INS_QUERY, values),)
exemptionsHandled = True
elif change == "bpe":
- values = ( pt.serialno,
- pt.bpe[-1][0],
- pt.bpe[-1][1],
- pt.bpe[-1][1]
- )
- sqlcommands['bpe'] =((BPE_INS_QUERY, values),)
+ values = (pt.serialno,
+ pt.bpe[-1][0],
+ pt.bpe[-1][1],
+ pt.bpe[-1][1]
+ )
+ sqlcommands['bpe'] = ((BPE_INS_QUERY, values),)
elif change == "synopsis":
values = (pt.serialno, pt.synopsis,
- localsettings.operator)
+ localsettings.operator)
- sqlcommands['clinical_memos']= ((SYNOPSIS_INS_QUERY, values),)
+ sqlcommands['clinical_memos'] = ((SYNOPSIS_INS_QUERY, values),)
elif change == "estimates":
estimate_commands["insertions"] = []
estimate_commands["updates"] = []
sqlcommands["estimate_deletions"] = []
+ sqlcommands["estimate_daybook_alterations"] = []
oldEstDict = {}
- for est in pt.dbstate.estimates:
+ for est in pt.dbstate.estimates:
#-- generate a dictionary with the
#-- autogenerated db indexas key
- if est.ix != None:
+ if est.ix is not None:
oldEstDict[est.ix] = est
for est in pt.estimates:
- if est.ix == None: #--new item
+ if est.ix is None: # --new item
values = (pt.serialno, est.courseno, est.number,
- est.itemcode, est.description,
- est.fee, est.ptfee, est.feescale, est.csetype,
- est.dent, localsettings.operator)
+ est.itemcode, est.description,
+ est.fee, est.ptfee, est.feescale, est.csetype,
+ est.dent, localsettings.operator)
estimate_commands["insertions"].append(
(ESTS_INS_QUERY, values, est.tx_hashes)
- )
+ )
elif est.ix in oldEstDict.keys():
oldEst = oldEstDict[est.ix]
- if str(oldEst) != str(est):
+ if str(oldEst) != str(est):
#-- have to use the str because est class does not
#-- have a _eq_ property ??
query = 'update newestimates set '
@@ -156,17 +230,20 @@ def all_changes(pt, changes):
values.append(est.dent)
query += ('modified_by = %s, '
- 'time_stamp = NOW() where ix = %s')
+ 'time_stamp = NOW() where ix = %s')
values.append(localsettings.operator)
values.append(est.ix)
estimate_commands["updates"].append(
- (query, tuple(values), est))
+ (query, tuple(values), est))
+ for tx_hash in est.tx_hashes:
+ values = (pt.serialno, tx_hash)
+ post_cleanup_commands.append(
+ (update_daybook_after_estimate_change, values))
oldEstDict.pop(est.ix)
-
#-- all that is left in oldEstDict now are items which
#-- have been removed.
#-- so remove from database if they are current course!
@@ -177,25 +254,29 @@ def all_changes(pt, changes):
deletions = sqlcommands["estimate_deletions"]
deletions.append((EST_DEL_QUERY, values))
deletions.append((EST_LINK_DEL_QUERY, values))
+ for tx_hash in old_est.tx_hashes:
+ values = (pt.serialno, tx_hash)
+ post_cleanup_commands.append(
+ (update_daybook_after_estimate_change, values))
- elif change == "treatment_course": #patient.CURRTRT_ATTS:
+ elif change == "treatment_course": # patient.CURRTRT_ATTS:
for trt_att in CURRTRT_ATTS:
value = pt.treatment_course.__dict__[trt_att]
existing = pt.dbstate.treatment_course.__dict__[trt_att]
if pt.has_new_course or value != existing:
- trtchanges += '%s = %%s ,'% trt_att
+ trtchanges += '%s = %%s ,' % trt_att
trtvalues.append(value)
elif change == "appt_prefs":
pt.appt_prefs.commit_changes()
-
result = True
if patchanges != "":
patvalues.append(pt.serialno)
values = tuple(patvalues)
- query = "update patients SET %s where serialno=%%s"% patchanges.strip(",")
+ query = "update patients SET %s where serialno=%%s" % patchanges.strip(
+ ",")
sqlcommands['patients'] = ((query, values),)
@@ -205,7 +286,7 @@ def all_changes(pt, changes):
values = tuple(trtvalues)
query = ('update currtrtmt2 SET '
- '%s where serialno=%%s and courseno=%%s'%( trtchanges.strip(",")))
+ '%s where serialno=%%s and courseno=%%s' % (trtchanges.strip(",")))
sqlcommands['currtrtmt'] = ((query, values),)
if sqlcommands != {} or estimate_commands != {}:
@@ -219,7 +300,7 @@ def all_changes(pt, changes):
try:
cursor.execute(query, values)
except Exception as exc:
- LOGGER.exception("error executing query %s"% query)
+ LOGGER.exception("error executing query %s" % query)
result = False
insert_commands = estimate_commands.get("insertions", [])
@@ -232,11 +313,11 @@ def all_changes(pt, changes):
vals = (ix, tx_hash.hash, tx_hash.completed)
cursor.execute(EST_LINK_INS_QUERY, vals)
except Exception as exc:
- LOGGER.exception("error executing query\n %s\n %s"% (
+ LOGGER.exception("error executing query\n %s\n %s" % (
EST_LINK_INS_QUERY, vals))
result = False
except Exception as exc:
- LOGGER.exception("error executing query\n %s\n %s"% (
+ LOGGER.exception("error executing query\n %s\n %s" % (
query, str(values)))
result = False
@@ -247,24 +328,30 @@ def all_changes(pt, changes):
cursor.execute(EST_LINK_DEL_QUERY, (estimate.ix,))
for tx_hash in estimate.tx_hashes:
cursor.execute(EST_LINK_INS_QUERY,
- (estimate.ix, tx_hash.hash, tx_hash.completed)
- )
+ (estimate.ix, tx_hash.hash,
+ tx_hash.completed)
+ )
except Exception as exc:
- LOGGER.exception("error updating estimate %s"% estimate)
+ LOGGER.exception("error updating estimate %s" % estimate)
result = False
cursor.close()
+
+ for func, values in post_cleanup_commands:
+ func.__call__(values)
+
db.commit()
return result
+
def toNotes(serialno, newnotes):
'''
new code with schema 1.9
'''
- LOGGER.debug("write changes - toNotes for patient %d"% serialno)
+ LOGGER.debug("write changes - toNotes for patient %d" % serialno)
- #database version stores max line length of 80chars
+ # database version stores max line length of 80chars
query = '''insert into formatted_notes
(serialno, ndate, op1, op2, ntype, note)
@@ -274,9 +361,9 @@ def toNotes(serialno, newnotes):
tstamp = localsettings.currentTime().strftime("%d/%m/%Y %T")
notetuplets.append(
- ("opened", "System date - %s"% tstamp))
+ ("opened", "System date - %s" % tstamp))
for ntype, note in newnotes:
- while len(note)>79:
+ while len(note) > 79:
if " " in note[:79]:
pos = note[:79].rindex(" ")
#--try to split nicely
@@ -287,11 +374,11 @@ def toNotes(serialno, newnotes):
pos = 79
#--ok, no option (unlikely to happen though)
notetuplets.append((ntype, note[:pos]))
- note = note[pos+1:]
+ note = note[pos + 1:]
- notetuplets.append((ntype, note+"\n"))
+ notetuplets.append((ntype, note + "\n"))
notetuplets.append(
- ("closed", "%s %s"% (localsettings.operator,tstamp)))
+ ("closed", "%s %s" % (localsettings.operator, tstamp)))
values = []
ops = localsettings.operator.split("/")
@@ -305,11 +392,11 @@ def toNotes(serialno, newnotes):
rows = 0
if values:
- db=connect()
+ db = connect()
cursor = db.cursor()
- #this (superior code?) didn't work on older MySQLdb versions.
- #rows = cursor.executemany(query, tuple(values))
+ # this (superior code?) didn't work on older MySQLdb versions.
+ # rows = cursor.executemany(query, tuple(values))
for value in values:
rows += cursor.execute(query, value)
@@ -318,7 +405,8 @@ def toNotes(serialno, newnotes):
return rows > 0
-def discreet_changes(pt_changed,changes):
+
+def discreet_changes(pt_changed, changes):
'''
this updates only the selected atts
(usually called by automated proc such as recalls...
@@ -329,32 +417,31 @@ def discreet_changes(pt_changed,changes):
sqlcond = ""
for change in changes:
value = pt_changed.__dict__[change]
- LOGGER.debug("discreet change %s %s"% (change, type(value)))
+ LOGGER.debug("discreet change %s %s" % (change, type(value)))
if change in patient_class.dateFields:
- if value != "" and value != None:
- sqlcond += '%s="%s" ,'%(change, value)
- elif value == None:
- sqlcond += '%s=NULL ,'% change
- elif type(value) in (types.IntType,types.LongType):
- sqlcond += '%s=%s ,'% (change,value)
+ if value != "" and value is not None:
+ sqlcond += '%s="%s" ,' % (change, value)
+ elif value is None:
+ sqlcond += '%s=NULL ,' % change
+ elif type(value) in (int, int):
+ sqlcond += '%s=%s ,' % (change, value)
else:
- sqlcond += '%s="%s" ,'% (change,value)
+ sqlcond += '%s="%s" ,' % (change, value)
- sqlcommand= "update patients SET %s where serialno=%%s"%(
+ sqlcommand = "update patients SET %s where serialno=%%s" % (
sqlcond.strip(","))
- LOGGER.debug("%s (%s,)"% (sqlcommand, pt_changed.serialno))
+ LOGGER.debug("%s (%s,)" % (sqlcommand, pt_changed.serialno))
- result=True
+ result = True
if sqlcond != "":
- db=connect()
+ db = connect()
cursor = db.cursor()
try:
cursor.execute(sqlcommand, (pt_changed.serialno,))
db.commit()
- except Exception,e:
+ except Exception as e:
LOGGER.exception("unable to write discreet changes")
- result=False
+ result = False
cursor.close()
return result
-
diff --git a/src/openmolar/dbtools/paymentHistory.py b/src/openmolar/dbtools/paymentHistory.py
index daa798d..889562b 100644
--- a/src/openmolar/dbtools/paymentHistory.py
+++ b/src/openmolar/dbtools/paymentHistory.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
from openmolar.settings import localsettings
@@ -12,158 +28,159 @@ from openmolar.connect import connect
from openmolar.dbtools.cashbook import cashbookCodesDict
HEADERS = (
- _("Date"),
- _("Dentist"),
- _("Patient"),
- _("Code"),
- _("Cash"),
- _("Cheque"),
- _("Card"),
- _("Unknown"),
- _("Amount")
- )
+ _("Date"),
+ _("Dentist"),
+ _("Patient"),
+ _("Code"),
+ _("Cash"),
+ _("Cheque"),
+ _("Card"),
+ _("Unknown"),
+ _("Amount")
+)
QUERY = '''
-select DATE_FORMAT(cbdate, %s), dntid, descr, code, amt
+select DATE_FORMAT(cbdate, %s), dntid, descr, code, amt
from cashbook where ref=%s order by cbdate desc
'''
SUMMARY_QUERY = '''
-select DATE_FORMAT(cbdate, %s), dntid, code, amt
-from cashbook where ref=%s and (code<10 or code>123)
+select DATE_FORMAT(cbdate, %s), dntid, code, amt
+from cashbook where ref=%s and (code<10 or code>123)
and cbdate >= %s order by cbdate
'''
+
def summary_details(sno, start_date):
- values = (localsettings.OM_DATE_FORMAT, "%06d"% sno, start_date)
+ values = (localsettings.OM_DATE_FORMAT, "%06d" % sno, start_date)
db = connect()
cursor = db.cursor()
cursor.execute(SUMMARY_QUERY, values)
rows = cursor.fetchall()
cursor.close()
-
+
claimNo = len(rows)
- if claimNo==0:
+ if claimNo == 0:
return "No Payments Found"
retarg = '<table width="100%" border="1">'
retarg += '<tr class="table_header">'
for header in HEADERS[:3] + HEADERS[8:]:
- retarg += "<th>%s</th>"% header
+ retarg += "<th>%s</th>" % header
retarg += '</tr>'
-
+
total = 0
for i, row in enumerate(rows):
- if i %2 == 0:
- retarg+='<tr bgcolor="#eeeeee">'
+ if i % 2 == 0:
+ retarg += '<tr bgcolor="#eeeeee">'
else:
- retarg+='<tr>'
-
+ retarg += '<tr>'
+
#-- a row is (date,sno,dnt,patient,code,amount)
-
- retarg += '<td>%s</td>'% (row[0])
- retarg += '<td>%s</td>'% localsettings.ops.get(row[1])
+
+ retarg += '<td>%s</td>' % (row[0])
+ retarg += '<td>%s</td>' % localsettings.ops.get(row[1])
CODE = cashbookCodesDict.get(row[2], "UNKNOWN")
- retarg += '<td>%s</td>'% CODE
+ retarg += '<td>%s</td>' % CODE
amt = row[3]
-
- retarg += '<td align="right">%s</td>'% localsettings.formatMoney(amt)
-
+
+ retarg += '<td align="right">%s</td>' % localsettings.formatMoney(amt)
+
retarg += '</tr>\n'
total += amt
-
+
retarg += '''<tr class="table_header">
<td colspan="3" align="right"><b>TOTAL</b></td>
- <td align="right"><b>%s</b></td></tr>'''% (
+ <td align="right"><b>%s</b></td></tr>''' % (
localsettings.formatMoney(total))
-
+
retarg += '</table>'
return retarg
+
def details(sno):
'''
returns an html page showing pt's payment History
'''
- values = (localsettings.OM_DATE_FORMAT, "%06d"% sno)
-
+ values = (localsettings.OM_DATE_FORMAT, "%06d" % sno)
+
db = connect()
cursor = db.cursor()
cursor.execute(QUERY, values)
rows = cursor.fetchall()
cursor.close()
-
+
claimNo = len(rows)
- if claimNo==0:
+ if claimNo == 0:
return "<h2>No Payments Found</h2>"
retarg = '<html><body><table width="100%" border="1">'
retarg += '<tr>'
for header in HEADERS:
- retarg += "<th>%s</th>"% header
+ retarg += "<th>%s</th>" % header
retarg += '</tr>'
odd = True
total, cashTOT, chequeTOT, cardTOT, otherTOT = 0, 0, 0, 0, 0
for row in rows:
if odd:
- retarg+='<tr bgcolor="#eeeeee">'
+ retarg += '<tr bgcolor="#eeeeee">'
odd = False
else:
- retarg+='<tr>'
+ retarg += '<tr>'
odd = True
-
+
#-- a row is (date,sno,dnt,patient,code,amount)
-
- retarg += '<td>%s</td>'%(row[0])
- retarg += '<td>%s</td>'%localsettings.ops.get(row[1])
- retarg += '<td>%s</td>'%row[2]
+
+ retarg += '<td>%s</td>' % (row[0])
+ retarg += '<td>%s</td>' % localsettings.ops.get(row[1])
+ retarg += '<td>%s</td>' % row[2]
CODE = cashbookCodesDict.get(row[3], "UNKNOWN")
- retarg += '<td>%s</td>'%CODE
+ retarg += '<td>%s</td>' % CODE
amt = row[4]
amt_str = localsettings.formatMoney(amt)
if "CASH" in CODE:
- retarg += '<td align="right">%s</td>'% amt_str
+ retarg += '<td align="right">%s</td>' % amt_str
cashTOT += amt
- retarg += "<td> </td>"*3
+ retarg += "<td> </td>" * 3
elif "CHEQUE" in CODE:
- retarg += '<td> </td><td align="right">%s</td>'% amt_str
+ retarg += '<td> </td><td align="right">%s</td>' % amt_str
chequeTOT += amt
- retarg += "<td> </td>"*2
+ retarg += "<td> </td>" * 2
elif "CARD" in CODE:
- retarg += "<td> </td>"*2
- retarg += '<td align="right">%s</td>'% amt_str
+ retarg += "<td> </td>" * 2
+ retarg += '<td align="right">%s</td>' % amt_str
cardTOT += amt
retarg += "<td> </td>"
else:
- retarg += "<td> </td>"*3
- retarg += '<td align="right">%s</td>'% amt_str
+ retarg += "<td> </td>" * 3
+ retarg += '<td align="right">%s</td>' % amt_str
otherTOT += amt
-
- retarg += '<td align="right">%s</td>'% amt_str
-
+
+ retarg += '<td align="right">%s</td>' % amt_str
+
retarg += '</tr>\n'
total += amt
-
+
retarg += '''<tr><td colspan="3"></td>
<td><b>TOTAL</b></td>
<td align="right"><b>%s</b></td>
<td align="right"><b>%s</b></td>
<td align="right"><b>%s</b></td>
<td align="right"><b>%s</b></td>
- <td align="right"><b>%s</b></td></tr>'''% (
- localsettings.formatMoney(cashTOT),
- localsettings.formatMoney(chequeTOT),
- localsettings.formatMoney(cardTOT),
- localsettings.formatMoney(otherTOT),
+ <td align="right"><b>%s</b></td></tr>''' % (
+ localsettings.formatMoney(cashTOT),
+ localsettings.formatMoney(chequeTOT),
+ localsettings.formatMoney(cardTOT),
+ localsettings.formatMoney(otherTOT),
localsettings.formatMoney(total))
-
+
retarg += '</table></body></html>'
return retarg
if __name__ == "__main__":
from datetime import date
- print summary_details(1, date(2000,1,1)).encode("ascii", "replace")
-
\ No newline at end of file
+ print summary_details(1, date(2000, 1, 1)).encode("ascii", "replace")
diff --git a/src/openmolar/dbtools/phrasebook.py b/src/openmolar/dbtools/phrasebook.py
index 3fc481d..2b332e3 100644
--- a/src/openmolar/dbtools/phrasebook.py
+++ b/src/openmolar/dbtools/phrasebook.py
@@ -1,17 +1,33 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import datetime
import logging
from openmolar.connect import connect
-CHECK_INTERVAL = 300 #update phrasebook every 5 minutes
+CHECK_INTERVAL = 300 # update phrasebook every 5 minutes
BLANK_PHRASEBOOK = '''<?xml version="1.0" ?>
<phrasebook>
@@ -35,6 +51,7 @@ INSERT_QUERY = "insert into phrasebook (phrases, clinician_id) values(%s, %s)"
LOGGER = logging.getLogger("openmolar")
+
class Phrasebooks(object):
_books = {}
@@ -50,13 +67,13 @@ class Phrasebooks(object):
return book
def has_book(self, index):
- return self._books.has_key(index)
+ return index in self._books
def has_phrasebook(self, index):
return self.book(index).has_data
def get_all_books(self):
- self._books = {} #forget any loaded books
+ self._books = {} # forget any loaded books
db = connect()
cursor = db.cursor()
cursor.execute(ALL_BOOKS_QUERY)
@@ -73,7 +90,7 @@ class Phrasebooks(object):
cursor = db.cursor()
result = cursor.execute(UPDATE_QUERY, (xml, clinician_id))
cursor.close()
- self._books = {} #forget any loaded books
+ self._books = {} # forget any loaded books
return result
def create_book(self, clinician_id):
@@ -81,7 +98,7 @@ class Phrasebooks(object):
cursor = db.cursor()
result = cursor.execute(INSERT_QUERY, (BLANK_PHRASEBOOK, clinician_id))
cursor.close()
- self._books = {} #forget any loaded books
+ self._books = {} # forget any loaded books
return result
@@ -104,7 +121,7 @@ class Phrasebook(object):
@property
def xml(self):
if not self.loaded or self.refresh_needed:
- LOGGER.info("(re)loading phrasebook %s from database"% self.ix)
+ LOGGER.info("(re)loading phrasebook %s from database" % self.ix)
db = connect()
cursor = db.cursor()
cursor.execute(QUERY, (self.ix,))
@@ -123,4 +140,4 @@ PHRASEBOOKS = Phrasebooks()
if __name__ == "__main__":
print PHRASEBOOKS.global_phrasebook
- print PHRASEBOOKS.book(1)
\ No newline at end of file
+ print PHRASEBOOKS.book(1)
diff --git a/src/openmolar/dbtools/plan_data.py b/src/openmolar/dbtools/plan_data.py
index 1fc23ff..5d06631 100644
--- a/src/openmolar/dbtools/plan_data.py
+++ b/src/openmolar/dbtools/plan_data.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
@@ -13,13 +29,16 @@ from openmolar.settings import localsettings
LOGGER = logging.getLogger("openmolar")
-planDBAtts=("serialno", "plantype","band", "grosschg","discount","netchg",
-"catcode", "planjoin","regno")
+planDBAtts = ("serialno", "plantype", "band", "grosschg", "discount", "netchg",
+ "catcode", "planjoin", "regno")
+
class PlanData(object):
+
'''
a custom class to hold data about the patient's maintenance plan
'''
+
def __init__(self, sno):
self.serialno = sno
self.plantype = None
@@ -31,39 +50,39 @@ class PlanData(object):
self.planjoin = None
self.regno = None
#-- a variable to indicate if getFromDbhas been run
- self.retrieved=False
+ self.retrieved = False
def __repr__(self):
- return "%d,%s,%s,%s,%s,%s,%s,%s,%s"%(
- self.serialno, self.plantype, self.band, self.grosschg, self.discount,
- self.netchg, self.catcode, self.planjoin,self.regno)
+ return "%d,%s,%s,%s,%s,%s,%s,%s,%s" % (
+ self.serialno, self.plantype, self.band, self.grosschg, self.discount,
+ self.netchg, self.catcode, self.planjoin, self.regno)
def getFromDB(self):
try:
db = connect.connect()
cursor = db.cursor()
- query='''SELECT %s,%s,%s,%s,%s,%s,%s,%s from plandata
- where serialno=%s'''%(planDBAtts[1:]+(self.serialno,))
+ query = '''SELECT %s,%s,%s,%s,%s,%s,%s,%s from plandata
+ where serialno=%s''' % (planDBAtts[1:] + (self.serialno,))
cursor.execute(query)
- row=cursor.fetchone()
+ row = cursor.fetchone()
cursor.close()
i = 1
if row:
for val in row:
if val:
- att=planDBAtts[i]
- if att=="planjoin":
- self.planjoin=localsettings.formatDate(val)
+ att = planDBAtts[i]
+ if att == "planjoin":
+ self.planjoin = localsettings.formatDate(val)
else:
- self.__dict__[att]=val
+ self.__dict__[att] = val
i += 1
self.retrieved = True
except Exception as exc:
LOGGER.exception("error loading from plandata")
-if __name__ =="__main__":
+if __name__ == "__main__":
LOGGER.setLevel(logging.DEBUG)
pd = PlanData(1)
pd.getFromDB()
- print pd
\ No newline at end of file
+ print pd
diff --git a/src/openmolar/dbtools/queries.py b/src/openmolar/dbtools/queries.py
index dd7bac4..be17ce0 100644
--- a/src/openmolar/dbtools/queries.py
+++ b/src/openmolar/dbtools/queries.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
ESTS_QUERY = '''SELECT newestimates.ix, number, itemcode, description,
fee, ptfee, feescale, csetype, dent, est_link2.completed, tx_hash, courseno
diff --git a/src/openmolar/dbtools/recall.py b/src/openmolar/dbtools/recall.py
index 12b1b37..d1b725c 100644
--- a/src/openmolar/dbtools/recall.py
+++ b/src/openmolar/dbtools/recall.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import sys
import types
@@ -12,15 +29,18 @@ from openmolar.connect import connect
from datetime import date
HEADERS = (
-_("Letter No"), _("Serial No"), _("Title"), _("First Name"), _("Surname"),
-_("Age"),
-_("Address") + " 1",_("Address")+" 2",_("Address")+" 3", _("Town"),
-_("County"), _("PostCode"), _("Dentist"), _("Family No"),_("Recall Date"))
+ _("Letter No"), _("Serial No"), _("Title"), _("First Name"), _("Surname"),
+ _("Age"),
+ _("Address") + " 1", _("Address") + " 2", _("Address") + " 3", _("Town"),
+ _("County"), _("PostCode"), _("Dentist"), _("Family No"), _("Recall Date"))
+
class RecalledPatient(object):
+
'''
a data object to store a recalled patient's details
'''
+
def __init__(self, letterno, row):
self.letterno = letterno
self.grouped = False
@@ -28,7 +48,7 @@ class RecalledPatient(object):
self.title = row[1].title()
self.fname = row[2].title()
self.sname = row[3].title()
- self.dnt1 = localsettings.ops.get(row[4],"??")
+ self.dnt1 = localsettings.ops.get(row[4], "??")
if row[5] == 0:
self.familyno = None
else:
@@ -36,11 +56,11 @@ class RecalledPatient(object):
self._dob = row[6]
self.addr1 = row[7].strip()
- self.addr2 = row[8] if row[8] != None else ""
- self.addr3 = row[9] if row[9] != None else ""
- self.town = row[10] if row[10] != None else ""
- self.county = row[11] if row[11] != None else ""
- self.pcde = row[12] if row[12] != None else ""
+ self.addr2 = row[8] if row[8] is not None else ""
+ self.addr3 = row[9] if row[9] is not None else ""
+ self.town = row[10] if row[10] is not None else ""
+ self.county = row[11] if row[11] is not None else ""
+ self.pcde = row[12] if row[12] is not None else ""
self.recd = row[13]
def __getitem__(self, pos):
@@ -87,8 +107,8 @@ class RecalledPatient(object):
today = localsettings.currentDay()
try:
nextbirthday = date(today.year, self._dob.month, self._dob.day)
- except ValueError:#leap year!
- nextbirthday = date(today.year, self._dob.month, self._dob.day-1)
+ except ValueError: # leap year!
+ nextbirthday = date(today.year, self._dob.month, self._dob.day - 1)
ageYears = today.year - self._dob.year
if nextbirthday > today:
ageYears -= 1
@@ -101,26 +121,27 @@ class RecalledPatient(object):
'''
allow comparison based on family number and address line 1
'''
- if type(self) != type(other) or self.familyno in (None, 0):
+ if not isinstance(self, type(other)) or self.familyno in (None, 0):
return cmp(0, 1)
else:
return cmp(
- (self.familyno, self.addr1),
- (other.familyno, other.addr1)
+ (self.familyno, self.addr1),
+ (other.familyno, other.addr1)
)
def __repr__(self):
'''
represent the object
'''
- return "%s %s %s"% (self.serialno, self.sname, self.fname)
+ return "%s %s %s" % (self.serialno, self.sname, self.fname)
+
def getpatients(conditions="", values=()):
'''
returns patients with a recall between the two dates
'''
- assert type(conditions) == types.StringType, "conditions must be a string"
- assert type(values) == types.TupleType, "values must be a tuple"
+ assert isinstance(conditions, bytes), "conditions must be a string"
+ assert isinstance(values, tuple), "values must be a tuple"
query = '''
select patients.serialno, title, fname, sname, dnt1, familyno, dob,
addr1, addr2, addr3, town, county, pcde, recdent
@@ -156,6 +177,6 @@ def getpatients(conditions="", values=()):
if __name__ == "__main__":
localsettings.initiate()
conditions = "recd>=%s and recd<=%s and dnt1=%s"
- values = date(2012,7,1), date(2012,7,31), 6
+ values = date(2012, 7, 1), date(2012, 7, 31), 6
patients = getpatients(conditions, values)
print patients
diff --git a/src/openmolar/dbtools/schema_version.py b/src/openmolar/dbtools/schema_version.py
index 997cc18..26d15d4 100644
--- a/src/openmolar/dbtools/schema_version.py
+++ b/src/openmolar/dbtools/schema_version.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
from openmolar import connect
@@ -11,6 +28,7 @@ from openmolar.settings import localsettings
LOGGER = logging.getLogger("openmolar")
+
def getVersion():
try:
db = connect.connect()
@@ -18,8 +36,8 @@ def getVersion():
query = 'select data from settings where value = "Schema_Version"'
cursor.execute(query)
rows = cursor.fetchall()
- except connect.ProgrammingError, ex:
- LOGGER.warning("no settings table! %s"% ex)
+ except connect.ProgrammingError as ex:
+ LOGGER.warning("no settings table! %s" % ex)
LOGGER.warning("schema assumed to be 1.0")
return "1.0"
@@ -31,6 +49,7 @@ def getVersion():
localsettings.DB_SCHEMA_VERSION = version
return version
+
def clientCompatibility(client_schema):
rows = ()
try:
@@ -39,12 +58,13 @@ def clientCompatibility(client_schema):
query = 'select data from settings where value = "compatible_clients"'
cursor.execute(query)
rows = cursor.fetchall()
- except connect.ProgrammingError, ex:
+ except connect.ProgrammingError as ex:
LOGGER.exception("client_schema not found")
for row in rows:
if row[0] == client_schema:
return True
+
def update(schemas, user):
'''
updates the schema version,
diff --git a/src/openmolar/dbtools/search.py b/src/openmolar/dbtools/search.py
index c2336df..015a2e6 100644
--- a/src/openmolar/dbtools/search.py
+++ b/src/openmolar/dbtools/search.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''this script connects to the database and performs searches'''
@@ -12,8 +29,9 @@ import sys
from openmolar.connect import connect
from openmolar.settings import localsettings
-def getcandidates(dob, addr, tel, sname, similar_sname, fname,
-similar_fname, pcde):
+
+def getcandidates(dob, addr, tel, sname, similar_sname, fname,
+ similar_fname, pcde):
'''
this searches the database for patients matching the given fields
'''
@@ -22,11 +40,11 @@ similar_fname, pcde):
if addr != '':
query += '(ADDR1 like %s or ADDR2 like %s) and '
values.append("%" + addr + "%")
- values.append("%" + addr + "%")
+ values.append("%" + addr + "%")
if tel != '':
query += 'tel1 like %s and '
values.append("%" + tel + "%")
- if dob != datetime.date(1900,1,1):
+ if dob != datetime.date(1900, 1, 1):
query += 'dob = %s and '
values.append(dob)
if pcde != '':
@@ -41,23 +59,23 @@ similar_fname, pcde):
if "'" in sname:
query += '(sname like %s or sname like %s) and '
values.append(sname)
- values.append(sname.replace("'",""))
+ values.append(sname.replace("'", ""))
elif sname[:1] == "o":
query += '(sname like %s or sname like %s) and '
values.append(sname)
- values.append("o'" + sname[1:])
+ values.append("o'" + sname[1:])
elif sname[:2] == "mc":
query += '(sname like %s or sname like %s) and '
values.append(sname)
- values.append(sname.replace("mc","mac"))
+ values.append(sname.replace("mc", "mac"))
elif sname[:3] == "mac":
query += '(sname like %s or sname like %s) and '
values.append(sname)
- values.append(sname.replace("mac","mc"))
+ values.append(sname.replace("mac", "mc"))
else:
query += 'sname like %s and '
values.append(sname)
-
+
if fname != '':
if similar_fname:
query += 'fname sounds like %s and '
@@ -67,41 +85,42 @@ similar_fname, pcde):
values.append(fname + "%")
if query != '':
- fields = '''serialno, sname, fname, dob, addr1, addr2, pcde, tel1,
+ fields = '''serialno, sname, fname, dob, addr1, addr2, pcde, tel1,
tel2, mobile'''
-
- query = "select %s from patients where %s order by sname, fname"% (
- fields, query[0 : query.rindex("and")])
-
+
+ query = "select %s from patients where %s order by sname, fname" % (
+ fields, query[0: query.rindex("and")])
+
db = connect()
cursor = db.cursor()
- cursor.execute(query,tuple(values))
+ cursor.execute(query, tuple(values))
results = cursor.fetchall()
cursor.close()
-
+
return results
else:
return ()
+
def getcandidates_from_serialnos(list_of_snos):
- query=""
+ query = ""
for sno in list_of_snos:
- query+="serialno=%d or "%sno
- if query!='':
- fields='serialno,sname,fname,dob, addr1,addr2,pcde,tel1,tel2,mobile'
- query="select %s from patients where %s order by sname,fname"%(
- fields,query[:query.rindex("or")])
+ query += "serialno=%d or " % sno
+ if query != '':
+ fields = 'serialno,sname,fname,dob, addr1,addr2,pcde,tel1,tel2,mobile'
+ query = "select %s from patients where %s order by sname,fname" % (
+ fields, query[:query.rindex("or")])
- db=connect()
+ db = connect()
cursor = db.cursor()
cursor.execute(query)
results = cursor.fetchall()
cursor.close()
- #db.close()
+ # db.close()
return results
else:
return()
-
-if __name__=='__main__':
- print getcandidates(datetime.date(1900,1,1),"","","smit","","","","")
- #print getcandidates_from_serialnos((1,2,3,4))
\ No newline at end of file
+
+if __name__ == '__main__':
+ print getcandidates(datetime.date(1900, 1, 1), "", "", "smit", "", "", "", "")
+ # print getcandidates_from_serialnos((1,2,3,4))
diff --git a/src/openmolar/dbtools/treatment_course.py b/src/openmolar/dbtools/treatment_course.py
index dab6bb8..04b1ff6 100644
--- a/src/openmolar/dbtools/treatment_course.py
+++ b/src/openmolar/dbtools/treatment_course.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from copy import deepcopy
import logging
@@ -16,38 +32,39 @@ from openmolar.settings import localsettings
LOGGER = logging.getLogger("openmolar")
CURRTRT_NON_TOOTH_ATTS = ('xray', 'perio', 'anaes',
-'other', 'ndu', 'ndl', 'odu', 'odl', 'custom')
+ 'other', 'ndu', 'ndl', 'odu', 'odl', 'custom')
CURRTRT_ROOT_ATTS = CURRTRT_NON_TOOTH_ATTS + (
-'ur8', 'ur7', 'ur6', 'ur5', 'ur4', 'ur3', 'ur2', 'ur1', 'ul1',
-'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8', 'll8', 'll7', 'll6', 'll5',
-'ll4', 'll3', 'll2', 'll1', 'lr1', 'lr2', 'lr3', 'lr4', 'lr5', 'lr6', 'lr7',
-'lr8')
-
-CURRTRT_ATTS=('courseno','xraypl','periopl','anaespl','otherpl',
-'ndupl','ndlpl','odupl','odlpl',"custompl",
-'xraycmp','periocmp','anaescmp','othercmp','nducmp','ndlcmp',
-'oducmp','odlcmp',"customcmp",'ur8pl','ur7pl',
-'ur6pl','ur5pl','ur4pl','ur3pl','ur2pl','ur1pl','ul1pl','ul2pl','ul3pl',
-'ul4pl','ul5pl','ul6pl','ul7pl',
-'ul8pl','ll8pl','ll7pl','ll6pl','ll5pl','ll4pl','ll3pl','ll2pl','ll1pl',
-'lr1pl','lr2pl','lr3pl','lr4pl',
-'lr5pl','lr6pl','lr7pl','lr8pl','ur8cmp','ur7cmp','ur6cmp','ur5cmp',
-'ur4cmp','ur3cmp','ur2cmp','ur1cmp',
-'ul1cmp','ul2cmp','ul3cmp','ul4cmp','ul5cmp','ul6cmp','ul7cmp','ul8cmp',
-'ll8cmp','ll7cmp','ll6cmp','ll5cmp',
-'ll4cmp','ll3cmp','ll2cmp','ll1cmp','lr1cmp','lr2cmp','lr3cmp','lr4cmp',
-'lr5cmp','lr6cmp','lr7cmp','lr8cmp',
-'examt','examd','accd','cmpd')
+ 'ur8', 'ur7', 'ur6', 'ur5', 'ur4', 'ur3', 'ur2', 'ur1', 'ul1',
+ 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8', 'll8', 'll7', 'll6', 'll5',
+ 'll4', 'll3', 'll2', 'll1', 'lr1', 'lr2', 'lr3', 'lr4', 'lr5', 'lr6', 'lr7',
+ 'lr8')
+
+CURRTRT_ATTS = ('courseno', 'xraypl', 'periopl', 'anaespl', 'otherpl',
+ 'ndupl', 'ndlpl', 'odupl', 'odlpl', "custompl",
+ 'xraycmp', 'periocmp', 'anaescmp', 'othercmp', 'nducmp', 'ndlcmp',
+ 'oducmp', 'odlcmp', "customcmp", 'ur8pl', 'ur7pl',
+ 'ur6pl', 'ur5pl', 'ur4pl', 'ur3pl', 'ur2pl', 'ur1pl', 'ul1pl', 'ul2pl', 'ul3pl',
+ 'ul4pl', 'ul5pl', 'ul6pl', 'ul7pl',
+ 'ul8pl', 'll8pl', 'll7pl', 'll6pl', 'll5pl', 'll4pl', 'll3pl', 'll2pl', 'll1pl',
+ 'lr1pl', 'lr2pl', 'lr3pl', 'lr4pl',
+ 'lr5pl', 'lr6pl', 'lr7pl', 'lr8pl', 'ur8cmp', 'ur7cmp', 'ur6cmp', 'ur5cmp',
+ 'ur4cmp', 'ur3cmp', 'ur2cmp', 'ur1cmp',
+ 'ul1cmp', 'ul2cmp', 'ul3cmp', 'ul4cmp', 'ul5cmp', 'ul6cmp', 'ul7cmp', 'ul8cmp',
+ 'll8cmp', 'll7cmp', 'll6cmp', 'll5cmp',
+ 'll4cmp', 'll3cmp', 'll2cmp', 'll1cmp', 'lr1cmp', 'lr2cmp', 'lr3cmp', 'lr4cmp',
+ 'lr5cmp', 'lr6cmp', 'lr7cmp', 'lr8cmp',
+ 'examt', 'examd', 'accd', 'cmpd')
QUERY = "SELECT "
for field in CURRTRT_ATTS:
- QUERY += "%s, "% field
+ QUERY += "%s, " % field
QUERY = QUERY.rstrip(", ")
QUERY += " from currtrtmt2 where serialno=%s and courseno=%s"
class TreatmentCourse(object):
+
def __init__(self, sno, courseno):
'''
initiate the class with default variables, then load from database
@@ -151,13 +168,13 @@ class TreatmentCourse(object):
cursor.close()
def __repr__(self):
- message = "TreatmentCourse for patient %s courseno %s\n"% (
+ message = "TreatmentCourse for patient %s courseno %s\n" % (
self.serialno, self.courseno)
for att in CURRTRT_ATTS:
value = self.__dict__.get(att, "")
if value != "":
- message += " %s,%s\n"% (att, value)
+ message += " %s,%s\n" % (att, value)
return message
def __cmp__(self, other):
@@ -165,14 +182,14 @@ class TreatmentCourse(object):
def _non_tooth_items(self, suffix="pl"):
for att in CURRTRT_NON_TOOTH_ATTS:
- value = self.__dict__.get(att+suffix, "")
+ value = self.__dict__.get(att + suffix, "")
if value != "":
txs = value.split(" ")
for tx in set(txs):
if tx != "":
n = txs.count(tx)
if n != 1:
- tx = "%d%s"% (n, tx)
+ tx = "%d%s" % (n, tx)
yield att, tx
@property
@@ -195,7 +212,7 @@ class TreatmentCourse(object):
for value in cursor.fetchall():
for i, field in enumerate(CURRTRT_ATTS):
self.__dict__[field] = value[i]
- #LOGGER.debug("getCurrtrt '%s' = '%s'"% (field, value[i]))
+ # LOGGER.debug("getCurrtrt '%s' = '%s'"% (field, value[i]))
cursor.close()
@property
@@ -207,8 +224,8 @@ class TreatmentCourse(object):
db = connect.connect()
cursor = db.cursor()
if cursor.execute(
- "select max(courseno) from currtrtmt2 where serialno=%s",
- (self.serialno,)):
+ "select max(courseno) from currtrtmt2 where serialno=%s",
+ (self.serialno,)):
cno = cursor.fetchone()[0]
else:
cno = 0
@@ -275,13 +292,13 @@ class TreatmentCourse(object):
'''
if self.examt != "":
hash_ = localsettings.hash_func(
- "%sexam1%s"% (self.courseno, self.examt))
- yield (hash_, "exam", self.examt+" ")
+ "%sexam1%s" % (self.courseno, self.examt))
+ yield (hash_, "exam", self.examt + " ")
for att in CURRTRT_ROOT_ATTS:
- treats = self.__dict__[att+"cmp"]
+ treats = self.__dict__[att + "cmp"]
if not completed_only:
- treats += " " + self.__dict__[att+"pl"]
+ treats += " " + self.__dict__[att + "pl"]
treat_list = sorted(treats.split(" "))
prev_tx, count = None, 1
@@ -294,8 +311,8 @@ class TreatmentCourse(object):
else:
count += 1
hash_ = localsettings.hash_func(
- "%s%s%s%s"% (self.courseno, att, count, tx))
- yield (hash_, att, tx+" ")
+ "%s%s%s%s" % (self.courseno, att, count, tx))
+ yield (hash_, att, tx + " ")
def get_tx_from_hash(self, hash_):
'''
@@ -306,7 +323,7 @@ class TreatmentCourse(object):
for tx_hash in self.tx_hashes:
if tx_hash[0] == hash_:
return tx_hash[1], tx_hash[2]
- LOGGER.warning("couldn't find treatment %s"% hash_)
+ LOGGER.warning("couldn't find treatment %s" % hash_)
LOGGER.debug("listing existing hashes")
for tx_hash in self.tx_hashes:
LOGGER.debug(tx_hash)
@@ -317,7 +334,7 @@ class TreatmentCourse(object):
returns the list of treatments currently planned for this attribute.
eg pl_txs("ul8") may return ["O", "B,CO"]
'''
- txs = self.__dict__["%spl"%att].split(" ")
+ txs = self.__dict__["%spl" % att].split(" ")
while "" in txs:
txs.remove("")
return txs
@@ -327,7 +344,7 @@ class TreatmentCourse(object):
returns the list of treatments currently planned for this attribute.
eg cmp_txs("ul8") may return ["O", "B,CO"]
'''
- txs = self.__dict__["%scmp"%att].split(" ")
+ txs = self.__dict__["%scmp" % att].split(" ")
while "" in txs:
txs.remove("")
return txs
@@ -339,7 +356,7 @@ class TreatmentCourse(object):
'''
return self.cmp_txs(att) + self.pl_txs(att)
-if __name__ =="__main__":
+if __name__ == "__main__":
'''
testing stuff
'''
@@ -348,7 +365,7 @@ if __name__ =="__main__":
db = connect.connect()
cursor = db.cursor()
cursor.execute("select courseno0 from patients where serialno = %s",
- (TEST_SNO,))
+ (TEST_SNO,))
courseno = cursor.fetchone()[0]
cursor.close()
@@ -362,4 +379,3 @@ if __name__ =="__main__":
print tc.non_tooth_plan_items
print tc.non_tooth_cmp_items
print tc.all_txs("ur5")
-
diff --git a/src/openmolar/dbtools/updateMH.py b/src/openmolar/dbtools/updateMH.py
index 7093247..4890ed0 100644
--- a/src/openmolar/dbtools/updateMH.py
+++ b/src/openmolar/dbtools/updateMH.py
@@ -1,42 +1,62 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
-import MySQLdb,sys
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+import MySQLdb
+import sys
from openmolar.connect import connect
from openmolar.settings import localsettings
-def write(sno,data):
- db=connect()
+
+def write(sno, data):
+ db = connect()
cursor = db.cursor()
- result=True
- query='insert into mednotes (serialno,drnm,adrtel,curmed,oldmed,allerg,heart,lungs,liver,kidney,bleed,anaes,other,alert'
+ result = True
+ query = 'insert into mednotes (serialno,drnm,adrtel,curmed,oldmed,allerg,heart,lungs,liver,kidney,bleed,anaes,other,alert'
dateToWrite = data[13]
- if dateToWrite==None:
- query+=") values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
- values=(int(sno),)+data[:13]
+ if dateToWrite is None:
+ query += ") values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
+ values = (int(sno),) + data[:13]
else:
- query+=",chkdate) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
- values=(int(sno),)+data[:13]+(dateToWrite,)
+ query += ",chkdate) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
+ values = (int(sno),) + data[:13] + (dateToWrite,)
print values
try:
- cursor.execute("delete from mednotes where serialno=%d"%sno)
- cursor.execute(query,values)
- except Exception,e:
+ cursor.execute("delete from mednotes where serialno=%d" % sno)
+ cursor.execute(query, values)
+ except Exception as e:
print e
- result=False
+ result = False
db.commit()
cursor.close()
- #db.close()
+ # db.close()
return result
-def writeHist(sno,data):
- db=connect()
+
+def writeHist(sno, data):
+ db = connect()
cursor = db.cursor()
for ix, note in data:
@@ -46,13 +66,14 @@ def writeHist(sno,data):
cursor.execute(query, values)
db.commit()
cursor.close()
- #db.close()
+ # db.close()
return True
if __name__ == "__main__":
import datetime
- newdata=("doctor","address","curmeds","pastmeds","allergies","heart","lungs","liver","bleeding","Kidneys",
- "ops","other",True,datetime.date.today())
- write(11956,newdata)
- writeHist(11956,((140,"new doctor"),))
+ newdata = (
+ "doctor", "address", "curmeds", "pastmeds", "allergies", "heart", "lungs", "liver", "bleeding", "Kidneys",
+ "ops", "other", True, datetime.date.today())
+ write(11956, newdata)
+ writeHist(11956, ((140, "new doctor"),))
diff --git a/src/openmolar/dbtools/writeNewCourse.py b/src/openmolar/dbtools/writeNewCourse.py
index 90bed26..c665872 100644
--- a/src/openmolar/dbtools/writeNewCourse.py
+++ b/src/openmolar/dbtools/writeNewCourse.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from openmolar.connect import connect
@@ -12,6 +28,7 @@ INS_QUERY = 'insert into currtrtmt2 (serialno, accd) values (%s, %s)'
DEL_QUERY = 'delete from currtrtmt2 where serialno = %s and courseno = %s'
+
def write(serialno, accd):
db = connect()
cursor = db.cursor()
@@ -21,13 +38,14 @@ def write(serialno, accd):
return cno
+
def delete(serialno, courseno):
db = connect()
cursor = db.cursor()
cursor.execute(DEL_QUERY, (serialno, courseno))
cno = db.insert_id()
cursor.close()
-
+
if __name__ == "__main__":
- print "started course %d"% write(31720, "20081225")
+ print "started course %d" % write(31720, "20081225")
diff --git a/src/openmolar/dbtools/writeNewPatient.py b/src/openmolar/dbtools/writeNewPatient.py
index c2b60a9..2820b14 100644
--- a/src/openmolar/dbtools/writeNewPatient.py
+++ b/src/openmolar/dbtools/writeNewPatient.py
@@ -1,25 +1,43 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import MySQLdb
from openmolar import connect
from openmolar.dbtools import patient_class
from openmolar.settings import localsettings
+
def commit(pt):
- sqlcond=""
+ sqlcond = ""
values = []
for attr in patient_class.patientTableAtts:
value = pt.__dict__[attr]
if value:
- sqlcond += '%s = %%s,'% attr
+ sqlcond += '%s = %%s,' % attr
values.append(value)
-
- sqlcommand= "insert into patients SET %s serialno=%%s"%sqlcond
+
+ sqlcommand = "insert into patients SET %s serialno=%%s" % sqlcond
query = "select max(serialno) from patients"
@@ -28,10 +46,10 @@ def commit(pt):
db = connect.connect()
cursor = db.cursor()
cursor.execute(query)
- currentMax=cursor.fetchone()[0]
+ currentMax = cursor.fetchone()[0]
if currentMax:
- newSerialno = currentMax+1
+ newSerialno = currentMax + 1
else:
newSerialno = 1
try:
@@ -39,24 +57,24 @@ def commit(pt):
cursor.close()
db.commit()
break
-
- except connect.IntegrityError, e:
+
+ except connect.IntegrityError as e:
print "error saving new patient, will retry with new serialno"
print e
newSerialno = -1
-
+
Attempts += 1
if Attemps > 20:
break
- #db.close()
+ # db.close()
return newSerialno
if __name__ == "__main__":
global pt
from openmolar.dbtools import patient_class
import copy
- pt= patient_class.patient(0)
- pt.fname="Norman"
- pt.sname="Wisdom"
- #ok - so a trivial change has been made - now write to the database
+ pt = patient_class.patient(0)
+ pt.fname = "Norman"
+ pt.sname = "Wisdom"
+ # ok - so a trivial change has been made - now write to the database
print commit(pt)
diff --git a/src/openmolar/firstRun.py b/src/openmolar/firstRun.py
index d078122..75dbe13 100755
--- a/src/openmolar/firstRun.py
+++ b/src/openmolar/firstRun.py
@@ -1,14 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 2 of the License, or
-# version 3 of the License, or (at your option) any later version. It is
-# provided for educational purposes and is distributed in the hope that
-# it will be useful, but WITHOUT ANY WARRANTY; without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
-# the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module is only called if a settings file isn't found
@@ -22,7 +34,7 @@ import MySQLdb
from PyQt4 import QtGui, QtCore
from xml.dom import minidom
-from openmolar.qt4gui.compiled_uis import Ui_newSetup
+from openmolar.qt4gui.compiled_uis.Ui_newSetup import Ui_MainWindow
from openmolar.settings import localsettings
blankXML = '''<?xml version="1.1" ?>
@@ -43,15 +55,17 @@ blankXML = '''<?xml version="1.1" ?>
</settings>'''
-class newsetup(QtGui.QDialog, Ui_newSetup.Ui_Dialog):
+class NewSetupMainWindow(QtGui.QMainWindow, Ui_MainWindow):
+
'''
a new setup - creates and saves a config file
creates a database if required
loads a demo set of data.
'''
+ completed = False
def __init__(self, parent=None):
- super(newsetup, self).__init__(parent)
+ super(NewSetupMainWindow, self).__init__(parent)
self.setupUi(self)
self.stackedWidget.setCurrentIndex(0)
self.PASSWORD = ""
@@ -65,164 +79,164 @@ class newsetup(QtGui.QDialog, Ui_newSetup.Ui_Dialog):
self.back_pushButton.hide()
self.groupBox.setEnabled(False)
self.specificLabel()
-
+
def specificLabel(self):
'''
offer customised advice depending on the OS
'''
if "win" in sys.platform:
- advice = _("If you ever need to run this again, ")
+ advice = _("If you ever need to run this again, ")
advice += _("delete the openmolar.conf file in ")
advice += "C:\\Program Files\\openmolar\\"
else:
advice = _("If you ever need to run this wizard again, ") +\
- "(" + _("Eg. if your server location changes, ") +\
- _("or you require a new password")+")"
- advice += "<br>"+ _("type") + " 'openmolar firstrun' "
+ "(" + _("Eg. if your server location changes, ") +\
+ _("or you require a new password") + ")"
+ advice += "<br>" + _("type") + " 'openmolar firstrun' "
advice += _("on the command line, or delete the file")
- advice += "<br />"+"~/.openmolar/openmolar.conf" +"<br />"*2
+ advice += "<br />" + "~/.openmolar/openmolar.conf" + "<br />" * 2
advice += _(
- "For a more secure setup, you should move this file to")
+ "For a more secure setup, you should move this file to")
advice += "/etc/openmolar/openmolar.conf"
-
+
self.sysAdvice_label.setText(advice)
-
+
def signals(self):
self.connect(self.go_pushButton, QtCore.SIGNAL("clicked()"), self.next)
-
- self.connect(self.back_pushButton,
- QtCore.SIGNAL("clicked()"), self.back)
+
+ self.connect(self.back_pushButton,
+ QtCore.SIGNAL("clicked()"), self.back)
self.connect(self.rootPassword_checkBox, QtCore.SIGNAL(
- "stateChanged(int)"), self.rootechomode)
+ "stateChanged(int)"), self.rootechomode)
self.connect(self.mainpassword_checkBox, QtCore.SIGNAL(
- "stateChanged(int)"), self.echomode)
-
+ "stateChanged(int)"), self.echomode)
+
self.connect(self.dbpassword_checkBox, QtCore.SIGNAL(
- "stateChanged(int)"), self.dbechomode)
-
+ "stateChanged(int)"), self.dbechomode)
+
self.connect(self.existingDB_radioButton, QtCore.SIGNAL(
- "toggled(bool)"),self.demo_or_existing)
-
- self.connect(self.testDB_pushButton,
- QtCore.SIGNAL("clicked()"), self.testConnection)
-
- self.connect(self.stackedWidget,
- QtCore.SIGNAL("currentChanged (int)"), self.title_label_update)
-
+ "toggled(bool)"), self.demo_or_existing)
+
+ self.connect(self.testDB_pushButton,
+ QtCore.SIGNAL("clicked()"), self.testConnection)
+
+ self.connect(self.stackedWidget,
+ QtCore.SIGNAL("currentChanged (int)"), self.title_label_update)
+
for le in (self.rootPassword_lineEdit,
- self.user_lineEdit,
- self.password_lineEdit,
- self.main_password_lineEdit,
- self.repeat_password_lineEdit,
- self.host_lineEdit,
- self.port_lineEdit):
- self.connect(le,
- QtCore.SIGNAL("returnPressed()"), self.next)
-
- def advise(self, message, warning = False):
+ self.user_lineEdit,
+ self.password_lineEdit,
+ self.main_password_lineEdit,
+ self.repeat_password_lineEdit,
+ self.host_lineEdit,
+ self.port_lineEdit):
+ self.connect(le,
+ QtCore.SIGNAL("returnPressed()"), self.next)
+
+ def advise(self, message, warning=False):
'''
throws up a message box
'''
if warning:
QtGui.QMessageBox.warning(self, _("Error"), message)
else:
- QtGui.QMessageBox.information(self, _("Advisory"),
- message)
-
+ QtGui.QMessageBox.information(self, _("Advisory"),
+ message)
+
def next(self):
'''
time to move on to the next screen
assuming all is well
'''
i = self.stackedWidget.currentIndex()
-
- if i == 0:
+
+ if i == 0: # welcome screen
self.stackedWidget.setCurrentIndex(1)
self.main_password_lineEdit.setFocus()
self.back_pushButton.show()
- elif i == 1:
+ elif i == 1: # system password
p1 = self.main_password_lineEdit.text()
p2 = self.repeat_password_lineEdit.text()
- if p1 != p2:
+ if p1 == "":
+ self.advise(_("Password must not be blank!"))
+ elif p1 != p2:
self.advise(_("Passwords don't match!"))
else:
self.PASSWORD = self.main_password_lineEdit.text()
self.stackedWidget.setCurrentIndex(2)
-
- elif i == 2:
+
+ elif i == 2: # server_location
self.stackedWidget.setCurrentIndex(3)
-
- elif i == 3:
+
+ elif i == 3: # choose database
if self.createDemo_radioButton.isChecked():
- self.stackedWidget.setCurrentIndex(5)
+ self.stackedWidget.setCurrentIndex(4)
self.rootPassword_lineEdit.setFocus()
else:
- self.stackedWidget.setCurrentIndex(4)
+ self.stackedWidget.setCurrentIndex(6)
self.go_pushButton.setFocus()
-
+
+ elif i == 6:
+ self.completed = self.finish()
+ QtGui.QApplication.instance().closeAllWindows()
+
elif i == 4:
- self.finish()
- if self.checkBox.isChecked():
- self.accept()
- else:
- self.reject()
-
- elif i == 5:
self.snapshot()
- result=QtGui.QMessageBox.question(self,
- _("Create Database"),
- _("Create Demo Database now with the following settings?") +
- '''<br><ul><li>host - %s </li><li>port - %s</li>
+ result = QtGui.QMessageBox.question(self,
+ _("Create Database"),
+ _("Create Demo Database now with the following settings?") +
+ '''<br><ul><li>host - %s </li><li>port - %s</li>
<li>database name - %s</li>
- <li>username - %s</li><li>password - (hidden)</li>'''% (
- self.HOST,self.PORT,self.DB,self.MysqlUser),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
-
+ <li>username - %s</li><li>password - (hidden)</li>''' % (
+ self.HOST, self.PORT, self.DB, self.MysqlUser),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
+
if result == QtGui.QMessageBox.Yes:
- self.stackedWidget.setCurrentIndex(6)
+ self.stackedWidget.setCurrentIndex(5)
if self.createDemoDatabase():
self.advise(_("Database Created Sucessfully"))
- self.stackedWidget.setCurrentIndex(4)
+ self.stackedWidget.setCurrentIndex(6)
self.testDB_pushButton.setEnabled(True)
return
else:
- self.stackedWidget.setCurrentIndex(3)
-
+ self.stackedWidget.setCurrentIndex(3)
+ return
+
self.advise(_("Database NOT Created"))
- self.stackedWidget.setCurrentIndex(4)
-
+ self.stackedWidget.setCurrentIndex(4)
+
def back(self):
'''
time to move on to the next screen
assuming all is well
'''
i = self.stackedWidget.currentIndex()
-
+
if i == 1:
self.back_pushButton.hide()
elif i == 5:
i -= 1
- self.stackedWidget.setCurrentIndex(i-1)
-
+ self.stackedWidget.setCurrentIndex(i - 1)
+
def title_label_update(self, i):
'''
updates the header label when the stacked widget changes
'''
message = (
- _("Welcome to the openMolar settings wizard."),
- _("Set the application Password"),
- _("Server Location"),
- _("Database Settings"),
- _("Save settings and exit"),
- _("Create a demo database"),
- _("Creating Database"))[i]
-
+ _("Welcome to the openMolar settings wizard."),
+ _("Set the application Password"),
+ _("Server Location"),
+ _("Database Settings"),
+ _("Save settings and exit"),
+ _("Create a demo database"),
+ _("Creating Database"))[i]
+
self.title_label.setText(message)
-
+
def snapshot(self):
'''
grab the current settings
@@ -241,13 +255,13 @@ class newsetup(QtGui.QDialog, Ui_newSetup.Ui_Dialog):
'''
user is choosing between demo or existing db
'''
-
+
self.groupBox.setEnabled(checked)
-
+
if checked:
self.database_lineEdit.setFocus()
self.database_lineEdit.selectAll()
-
+
def testConnection(self):
'''
tries to connect to a mysql database with the settings
@@ -255,29 +269,29 @@ class newsetup(QtGui.QDialog, Ui_newSetup.Ui_Dialog):
self.snapshot()
result = False
try:
-
- print "attempting to connect to mysql server on %s port %s..."% (
- self.HOST, self.PORT)
- db = MySQLdb.connect(host = self.HOST,
- port = self.PORT, db = self.DB,
- passwd = self.MysqlPassword, user = self.MysqlUser)
+
+ print "attempting to connect to mysql server on %s port %s..." % (
+ self.HOST, self.PORT)
+ db = MySQLdb.connect(host=self.HOST,
+ port=self.PORT, db=self.DB,
+ passwd=self.MysqlPassword, user=self.MysqlUser)
result = db.open
db.close()
- except Exception,e:
+ except Exception as e:
print e
self.advise(_("The connection attempt threw an exception")
- + "<hr>%s"% e, True)
+ + "<hr>%s" % e, True)
return
-
- if result:
+
+ if result:
QtGui.QMessageBox.information(None,
- _("Success!"),
- _("The %s database accepted the connection.")% self.DB)
+ _("Success!"),
+ _("The %s database accepted the connection.") % self.DB)
else:
- self.advise(_('''The connection attempt failed,
+ self.advise(_('''The connection attempt failed,
please recheck your settings'''), True)
print "Connection failed!"
@@ -285,43 +299,44 @@ please recheck your settings'''), True)
self.progressBar.setValue(0)
self.snapshot()
PB_LIMIT = 50
+
def updatePB():
val = self.progressBar.value()
if val < PB_LIMIT:
- self.progressBar.setValue(val+5)
+ self.progressBar.setValue(val + 5)
self.progressBar.update()
-
- self.timer1 = QtCore.QTimer()
- self.timer1.start(10) # 1/100thsecond
+
+ self.timer1 = QtCore.QTimer()
+ self.timer1.start(10) # 1/100thsecond
self.connect(self.timer1, QtCore.SIGNAL("timeout()"),
- updatePB)
-
+ updatePB)
+
try:
from openmolar import createdemodatabase
self.progressBar.setValue(10)
if createdemodatabase.create_database(self.HOST, self.PORT,
- self.MysqlUser, self.MysqlPassword, self.DB, self.rootpass):
+ self.MysqlUser, self.MysqlPassword, self.DB, self.rootpass):
print 'New database created sucessfully.'
else:
print "error creating database"
- raise IOError ("error creating database")
+ raise IOError("error creating database")
self.progressBar.setValue(50)
PB_LIMIT = 90
print 'attempting to loadtables....',
if createdemodatabase.loadTables(self.HOST, self.PORT,
- self.MysqlUser, self.MysqlPassword, self.DB):
+ self.MysqlUser, self.MysqlPassword, self.DB):
print "successfully loaded tables"
else:
print "error loading tables"
- raise IOError ("error loading tables")
+ raise IOError("error loading tables")
self.progressBar.setValue(100)
-
+
return True
-
- except Exception, e:
- print "error in creatDemoDB", e
- self.advise( _("Error Creating Database") +"<hr>%s"% e,2)
-
+
+ except Exception as e:
+ print "error in creatDemoDB", e
+ self.advise(_("Error Creating Database") + "<hr>%s" % e, 2)
+
def echomode(self, arg):
'''
toggle the echo mode of the password input boxes
@@ -352,47 +367,47 @@ please recheck your settings'''), True)
dom = minidom.parseString(blankXML)
#-- hash the password and save it
PSWORD = hashlib.md5(hashlib.sha1(
- str("diqug_ADD_SALT_3i2some"+self.PASSWORD)).hexdigest()
- ).hexdigest()
+ str("diqug_ADD_SALT_3i2some" + self.PASSWORD)).hexdigest()
+ ).hexdigest()
dom.getElementsByTagName(
- "system_password")[0].firstChild.replaceWholeText(PSWORD)
+ "system_password")[0].firstChild.replaceWholeText(PSWORD)
#-- server settings
xmlnode = dom.getElementsByTagName("server")[0]
#--save the location
xmlnode.getElementsByTagName(
- "location")[0].firstChild.replaceWholeText(self.HOST)
+ "location")[0].firstChild.replaceWholeText(self.HOST)
#--port
xmlnode.getElementsByTagName(
- "port")[0].firstChild.replaceWholeText(str(self.PORT))
+ "port")[0].firstChild.replaceWholeText(str(self.PORT))
#-- database settings
xmlnode = dom.getElementsByTagName("database")[0]
#--user
xmlnode.getElementsByTagName(
- "user")[0].firstChild.replaceWholeText(self.MysqlUser)
+ "user")[0].firstChild.replaceWholeText(self.MysqlUser)
xmlnode.getElementsByTagName(
- "password")[0].firstChild.replaceWholeText(
- base64.b64encode(self.MysqlPassword))
+ "password")[0].firstChild.replaceWholeText(
+ base64.b64encode(self.MysqlPassword))
xmlnode.getElementsByTagName(
- "dbname")[0].firstChild.replaceWholeText(self.DB)
+ "dbname")[0].firstChild.replaceWholeText(self.DB)
settingsDir = os.path.dirname(localsettings.global_cflocation)
-
+
sucessful_save = False
-
+
try:
if not os.path.exists(settingsDir):
print 'putting a global settings file in', settingsDir,
os.mkdir(settingsDir)
print '...ok'
print 'writing settings to', localsettings.global_cflocation,
- f = open(localsettings.global_cflocation,"w")
+ f = open(localsettings.global_cflocation, "w")
f.write(dom.toxml())
f.close()
print '...ok'
@@ -402,11 +417,11 @@ please recheck your settings'''), True)
pass
except IOError:
pass
-
+
if not sucessful_save:
- print 'unable to write to %s...'%settingsDir,
- print ' we need root privileges for that'
-
+ print 'unable to write to %s...' % settingsDir,
+ print ' we need root privileges for that'
+
print "will resort to putting settings into a local file",
print localsettings.cflocation
@@ -414,27 +429,37 @@ please recheck your settings'''), True)
if not os.path.exists(settingsDir):
os.mkdir(settingsDir)
-
+
print 'putting a local settings file in', settingsDir,
-
- f = open(localsettings.cflocation,"w")
+
+ f = open(localsettings.cflocation, "w")
f.write(dom.toxml())
f.close()
print '...ok'
localsettings.cflocation = localsettings.cflocation
-
- self.accept()
- except Exception, e:
- print "error saving settings", e
+ if self.DB == "openmolar_demo":
+ f = open(localsettings.LOGIN_CONF, "w")
+ f.write("[login]\nPASSWORD=%s\nUSER1=NW" % self.PASSWORD)
+ f.close()
+
+ return True
+
+ except Exception as e:
+ print "error saving settings", e
QtGui.QMessageBox.warning(self, _("FAILURE"), str(e))
-
-
-def run():
- dl = newsetup()
- return dl.exec_()
+ return False
+
+
+def run():
+ app = QtGui.QApplication.instance()
+ if not app:
+ app = QtGui.QApplication(sys.argv)
+ mw = NewSetupMainWindow()
+ mw.show()
+ app.exec_()
+ return mw.completed
if __name__ == "__main__":
- app = QtGui.QApplication(sys.argv)
- run()
+ print run()
diff --git a/src/openmolar/locale/de.po b/src/openmolar/locale/de.po
index f652681..a8f3d11 100644
--- a/src/openmolar/locale/de.po
+++ b/src/openmolar/locale/de.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openmolar\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
"POT-Creation-Date: 2010-06-07 22:00+0000\n"
-"PO-Revision-Date: 2012-05-27 12:07+0000\n"
-"Last-Translator: Daniel Winzen <d at winzen4.de>\n"
+"PO-Revision-Date: 2014-02-12 21:00+0000\n"
+"Last-Translator: Tobias Bannert <Unknown>\n"
"Language-Team: German <de at li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-05-28 05:20+0000\n"
-"X-Generator: Launchpad (build 15288)\n"
+"X-Launchpad-Export-Date: 2014-02-13 05:59+0000\n"
+"X-Generator: Launchpad (build 16916)\n"
#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/appointments.py:751
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:221
@@ -2219,7 +2219,7 @@ msgstr "Weitere Felder verfügbar. Zum Bearbeiten hier klicken."
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3054
msgid "More"
-msgstr "Weiter.."
+msgstr "Mehr"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3056
msgid "Tel (work)"
diff --git a/src/openmolar/locale/en_GB.po b/src/openmolar/locale/en_GB.po
index 8454c82..e059b92 100644
--- a/src/openmolar/locale/en_GB.po
+++ b/src/openmolar/locale/en_GB.po
@@ -7,47 +7,55 @@ msgid ""
msgstr ""
"Project-Id-Version: openmolar\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
-"POT-Creation-Date: 2010-04-05 02:09+0000\n"
-"PO-Revision-Date: 2010-04-05 02:27+0000\n"
-"Last-Translator: Neil Wallace <rowinggolfer at googlemail.com>\n"
+"POT-Creation-Date: 2010-06-07 22:00+0000\n"
+"PO-Revision-Date: 2013-07-23 19:15+0000\n"
+"Last-Translator: Andi Chandler <Unknown>\n"
"Language-Team: English (United Kingdom) <en_GB at li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-06 04:03+0000\n"
-"X-Generator: Launchpad (build Unknown)\n"
+"X-Launchpad-Export-Date: 2013-07-24 05:33+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/appointments.py:751
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:221
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:222
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:223
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/block_wizard.py:25
+msgid "emergency"
+msgstr "emergency"
#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:64
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2922
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3178
msgid "Exam"
msgstr "Exam"
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:67
-msgid "anaes"
-msgstr "anaes"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:67
+#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:68
msgid "perio"
msgstr "perio"
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:67
+#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:69
msgid "xray"
msgstr "x-ray"
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:68
+#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:70
+msgid "anaes"
+msgstr "anaes"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:71
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:545
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:557
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:167
msgid "other"
msgstr "other"
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:68
+#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:72
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:546
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:558
msgid "custom"
msgstr "custom"
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:81
+#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:86
msgid "Denture Work"
msgstr "Denture Work"
@@ -86,11 +94,11 @@ msgid "Message"
msgstr "Message"
#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/forum.py:14
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2872
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3128
msgid "Date"
msgstr "Date"
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/patient_class.py:664
+#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/patient_class.py:655
msgid "Age Exemption removed"
msgstr "Age exemption removed"
@@ -103,18 +111,18 @@ msgid "Serial No"
msgstr "Serial No."
#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:14
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2792
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3048
msgid "Title"
msgstr "Title"
#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:14
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2799
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:136
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3055
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:138
msgid "First Name"
msgstr "First Name"
#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:14
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2801
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3057
msgid "Surname"
msgstr "Surname"
@@ -127,8 +135,8 @@ msgid "Address"
msgstr "Address"
#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:16
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:601
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2819
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:614
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3075
msgid "Town"
msgstr "Town"
@@ -141,19 +149,19 @@ msgid "PostCode"
msgstr "Postcode"
#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:17
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:126
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:622
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:130
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:635
msgid "Dentist"
msgstr "Dentist"
#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:17
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:602
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2821
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:615
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3077
msgid "County"
msgstr "County"
#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:17
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3053
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3332
msgid "Recall Date"
msgstr "Recall Date"
@@ -178,7 +186,7 @@ msgid "or you require a new password"
msgstr "or you require a new password"
#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:81
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:144
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:145
msgid "type"
msgstr "type"
@@ -193,7 +201,7 @@ msgstr "For a more secure setup, you should move this file to"
#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:129
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:172
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/newCourse.py:54
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:170
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:185
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:37
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:146
msgid "Error"
@@ -201,8 +209,8 @@ msgstr "Error"
#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:131
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/newCourse.py:36
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:85
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:167
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:90
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:182
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:34
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:143
msgid "Advisory"
@@ -229,7 +237,7 @@ msgid "Database NOT Created"
msgstr "Database NOT Created"
#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:216
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:287
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:290
msgid "Welcome to the openMolar settings wizard."
msgstr "Welcome to the openMolar settings wizard."
@@ -285,11 +293,11 @@ msgstr "Error Creating Database"
msgid "FAILURE"
msgstr "FAILURE"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:75
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:79
msgid "Update Client"
msgstr "Update Client"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:76
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:80
msgid ""
"<p>Sorry, you cannot run this version of the openMolar client\n"
"because your database schema is more advanced.</p>\n"
@@ -301,11 +309,11 @@ msgstr ""
"<p>this client requires schema version %s, but your database is at %s</p>\n"
"<p>Please Update openMolar now</p>"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:83
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:87
msgid "Proceed without upgrade?"
msgstr "Proceed without upgrade?"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:84
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:88
msgid ""
"<p>This openMolar client has fallen behind your database\n"
"schema version<br />this client was written for schema version %s,\n"
@@ -323,24 +331,24 @@ msgstr ""
"<p><i>It would still be wise to update this client ASAP</i></p>\n"
"<hr /><p>Do you wish to continue?</p>"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:131
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:137
msgid "This is not the default database - are you sure?"
msgstr "This is not the default database - are you sure?"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:134
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:140
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:154
msgid "confirm"
msgstr "confirm"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:148
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:154
msgid "DEFAULT"
msgstr "DEFAULT"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:150
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:156
msgid "Chosen server"
msgstr "Chosen server"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:166
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:172
msgid ""
"<center><p>\n"
"This appears to be your first running of openMolar<br />\n"
@@ -356,24 +364,24 @@ msgstr ""
"If you do not have a database, you will be prompted to create one<</p>\n"
"Are you ready to proceed?</center>"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:173
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:179
msgid "First Run"
msgstr "First Run"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:202
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:211
msgid "Unable to Run OpenMolar"
msgstr "Unable to Run OpenMolar"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:203
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:212
msgid "Good Bye!"
msgstr "Good Bye!"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:284
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:292
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:294
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:302
msgid "Login Error"
msgstr "Login Error"
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:285
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:295
msgid ""
"Incorrect<br />User/password<br />\n"
"combination!<br />Please Try Again."
@@ -381,7 +389,7 @@ msgstr ""
"Incorrect<br />User/password<br />\n"
"combination!<br />Please Try Again."
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:288
+#: /home/neil/openmolar/openmolar/src/openmolar/main.py:298
msgid ""
"<p>DATABASE ERROR </p>\n"
"<p>application cannot run</p>Error %s"
@@ -423,8 +431,8 @@ msgstr "Previous Course"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:152
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:155
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:158
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:85
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:595
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:93
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:608
msgid "Start"
msgstr "Start"
@@ -444,86 +452,223 @@ msgstr "COMPLETED"
msgid "PLAN"
msgstr "PLAN"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:225
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:251
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:265
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:15
+msgid "Relevant Books"
+msgstr "Relevant Books"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:15
+msgid "Selected Book(s)"
+msgstr "Selected Book(s)"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:16
+msgid "Available Dentists"
+msgstr "Available Dentists"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:16
+msgid "Available Hygenists"
+msgstr "Available Hygenists"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:17
+msgid "Available Clinicians"
+msgstr "Available Clinicians"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:17
+msgid "Manual Selection"
+msgstr "Manual Selection"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:17
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3381
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:41
+msgid "Everyone"
+msgstr "Everyone"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:218
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:219
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:154
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:142
+msgid "Lunch"
+msgstr "Lunch"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:220
+msgid "staff meeting"
+msgstr "staff meeting"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:224
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:141
+msgid "Out of Office"
+msgstr "Out of Office"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:178
+msgid "Please specify a clinician"
+msgstr "Please specify a clinician"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:233
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:261
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:275
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:67
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/saveDiscardCancel.py:82
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:293
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:299
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/examdialog.py:84
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:3828
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:4085
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:57
msgid "Confirm"
msgstr "Confirm"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:226
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:234
msgid "Delete all past Appointments?"
msgstr "Delete all past Appointments?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:227
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:235
msgid "from the diary of"
msgstr "from the diary of"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:241
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:249
msgid "Sucessfully removed appointment"
msgstr "Sucessfully removed appointment"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:244
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:253
msgid "Error removing proposed appointment"
msgstr "Error removing proposed appointment"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:247
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:319
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:256
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:328
msgid "No appointment selected"
msgstr "No appointment selected"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:252
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:262
msgid "Delete Unscheduled Appointment?"
msgstr "Delete unscheduled appointment?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:259
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:269
msgid "Confirm Delete appointment at"
msgstr "Confirm delete appointment at"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:263
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:273
msgid "with"
msgstr "with"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:276
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:286
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:50
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:48
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:374
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:378
msgid "Question"
msgstr "Question"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:277
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:287
msgid "Removed from appointment book - keep for rescheduling?"
msgstr "Removed from appointment book - keep for rescheduling?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:282
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:292
msgid "Error converting appointment"
msgstr "Error converting appointment"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:286
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:296
msgid "Error removing from patient diary"
msgstr "Error removing from patient diary"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:291
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:301
msgid "Error Removing from Appointment Book"
msgstr "Error removing from appointment book"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1379
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:412
+msgid "Error putting into dentist's book"
+msgstr "Error putting into dentist's book"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:425
+msgid "Please select an appointment to schedule"
+msgstr "Please select an appointment to schedule"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:429
+msgid "appointment already scheduled for"
+msgstr "appointment already scheduled for"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:476
+msgid "Reached"
+msgstr "Reached"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:478
+msgid "which is specified as the book end point"
+msgstr "which is specified as the book end point"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:498
+msgid "No clinicians selected"
+msgstr "No clinicians selected"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:507
+msgid "no appointments of"
+msgstr "no appointments of"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:508
+msgid "minutes or more available for selected week"
+msgstr "minutes or more available for selected week"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:520
+msgid "Please select an appointment to place here"
+msgstr "Please select an appointment to place here"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:524
+msgid "Please choose another appointment - this one is made already!"
+msgstr "Please choose another appointment - this one is made already!"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:534
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1423
+msgid "You have chosen an appointment with"
+msgstr "You have chosen an appointment with"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:536
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1425
+msgid "Is this correct?"
+msgstr "Is this correct?"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:569
+msgid "Confirm Make appointment for"
+msgstr "Confirm Make appointment for"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:622
+msgid "Error putting appointment back into patient diary"
+msgstr "Error putting appointment back into patient diary"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:626
+msgid "Error making appointment - sorry!"
+msgstr "Error making appointment - sorry!"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1141
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1238
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:862
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2453
+msgid "You can't schedule an appointment in the past"
+msgstr "You cannot schedule an appointment in the past"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1163
+msgid "showing current week"
+msgstr "showing current week"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1255
+msgid "showing current day"
+msgstr "showing current day"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1329
+msgid "Nothing to show!"
+msgstr "Nothing to show!"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1359
msgid "Do you want to unblock the selected slot?"
msgstr "Do you want to unblock the selected slot?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1409
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1388
msgid "unable to block - has the book been altered elsewhere?"
msgstr "unable to block - has the book been altered elsewhere?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1428
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1406
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1438
msgid "unable to make appointment - has the book been altered elsewhere?"
msgstr "unable to make appointment - has the book been altered elsewhere?"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1442
+msgid "unable to make make changes to the patient diary!"
+msgstr "unable to make make changes to the patient diary!"
+
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:20
msgid "Unscheduled"
msgstr "Unscheduled"
@@ -542,7 +687,7 @@ msgstr "Practitioner"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:21
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:149
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:103
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:104
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:151
msgid "Length"
msgstr "Length"
@@ -552,9 +697,9 @@ msgid "Treatment"
msgstr "Treatment"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:22
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:87
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2820
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:47
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:95
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3076
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:48
msgid "Memo"
msgstr "Memo"
@@ -574,14 +719,14 @@ msgstr "unable to update chart - this shouldn't happen!!"
msgid "you need to be in the static chart to change tooth state"
msgstr "you need to be in the static chart to change tooth state"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/charts/charts_gui.py:259
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2918
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2975
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:777
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/charts/charts_gui.py:260
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3174
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3231
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:926
msgid "BPE"
msgstr "BPE"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/charts/charts_gui.py:271
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/charts/charts_gui.py:272
msgid "NO CHARTS"
msgstr "NO CHARTS"
@@ -589,12 +734,13 @@ msgstr "NO CHARTS"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py:42
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estFooterWidget.py:220
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:134
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:139
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:140
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py:39
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:131
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_taskWidget.py:50
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_task_widget.py:50
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:120
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:220
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:123
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:225
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py:38
msgid "Form"
msgstr "Form"
@@ -628,7 +774,7 @@ msgid "Open a Day"
msgstr "Open a Day"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:147
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:84
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:92
msgid "Clinician"
msgstr "Clinician"
@@ -651,15 +797,10 @@ msgstr "Morning Emergency Slot"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:153
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:156
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:159
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:86
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:94
msgid "Finish"
msgstr "Finish"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:154
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:142
-msgid "Lunch"
-msgstr "Lunch"
-
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:157
msgid "Afternoon Emergency Slot "
msgstr "Afternoon Emergency Slot "
@@ -668,38 +809,38 @@ msgstr "Afternoon Emergency Slot "
msgid "Day Finish"
msgstr "Day Finish"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:60
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3120
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:61
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3408
msgid "Appointment Tools"
msgstr "Appointment Tools"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:61
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:62
msgid "Move the end date for making appointments."
msgstr "Move the end date for making appointments."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:62
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:63
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:65
msgid "Extend Books"
msgstr "Extend Books"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:63
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:64
msgid "Remove old weeks"
msgstr "Remove old weeks"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:64
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:65
msgid "Edit Standard Working Weeks for Clinicians"
msgstr "Edit Standard Working Weeks for Clinicians"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:65
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:66
msgid "Open A Day"
msgstr "Open A Day"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:66
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:67
msgid "Insert regular blocks"
msgstr "Insert regular blocks"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:67
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3112
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:68
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3400
msgid "&Quit"
msgstr "&Quit"
@@ -713,13 +854,18 @@ msgstr "Add a combination of proposed appointments to the patients diary."
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py:43
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:216
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3019
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3064
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3074
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3266
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3277
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3283
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3343
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3353
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py:40
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:296
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:48
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:136
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:299
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:49
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:132
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:134
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:136
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:137
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py:39
msgid "TextLabel"
msgstr "TextLabel"
@@ -728,11 +874,32 @@ msgstr "TextLabel"
msgid "Add"
msgstr "Add"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:83
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:91
msgid "Clinicians - DATE"
msgstr "Clinicians - DATE"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:96
+msgid ""
+"If you copy this day's setup to the clipboard, you can create a \"clone\" of "
+"this day when no data is set. This is useful when extending books."
+msgstr ""
+"If you copy this day's setup to the clipboard, you can create a \"clone\" of "
+"this day when no data is set. This is useful when extending books."
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:97
+msgid "Copy To Clipboard"
+msgstr "Copy To Clipboard"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:98
+msgid "Paste the saved values."
+msgstr "Paste the saved values."
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:99
+msgid "Paste"
+msgstr "Paste"
+
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:133
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3382
msgid "Options"
msgstr "Options"
@@ -764,10 +931,6 @@ msgstr "Emergency"
msgid "Reserved Clinical Time"
msgstr "Reserved Clinical Time"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:141
-msgid "Out of Office"
-msgstr "Out of Office"
-
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:143
msgid "Catch up time"
msgstr "Catch up time"
@@ -806,7 +969,7 @@ msgid "Reason for appointment is"
msgstr "Reason for appointment is"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:153
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:107
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:108
msgid " minutes"
msgstr " minutes"
@@ -814,38 +977,38 @@ msgstr " minutes"
msgid "Insert a Known Patient"
msgstr "Insert a Known Patient"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:98
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:99
msgid "Block Wizard"
msgstr "Block Wizard"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:99
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:100
msgid "Insert a block into a book for a range of dates."
msgstr "Insert a block into a book for a range of dates."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:100
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:101
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:104
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3027
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3034
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3306
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3313
msgid "Start Date"
msgstr "Start Date"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:101
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:102
msgid "End Date (inclusive)"
msgstr "End Date (inclusive)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:102
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:103
msgid "Time"
msgstr "Time"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:104
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:105
msgid "Text to Apply"
msgstr "Text to apply"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:105
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:106
msgid "Days to Apply"
msgstr "Days to apply"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:106
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:107
msgid "Clinicians"
msgstr "Clinicians"
@@ -896,11 +1059,12 @@ msgstr "Partial (co-chrome)"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:121
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:127
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_crownChoice.py:69
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:679
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:692
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:171
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:95
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:129
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:132
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:40
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:319
msgid "Other"
msgstr "Other"
@@ -949,7 +1113,7 @@ msgid "Change Database"
msgstr "Change Database"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:64
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:302
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:305
msgid "Host"
msgstr "Host"
@@ -958,7 +1122,7 @@ msgid "localhost"
msgstr "localhost"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:66
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:309
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:312
msgid "User"
msgstr "User"
@@ -967,7 +1131,7 @@ msgid "user"
msgstr "user"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:68
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:298
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:301
msgid "Password"
msgstr "Password"
@@ -1019,6 +1183,10 @@ msgstr "NHS \"Information Guide\""
msgid "2009"
msgstr "2009"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_choose_clinicians.py:36
+msgid "Choose Clinicians"
+msgstr "Choose Clinicians"
+
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py:66
msgid "Language Selector"
msgstr "Language Selector"
@@ -1101,29 +1269,28 @@ msgstr "Choose a tooth"
msgid "Please Select the tooth to which this treatment is planned"
msgstr "Please select the tooth for which this treatment is planned"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:51
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:52
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:215
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_options.py:45
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:167
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_phraseBook.py:54
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:83
msgid "Dialog"
msgstr "Dialog"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:52
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:677
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:53
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:690
msgid "Adult"
msgstr "Adult"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:53
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:54
msgid "Deciduous"
msgstr "Deciduous"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:54
-msgid "Tooth Code"
-msgstr "Tooth Code"
-
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:55
+msgid "Enter a Restoration Code (eg. MOD) to test your fee scale logic"
+msgstr "Enter a Restoration Code (eg. MOD) to test your fee scale logic"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:56
msgid ""
"Enter a filling or restoration code, and check that your feetable finds the "
"correct itemcode"
@@ -1131,7 +1298,7 @@ msgstr ""
"Enter a filling or restoration code, and check that your feetable finds the "
"correct itemcode"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:56
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:57
msgid "go"
msgstr "go"
@@ -1274,8 +1441,8 @@ msgid "Specify Dates and Practitioners for a Daylist Print Run"
msgstr "Specify Dates and Practitioners for a Daylist Print Run"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:105
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3028
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3035
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3307
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3314
msgid "End Date"
msgstr "End Date"
@@ -1333,19 +1500,19 @@ msgstr "Code"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:137
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_model.py:153
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1084
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1238
msgid "Description"
msgstr "Description"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:138
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:143
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:144
msgid "Cat"
msgstr "Cat"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:139
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:121
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:125
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:78
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1084
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1238
msgid "Type"
msgstr "Type"
@@ -1358,7 +1525,7 @@ msgid "Charge"
msgstr "Charge"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:143
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3061
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3340
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:252
msgid "Expand All"
msgstr "Expand All"
@@ -1367,8 +1534,8 @@ msgstr "Expand All"
msgid "Split Items"
msgstr "Split Items"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:140
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2878
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:141
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3134
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:107
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:113
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:119
@@ -1378,90 +1545,94 @@ msgstr "Split Items"
msgid "1"
msgstr "1"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:141
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:142
msgid "code"
msgstr "code"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:142
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:143
msgid "small xrays"
msgstr "small xrays"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:145
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:146
msgid "P"
msgstr "P"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:146
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:147
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:148
msgid "1000.00"
msgstr "1000.00"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:148
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2940
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2970
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:149
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3196
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3226
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:34
msgid "Completed"
msgstr "Completed"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:120
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:124
msgid "Exam Wizard"
msgstr "Exam Wizard"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:122
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:126
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:218
msgid "Standard"
msgstr "Standard"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:123
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:127
msgid "Extensive"
msgstr "Extensive"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:124
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:128
msgid "Full Case Assessment"
msgstr "Full Case Assessment"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:125
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:129
msgid "Exam Date"
msgstr "Exam Date"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:127
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2899
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2936
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:131
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3155
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3192
msgid "Notes"
msgstr "Notes"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:128
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:132
msgid "Pt c/o"
msgstr "Pt c/o"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:129
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:133
msgid "nil"
msgstr "nil"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:130
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:134
msgid "Broken Tooth"
msgstr "Broken Tooth"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:131
-msgid "Pain"
-msgstr "Pain"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:132
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:135
msgid "Denture Problems"
msgstr "Denture Problems"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:133
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:136
+msgid "Lost Filling"
+msgstr "Lost Filling"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:137
+msgid "Pain"
+msgstr "Pain"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:138
msgid "Sensitive Teeth"
msgstr "Sensitive Teeth"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:134
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:139
msgid "Soft Tissues Checked"
msgstr "Soft Tissues Checked"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:135
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:140
msgid "OHI given"
msgstr "OHI given"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:136
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:141
msgid "Palpated for upper canines - NAD"
msgstr "Palpated for upper canines - NAD"
@@ -1533,8 +1704,8 @@ msgid "Original (read only)"
msgstr "Original (read only)"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:232
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2920
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2974
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3176
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3230
msgid "New"
msgstr "New"
@@ -1612,149 +1783,149 @@ msgstr "Dentist/Hygenist"
msgid "Debridement"
msgstr "Debridement"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:590
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:603
msgid "OpenMolar - database wizard"
msgstr "OpenMolar - database wizard"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:591
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:604
msgid "What do you want to do?"
msgstr "What do you want to do?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:592
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:605
msgid "Modify an existing openmolar database"
msgstr "Modify an existing openmolar database"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:593
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:606
msgid "Create a New database from scratch"
msgstr "Create a new database from scratch"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:594
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:607
msgid "Create a New database (from a known template)"
msgstr "Create a new database (from a known template)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:596
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:609
msgid "Practice Name"
msgstr "Practice Name"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:597
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:610
msgid "Used in receipts, appointment cards etc."
msgstr "Used in receipts, appointment cards etc."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:598
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:611
msgid "Address Line 1"
msgstr "Address Line 1"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:599
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:612
msgid "Address Line 2"
msgstr "Address Line 2"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:600
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:613
msgid "Address Line 3"
msgstr "Address Line 3"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:603
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:616
msgid "Postcode / Zip"
msgstr "Postcode / Zip"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:604
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:147
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:617
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:149
msgid "Telephone"
msgstr "Telephone"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:605
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2806
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:618
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3062
msgid "Fax"
msgstr "Fax"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:606
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:619
msgid "Website"
msgstr "Website"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:607
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:620
msgid "Email"
msgstr "Email"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:608
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:621
msgid "Practice Details"
msgstr "Practice Details"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:609
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:622
msgid "The Following users can login to the application"
msgstr "The Following users can login to the application"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:610
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:623
msgid "Id"
msgstr "ID"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:611
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:619
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:631
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:636
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:624
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:632
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:644
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:649
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:657
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:662
msgid "Initials"
msgstr "Initials"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:612
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:618
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:632
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:637
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:625
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:631
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:645
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:650
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:658
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:663
msgid "Name"
msgstr "Name"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:613
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:620
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:626
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:633
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:646
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:659
msgid "User Group"
msgstr "User Group"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:614
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:634
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:627
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:647
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:660
msgid "Active?"
msgstr "Active?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:615
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:626
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:628
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:639
msgid "DeActivation Date"
msgstr "Deactivation Date"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:616
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:629
msgid "Modify Selected User"
msgstr "Modify selected user"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:617
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:630
msgid "New User Details"
msgstr "New user details"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:621
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:634
msgid "Standard User"
msgstr "Standard User"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:623
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:636
msgid "Hygienist"
msgstr "Hygienist"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:624
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:637
msgid "Receptionist"
msgstr "Receptionist"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:625
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:638
msgid "Active User"
msgstr "Active User"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:627
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:640
msgid "Add a New User"
msgstr "Add a new user"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:628
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:641
msgid "Users"
msgstr "Users"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:629
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:642
msgid ""
"The Following dentists have notes in this database\n"
"(note - dentists should not be removed from the database, as this could "
@@ -1764,31 +1935,31 @@ msgstr ""
"(note - dentists should not be removed from the database, as this could "
"create lookup issues for cashbooks and notes) "
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:635
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:648
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:661
msgid "Add a Dentist"
msgstr "Add a Dentist"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:638
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:651
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:664
msgid "Registration"
msgstr "Registration"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:639
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:652
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:665
msgid "Active Appointment Book"
msgstr "Active Appointment Book"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:640
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:653
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:666
msgid "Patients can be assigned to this dentist"
msgstr "Patients can be assigned to this dentist"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:641
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:654
msgid "Dentists"
msgstr "Dentists"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:642
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:655
msgid ""
"The Following hygienists have notes in this database\n"
"(note - hygienists should not be removed from the database, as this could "
@@ -1798,547 +1969,549 @@ msgstr ""
"(note - hygienists should not be removed from the database, as this could "
"create lookup issues for cashbooks and notes) "
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:654
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:667
msgid "Hygienists"
msgstr "Hygienists"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:655
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:425
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:668
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:438
msgid "Monday"
msgstr "Monday"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:656
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:425
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:669
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:438
msgid "Tuesday"
msgstr "Tuesday"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:657
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:347
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:425
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:670
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:388
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:438
msgid "Wednesday"
msgstr "Wednesday"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:658
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:425
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:671
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:438
msgid "Thursday"
msgstr "Thursday"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:659
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:426
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:672
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:439
msgid "Friday"
msgstr "Friday"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:660
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:426
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:673
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:439
msgid "Saturday"
msgstr "Saturday"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:661
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:426
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:674
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:439
msgid "Sunday"
msgstr "Sunday"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:662
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:675
msgid "Practice Hours"
msgstr "Practice Hours"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:663
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:676
msgid "The Following Categories are used in this database"
msgstr "The Following Categories are used in this database"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:664
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:677
msgid "Category"
msgstr "Category"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:665
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:671
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:678
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:684
msgid "Category Name"
msgstr "Category Name"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:666
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:672
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:679
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:685
msgid "Image"
msgstr "Image"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:667
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:680
msgid "Age Category"
msgstr "Age Category"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:668
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:681
msgid "Minimum Age"
msgstr "Minimum Age"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:669
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:682
msgid "Maximum Age"
msgstr "Maximum Age"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:670
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:683
msgid "Add a Category"
msgstr "Add a Category"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:673
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:686
msgid "..."
msgstr "..."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:674
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:687
msgid "Age Limit"
msgstr "Age Limit"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:675
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:688
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:175
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:945
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:946
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:514
msgid "None"
msgstr "None"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:676
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:689
msgid "Under 18"
msgstr "Under 18"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:678
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:691
msgid "OAP"
msgstr "OAP"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:680
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:693
msgid "Category Letter"
msgstr "Category Letter"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:681
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:694
msgid "Category Active"
msgstr "Category Active"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:682
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:695
msgid "Patient Categories"
msgstr "Patient Categories"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:683
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:696
msgid "Treatments and Fees"
msgstr "Treatments and Fees"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:684
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:697
msgid "Referral Centres"
msgstr "Referral Centres"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:685
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:698
msgid "View XML"
msgstr "View XML"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:686
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:699
msgid "File"
msgstr "File"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:687
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:700
msgid "L&oad Template"
msgstr "&Load Template"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:688
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:701
msgid "&Save Template"
msgstr "&Save Template"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2776
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3032
msgid "Open Molar - YOUR dental database application"
msgstr "Open Molar - YOUR dental database application"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2777
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3033
msgid "Exit the Current Patient Record."
msgstr "Exit the Current Patient Record."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2778
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3034
msgid "Esc"
msgstr "Esc"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2779
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3035
msgid "Add a New Patient to the database."
msgstr "Add a New Patient to the database."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2780
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3068
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3094
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3036
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3347
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3377
msgid "Click on this Button to search for in patient in your database."
msgstr "Click on this Button to search for in patient in your database."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2781
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3095
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3037
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3378
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:38
msgid "Find"
msgstr "Find"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2782
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3069
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3096
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3038
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3348
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3379
msgid "Ctrl+F"
msgstr "Ctrl+F"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2783
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3039
msgid "This cycles back through the history of records loaded today."
msgstr "This cycles back through the history of records loaded today."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2784
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3040
msgid "Reload the patient from the database."
msgstr "Reload the patient from the database."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2785
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3041
msgid "Ctrl+R"
msgstr "Ctrl+R"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2786
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3042
msgid "This cycles forwards through the history of records loaded today."
msgstr "This cycles forwards through the history of records loaded today."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2787
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3043
msgid ""
"Show patients who live at the same address, or who have a similar name."
msgstr ""
"Show patients who live at the same address, or who have a similar name."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2788
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3044
msgid "&Related"
msgstr "&Related"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2789
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3045
msgid "Ctrl+G"
msgstr "Ctrl+G"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2790
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3046
msgid "A drop down box of all patients who have an appointment today."
msgstr "A drop down box of all patients who have an appointment today."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2791
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2966
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3047
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3222
msgid "Details"
msgstr "Details"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2793
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3049
msgid "Sex"
msgstr "Sex"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2794
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3050
msgid "M"
msgstr "M"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2795
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3051
msgid "F"
msgstr "F"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2796
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3052
msgid "Tel (home)"
msgstr "Tel (home)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2797
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3053
msgid "More Fields are available. Click Here to Edit."
msgstr "More Fields are available. Click Here to Edit."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2798
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3054
msgid "More"
msgstr "More"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2800
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3056
msgid "Tel (work)"
msgstr "Tel (work)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2802
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3058
msgid "Tel (mob)"
msgstr "Tel (mob)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2803
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3059
msgid "send an sms"
msgstr "send an sms"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2804
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3060
msgid "sms"
msgstr "sms"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2805
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:144
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3061
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:146
msgid "Date of Birth"
msgstr "Date of Birth"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2807
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3063
msgid "send a fax"
msgstr "send a fax"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2808
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3064
msgid "fax"
msgstr "fax"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2809
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3065
msgid "Address1"
msgstr "Address1"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2810
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3066
msgid "email1"
msgstr "email1"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2811
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2815
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3067
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3071
msgid "send an email"
msgstr "send an email"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2812
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2816
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3068
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3072
msgid "email"
msgstr "email"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2813
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3069
msgid "Address2"
msgstr "Address2"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2814
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3070
msgid "email2"
msgstr "email2"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2817
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3073
msgid "Address3"
msgstr "Address3"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2818
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3074
msgid "Occupation"
msgstr "Occupation"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2822
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:149
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3078
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:151
msgid "Postcode"
msgstr "Postcode"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2823
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3079
msgid "New Patients"
msgstr "New Patients"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2824
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3080
msgid "Use the Sname and Address details from the previous patient."
msgstr "Use the Sname and Address details from the previous patient."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2825
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3081
msgid "Default Sname / Address"
msgstr "Default Sname / Address"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2826
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3082
msgid "Not implemented yet."
msgstr "Not implemented yet."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2827
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3083
msgid "Family"
msgstr "Family"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2828
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3084
msgid "Higlighted Fields are Mandatory for New Patients"
msgstr "Higlighted Fields are Mandatory for New Patients"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2829
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3085
msgid "Patient Details"
msgstr "Patient Details"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2830
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3086
msgid "Pt is registered with Dentist"
msgstr "Pt is registered with Dentist"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2831
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3087
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:67
msgid "Course Type"
msgstr "Course Type"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2832
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3088
msgid "Status"
msgstr "Status"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2833
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3089
msgid "Active"
msgstr "Active"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2834
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3090
msgid "Moved Away"
msgstr "Moved Away"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2835
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3091
msgid "Deceased"
msgstr "Deceased"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2836
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3092
msgid "Bad Debt"
msgstr "Bad Debt"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2837
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3093
msgid "No More Appts"
msgstr "No More Appts"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2838
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3094
msgid "Write Off Bad Debt"
msgstr "Write Off Bad Debt"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2839
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3095
msgid "This label is for displaying Private contractual stuff"
msgstr "This label is for displaying Private contractual stuff"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2840
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2843
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2847
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2852
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3020
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3096
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3099
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3103
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3108
msgid "Edit"
msgstr "Edit"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2841
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3097
msgid "Private"
msgstr "Private"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2842
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3098
msgid "This label is for displaying HDP contractual stuff"
msgstr "This label is for displaying HDP contractual stuff"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2844
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3100
msgid "Highland Dental Plan"
msgstr "Highland Dental Plan"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2845
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3101
msgid "This label is for displaying NHS contractual stuff"
msgstr "This label is for displaying NHS contractual stuff"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2846
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3102
msgid "View Claims History"
msgstr "View Claims History"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2848
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3104
msgid "Exemption"
msgstr "Exemption"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2849
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3105
msgid "Exemption Text"
msgstr "Exemption text"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2850
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2892
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3106
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3148
msgid "NHS"
msgstr "NHS"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2851
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3107
msgid "No Details of Pt's Registered Dentist Found"
msgstr "No Details of Pt's Registered Dentist Found"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2853
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3109
msgid "Registered Elsewhere"
msgstr "Registered Elsewhere"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2854
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3110
msgid "Contract"
msgstr "Contract"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2855
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3111
msgid "Letters TO the patient"
msgstr "Letters TO the patient"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2856
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3112
msgid " Custom Letter to the patient"
msgstr " Custom Letter to the patient"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2857
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3113
msgid "Recall management"
msgstr "Recall management"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2858
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3114
msgid "Set the date for a recall to be generated automatically"
msgstr "Set the date for a recall to be generated automatically"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2859
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3115
msgid "Date Shortcuts"
msgstr "Date Shortcuts"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2860
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3116
msgid "1 Month hence"
msgstr "1 Month hence"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2861
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3117
msgid "3 Months hence"
msgstr "3 Months hence"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2862
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3118
msgid "6 Months hence"
msgstr "6 Months hence"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2863
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3119
msgid "12 Months hence"
msgstr "12 Months hence"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2864
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3120
msgid "Print a recall saying the patient is due now."
msgstr "Print a recall saying the patient is due now."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2865
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3121
msgid "Print Recall Now"
msgstr "Print Recall Now"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2866
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3051
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3122
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3330
msgid "Accounts"
msgstr "Accounts"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2867
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3123
msgid "\"A\" letter"
msgstr "\"A\" letter"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2868
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3124
msgid "\"B\" letter"
msgstr "\"B\" letter"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2869
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3125
msgid "\"C\" letter"
msgstr "\"C\" letter"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2870
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3126
msgid "Print A Statement of Account"
msgstr "Print A Statement of Account"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2871
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3127
msgid "Duplicate Receipt"
msgstr "Duplicate Receipt"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2873
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3129
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_raiseCharge.py:57
msgid "Amount"
msgstr "Amount"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2874
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3130
msgid "Print a receipt - useful for duplicates."
msgstr "Print a receipt - useful for duplicates."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2875
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2882
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2989
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3032
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3040
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3131
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3138
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3245
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3311
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3319
msgid "Print"
msgstr "Print"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2876
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3132
msgid "Previous Correspondence"
msgstr "Previous Correspondence"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2877
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3133
msgid "Generated By OpenMolar"
msgstr "Generated By OpenMolar"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2879
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3135
msgid "Imported into database"
msgstr "Imported into database"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2880
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3136
msgid "Import A Document"
msgstr "Import A Document"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2881
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3137
msgid "Referrals (Letters about the patient)"
msgstr "Referrals (Letters about the patient)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2883
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3139
msgid "Export this record card"
msgstr "Export this record card"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2884
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3140
msgid "Print a patient's static chart."
msgstr "Print a patient's static chart."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2885
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3141
msgid "Print the Patient's static Chart"
msgstr "Print the Patient's static Chart"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2886
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3142
msgid ""
"Print a summary of the patient's notes (for them to take on). Includes No "
"fee details."
@@ -2346,235 +2519,235 @@ msgstr ""
"Print a summary of the patient's notes (for them to take on). Includes No "
"fee details."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2887
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3143
msgid "Print A Summary of the Notes"
msgstr "Print A Summary of the Notes"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2888
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3144
msgid ""
"Print a summary of the patient's notes. Includes FEE and ESTIMATE details."
msgstr ""
"Print a summary of the patient's notes. Includes FEE and ESTIMATE details."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2889
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3145
msgid "Print Detailed Notes"
msgstr "Print Detailed Notes"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2890
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3146
msgid "Correspondence"
msgstr "Correspondence"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2891
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3147
msgid "Account"
msgstr "Account"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2893
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3149
msgid "Print A GP17"
msgstr "Print A GP17"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2894
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3150
msgid "Apply an Exemption"
msgstr "Apply an exemption"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2895
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3151
msgid "Custom Estimate on File"
msgstr "Custom Estimate on File"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2896
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3152
msgid "Print &Estimate"
msgstr "Print &Estimate"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2897
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3153
msgid "Print &Account"
msgstr "Print &Account"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2898
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3154
msgid "Take &Payment"
msgstr "Take &Payment"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2900
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3156
msgid "Patient's Diary"
msgstr "Patient's Diary"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2901
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3157
msgid "A Wizard to select some common appointment combinations"
msgstr "A wizard to select some common appointment combinations"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2902
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3158
msgid "Appointment Shortcuts"
msgstr "Appointment Shortcuts"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2903
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3159
msgid "A New Appointment for this patient"
msgstr "A new appointment for this patient"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2904
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3160
msgid "&New"
msgstr "&New"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2905
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3161
msgid "delete or cancel the appointment"
msgstr "Delete or cancel the appointment"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2906
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3162
msgid "Clear/Cancel"
msgstr "Clear/Cancel"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2907
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3163
msgid "Make the selected appointment"
msgstr "Make the selected appointment"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2908
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3164
msgid "Schedule"
msgstr "Schedule"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2909
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3165
msgid "Housekeeping - remove all past appointments from the patient's diary"
msgstr "Housekeeping - remove all past appointments from the patient's diary"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2910
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3166
msgid "Delete All Past Appointments"
msgstr "Delete all past appointments"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2911
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3167
msgid "Find the appointment in the the practice appointment list"
msgstr "Find the appointment in the the practice appointment list"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2912
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3168
msgid "Find in Book"
msgstr "Find in Book"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2913
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3169
msgid "Print out the next 5 appointments for this patient"
msgstr "Print out the next 5 appointments for this patient"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2914
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3170
msgid "Print Card"
msgstr "Print Card"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2915
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3171
msgid "Allows modifcation of certain criteria for this appointment"
msgstr "Allows modifcation of certain criteria for this appointment"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2916
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3172
msgid "Modify"
msgstr "Modify"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2917
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3173
msgid "Reception"
msgstr "Reception"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2919
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3175
msgid "Update the Basic Perio Exam (CPITN) score"
msgstr "Update the Basic Perio Exam (CPITN) score"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2921
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3177
msgid "perform a clinical exam"
msgstr "perform a clinical exam"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2923
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3179
msgid "add x-rays to the patient's current course."
msgstr "add x-rays to the patient's current course."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2924
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3180
msgid "X-ray"
msgstr "X-ray"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2925
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3181
msgid "perform common perio treatments"
msgstr "perform common perio treatments"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2926
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3182
msgid "Hyg"
msgstr "Hyg"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2927
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3183
msgid "Close This Course"
msgstr "Close This Course"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2928
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3184
msgid "check / update the patients medical history"
msgstr "check / update the patients medical history"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2929
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3185
msgid "Med Notes"
msgstr "Med Notes"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2930
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3186
msgid "Clinical Summary"
msgstr "Clinical Summary"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2931
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3187
msgid "Verbosity Level"
msgstr "Verbosity Level"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2932
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3188
msgid "minimum"
msgstr "minimum"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2933
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3189
msgid "medium"
msgstr "medium"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2934
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3190
msgid "maximum"
msgstr "maximum"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2935
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3191
msgid "reception only"
msgstr "reception only"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2937
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3193
msgid "Charts View"
msgstr "Charts View"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2938
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:243
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3194
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:248
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:32
msgid "Static"
msgstr "Static"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2939
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2968
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:251
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3195
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3224
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:256
msgid "Plan"
msgstr "Plan"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2941
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3197
msgid "Charts"
msgstr "Charts"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2942
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3198
msgid "Estimate"
msgstr "Estimate"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2943
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3199
msgid "Course Management"
msgstr "Course Management"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2944
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3200
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:66
msgid "Course Dentist"
msgstr "Course Dentist"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2945
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3201
msgid "New Course Of Treatment"
msgstr "New Course Of Treatment"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2946
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1552
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3202
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1699
msgid "Close Course"
msgstr "Close Course"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2947
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3203
msgid "Estimate Management"
msgstr "Estimate Management"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2948
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3204
msgid "Custom Estimate Letter"
msgstr "Custom Estimate Letter"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2949
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3205
msgid ""
"Use this feature to re-price all items in the \"tooth\" category of "
"treatments. i.e all those which appear on the charts.\n"
@@ -2586,99 +2759,99 @@ msgstr ""
"\n"
"Note - this will not remove items which are currently there. "
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2952
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3208
msgid "ReCalculate Estimate"
msgstr "ReCalculate Estimate"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2953
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3209
msgid "Apply Exemption"
msgstr "Apply Exemption"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2954
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3210
msgid "Standard View"
msgstr "Standard View"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2955
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3211
msgid "Expanded View"
msgstr "Expanded View"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2956
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3212
msgid "Plan/Completed (standard)"
msgstr "Plan/Completed (standard)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2957
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3213
msgid "Plan/Completed (expanded)"
msgstr "Plan/Completed (expanded)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2958
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3214
msgid "Treatment Planning"
msgstr "Treatment Planning"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2959
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3215
msgid "Perform Exam"
msgstr "Perform Exam"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2960
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3216
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:543
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:555
msgid "Perio"
msgstr "Perio"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2961
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3217
msgid "X-Rays"
msgstr "X-Rays"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2962
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3218
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:547
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:559
msgid "Dentures"
msgstr "Dentures"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2963
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3219
msgid "Ortho"
msgstr "Ortho"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2964
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3220
msgid "Other Tx"
msgstr "Other Tx"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2965
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3221
msgid "Add Custom Item"
msgstr "Add Custom Item"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2971
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3227
msgid "Estimate/Plan"
msgstr "Estimate/Plan"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2972
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3228
msgid "Choose Data"
msgstr "Choose Data"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2973
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3229
msgid "Chart Date"
msgstr "Chart Date"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2976
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3232
msgid "Perio Charts"
msgstr "Perio Charts"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2977
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3233
msgid "See all payments in the database made by this patient"
msgstr "See all payments in the database made by this patient"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2978
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3234
msgid "Past Payments"
msgstr "Past Payments"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2979
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3235
msgid "View treatments completed, by date order"
msgstr "View treatments completed by date order"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2980
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3236
msgid "Past Treatment"
msgstr "Past Treatment"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2981
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3237
msgid ""
"View all Courses of treatment. This includes treatment that was planned but "
"not completed."
@@ -2686,39 +2859,39 @@ msgstr ""
"View all courses of treatment. This includes treatment that was planned but "
"not completed."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2982
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3238
msgid "Courses"
msgstr "Courses"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2983
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3239
msgid "Estimate history for this patient."
msgstr "Estimate history for this patient"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2984
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3240
msgid "Estimates"
msgstr "Estimates"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2985
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3241
msgid "display a combination of courses and estimates."
msgstr "Display a combination of courses and estimates"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2986
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3242
msgid "Courses / Estimates"
msgstr "Courses / Estimates"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2987
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3243
msgid "NHS Claims"
msgstr "NHS Claims"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2988
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3244
msgid "Print the text displayed on this page."
msgstr "Print the text displayed on this page."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2990
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3246
msgid "Custom Options"
msgstr "Custom Options"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2991
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3247
msgid ""
"Advanced options for developer use. Don't expect this to make much sense!\n"
"\n"
@@ -2730,450 +2903,554 @@ msgstr ""
"If the \"changes only\" checkbox is checked, only data which has been "
"changed will be displayed."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2994
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3250
msgid "debug tools"
msgstr "debug tools"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2995
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3251
msgid "changes only"
msgstr "changes only"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2996
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3252
msgid "History"
msgstr "History"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2997
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3253
msgid "Memos"
msgstr "Memos"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2998
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3254
msgid "Enter Notes."
msgstr "Enter Notes."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:2999
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3255
msgid "Today's Notes"
msgstr "Today's Notes"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3000
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3256
msgid "Save the changes made to this record."
msgstr "Save the changes made to this record."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3001
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3257
msgid "Save Changes"
msgstr "Save Changes"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3002
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3258
msgid "Ctrl+S"
msgstr "Ctrl+S"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3003
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3018
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3025
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3259
msgid "Tasks"
msgstr "Tasks"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3004
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3260
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:84
msgid "PhraseBook"
msgstr "PhraseBook"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3005
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3261
msgid "Ins"
msgstr "Ins"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3006
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3262
msgid "Patient Database"
msgstr "Patient Database"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3007
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3263
msgid "Go To Today"
msgstr "Go To Today"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3008
-msgid "Week"
-msgstr "Week"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3264
+msgid "Manual Clinicians"
+msgstr "Manual Clinicians"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3009
-msgid "Month"
-msgstr "Month"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3265
+msgid "Schedule Appointments"
+msgstr "Schedule Appointments"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3010
-msgid "Smart Selection"
-msgstr "Smart Selection"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3267
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3284
+msgid "Find the First Suitable Appointment. "
+msgstr "Find the First Suitable Appointment. "
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3011
-msgid "Books as selected below"
-msgstr "Books as selected below"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3268
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3285
+msgid "1st Available"
+msgstr "1st Available"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3012
-msgid "show emergency spaces"
-msgstr "show emergency spaces"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3269
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3286
+msgid ""
+"Find the Previous Appointment\n"
+"F5"
+msgstr ""
+"Find the Previous Appointment\n"
+"F5"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3013
-msgid "show lunch breaks"
-msgstr "show lunch breaks"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3271
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3288
+msgid "Prev"
+msgstr "Prev"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3014
-msgid "Ignore Out-of-office"
-msgstr "Ignore Out-of-office"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3272
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3289
+msgid ""
+"Find the Next Available Appointment.\n"
+"F6"
+msgstr ""
+"Find the Next Available Appointment.\n"
+"F6"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3015
-msgid "show appointments"
-msgstr "show appointments"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3274
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3291
+msgid "Next"
+msgstr "Next"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3016
-msgid "Print Month View"
-msgstr "Print month view"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3275
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3292
+msgid "Current Patient"
+msgstr "Current Patient"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3017
-msgid "Year"
-msgstr "Year"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3276
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3293
+msgid "Blocks etc.."
+msgstr "Blocks etc.."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3021
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3278
msgid "Day View"
msgstr "Day View"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3022
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3279
+msgid "View Current Week"
+msgstr "View Current Week"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3280
+msgid "show All appointments"
+msgstr "show All appointments"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3281
+msgid "Manually Select Clinicians"
+msgstr "Manually Select Clinicians"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3282
+msgid "Schedule appointments"
+msgstr "Schedule appointments"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3294
msgid "Week View"
msgstr "Week View"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3023
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3295
+msgid "Month"
+msgstr "Month"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3296
+msgid "Print Month View"
+msgstr "Print month view"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3297
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3300
+msgid "All Clinicians"
+msgstr "All Clinicians"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3298
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3301
+msgid "Select Clinicians"
+msgstr "Select Clinicians"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3299
msgid "Month View"
msgstr "Month View"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3024
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3302
+msgid "Year"
+msgstr "Year"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3303
msgid "Year View"
msgstr "Year View"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3026
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3304
+msgid "Staff Diaries"
+msgstr "Staff Diaries"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3305
msgid "Appointments / Diary"
msgstr "Appointments / Diary"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3029
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3036
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3308
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3315
msgid "Registered Dentist"
msgstr "Registered Dentist"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3030
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3038
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:237
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3309
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3317
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:242
msgid "Go"
msgstr "Go"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3031
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3039
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3310
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3318
msgid "Print the Data"
msgstr "Print the Data"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3033
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3312
msgid "Cashbook"
msgstr "Cashbook"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3037
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3316
msgid "Treating Dentist / Hygenist"
msgstr "Treating Dentist / Hygenist"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3041
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3320
msgid "Daybook"
msgstr "Daybook"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3042
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3321
msgid "Find Patient Records where the patient is in"
msgstr "Find patient records for this patient"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3043
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3322
msgid "Debt"
msgstr "Debt"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3044
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3323
msgid "Credit"
msgstr "Credit"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3045
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3324
msgid "By More than"
msgstr "By more than"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3046
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3059
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3325
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3338
msgid "Load Table"
msgstr "Load Table"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3047
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3326
msgid "Print Table"
msgstr "Print Table"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3048
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3327
msgid "Print Selected Letters"
msgstr "Print Selected Letters"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3050
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3329
msgid "TOTAL OUTSTANDING"
msgstr "TOTAL OUTSTANDING"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3052
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3331
msgid "Find Patient Records where"
msgstr "Find patient records where"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3054
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3333
msgid "is between"
msgstr "is between"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3055
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3057
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3334
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3336
msgid "dd/MM/yyyy"
msgstr "dd/mm/yyyy"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3056
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3335
msgid "and"
msgstr "and"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3058
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3337
msgid "(Inclusive)"
msgstr "(Inclusive)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3060
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3339
msgid "Print Letters"
msgstr "Print letters"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3062
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3341
msgid "Letter Options"
msgstr "Letter options"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3063
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3342
msgid "Bulk Mailings"
msgstr "Bulk Mailings"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3065
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3344
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:170
msgid "Fee Scales Available"
msgstr "Fee scales available"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3066
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3345
msgid "Use this control to select a feescale"
msgstr "Use this control to select a feescale"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3067
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3346
msgid "Search For an Item"
msgstr "Search for an item"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3070
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3349
msgid "only search for the given phrase in the usercode column"
msgstr "Only search for the given phrase in the usercode column"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3071
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3350
msgid "Search Usercodes"
msgstr "Search usercodes"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3072
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3351
msgid "search for the given phrase in description columns"
msgstr "Search for the given phrase in description columns"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3073
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3352
msgid "Search Descriptions"
msgstr "Search descriptions"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3075
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3354
msgid "Quickly expand all items"
msgstr "Quickly expand all items"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3076
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3355
msgid "Expand All Sections"
msgstr "Expand All Sections"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3077
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3356
msgid "Quickly compress all items"
msgstr "Quickly compress all items"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3078
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3357
msgid "Compress All Sections"
msgstr "Compress All Sections"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3079
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3358
msgid "NHS Regulation Document"
msgstr "NHS Regulation Document"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3080
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3359
msgid "Open A PDF of the latest NHS Regulations"
msgstr "Open A PDF of the latest NHS Regulations"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3081
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3360
msgid "Open"
msgstr "Open"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3082
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3361
msgid "Feescale Adjustment"
msgstr "Feescale Adjustment"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3083
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3362
msgid ""
"If checked, then the user can modify the underlying fees and fee items."
msgstr ""
"If checked, then the user can modify the underlying fees and fee items."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3084
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3363
msgid "Allow Adjust FeeScales"
msgstr "Allow Adjust FeeScales"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3085
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3364
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:34
msgid "Commit Changes"
msgstr "Commit Changes"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3086
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3365
msgid "show table xml"
msgstr "show table xml"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3087
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3366
msgid "Feesscale Tester"
msgstr "Feesscale Tester"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3088
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3367
msgid "Feescales"
msgstr "Feescales"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3090
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3369
msgid "Reply"
msgstr "Reply"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3091
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3370
+msgid "Alt+R"
+msgstr "Alt+R"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3371
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:306
msgid "Delete"
msgstr "Delete"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3092
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3372
+msgid "Del, Backspace"
+msgstr "Del, Backspace"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3373
+msgid "&set parent"
+msgstr "&set parent"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3374
+msgid "Alt+S"
+msgstr "Alt+S"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3375
msgid "New Topic"
msgstr "New Topic"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3093
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3376
msgid "Search by keyword"
msgstr "Search by keyword"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3097
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3380
msgid "Show Topics for"
msgstr "Show Topics for"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3098
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:39
-msgid "Everyone"
-msgstr "Everyone"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3383
+msgid "Include Deleted Posts"
+msgstr "Include Deleted Posts"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3099
-msgid "Layout Options"
-msgstr "Layout Options"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3384
+msgid "Split Replies"
+msgstr "Split Replies"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3100
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3385
msgid "Group replies"
msgstr "Group replies"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3101
-msgid "Split Replies"
-msgstr "Split Replies"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3386
+msgid "&Collapse Replies"
+msgstr "&Collapse Replies"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3102
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1753
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3387
+msgid "&Expand Replies"
+msgstr "&Expand Replies"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3388
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1918
msgid "FORUM"
msgstr "FORUM"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3103
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3389
msgid "Wiki"
msgstr "Wiki"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3104
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3390
msgid "&File"
msgstr "&File"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3105
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3391
msgid "&Help"
msgstr "&Help"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3106
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3392
msgid "&Preferences"
msgstr "&Preferences"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3107
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3393
+msgid "View"
+msgstr "View"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3394
+msgid "Appointments"
+msgstr "Appointments"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3395
msgid "Tools"
msgstr "Tools"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3108
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3396
msgid "&Export Patient to disk"
msgstr "&Export Patient to disk"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3109
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3397
msgid "&Import Patient from disk"
msgstr "&Import Patient from disk"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3110
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3398
msgid "About &OpenMolar"
msgstr "About &OpenMolar"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3111
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3399
msgid "&About QT"
msgstr "&About QT"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3113
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3401
msgid "Appointment Font Size"
msgstr "Appointment Font Size"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3114
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3402
msgid "Table View For Charting"
msgstr "Table View For Charting"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3115
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3403
msgid "Clear Today's Emergency Slots"
msgstr "Clear Today's Emergency Slots"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3116
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3404
msgid "Test Print an NHS Form"
msgstr "Test Print an NHS Form"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3117
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3405
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3420
msgid "options"
msgstr "options"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3118
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3406
msgid "log queries in underlying terminal"
msgstr "log queries in underlying terminal"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3119
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3407
msgid "Set Clinician"
msgstr "Set Clinician"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3121
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3409
msgid "Choose Database"
msgstr "Choose Database"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3122
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3410
msgid "FeeScale Adjuster"
msgstr "FeeScale Adjuster"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3123
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3411
msgid "Select && Print Daylists"
msgstr "Select && Print Daylists"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3124
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3412
msgid "Change Language"
msgstr "Change Language"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3125
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3413
msgid "Full Screen Mode (Ctrl-Alt-F)"
msgstr "Full Screen Mode (Ctrl-Alt-F)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3126
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3414
msgid "Ctrl+Alt+F"
msgstr "Ctrl+Alt+F"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3127
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3415
msgid "Create/Modify database"
msgstr "Create/Modify database"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3128
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3416
msgid "Advanced Record Management"
msgstr "Advanced record management"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3129
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3417
msgid "Show Geek Column"
msgstr "Show Geek Column"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3418
+msgid "test"
+msgstr "test"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3419
+msgid "t"
+msgstr "t"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3421
+msgid "Font Size"
+msgstr "Font Size"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3422
+msgid "Forum - show advanced options"
+msgstr "Forum - show advanced options"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3423
+msgid "Set Assistant"
+msgstr "Set Assistant"
+
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:157
msgid "Medical Notes"
msgstr "Medical Notes"
@@ -3219,7 +3496,8 @@ msgid "Liver"
msgstr "Liver"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:168
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:123
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:126
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:319
msgid "Bleeding"
msgstr "Bleeding"
@@ -3308,11 +3586,11 @@ msgstr "Contracted Dentist"
msgid "Acceptance Date"
msgstr "Acceptance Date"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:286
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:289
msgid "OpenMolar - First Run"
msgstr "OpenMolar - First Run"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:288
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:291
msgid ""
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
@@ -3354,31 +3632,31 @@ msgstr ""
"right:0px; -qt-block-indent:0; text-indent:0px;\">Install a small (four "
"patient) demo database if required.</li></ul></body></html>"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:297
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:300
msgid ""
"Please enter a password to prevent unauthorised running of this application."
msgstr ""
"Please enter a password to prevent unauthorised running of this application."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:299
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:311
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:335
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:302
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:314
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:338
msgid "show"
msgstr "show"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:300
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:303
msgid "Repeat Password"
msgstr "Repeat Password"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:301
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:304
msgid "Where is your mysql server located? **"
msgstr "Where is your mysql server located? **"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:303
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:306
msgid "Port"
msgstr "Port"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:304
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:307
msgid ""
"** If you do not have a mysql server on your network, please quit this "
"setup, and install mysql server now.\n"
@@ -3392,31 +3670,31 @@ msgstr ""
"If you are a debian or ubuntu user, \"sudo apt-get install mysql-server\"\n"
"and make a note of the root password you create during set up. "
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:308
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:311
msgid "Database Details"
msgstr "Database Details"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:310
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:313
msgid "(mysql)Password"
msgstr "(mysql)Password"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:312
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:315
msgid "Database Name"
msgstr "Database Name"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:313
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:316
msgid "Test this Connection"
msgstr "Test this Connection"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:314
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:317
msgid "Create A Demo Database"
msgstr "Create a Demo Database"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:315
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:318
msgid "Use with an existing database"
msgstr "Use with an existing database"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:316
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:319
msgid ""
"OK.... you are all set to go.\n"
"\n"
@@ -3434,11 +3712,11 @@ msgstr ""
"User1 = any registered user (demo database has one user \"user\")\n"
"User2 = any registered user (can be left blank)\n"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:324
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:327
msgid "Launch OpenMolar Now"
msgstr "Launch OpenMolar Now"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:325
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:328
msgid ""
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
@@ -3490,19 +3768,19 @@ msgstr ""
"setups, root access is disabled unless the server is on "
"localhost)</p></body></html>"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:334
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:337
msgid "Root mysql password"
msgstr "Root mysql password"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:336
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:339
msgid "Creating Database.... please wait"
msgstr "Creating Database.... please wait"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:337
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:340
msgid "Back"
msgstr "Back"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:338
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:341
msgid "Proceed"
msgstr "Proceed"
@@ -3639,25 +3917,25 @@ msgstr "Removable Applicance"
msgid "Fixed Appliance"
msgstr "Fixed Appliance"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:127
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:129
msgid "Patient Finder"
msgstr "Patient Finder"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:128
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:130
msgid ""
"Fill in a few of the following fields to get a list of possible patients"
msgstr ""
"Fill in a few of the following fields to get a list of possible patients"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:129
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:131
msgid "Repeat Last Search"
msgstr "Repeat Last Search"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:130
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:132
msgid "SNO or Surname"
msgstr "SNO or Surname"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:131
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:133
msgid ""
"Enter either the full name or the first few letters of the name.\n"
"\n"
@@ -3669,12 +3947,12 @@ msgstr ""
"If you are unsure of the spelling, type in the COMPLETE name,\n"
"and check the adjacent \"sounds like\" box."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:135
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:143
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:137
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:145
msgid "check to search for a similar sounding name"
msgstr "check to search for a similar sounding name"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:137
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:139
msgid ""
"Enter either the full name or the first few letters of the name.\n"
"\n"
@@ -3690,21 +3968,21 @@ msgstr ""
"Be wary of middle names. \n"
"eg. \"Neil\" does NOT sound like \"Neil Alexander\"!"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:145
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:147
msgid "Address includes"
msgstr "Address includes"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:146
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:148
msgid "openMolar will search line1 and line2 of the address for this text"
msgstr "openMolar will search line1 and line2 of the address for this text"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:148
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:150
msgid ""
"open molar will search tel1, tel2 and mobile for numbers present here."
msgstr ""
"open molar will search tel1, tel2 and mobile for numbers present here."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:150
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:152
msgid "search for a postcode"
msgstr "search for a postcode"
@@ -3724,7 +4002,7 @@ msgstr "Cash"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:176
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:178
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:180
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:136
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:139
msgid "-"
msgstr "-"
@@ -3780,50 +4058,14 @@ msgid ""
msgstr ""
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
-"type=\"text/css\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Sans Serif'; font-size:10pt; font-"
-"weight:400; font-style:normal;\">\n"
-"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-"right:0px; -qt-block-indent:0; text-indent:0px;\">Supervisor Rights required "
-"to Perform This Action.<br />Please enter password.</p></body></html>"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_phraseBook.py:55
-msgid "Anaesthetic Used - Scandonest Plain"
-msgstr "Anaesthetic Used - Scandonest Plain"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_phraseBook.py:56
-msgid "Anaesthetic Used - Citanest"
-msgstr "Anaesthetic Used - Citanest"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_phraseBook.py:57
-msgid "Anaesthetic Used - Septonest + 1:100,000 Adrenaline (Gold)"
-msgstr "Anaesthetic Used - Septonest + 1:100,000 Adrenaline (Gold)"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_phraseBook.py:58
-msgid "Anaesthetic Used - Septonest + 1:200,000 Adrenaline (Green)"
-msgstr "Anaesthetic Used - Septonest + 1:200,000 Adrenaline (Green)"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_phraseBook.py:59
-msgid "Anaesthetic Used - Lignocaine + 1:80,000 Adrenaline"
-msgstr "Anaesthetic Used - Lignocaine + 1:80,000 Adrenaline"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_phraseBook.py:60
-msgid "Etch, Bond, Restored Using 3M Filtek Family of Composites"
-msgstr "Etch, Bond, Restored Using 3M Filtek Family of Composites"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_phraseBook.py:61
-msgid "Restored Using Fuji IX"
-msgstr "Restored Using Fuji IX"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_phraseBook.py:62
-msgid ""
-"Crown Preparation, Pentamix Impression, Alginate of opposing arch. "
-"Temporised with Quick Temp and tempbond. Shade - ????"
-msgstr ""
-"Crown Preparation, Pentamix Impression, Alginate of opposing arch. "
-"Temporised with Quick Temp and tempbond. Shade - ????"
+"<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
+"type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:'Sans Serif'; font-size:10pt; font-"
+"weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
+"right:0px; -qt-block-indent:0; text-indent:0px;\">Supervisor Rights required "
+"to Perform This Action.<br />Please enter password.</p></body></html>"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:84
msgid ""
@@ -4085,71 +4327,27 @@ msgstr "Completed treatment"
msgid "Hidden Notes"
msgstr "Hidden notes"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:73
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:59
msgid "Related Patients"
msgstr "Related Patients"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:74
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:60
msgid "This Patient"
msgstr "This Patient"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:75
-msgid ""
-"F\n"
-"A\n"
-"M\n"
-"I\n"
-"L\n"
-"Y"
-msgstr ""
-"F\n"
-"A\n"
-"M\n"
-"I\n"
-"L\n"
-"Y"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:81
-msgid ""
-"A\n"
-"D\n"
-"D\n"
-"R\n"
-"E\n"
-"S\n"
-"S"
-msgstr ""
-"A\n"
-"D\n"
-"D\n"
-"R\n"
-"E\n"
-"S\n"
-"S"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:88
-msgid ""
-"S\n"
-"I\n"
-"M\n"
-"I\n"
-"L\n"
-"A\n"
-"R"
-msgstr ""
-"S\n"
-"I\n"
-"M\n"
-"I\n"
-"L\n"
-"A\n"
-"R"
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveDiscardCancel.py:54
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:61
+msgid "Known Family Members"
+msgstr "Known Family Members"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:62
+msgid "Address Matches"
+msgstr "Address Matches"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveDiscardCancel.py:60
msgid "Confirmation Required"
msgstr "Confirmation Required"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveDiscardCancel.py:55
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveDiscardCancel.py:61
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/saveDiscardCancel.py:65
msgid "What's Changed?"
msgstr "What's Changed?"
@@ -4194,7 +4392,7 @@ msgstr "Author"
msgid "Make a Selection"
msgstr "Make a Selection"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:49
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:50
msgid "Delete this memo when I close this"
msgstr "Delete this memo when I close this"
@@ -4290,31 +4488,52 @@ msgstr "Brief Note for Clinician (optional)"
msgid "Schedule Appointment Now"
msgstr "Schedule Appointment Now"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:130
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:133
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:137
+msgid "Summary"
+msgstr "Summary"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:135
+msgid "Agenda"
+msgstr "Agenda"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:138
+msgid "Messages and Tasks"
+msgstr "Messages and Tasks"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:139
+msgid "My Calendar"
+msgstr "My Calendar"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:140
+msgid "Holiday Planner"
+msgstr "Holiday Planner"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:131
msgid "openMolar"
msgstr "openMolar"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:131
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:132
msgid "System Password"
msgstr "System Password"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:132
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:133
msgid "User 1(required)"
msgstr "User 1(required)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:133
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:134
msgid "User 2 (optional)"
msgstr "User 2 (optional)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:134
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:135
msgid "Surgery Machine"
msgstr "Surgery Machine"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:135
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:136
msgid "Reception Machine"
msgstr "Reception Machine"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:137
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:138
msgid "change"
msgstr "Change"
@@ -4349,197 +4568,203 @@ msgstr "Edit Selected Task"
msgid "Add a New Task"
msgstr "Add a New Task"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:121
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:124
msgid "ToothId"
msgstr "ToothId"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:122
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:125
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:318
msgid "Pocketing"
msgstr "Pocketing"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:124
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:127
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:318
msgid "Plaque"
msgstr "Plaque"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:125
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:128
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:318
msgid "Recession"
msgstr "Recession"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:126
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:129
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:319
msgid "Furcation"
msgstr "Furcation"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:127
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:130
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:319
msgid "Suppuration"
msgstr "Suppuration"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:128
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:131
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:320
msgid "Mobility"
msgstr "Mobility"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:130
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:133
msgid "Copy &All"
msgstr "Copy &All"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:131
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:133
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:221
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:134
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:136
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:226
msgid "delete tooth data"
msgstr "delete tooth data"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:132
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:135
msgid "Cp"
msgstr "Cp"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:134
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:238
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:137
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:243
msgid "Apply and move Back a tooth"
msgstr "Apply and move Back a tooth"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:135
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:241
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:138
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:246
msgid "Apply & Move to Next Tooth"
msgstr "Apply & Move to Next Tooth"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:137
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:140
msgid "I"
msgstr "I"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:138
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:141
msgid "II"
msgstr "II"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:139
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:142
msgid "III"
msgstr "III"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:222
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:227
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:309
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:352
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:375
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:374
msgid "ADD COMMENTS"
msgstr "ADD COMMENTS"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:223
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:228
msgid "!KUO"
msgstr "!KUO"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:224
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:229
msgid "!Mobile Tooth"
msgstr "!Mobile Tooth"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:225
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:230
msgid "!Early Caries"
msgstr "!Early Caries"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:226
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:231
msgid "!Filling Missing"
msgstr "!Filling Missing"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:227
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:232
msgid "!Chipped"
msgstr "!Chipped"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:228
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:233
msgid "!Cracked"
msgstr "!Cracked"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:229
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:234
msgid "!Poor Prognosis"
msgstr "!Poor Prognosis"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:230
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:235
msgid "!Extract Soon"
msgstr "!Extract Soon"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:231
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:236
msgid "!Implant required"
msgstr "!Implant required"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:232
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:377
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:237
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:376
msgid "DELETE COMMENTS"
msgstr "DELETE COMMENTS"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:233
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:238
msgid "AM"
msgstr "AM"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:234
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:239
msgid "CO"
msgstr "CO"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:235
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:240
msgid "GL"
msgstr "GL"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:236
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:241
msgid "Po"
msgstr "Po"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:239
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:244
msgid "Apply & Add Another Item"
msgstr "Apply & Add Another Item"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:240
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:245
msgid "&&"
msgstr "&&"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:242
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:250
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:258
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:247
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:255
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:263
msgid "Toggle between static and plan"
msgstr "Toggle between static and plan"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:244
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:249
msgid "toggle between deciduous and permanent tooth"
msgstr "toggle between deciduous and permanent tooth"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:245
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:250
msgid "Dec"
msgstr "Dec"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:246
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:251
msgid "denture tooth"
msgstr "denture tooth"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:247
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:252
msgid "AT"
msgstr "AT"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:248
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:253
msgid "tooth missing"
msgstr "tooth missing"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:249
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:254
msgid "TM"
msgstr "TM"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:252
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:257
msgid "extract (plan only!)"
msgstr "extract (plan only!)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:253
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:258
msgid "Ex"
msgstr "Ex"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:254
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:259
msgid "root treatment"
msgstr "root treatment"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:255
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:260
msgid "RT"
msgstr "RT"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:256
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:261
msgid "porcelain veneer"
msgstr "porcelain veneer"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:257
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:262
msgid "Cr"
msgstr "Cr"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:259
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:264
msgid "Comp"
msgstr "Comp"
@@ -4559,29 +4784,53 @@ msgstr "Items"
msgid "Database Line"
msgstr "Database Line"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/contract_gui_module.py:96
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/contract_gui_module.py:98
msgid "erroneous exemption category entered"
msgstr "Erroneous exemption category entered"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:80
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:88
+msgid "Out Of Office"
+msgstr "Out Of Office"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:519
+msgid "Made"
+msgstr "Made"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:519
+msgid "at"
+msgstr "at"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:523
+msgid "Made on"
+msgstr "Made on"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:594
+msgid "Bad Time Sequence!"
+msgstr "Bad Time Sequence!"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:594
+msgid "Whoops!"
+msgstr "Whoops!"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:121
msgid "Public Holidays"
msgstr "Public holidays"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:81
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:122
msgid "Enter the information for "
msgstr "Enter the information for "
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:387
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:428
msgid "DATE"
msgstr "DATE"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:644
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:651
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:685
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:692
msgid "Edit day memos"
msgstr "Edit day memos"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:645
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:653
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:686
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:694
msgid "Edit Public Holiday information"
msgstr "Edit public holiday information"
@@ -4634,6 +4883,10 @@ msgstr "Right"
msgid "close"
msgstr "Close"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/staff_diaries.py:51
+msgid "Diary for"
+msgstr "Diary for"
+
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:19
msgid "Fissure Sealants"
msgstr "Fissure Sealants"
@@ -4778,9 +5031,22 @@ msgstr "Unerupted Tooth"
msgid "What treatment has been performed?"
msgstr "What treatment has been performed?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/block_wizard.py:25
-msgid "emergency"
-msgstr "emergency"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/alterAday.py:127
+msgid "Clinician Times"
+msgstr "Clinician Times"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/alterAday.py:147
+msgid "values from"
+msgstr "values from"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:17
+msgid "Select an Assitant"
+msgstr "Select an Assistant"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:26
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:26
+msgid "NONE"
+msgstr "NONE"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/block_wizard.py:93
msgid "applying changes for"
@@ -4815,11 +5081,11 @@ msgid "no reason for the block given"
msgstr "No reason for the block given"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:108
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2004
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2164
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:90
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:118
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:184
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:203
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:188
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:207
msgid "no patient selected"
msgstr "no patient selected"
@@ -4848,6 +5114,14 @@ msgstr "Chosen Patient is"
msgid "no patient chosen"
msgstr "no patient chosen"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:17
+msgid "Select a Clinician"
+msgstr "Select a Clinician"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:68
+msgid "Set assistant as"
+msgstr "Set assistant as"
+
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:52
msgid "Please enter a dentist / hygenist"
msgstr "Please enter a dentist / hygenist"
@@ -4860,6 +5134,15 @@ msgstr "Please set a valid course type"
msgid "Some fields are missing, please check"
msgstr "Some fields are missing, please check"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/phrasebook_dialog.py:21
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/phrasebook_dialog.py:41
+msgid "Shade"
+msgstr "Shade"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/phrasebook_dialog.py:46
+msgid "Phrase Book"
+msgstr "Phrase Book"
+
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/saveDiscardCancel.py:28
msgid "You have unsaved changes to the record of"
msgstr "You have unsaved changes to the record of"
@@ -4869,54 +5152,66 @@ msgid "Hide"
msgstr "Hide"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:28
-msgid "English (GB)"
-msgstr "English (GB)"
+msgid "English (United Kingdom)"
+msgstr "English (United Kingdom)"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:29
-msgid "Afrikaans"
-msgstr "Afrikaans"
+msgid "English (Australia)"
+msgstr "English (Australia)"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:30
-msgid "French"
-msgstr "French"
+msgid "Afrikaans"
+msgstr "Afrikaans"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:31
msgid "Danish"
msgstr "Danish"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:32
+msgid "French"
+msgstr "French"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:33
msgid "German"
msgstr "German"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:33
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:34
msgid "Hungarian"
msgstr "Hungarian"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:34
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:35
+msgid "Indonesian"
+msgstr "Indonesian"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:36
msgid "Italian"
msgstr "Italian"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:35
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:37
+msgid "Occitan"
+msgstr "Occitan"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:38
msgid "Polish"
msgstr "Polish"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:36
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:39
msgid "Portuguese"
msgstr "Portuguese"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:37
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:40
msgid "Slovak"
msgstr "Slovak"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:38
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:41
msgid "Spanish"
msgstr "Spanish"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:39
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:42
msgid "Turkish"
msgstr "Turkish"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:83
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:88
msgid "no translation file found for %s"
msgstr "no translation file found for %s"
@@ -5020,8 +5315,8 @@ msgid "You have altered a usercode."
msgstr "You have altered a usercode."
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:301
-msgid "Do you want to apply this change accross all fee tables?"
-msgstr "Do you want to apply this change accross all feetables?"
+msgid "Do you want to apply this change to selected other fee tables?"
+msgstr "Do you want to apply this change to selected other fee tables?"
#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/examdialog.py:34
msgid ""
@@ -5132,72 +5427,84 @@ msgstr "Usercode"
msgid "brief description"
msgstr "Brief description"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:206
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:218
msgid "The following tables were altered"
msgstr "The following tables were altered"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:212
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:224
msgid "No changes apllied"
msgstr "No changes applied"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:247
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:262
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:234
+msgid "Make Selection"
+msgstr "Make Selection"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:235
+msgid "Choose other tables to alter"
+msgstr "Choose other tables to alter"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:239
+msgid "Select All"
+msgstr "Select All"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:307
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:322
msgid "Adjust / edit this Item"
msgstr "Adjust / edit this Item"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:249
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:309
msgid "Add to tx plan"
msgstr "Add to TX plan"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:257
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:317
msgid "Add to tx plan of patient"
msgstr "Add to TX plan of patient"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:263
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:323
msgid "Delete Item"
msgstr "Delete Item"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:264
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:324
msgid "Insert New Item"
msgstr "Insert New Item"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:301
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:361
msgid "Items containing"
msgstr "Items containing"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:307
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:367
msgid "phrase not found in feetable"
msgstr "Phrase not found in feetable"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:309
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:369
msgid "usercodes or descriptions"
msgstr "Usercodes or descriptions"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:311
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:371
msgid "usercodes"
msgstr "Usercodes"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:313
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:373
msgid "descriptions"
msgstr "Descriptions"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:317
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:377
msgid "nothing to search"
msgstr "Nothing to search"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:318
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:378
msgid "please select usercodes and/or descriptions then search again"
msgstr "Please select usercodes and/or descriptions then search again"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:348
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:408
msgid "Error opening PDF file"
msgstr "Error opening PDF file"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:358
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:418
msgid "IN CURRENT USE"
msgstr "IN CURRENT USE"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:371
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:431
msgid "fee table error"
msgstr "Fee table error"
@@ -5213,111 +5520,136 @@ msgstr "From the Treatment Plan"
msgid "performed by"
msgstr "performed by"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:167
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:182
msgid "Delete %d Posts?"
msgstr "Delete %d Posts?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:179
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:194
msgid "Delete selected Post?"
msgstr "Delete selected Post?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:203
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:238
+msgid "Parenting Cancelled"
+msgstr "Parenting Cancelled"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:243
+msgid "Click on the Parent Item"
+msgstr "Click on the Parent Item"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:176
+msgid "advisory"
+msgstr "advisory"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:218
msgid "Decision Required"
msgstr "Decision Required"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:204
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:219
msgid "you have unsaved changes to your feetables"
msgstr "You have unsaved changes to your feetables"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:205
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:220
msgid "commit now?"
msgstr "commit now?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:933
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:950
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:505
+msgid "changed clinician to"
+msgstr "changed clinician to"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:512
+msgid "changed assistant to"
+msgstr "changed assistant to"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:704
+msgid "Switching off appointment mode"
+msgstr "Switching off appointment mode"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1087
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1104
msgid "is no longer an active dentist in this practice"
msgstr "is no longer an active dentist in this practice"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:937
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1091
msgid "unknown contract dentist - please correct this"
msgstr "unknown contract dentist - please correct this"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:955
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1109
msgid "unknown course dentist - please correct this"
msgstr "unknown course dentist - please correct this"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1000
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1154
msgid "SAVE NEW PATIENT"
msgstr "SAVE NEW PATIENT"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1012
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1166
msgid "SAVE CHANGES"
msgstr "SAVE CHANGES"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1046
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1055
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1116
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1200
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1209
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1270
msgid "Re-open"
msgstr "Re-open"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1047
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1056
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1201
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1210
msgid "Do you want to review and/or reprint this item?"
msgstr "Do you want to review and/or reprint this item?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1069
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1223
msgid "error reviewing PDF file"
msgstr "Error reviewing PDF file"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1074
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1228
msgid "No information available about this document, sorry"
msgstr "No information available about this document, sorry"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1083
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1237
msgid "Date imported"
msgstr "Date imported"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1084
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1238
msgid "Size"
msgstr "Size"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1101
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1255
msgid "opening"
msgstr "opening"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1105
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1259
msgid "error importing file"
msgstr "error importing file"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1107
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1261
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1963
msgid "no file chosen"
msgstr "no file chosen"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1117
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1271
msgid "Do you want to open a copy of this document?"
msgstr "Do you want to open a copy of this document?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1132
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1286
msgid "error opening document"
msgstr "error opening document"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1141
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1297
msgid "Today's Patients"
msgstr "Today's Patients"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1144
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1300
msgid "Today's Patients (ALL)"
msgstr "Today's Patients (ALL)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1272
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1417
msgid "Reached end of the List"
msgstr "Reached end of the list"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1287
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1432
msgid "Reached Start of the List"
msgstr "Reached start of the list"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1365
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1507
msgid ""
"Error populating interface\n"
"%s"
@@ -5325,7 +5657,15 @@ msgstr ""
"Error populating interface\n"
"%s"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1483
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1511
+msgid "error getting serialno"
+msgstr "error getting serialno"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1512
+msgid "please check this number is correct?"
+msgstr "please check this number is correct?"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1630
msgid ""
"<center>Message from %s <br />\n"
"Dated %s<br /><br />%s</center>"
@@ -5333,51 +5673,119 @@ msgstr ""
"<center>Message from %s <br />\n"
"Dated %s<br /><br />%s</center>"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1496
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1643
msgid "problem getting a memo %s"
msgstr "problem getting a memo %s"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1747
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1822
+msgid "NO CLINICIAN SET"
+msgstr "NO CLINICIAN SET"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1823
+msgid "you are in surgery mode without a clinician"
+msgstr "you are in surgery mode without a clinician"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1827
+msgid "CLINICIAN"
+msgstr "CLINICIAN"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1831
+msgid "team"
+msgstr "team"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1832
+msgid "using"
+msgstr "using"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1833
+msgid "mode"
+msgstr "mode"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1846
+msgid "Miss"
+msgstr "Miss"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1846
+msgid "Mr"
+msgstr "Mr"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1846
+msgid "Mrs"
+msgstr "Mrs"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1846
+msgid "Ms"
+msgstr "Ms"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1847
+msgid "Dr"
+msgstr "Dr"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1847
+msgid "Master"
+msgstr "Master"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1847
+msgid "Professor"
+msgstr "Professor"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1912
msgid "NEW FORUM POSTS"
msgstr "NEW FORUM POSTS"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1969
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1947
+msgid "Not loading patient"
+msgstr "Not loading patient"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1951
+msgid "opening patient file"
+msgstr "opening patient file"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2129
msgid "POTENTIALLY SERIOUS CONFUSION PROBLEM WITH PT RECORDS"
msgstr "POTENTIALLY SERIOUS CONFUSION PROBLEM WITH PT RECORDS"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2029
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2189
msgid "Sucessfully altered the following items"
msgstr "Sucessfully altered the following items"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2255
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2423
msgid "no record selected"
msgstr "no record selected"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2596
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2469
+msgid "FontSize"
+msgstr "FontSize"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2470
+msgid "Enter your preferred font size for appointment book"
+msgstr "Enter your preferred font size for appointment book"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2782
msgid "error commiting changes"
msgstr "error commiting changes"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:3813
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:4070
msgid "Scrap the estimate and re-price everything?"
msgstr "Scrap the estimate and re-price everything?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:3829
-msgid "apply an exmption to this estimate?"
-msgstr "apply an exmption to this estimate?"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:4086
+msgid "apply an exemption to this estimate?"
+msgstr "apply an exemption to this estimate?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:3834
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:4091
msgid "input needed"
msgstr "input needed"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:3835
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:4092
msgid "maximum charge for the patient"
msgstr "maximum charge for the patient"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:3835
-msgid "please enter the amount in pence, or leave as 0 for full exmption"
-msgstr "please enter the amount in pence, or leave as 0 for full exmption"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:4092
+msgid "please enter the amount in pence, or leave as 0 for full exemption"
+msgstr "please enter the amount in pence, or leave as 0 for full exemption"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/new_patient_gui.py:48
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/new_patient_gui.py:49
msgid ""
"<div align=\"center\">\n"
"<h3>Enter New Patient</h3>Please enter at least the required fields,\n"
@@ -5546,11 +5954,11 @@ msgstr "Professional Services"
msgid "duplicate receipt for %.02f"
msgstr "duplicate receipt for %.02f"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:144
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:150
msgid "Nothing to print - have you loaded the table?"
msgstr "Nothing to print - have you loaded the table?"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:148
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:154
msgid ""
"<tr><th>Dent</th><th>SerialNo</th><th>Cset</th>\n"
"<th>FName</th><th>Sname</th><th>DOB</th><th>Memo</th><th>Last Appt</th>\n"
@@ -5562,21 +5970,15 @@ msgstr ""
"<th>Last Bill</th><th>Type</th><th>Number</th><th>Complete</th>\n"
"<th>Amount</th></tr>"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:171
-msgid ""
-"<tr><td colspan=\"11\"></td><td><b>TOTAL</b></td>\n"
-"<td align=\"right\"><b>£ %.02f</b></td></tr>\n"
-"</table></body></html>"
-msgstr ""
-"<tr><td colspan=\"11\"></td><td><b>TOTAL</b></td>\n"
-"<td align=\"right\"><b>£ %.02f</b></td></tr>\n"
-"</table></body></html>"
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:179
+msgid "TOTAL"
+msgstr "TOTAL"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:208
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:212
msgid "Estimate for your current course of treatment."
msgstr "Estimate for your current course of treatment."
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:228
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:232
msgid ""
"<tr><td></td><td><b>TOTAL</b></td>\n"
"<td align=\"right\">%s</td></tr>"
@@ -5584,7 +5986,7 @@ msgstr ""
"<tr><td></td><td><b>TOTAL</b></td>\n"
"<td align=\"right\">%s</td></tr>"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:232
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:236
msgid ""
"<p><i>Please note, this estimate may be subject\n"
"to change if clinical circumstances dictate.</i></p>"
@@ -5592,11 +5994,11 @@ msgstr ""
"<p><i>Please note, this estimate may be subject\n"
"to change if clinical circumstances dictate.</i></p>"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:356
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:360
msgid "Previous Course (%s - %s)"
msgstr "Previous Course (%s - %s)"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:375
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:379
msgid "Print an NHS form now?"
msgstr "Print an NHS form now?"
@@ -5604,7 +6006,11 @@ msgstr "Print an NHS form now?"
msgid "Dear %s %s,"
msgstr "Dear %s %s,"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:59
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:56
+msgid "OpenMolar"
+msgstr "OpenMolar"
+
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:70
msgid ""
"<h3>Update required</h3>\n"
"Your Openmolar database schema is out of date for this version of the "
@@ -5622,27 +6028,29 @@ msgstr ""
"Would you like to Upgrade Now?<br />\n"
"WARNING - PLEASE ENSURE ALL OTHER STATIONS ARE LOGGED OFF"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:82
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:104
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:126
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:148
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:170
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:192
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:214
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:93
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:115
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:137
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:159
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:181
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:203
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:225
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:247
msgid "upgrading to schema version"
msgstr "upgrading to schema version"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:97
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:119
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:141
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:163
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:185
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:207
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:229
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:108
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:130
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:152
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:174
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:196
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:218
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:240
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:262
msgid "Conversion to %s failed"
msgstr "Conversion to %s failed"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:231
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:266
msgid ""
"<p>Sorry, we seem unable to update your schema at this point,\n"
"Perhaps you have grabbed a development version of the program?</p>\n"
@@ -5656,15 +6064,15 @@ msgstr ""
"If this is not the case, something odd has happened,\n"
"please let the developers of openmolar know ASAP.</p>"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:245
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:280
msgid "Unexpected Error updating the schema"
msgstr "Unexpected Error updating the schema"
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:247
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:282
msgid "Please File A bug by visiting "
msgstr "Please File A bug by visiting "
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:251
+#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:286
msgid ""
"<p>Sorry, you cannot run this version of the \n"
"openmolar client without updating your database schema.</p>"
@@ -5783,6 +6191,7 @@ msgstr "updated hidden notes list"
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_4to1_5.py:146
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:214
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:359
+#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_7to1_8.py:172
msgid "updating stored schema version"
msgstr "updating stored schema version"
@@ -5792,6 +6201,7 @@ msgstr "updating stored schema version"
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_4to1_5.py:148
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:216
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:361
+#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_7to1_8.py:174
msgid "ALL DONE - sucessfully moved db to"
msgstr "ALL DONE - sucessfully moved db to"
@@ -5805,6 +6215,7 @@ msgstr "creating new tables"
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_4to1_5.py:141
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:209
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:354
+#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_7to1_8.py:167
msgid "updating settings"
msgstr "updating settings"
@@ -5820,12 +6231,14 @@ msgstr "Copying data across from old Fee Table"
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_4to1_5.py:153
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:221
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:366
+#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_7to1_8.py:179
msgid "rolled back to"
msgstr "rolled back to"
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_4to1_5.py:129
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:190
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:342
+#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_7to1_8.py:157
msgid "executing statements"
msgstr "executing statements"
@@ -5836,6 +6249,7 @@ msgstr "transfering data"
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:201
#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:346
+#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_7to1_8.py:159
msgid "inserting values"
msgstr "inserting values"
@@ -5843,693 +6257,166 @@ msgstr "inserting values"
msgid "you may now remove old feetables"
msgstr "You may now remove old fee tables"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:41
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:45
msgid "translation tools are installed sucessfully"
msgstr "Translation tools are installed sucessfully"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:60
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:67
msgid "Please try and give at least 24 hours notice"
msgstr "Please try and give at least 24 hours notice"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:61
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:68
msgid "if you need to change an appointment."
msgstr "if you need to change an appointment."
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:282
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:299
msgid "EXAM"
msgstr "EXAM"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:283
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:300
msgid "BITE"
msgstr "BITE"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:284
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:301
msgid "BT"
msgstr "BT"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:285
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:302
msgid "FAMILY"
msgstr "FAMILY"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:286
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:303
msgid "FILL"
msgstr "FILL"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:287
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:304
msgid "FIT"
msgstr "FIT"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:288
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:305
msgid "HYG"
msgstr "HYG"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:289
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:306
msgid "IMPS"
msgstr "IMPS"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:290
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:307
msgid "LF"
msgstr "LF"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:291
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:308
msgid "ORTHO"
msgstr "ORTHO"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:292
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:309
msgid "PAIN"
msgstr "PAIN"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:293
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:310
msgid "PREP"
msgstr "PREP"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:294
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:311
msgid "RCT"
msgstr "RCT"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:295
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:312
msgid "RECEMENT"
msgstr "RECEMENT"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:296
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:313
msgid "REVIEW"
msgstr "REVIEW"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:297
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:314
msgid "SP"
msgstr "SP"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:298
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:315
msgid "TRY"
msgstr "TRY"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:299
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:316
msgid "XLA"
msgstr "XLA"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:460
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:473
msgid "January"
msgstr "January"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:461
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:474
msgid "February"
msgstr "February"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:462
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:475
msgid "March"
msgstr "March"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:463
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:476
msgid "April"
msgstr "April"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:464
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:477
msgid "May"
msgstr "May"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:465
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:478
msgid "June"
msgstr "June"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:466
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:479
msgid "July"
msgstr "July"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:467
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:480
msgid "August"
msgstr "August"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:468
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:481
msgid "September"
msgstr "September"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:469
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:482
msgid "October"
msgstr "October"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:470
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:483
msgid "November"
msgstr "November"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:471
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:484
msgid "December"
msgstr "December"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:502
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:517
msgid "Today"
msgstr "Today"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:504
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:519
msgid "Tomorrow"
msgstr "Tomorrow"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:506
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:521
msgid "Yesterday"
msgstr "Yesterday"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:792
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:871
msgid "Welcome to OpenMolar!"
msgstr "Welcome to OpenMolar!"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:793
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:872
msgid "Version"
msgstr "Version"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:794
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:873
msgid "Revision"
msgstr "Revision"
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:796
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:875
msgid "Your Data is Accessible, and the server reports no issues."
msgstr "Your data is accessible, and the server reports no issues."
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:797
+#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:876
msgid "Have a great day!"
msgstr "Have a great day!"
-
-#~ msgid "The %s accepted the connection %s."
-#~ msgstr "The %s accepted the connection %s."
-
-#~ msgid "Please re-enter this password"
-#~ msgstr "Please re-enter this password"
-
-#~ msgid "Passwords did not match, please try again"
-#~ msgstr "Passwords did not match, please try again"
-
-#~ msgid ""
-#~ "Please enter a password to\n"
-#~ "prevent unauthorised running of this application."
-#~ msgstr ""
-#~ "Please enter a password to\n"
-#~ "prevent unauthorised running of this application."
-
-#~ msgid ""
-#~ "<p>This openMolar client has fallen behind your database\n"
-#~ "schema version<br />this client was written for schema version %s,\n"
-#~ "but your database is now at %s<br />However, the differences are not "
-#~ "critical,\n"
-#~ "and you can continue if you wish</p>\n"
-#~ "<p><i>It would still be wise to update openMolar ASAP</i></p>\n"
-#~ "<hr /><p>Do you wish to continue?</p>"
-#~ msgstr ""
-#~ "<p>This openMolar client has fallen behind your database\n"
-#~ "schema version<br />this client was written for schema version %s,\n"
-#~ "but your database is now at %s<br />However, the differences are not "
-#~ "critical,\n"
-#~ "and you can continue if you wish</p>\n"
-#~ "<p><i>It would still be wise to update openMolar ASAP</i></p>\n"
-#~ "<hr /><p>Do you wish to continue?</p>"
-
-#~ msgid ""
-#~ "<center><p>\n"
-#~ "This appears to be your first running of openMolar<br />\n"
-#~ "Before you run this application ,<br />\n"
-#~ "We need to generate a settings file.<br />\n"
-#~ "So that openmolar knows where your mysql server resides<br />\n"
-#~ "If you do not have a database, you will be prompted to create one<</p>\n"
-#~ "Are you ready to proceed?</center>"
-#~ msgstr ""
-#~ "<center><p>\n"
-#~ "This appears to be your first running of openMolar<br />\n"
-#~ "Before you run this application ,<br />\n"
-#~ "We need to generate a settings file.<br />\n"
-#~ "So that openmolar knows where your mysql server resides<br />\n"
-#~ "If you do not have a database, you will be prompted to create one<</p>\n"
-#~ "Are you ready to proceed?</center>"
-
-#~ msgid "<H4>Previous Course</H4>"
-#~ msgstr "<H4>Previous Course</H4>"
-
-#~ msgid "Start %s<br />"
-#~ msgstr "Start %s<br />"
-
-#~ msgid "End %s<br />"
-#~ msgstr "End %s<br />"
-
-#~ msgid "%sNo treatment</body></html>"
-#~ msgstr "%sNo treatment</body></html>"
-
-#~ msgid "%s<h4>PLAN</h4>%s<hr /><h4>COMPLETED</h4>%s</body></html>"
-#~ msgstr "%s<h4>PLAN</h4>%s<hr /><h4>COMPLETED</h4>%s</body></html>"
-
-#~ msgid "TBA"
-#~ msgstr "TBA"
-
-#~ msgid "removing appointment dentist"
-#~ msgstr "removing appointment dentist"
-
-#~ msgid "Total Fee for these Items"
-#~ msgstr "Total Fee for these Items"
-
-#~ msgid "Complete this Treatment with the following Criteria?"
-#~ msgstr "Complete this Treatment with the following Criteria?"
-
-#~ msgid "Treating Dentist/Hygenist"
-#~ msgstr "Treating Dentist/Hygenist"
-
-#~ msgid "Gross Fee"
-#~ msgstr "Gross Fee"
-
-#~ msgid "Patient Charge"
-#~ msgstr "Patient Charge"
-
-#~ msgid "Patient Fee"
-#~ msgstr "Patient Fee"
-
-#~ msgid "Norman - Letter Text Entry"
-#~ msgstr "Norman - Letter Text Entry"
-
-#~ msgid "Pt Fee"
-#~ msgstr "Pt Fee"
-
-#~ msgid "FeeAdjuster"
-#~ msgstr "FeeAdjuster"
-
-#~ msgid "&About"
-#~ msgstr "&About"
-
-#~ msgid "&Save Changes"
-#~ msgstr "&Save Changes"
-
-#~ msgid "Help"
-#~ msgstr "Help"
-
-#~ msgid "&Version"
-#~ msgstr "&Version"
-
-#~ msgid "Standard Fee"
-#~ msgstr "Standard Fee"
-
-#~ msgid "Charge to Patient"
-#~ msgstr "Charge to Patient"
-
-#~ msgid "Print letter Now"
-#~ msgstr "Print letter Now"
-
-#~ msgid "History Options"
-#~ msgstr "History Options"
-
-#~ msgid "debug"
-#~ msgstr "debug"
-
-#~ msgid "Font Size"
-#~ msgstr "Font Size"
-
-#~ msgid "View Mode"
-#~ msgstr "View Mode"
-
-#~ msgid "Book"
-#~ msgstr "Book"
-
-#~ msgid "choose month"
-#~ msgstr "choose month"
-
-#~ msgid "MM/yyyy"
-#~ msgstr "MM/yyyy"
-
-#~ msgid "Find Patients"
-#~ msgstr "Find Patients"
-
-#~ msgid "Recalls"
-#~ msgstr "Recalls"
-
-#~ msgid "Show All Fee Scales"
-#~ msgstr "Show All Fee Scales"
-
-#~ msgid "Private FeeScale"
-#~ msgstr "Private FeeScale"
-
-#~ msgid "NHS FeeScale 2008"
-#~ msgstr "NHS FeeScale 2008"
-
-#~ msgid "Show All Items"
-#~ msgstr "Show All Items"
-
-#~ msgid "Favourite Items Only"
-#~ msgstr "Favourite Items Only"
-
-#~ msgid "Search for an Item"
-#~ msgstr "Search for an Item"
-
-#~ msgid "Default Columns"
-#~ msgstr "Default Columns"
-
-#~ msgid "All Columns"
-#~ msgstr "All Columns"
-
-#~ msgid ""
-#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
-#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
-#~ "type=\"text/css\">\n"
-#~ "p, li { white-space: pre-wrap; }\n"
-#~ "</style></head><body style=\" font-family:'Sans Serif'; font-size:10pt; font-"
-#~ "weight:400; font-style:normal;\">\n"
-#~ "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-#~ "left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Welcome "
-#~ "to the openMolar settings wizard.</p>\n"
-#~ "<p align=\"center\" style=\"-qt-paragraph-type:empty; margin-top:0px; margin-"
-#~ "bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
-#~ "indent:0px;\"></p>\n"
-#~ "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-#~ "left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">This will "
-#~ "set your system password, configure your mysql server, and install a small "
-#~ "demo database if required.</p></body></html>"
-#~ msgstr ""
-#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
-#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
-#~ "type=\"text/css\">\n"
-#~ "p, li { white-space: pre-wrap; }\n"
-#~ "</style></head><body style=\" font-family:'Sans Serif'; font-size:10pt; font-"
-#~ "weight:400; font-style:normal;\">\n"
-#~ "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-#~ "left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Welcome "
-#~ "to the openMolar settings wizard.</p>\n"
-#~ "<p align=\"center\" style=\"-qt-paragraph-type:empty; margin-top:0px; margin-"
-#~ "bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
-#~ "indent:0px;\"></p>\n"
-#~ "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-#~ "left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">This will "
-#~ "set your system password, configure your mysql server, and install a small "
-#~ "demo database if required.</p></body></html>"
-
-#~ msgid "OK, continue"
-#~ msgstr "OK, continue"
-
-#~ msgid "show password"
-#~ msgstr "show password"
-
-#~ msgid "Where is your mysql server located?"
-#~ msgstr "Where is your mysql server located?"
-
-#~ msgid "3306"
-#~ msgstr "3306"
-
-#~ msgid "Yes please"
-#~ msgstr "Yes please"
-
-#~ msgid "No, I have a database already, continue."
-#~ msgstr "No, I have a database already, continue."
-
-#~ msgid "Would you like to create a demo openmolar database now?"
-#~ msgstr "Would you like to create a demo openmolar database now?"
-
-#~ msgid ""
-#~ "Please enter a mysql user who has privileges for the openmolar database."
-#~ msgstr ""
-#~ "Please enter a mysql user who has privileges for the openmolar database."
-
-#~ msgid "OMuser"
-#~ msgstr "OMuser"
-
-#~ msgid "Test this connection to this database"
-#~ msgstr "Test this connection to this database"
-
-#~ msgid ""
-#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
-#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
-#~ "type=\"text/css\">\n"
-#~ "p, li { white-space: pre-wrap; }\n"
-#~ "</style></head><body style=\" font-family:'Sans Serif'; font-size:10pt; font-"
-#~ "weight:400; font-style:normal;\">\n"
-#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-#~ "right:0px; -qt-block-indent:0; text-indent:0px;\">OK.... you are all set to "
-#~ "go.</p>\n"
-#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-#~ "right:0px; -qt-block-indent:0; text-indent:0px;\">You will be presented with "
-#~ "a login screen.</p>\n"
-#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-#~ "right:0px; -qt-block-indent:0; text-indent:0px;\">I trust you remember your "
-#~ "password?</p>\n"
-#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
-#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
-#~ "indent:0px;\"></p>\n"
-#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-#~ "right:0px; -qt-block-indent:0; text-indent:0px;\">If you created a demo "
-#~ "database... </p>\n"
-#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-#~ "right:0px; -qt-block-indent:0; text-indent:0px;\">enter <span style=\" font-"
-#~ "weight:600; text-decoration: underline;\">user</span> into the user1 field "
-#~ "of the login screen.</p></body></html>"
-#~ msgstr ""
-#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
-#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
-#~ "type=\"text/css\">\n"
-#~ "p, li { white-space: pre-wrap; }\n"
-#~ "</style></head><body style=\" font-family:'Sans Serif'; font-size:10pt; font-"
-#~ "weight:400; font-style:normal;\">\n"
-#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-#~ "right:0px; -qt-block-indent:0; text-indent:0px;\">OK.... you are all set to "
-#~ "go.</p>\n"
-#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-#~ "right:0px; -qt-block-indent:0; text-indent:0px;\">You will be presented with "
-#~ "a login screen.</p>\n"
-#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-#~ "right:0px; -qt-block-indent:0; text-indent:0px;\">I trust you remember your "
-#~ "password?</p>\n"
-#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
-#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
-#~ "indent:0px;\"></p>\n"
-#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-#~ "right:0px; -qt-block-indent:0; text-indent:0px;\">If you created a demo "
-#~ "database... </p>\n"
-#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-#~ "right:0px; -qt-block-indent:0; text-indent:0px;\">enter <span style=\" font-"
-#~ "weight:600; text-decoration: underline;\">user</span> into the user1 field "
-#~ "of the login screen.</p></body></html>"
-
-#~ msgid "Save settings and launch openmolar"
-#~ msgstr "Save settings and launch openmolar"
-
-#~ msgid ""
-#~ "To create a database, please enter the password of your ROOT mysql user."
-#~ msgstr ""
-#~ "To create a database, please enter the password of your ROOT mysql user."
-
-#~ msgid "Create openmolar_demo database, and continue"
-#~ msgstr "Create openmolar_demo database, and continue"
-
-#~ msgid "Date of birth in format dd/mm/yyyy"
-#~ msgstr "Date of birth in format dd/mm/yyyy"
-
-#~ msgid "Discard Changes"
-#~ msgstr "Discard Changes"
-
-#~ msgid "Continue Editing"
-#~ msgstr "Continue Editing"
-
-#~ msgid "Show Advanced Options"
-#~ msgstr "Show Advanced Options"
-
-#~ msgid "Chose a server"
-#~ msgstr "Chose a server"
-
-#~ msgid "Toggle Deciduous Status"
-#~ msgstr "Toggle Deciduous Status"
-
-#~ msgid "Bridge Elements"
-#~ msgstr "Bridge Elements"
-
-#~ msgid "Bonded Retainer"
-#~ msgstr "Bonded Retainer"
-
-#~ msgid "Bonded Pontic"
-#~ msgstr "Bonded Pontic"
-
-#~ msgid "Lava Pontic"
-#~ msgstr "Lava Pontic"
-
-#~ msgid "Gold Retainer"
-#~ msgstr "Gold Retainer"
-
-#~ msgid "Gold Pontic"
-#~ msgstr "Gold Pontic"
-
-#~ msgid "Other Retainer"
-#~ msgstr "Other Retainer"
-
-#~ msgid "Other Pontic"
-#~ msgstr "Other Pontic"
-
-#~ msgid "You need to choose a patient"
-#~ msgstr "You need to choose a patient"
-
-#~ msgid ""
-#~ "<p>You already have an exam on this \n"
-#~ "course of treatment</p>Unable to perform exam"
-#~ msgstr ""
-#~ "<p>You already have an exam on this \n"
-#~ "course of treatment</p>Unable to perform exam"
-
-#~ msgid "unknown exam type"
-#~ msgstr "unknown exam type"
-
-#~ msgid ""
-#~ "<p>for the moment, please enter treatment\n"
-#~ "into the plan first then complete it."
-#~ msgstr ""
-#~ "<p>for the moment, please enter treatment\n"
-#~ "into the plan first then complete it."
-
-#~ msgid "Today's Patients (%s)"
-#~ msgstr "Today's Patients (%s)"
-
-#~ msgid "loading today's patients"
-#~ msgstr "loading today's patients"
-
-#~ msgid ""
-#~ "POTENTIALLY SERIOUS CONFUSION PROBLEM\n"
-#~ "WITH PT RECORDS %d and %d"
-#~ msgstr ""
-#~ "POTENTIALLY SERIOUS CONFUSION PROBLEM\n"
-#~ "WITH PT RECORDS %d and %d"
-
-#~ msgid ""
-#~ "<h3>Update required</h3>\n"
-#~ "Your Openmolar database schema is out of date for this version of the "
-#~ "client.\n"
-#~ "<br /> \n"
-#~ "Your database is at version %s, and %s is required.<br />\n"
-#~ "Would you like to Upgrade Now?"
-#~ msgstr ""
-#~ "<h3>Update required</h3>\n"
-#~ "Your Openmolar database schema is out of date for this version of the "
-#~ "client.\n"
-#~ "<br /> \n"
-#~ "Your database is at version %s, and %s is required.<br />\n"
-#~ "Would you like to Upgrade Now?"
-
-#~ msgid "Please File A bug by visiting<br>https://bugs.launchpad.net/openmolar"
-#~ msgstr ""
-#~ "Please File A bug by visiting<br>https://bugs.launchpad.net/openmolar"
-
-#~ msgid "hello"
-#~ msgstr "hello"
-
-#~ msgid "DOUBLE"
-#~ msgstr "DOUBLE"
-
-#~ msgid "Create A Demo Database on this server"
-#~ msgstr "Create A Demo Database on this server"
-
-#~ msgid ""
-#~ "This will set your system password, configure your mysql server, and install "
-#~ "a small demo database if required."
-#~ msgstr ""
-#~ "This will set your system password, configure your mysql server, and install "
-#~ "a small demo database if required."
-
-#~ msgid ""
-#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
-#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
-#~ "type=\"text/css\">\n"
-#~ "p, li { white-space: pre-wrap; }\n"
-#~ "</style></head><body style=\" font-family:'Droid Sans'; font-size:8pt; font-"
-#~ "weight:400; font-style:normal;\">\n"
-#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-#~ "right:0px; -qt-block-indent:0; text-indent:0px;\">OpenMolar uses a user with "
-#~ "limited privileges for database access.<br />You can change these if you "
-#~ "wish</p></body></html>"
-#~ msgstr ""
-#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
-#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
-#~ "type=\"text/css\">\n"
-#~ "p, li { white-space: pre-wrap; }\n"
-#~ "</style></head><body style=\" font-family:'Droid Sans'; font-size:8pt; font-"
-#~ "weight:400; font-style:normal;\">\n"
-#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
-#~ "right:0px; -qt-block-indent:0; text-indent:0px;\">OpenMolar uses a user with "
-#~ "limited privileges for database access.<br />You can change these if you "
-#~ "wish</p></body></html>"
-
-#~ msgid "Test this connection"
-#~ msgstr "Test this connection"
-
-#~ msgid "+"
-#~ msgstr "+"
-
-#~ msgid "Recall Letters"
-#~ msgstr "Recall Letters"
-
-#~ msgid "usercode"
-#~ msgstr "Usercode"
-
-#~ msgid "MainWindow"
-#~ msgstr "MainWindow"
-
-#~ msgid "Delete Rows"
-#~ msgstr "Delete Rows"
-
-#~ msgid "Add a User"
-#~ msgstr "Add a User"
-
-#~ msgid "Month Options"
-#~ msgstr "Month Options"
-
-#~ msgid "Show Books selected below"
-#~ msgstr "Show Books selected below"
-
-#~ msgid "Adjust FeeTables"
-#~ msgstr "Adjust FeeTables"
-
-#~ msgid "Create a New FeeTable"
-#~ msgstr "Create a New FeeTable"
-
-#~ msgid "Precious Metal/ Porcelain Bonded Crown"
-#~ msgstr "Precious Metal/ Porcelain Bonded Crown"
-
-#~ msgid "Crowns / Inlays"
-#~ msgstr "Crowns / Inlays"
-
-#~ msgid "Base Metal / Porcelain Bonded Crown"
-#~ msgstr "Base Metal / Porcelain Bonded Crown"
-
-#~ msgid "fee"
-#~ msgstr "fee"
-
-#~ msgid "brief descriptions"
-#~ msgstr "brief descriptions"
-
-#~ msgid "regulation"
-#~ msgstr "regulation"
-
-#~ msgid "Pontics"
-#~ msgstr "Pontics"
-
-#~ msgid "Retainers"
-#~ msgstr "Retainers"
-
-#~ msgid "description"
-#~ msgstr "description"
-
-#~ msgid "Function not yet available"
-#~ msgstr "Function not yet available"
-
-#~ msgid "charge"
-#~ msgstr "charge"
-
-#~ msgid "Choose a fee table to continue"
-#~ msgstr "Choose a fee table to continue"
-
-#~ msgid "Add how many Rows?"
-#~ msgstr "Add how many Rows?"
-
-#~ msgid "Create a New database (from the default template)"
-#~ msgstr "Create a New database (from the default template)"
-
-#~ msgid "Add/Insert Rows"
-#~ msgstr "Add/Insert Rows"
-
-#~ msgid "&FeesScale Options"
-#~ msgstr "&FeesScale Options"
-
-#~ msgid "reload fees"
-#~ msgstr "Reload Fees"
-
-#~ msgid "table xml"
-#~ msgstr "Table XML"
diff --git a/src/openmolar/locale/messages.pot b/src/openmolar/locale/messages.pot
index e3a6d67..b132649 100644
--- a/src/openmolar/locale/messages.pot
+++ b/src/openmolar/locale/messages.pot
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2010-06-07 11:55+BST\n"
+"POT-Creation-Date: 2014-04-22 14:21+BST\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
"Language-Team: LANGUAGE <LL at li.org>\n"
@@ -15,285 +15,451 @@ msgstr ""
"Generated-By: pygettext.py 1.5\n"
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/appointments.py:751
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:221
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:222
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:223
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/block_wizard.py:25
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/appointments.py:1040
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:225
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:226
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:227
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/block_wizard.py:44
msgid "emergency"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:64
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3178
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:83
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3318
msgid "Exam"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:68
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:87
msgid "perio"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:69
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:88
msgid "xray"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:70
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:89
msgid "anaes"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:71
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:545
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:557
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:167
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:90
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:627
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:641
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:204
msgid "other"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:72
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:546
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:558
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:91
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:628
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:642
msgid "custom"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/courseHistory.py:86
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:105
msgid "Denture Work"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/daybook.py:53
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:85
msgid "Error - unrecognised practioner- sorry"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/feesTable.py:177
-msgid "Feetable"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:107
+msgid "No estimate history found for course"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/feesTable.py:178
-msgid "Failed to Load"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:113
+msgid "Current Estimate Version History"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/feesTable.py:589
-msgid "not found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:119
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3359
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3370
+msgid "Estimate"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:120
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:141
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:105
+msgid "Author"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:128
+msgid "Feescale"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:128
+msgid "Itemcode"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:128
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:64
+msgid "No."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:128
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:66
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fee_table_model.py:177
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:914
+msgid "Description"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/forum.py:13
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:129
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:32
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:35
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:102
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:565
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:73
+msgid "Dentist"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:129
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py:92
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:70
+msgid "Fee"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:129
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:72
+msgid "Charge"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/forum.py:29
msgid "Subject"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/forum.py:13
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py:81
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/forum.py:29
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py:102
msgid "To"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/forum.py:13
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py:84
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/forum.py:29
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py:105
msgid "From"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/forum.py:14
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/forum.py:30
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:143
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:31
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:72
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:79
+msgid "Date"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/forum.py:30
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:146
msgid "Message"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/forum.py:14
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3128
-msgid "Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:125
+msgid "No memo history found"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:131
+msgid "Memo History"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:142
+msgid "Location"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:144
+msgid "Expires"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:145
+msgid "Deleted?"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:169
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:163
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:283
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:195
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:205
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:212
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:227
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:256
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:262
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:287
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:294
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:300
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:324
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:353
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:364
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:375
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:382
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:389
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:396
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:402
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:426
+msgid "Yes"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:169
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:167
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:284
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:196
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:206
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:214
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:234
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:257
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:269
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:288
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:295
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:307
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:331
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:354
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:365
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:376
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:383
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:390
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:397
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:409
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:427
+msgid "No"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/patient_class.py:772
+msgid "Student Exemption removed"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:33
+msgid "Patient"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:34
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:65
+msgid "Code"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/patient_class.py:655
-msgid "Age Exemption removed"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:35
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:205
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:98
+msgid "Cash"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:36
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:207
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:99
+msgid "Cheque"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:37
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:100
+msgid "Card"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:38
+msgid "Unknown"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:14
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:39
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:75
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:80
+msgid "Amount"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:32
msgid "Letter No"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:14
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:32
msgid "Serial No"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:14
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3048
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:32
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3207
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:36
msgid "Title"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:14
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3055
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:138
-msgid "First Name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:32
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3208
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:36
+msgid "Surname"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:14
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3057
-msgid "Surname"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:32
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3221
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:174
+msgid "First Name"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:15
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:33
msgid "Age"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:16
-msgid "Address"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:34
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:535
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3200
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:49
+msgid "Town"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:16
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:614
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3075
-msgid "Town"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:34
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:143
+msgid "Address"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:17
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:35
msgid "Family No"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:17
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:35
msgid "PostCode"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:17
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:130
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:635
-msgid "Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:35
+msgid "Recall Date"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:17
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:615
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3077
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:35
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:536
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3202
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:50
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:43
msgid "County"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/dbtools/recall.py:17
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3332
-msgid "Recall Date"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:74
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:88
msgid "If you ever need to run this again, "
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:75
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:89
msgid "delete the openmolar.conf file in "
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:78
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:92
msgid "If you ever need to run this wizard again, "
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:93
msgid "Eg. if your server location changes, "
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:80
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:94
msgid "or you require a new password"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:81
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:145
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:95
msgid "type"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:82
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:96
msgid "on the command line, or delete the file"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:84
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:98
msgid "For a more secure setup, you should move this file to"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:129
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:172
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/newCourse.py:54
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:185
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:37
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:146
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:143
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:150
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:125
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/newCourse.py:72
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:217
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:338
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:215
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:202
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:55
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:168
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:207
msgid "Error"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:131
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/newCourse.py:36
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:90
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:182
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:34
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:143
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:145
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:115
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:213
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:335
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:212
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1225
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:199
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:52
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:165
msgid "Advisory"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:150
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:164
+msgid "Password must not be blank!"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:166
msgid "Passwords don't match!"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:176
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:189
msgid "Create Database"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:177
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:190
msgid "Create Demo Database now with the following settings?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:188
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:201
msgid "Database Created Sucessfully"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:195
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:209
msgid "Database NOT Created"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:216
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:290
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:230
msgid "Welcome to the openMolar settings wizard."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:217
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:231
msgid "Set the application Password"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:218
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:232
msgid "Server Location"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:219
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:233
msgid "Database Settings"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:220
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:234
msgid "Save settings and exit"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:221
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:235
msgid "Create a demo database"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:222
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:236
msgid "Creating Database"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:270
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:284
msgid "The connection attempt threw an exception"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:276
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:290
msgid "Success!"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:277
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:291
msgid "The %s database accepted the connection."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:280
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:294
msgid ""
-"The connection attempt failed, \n"
+"The connection attempt failed,\n"
"please recheck your settings"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:323
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:338
msgid "Error Creating Database"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/firstRun.py:430
+#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:450
msgid "FAILURE"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:84
msgid "Update Client"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:80
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:85
msgid ""
"<p>Sorry, you cannot run this version of the openMolar client\n"
"because your database schema is more advanced.</p>\n"
@@ -301,11 +467,11 @@ msgid ""
"<p>Please Update openMolar now</p>"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:87
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:92
msgid "Proceed without upgrade?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:88
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:93
msgid ""
"<p>This openMolar client has fallen behind your database\n"
"schema version<br />this client was written for schema version %s,\n"
@@ -315,6446 +481,7709 @@ msgid ""
"<hr /><p>Do you wish to continue?</p>"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:137
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:140
msgid "This is not the default database - are you sure?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:140
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:143
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:418
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:637
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:694
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:708
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:366
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:176
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:178
msgid "confirm"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:157
msgid "DEFAULT"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:156
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:159
msgid "Chosen server"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:172
-msgid ""
-"<center><p>\n"
-"This appears to be your first running of openMolar<br />\n"
-"Before you run this application, we need to generate a settings file.<br />\n"
-"So that openmolar knows where your mysql server resides<hr />\n"
-"If you do not have a database, you will be prompted to create one<</p>\n"
-"Are you ready to proceed?</center>"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:179
-msgid "First Run"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:211
-msgid "Unable to Run OpenMolar"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:212
-msgid "Good Bye!"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:294
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:302
-msgid "Login Error"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:295
-msgid ""
-"Incorrect<br />User/password<br />\n"
-"combination!<br />Please Try Again."
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/main.py:298
-msgid ""
-"<p>DATABASE ERROR </p>\n"
-"<p>application cannot run</p>Error %s"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/ptModules/estimates.py:220
-msgid "<h1>Under Treatment - Current Estimate</h1>"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/ptModules/estimates.py:222
-msgid "<h1>Estimate from previous course</h1>"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/ptModules/estimates.py:225
-msgid "No estimate data found</body></html>"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/ptModules/estimates.py:228
-msgid ""
-"<table width =\"100%\" border=\"1\">\n"
-" <tr><td colspan=\"7\"><h3>ESTIMATE</h3></td></tr>\n"
-" <tr><th>No.</th><th>Description</th><th>Category</th>\n"
-" <th>Type</th><th>Course</th>\n"
-" <th>Fee</th><th>Pt Fee</th><th>Completed</th></tr>"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/ptModules/plan.py:123
-msgid "Previous Course"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/ptModules/plan.py:125
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:152
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:155
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:158
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:93
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:608
-msgid "Start"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/ptModules/plan.py:128
-msgid "End"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/ptModules/plan.py:138
-msgid "No treatment"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/ptModules/plan.py:141
-msgid "COMPLETED"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/ptModules/plan.py:141
-msgid "PLAN"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:15
-msgid "Relevant Books"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:15
-msgid "Selected Book(s)"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:16
-msgid "Available Dentists"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:16
-msgid "Available Hygenists"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:17
-msgid "Available Clinicians"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:17
-msgid "Manual Selection"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:17
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3381
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:41
-msgid "Everyone"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:218
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:219
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:154
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:142
-msgid "Lunch"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:220
-msgid "staff meeting"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appointment_drag.py:224
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:141
-msgid "Out of Office"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:178
-msgid "Please specify a clinician"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:233
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:261
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:275
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:67
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/saveDiscardCancel.py:82
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:293
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:299
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/examdialog.py:84
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:4085
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:57
-msgid "Confirm"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:234
-msgid "Delete all past Appointments?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:176
+msgid "This appears to be your first running of OpenMolar."
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:235
-msgid "from the diary of"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:249
-msgid "Sucessfully removed appointment"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:253
-msgid "Error removing proposed appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:177
+msgid "We need to generate a settings file."
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:256
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:328
-msgid "No appointment selected"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:178
+msgid "Are you ready to proceed?"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:262
-msgid "Delete Unscheduled Appointment?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:181
+msgid "First Run"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:269
-msgid "Confirm Delete appointment at"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:211
+msgid "Unable to Run OpenMolar"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:273
-msgid "with"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:212
+msgid "Good Bye!"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:286
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:50
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:48
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:378
-msgid "Question"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:301
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:315
+msgid "Login Error"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:287
-msgid "Removed from appointment book - keep for rescheduling?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:303
+msgid "Incorrect"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:292
-msgid "Error converting appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:304
+msgid "User/password combination!"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:296
-msgid "Error removing from patient diary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:305
+msgid "Please Try Again."
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:301
-msgid "Error Removing from Appointment Book"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:311
+msgid "UNEXPECTED ERROR"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:412
-msgid "Error putting into dentist's book"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:312
+msgid "application cannot run"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:425
-msgid "Please select an appointment to schedule"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:160
+msgid "no treatments"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:429
-msgid "appointment already scheduled for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:165
+msgid "Partially"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:476
-msgid "Reached"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/formatted_notes.py:165
+msgid "Course Activity"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:478
-msgid "which is specified as the book end point"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/formatted_notes.py:236
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3244
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3250
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3257
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3265
+msgid "Edit"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:498
-msgid "No clinicians selected"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/formatted_notes.py:254
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:556
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:570
+msgid "Today"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:507
-msgid "no appointments of"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/formatted_notes.py:257
+msgid "Add a note"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:508
-msgid "minutes or more available for selected week"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/formatted_notes.py:257
+msgid "No notes found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:520
-msgid "Please select an appointment to place here"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/formatted_notes.py:260
+msgid "Todays notes for"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:524
-msgid "Please choose another appointment - this one is made already!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:144
+msgid "DO NOT RECALL"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:534
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1423
-msgid "You have chosen an appointment with"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:133
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1360
+msgid "Previous Course"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:536
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1425
-msgid "Is this correct?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:135
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:199
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:202
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:205
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:122
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:529
+msgid "Start"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:569
-msgid "Confirm Make appointment for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:138
+msgid "End"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:622
-msgid "Error putting appointment back into patient diary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:144
+msgid "PLAN"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:626
-msgid "Error making appointment - sorry!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:150
+msgid "COMPLETED"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1141
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1238
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:862
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2453
-msgid "You can't schedule an appointment in the past"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:155
+msgid "No treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1163
-msgid "showing current week"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:41
+msgid "Available Clinicians"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1255
-msgid "showing current day"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:42
+msgid "Available Dentists"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1329
-msgid "Nothing to show!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:43
+msgid "Available Hygenists"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1359
-msgid "Do you want to unblock the selected slot?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:44
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:102
+msgid "All"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1388
-msgid "unable to block - has the book been altered elsewhere?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:222
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:223
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:201
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:170
+msgid "Lunch"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1406
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1438
-msgid "unable to make appointment - has the book been altered elsewhere?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:224
+msgid "staff meeting"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/appt_gui_module.py:1442
-msgid "unable to make make changes to the patient diary!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:228
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:169
+msgid "Out of Office"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:20
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:36
msgid "Unscheduled"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:20
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:36
msgid "View Past Appointments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:21
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
msgid "Date & Time"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:21
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
msgid "Practitioner"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:21
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:149
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:104
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:151
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:179
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:146
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:188
msgid "Length"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:22
-msgid "Treatment"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:22
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:95
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3076
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:48
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:38
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:124
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3201
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:64
msgid "Memo"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/charts/charts_gui.py:108
-msgid ""
-"for the moment, please enter treatment\n"
-"into the plan first then complete it."
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/charts/charts_gui.py:111
-msgid "unable to update chart - this shouldn't happen!!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:38
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:91
+msgid "Treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/charts/charts_gui.py:146
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/charts/charts_gui.py:143
msgid "you need to be in the static chart to change tooth state"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/charts/charts_gui.py:260
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3174
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3231
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:926
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/charts/charts_gui.py:253
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3313
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3374
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:116
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:681
msgid "BPE"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/charts/charts_gui.py:272
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/charts/charts_gui.py:266
msgid "NO CHARTS"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py:44
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py:42
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estFooterWidget.py:220
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:134
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:140
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py:39
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:131
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_taskWidget.py:50
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_task_widget.py:50
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:123
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:225
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py:38
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py:57
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py:55
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:603
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py:51
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:197
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:151
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:225
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py:51
msgid "Form"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py:45
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py:58
msgid "CheckBox"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py:53
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py:71
msgid "Plan Treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py:54
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py:73
msgid "Add the following Treatment Items to the Current Treatment Plan"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:56
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:78
msgid "Select Appointment Length"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:57
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:79
msgid "Hours"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:58
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:80
msgid "Minutes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:146
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:193
msgid "Open a Day"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:147
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:92
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:194
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:121
msgid "Clinician"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:148
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:195
msgid "Date to Open"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:149
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:196
msgid "Day Memo - optional"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:150
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:197
msgid "Day Start"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:151
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:198
msgid "Morning Emergency Slot"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:153
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:156
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:159
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:94
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:200
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:203
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:206
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:123
msgid "Finish"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:157
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:204
msgid "Afternoon Emergency Slot "
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:160
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:207
msgid "Day Finish"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:61
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3408
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:76
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3543
msgid "Appointment Tools"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:62
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:78
msgid "Move the end date for making appointments."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:63
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:65
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:84
msgid "Extend Books"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:64
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:80
msgid "Remove old weeks"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:65
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:82
msgid "Edit Standard Working Weeks for Clinicians"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:66
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:83
msgid "Open A Day"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:67
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:84
msgid "Insert regular blocks"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:68
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3400
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:85
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3540
msgid "&Quit"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptWizard.py:49
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptWizard.py:66
msgid "Appointment Wizard"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptWizard.py:50
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptWizard.py:68
msgid "Add a combination of proposed appointments to the patients diary."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py:43
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:216
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3266
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3277
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3283
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3343
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3353
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py:40
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:299
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:49
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:132
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:134
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:136
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:137
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py:39
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py:56
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:605
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3465
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3479
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py:52
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:366
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:65
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:155
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:157
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:159
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:172
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py:52
msgid "TextLabel"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py:44
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py:57
msgid "Add"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:91
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:120
msgid "Clinicians - DATE"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:96
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:126
msgid "If you copy this day's setup to the clipboard, you can create a \"clone\" of this day when no data is set. This is useful when extending books."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:97
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:127
msgid "Copy To Clipboard"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:98
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:128
msgid "Paste the saved values."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:99
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:129
msgid "Paste"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:133
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3382
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:160
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3513
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:146
msgid "Options"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:134
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:162
msgid "Would you like to Block (or partially Block) this Slot?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:135
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:163
msgid "Block Start"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:136
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:164
msgid "Bock End"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:137
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:165
msgid "Text to apply"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:138
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:166
msgid "//Blocked//"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:139
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:167
msgid "Emergency"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:140
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:168
msgid "Reserved Clinical Time"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:143
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:171
msgid "Catch up time"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:144
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:172
msgid "Phone Call"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:145
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:206
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:173
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:184
msgid "minutes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:146
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:176
msgid "Insert a Block"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:147
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:177
msgid "Insert A Patient into this slot?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:148
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:178
msgid "Start Time"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:150
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:180
msgid "Chosen Patient is<br />"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:151
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:181
msgid "Change"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:152
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:182
msgid "Reason for appointment is"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:153
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:108
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:183
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:150
msgid " minutes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:186
msgid "Insert a Known Patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:99
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:140
msgid "Block Wizard"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:100
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:142
msgid "Insert a block into a book for a range of dates."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:101
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:104
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3306
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3313
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:143
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:137
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3422
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3434
msgid "Start Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:102
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:144
msgid "End Date (inclusive)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:103
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:145
msgid "Time"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:105
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:147
msgid "Text to Apply"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:106
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:148
msgid "Days to Apply"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:107
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:149
msgid "Clinicians"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:111
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:131
msgid "Bridge - Denture Entry"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:112
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:132
msgid "Porcelain / Precious Metal"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:113
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:133
msgid "Lava (or all ceramic)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:114
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:134
msgid "Resin Retained"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:115
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:137
msgid "Bridge"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:116
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:138
msgid "Upper"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:117
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:123
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:139
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:145
msgid "Full (acrylic)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:118
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:124
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:140
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:146
msgid "Full (co-chrome)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:119
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:125
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:141
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:147
msgid "Partial (acrylic)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:120
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:126
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:142
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:148
msgid "Partial (co-chrome)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:121
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:127
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_crownChoice.py:69
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:692
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:171
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:95
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:132
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:40
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:319
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:143
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:149
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3351
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:210
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:160
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:45
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:44
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/post_choice_dialog.py:40
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:353
msgid "Other"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:122
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:144
msgid "Lower"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:128
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:152
msgid "Denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:81
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:104
msgid "Bulk Mail Options"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:82
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:105
msgid "Date Format for the letters"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:83
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:106
msgid "Full, Day, month and Year"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:84
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:107
msgid "Month and Year Only"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:85
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:108
msgid "Date to use"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:86
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:109
msgid "Today's Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:87
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:111
msgid "The actual recall date for the patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:88
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:112
msgid "This Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:63
-msgid "Change Database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_choose_clinicians.py:51
+msgid "Choose Clinicians"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:64
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:305
-msgid "Host"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py:89
+msgid "Language Selector"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:65
-msgid "localhost"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py:90
+msgid ""
+"Choose from the following available languages.\n"
+"Please Note that some of these translations are not complete."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:66
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:312
-msgid "User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py:93
+msgid "Note - if your preferred language is not available (or incomplete), please visit https://launchpad.net/openmolar and add a translation of your own!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:67
-msgid "user"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py:95
+msgid "Many thanks to all who have helped internationalise openMolar, and to the folks behind the GNU tools and launchpad rosetta team who make this possible."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:68
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:301
-msgid "Password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_choose_tooth.py:57
+msgid "Choose A Tooth"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:69
-msgid "display password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_choose_tooth.py:59
+msgid "Please Select the tooth to which this treatment is planned"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:70
-msgid "Database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:101
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:213
+msgid "Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:71
-msgid "openmolar_demo"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:102
+msgid "Deciduous Teeth"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_changeDatabase.py:72
-msgid "password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:103
+msgid "Adult Teeth"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_chooseDocument.py:65
-msgid "Choose a Document"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:105
+msgid "Enter a Restoration Code (eg. MOD) to see how a feescale interprets the shortcut"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_chooseDocument.py:66
-msgid "Choose a document to view"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:106
+msgid "GO"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_chooseDocument.py:67
-msgid "NHS Schedule of Remuneration April 2008"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:107
+msgid "QUIT"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_chooseDocument.py:68
-msgid "NHS \"Information Guide\" 2008"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:86
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:119
+msgid "Completion Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_chooseDocument.py:69
-msgid "2008"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:87
+msgid "UNNAMED PT - (000000)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_chooseDocument.py:70
-msgid "NHS Schedule of Remuneration"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:89
+msgid "You have no further treatment proposed for this patient, yet they are deemed to be \"under treatment\"."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_chooseDocument.py:71
-msgid "NHS \"Information Guide\""
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:90
+msgid "Suggested completion Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_chooseDocument.py:72
-msgid "2009"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:91
+msgid ""
+"Apply this Date Now?\n"
+"(course can be re-opened later if necessary)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_choose_clinicians.py:36
-msgid "Choose Clinicians"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py:90
+msgid "Custom Item"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py:66
-msgid "Language Selector"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py:91
+msgid "Number of Items"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py:67
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Droid Sans'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
-"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Choose from the following available languages.<br />Please Note that some of these translations are not complete.</p></body></html>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py:93
+msgid "Treatment Description"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py:72
-msgid "Note - if your preferred language is not available (or incomplete), please visit https://launchpad.net/openmolar and add a translation of your own!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:134
+msgid "Daylist Printing Wizard"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py:73
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Droid Sans'; font-size:8pt; font-weight:400; font-style:italic;\">\n"
-"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Many thanks to all who have helped internationalise openMolar,</p>\n"
-"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">and to the folks behind the GNU tools and launchpad rosetta team</p>\n"
-"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">who make this possible.</p></body></html>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:136
+msgid "Specify Dates and Practitioners for a Daylist Print Run"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_choose_tooth.py:41
-msgid "Choose A Tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:138
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3423
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3435
+msgid "End Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_choose_tooth.py:42
-msgid "Please Select the tooth to which this treatment is planned"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:139
+msgid "All Practioners on One Page"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:52
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:215
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_options.py:45
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:167
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:83
-msgid "Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:141
+msgid "One Practitioner Per Page - Minimal"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:53
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:690
-msgid "Adult"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:143
+msgid "One Practioner Per Page - Fill Page"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:54
-msgid "Deciduous"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:604
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:626
+msgid "Go To Today"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:55
-msgid "Enter a Restoration Code (eg. MOD) to test your fee scale logic"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:608
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:82
+msgid "Day View"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:56
-msgid "Enter a filling or restoration code, and check that your feetable finds the correct itemcode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:609
+msgid "View Current Week"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py:57
-msgid "go"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:612
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:84
+msgid "Week View"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_completeTreatment.py:41
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/manipulate_tx_plan.py:40
-msgid "Complete Treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:613
+msgid "Month"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_completeTreatment.py:42
-msgid "Complete Multiple Treatments?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:614
+msgid "Print Month View"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:62
-msgid "Completion Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:615
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:620
+msgid "All Clinicians"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:63
-msgid "UNNAMED PT - (000000)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:616
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:621
+msgid "Select Clinicians"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:64
-msgid "You have no further treatment proposed for this patient, yet they are deemed to be \"under treatment\"."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:619
+msgid "Month View"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:65
-msgid "Suggested completion Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:622
+msgid "Year"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:66
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
-"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Apply this Date Now?<br />(course can be re-opened later if necessary)</p></body></html>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:625
+msgid "Year View"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_confirmDentist.py:45
-msgid "Which Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py:629
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:158
+msgid "Agenda"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_confirmDentist.py:46
-msgid "Print a GP17 form using this dentist's contract no? "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:76
+msgid "Edit Memos"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_confirmDentist.py:47
-msgid "Previous Course (00/00/0000 - 00/00/0000)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:77
+msgid "Global Memo"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_confirmDentist.py:48
-msgid "New Course ( no dates)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:78
+msgid "Clinician Memos"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_crownChoice.py:61
-msgid "Choose"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_enter_letter_text.py:54
+msgid "Letter Text Entry"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_crownChoice.py:62
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:38
-msgid "Gold"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_enter_letter_text.py:56
+msgid "<b>Please enter the body text for your letter here.</b>"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_crownChoice.py:63
-msgid "Resin"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:96
+msgid "Exam Wizard"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_crownChoice.py:64
-msgid "PJC"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:97
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:121
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:914
+msgid "Type"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_crownChoice.py:65
-msgid "Temporary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:98
+msgid "Standard"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_crownChoice.py:66
-msgid "Lava"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:99
+msgid "Extensive"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_crownChoice.py:67
-msgid "Fortress"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:100
+msgid "Full Case Assessment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_crownChoice.py:68
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:37
-msgid "Bonded"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:101
+msgid "Exam Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_crownChoice.py:70
-msgid "Recement"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:83
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:86
+msgid "Appointment Time"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_crownChoice.py:71
-msgid "Cancel"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:84
+msgid "Space Before Appointment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py:64
-msgid "Custom Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:85
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:89
+msgid "0 mins"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py:65
-msgid "Number of Items"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:87
+msgid "00:00 - 00:00"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py:66
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:141
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_feeTableTreatment.py:66
-msgid "Fee"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:88
+msgid "Space After Appointment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py:67
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_feeTableTreatment.py:65
-msgid "Treatment Description"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py:100
+msgid "Forum Input"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:102
-msgid "Daylist Printing Wizard"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py:101
+msgid "Topic"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:103
-msgid "Specify Dates and Practitioners for a Daylist Print Run"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py:103
+msgid "Comment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:105
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3307
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3314
-msgid "End Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py:104
+msgid "(0 Characters)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:106
-msgid "All Practioners on One Page"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:117
+msgid "Hygienist Wizard"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:107
-msgid "One Practitioner Per Page - Minimal"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:118
+msgid "Planned Treatments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py:108
-msgid "One Practioner Per Page - Fill Page"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:119
+msgid "label"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:58
-msgid "Edit Memos"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:120
+msgid "Ok - I'll be careful!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:59
-msgid ""
-"<p align=\"center\">Friday, 25th December 2009</p>\n"
-"<p align=\"center\">Christmas Day</p>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:122
+msgid "Debridement"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:61
-msgid "Global Memo"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:123
+msgid "Scale and Polish"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:62
-msgid "Clinician Memos"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:124
+msgid "Extensive Scaling"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_enter_letter_text.py:38
-msgid "Letter Text Entry"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:125
+msgid "Treating Dentist/Hygienist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_enter_letter_text.py:39
-msgid "<b>Please enter the body text for your letter here.</b>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:519
+msgid "OpenMolar - database wizard"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estFooterWidget.py:221
-msgid " TOTAL "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:520
+msgid "What do you want to do?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:135
-msgid "No."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:522
+msgid "Modify an existing openmolar database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:136
-msgid "Code"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:524
+msgid "Create a New database from scratch"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:137
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_model.py:153
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1238
-msgid "Description"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:526
+msgid "Create a New database (from a known template)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:138
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:144
-msgid "Cat"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:530
+msgid "Practice Name"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:139
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:125
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:78
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1238
-msgid "Type"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:531
+msgid "Used in receipts, appointment cards etc."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:140
-msgid "cset"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:532
+msgid "Address Line 1"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:142
-msgid "Charge"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:533
+msgid "Address Line 2"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estHeaderWidget.py:143
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3340
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:252
-msgid "Expand All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:534
+msgid "Address Line 3"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estSplitItemsDialog.py:38
-msgid "Split Items"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:537
+msgid "Postcode / Zip"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:141
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3134
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:107
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:113
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:119
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:125
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:131
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:137
-msgid "1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:538
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:187
+msgid "Telephone"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:142
-msgid "code"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:539
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3199
+msgid "Fax"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:143
-msgid "small xrays"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:540
+msgid "Website"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:146
-msgid "P"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:541
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:166
+msgid "Email"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:147
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:148
-msgid "1000.00"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:544
+msgid "Practice Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_estimateItemWidget.py:149
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3196
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3226
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:34
-msgid "Completed"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:546
+msgid "The Following users can login to the application"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:124
-msgid "Exam Wizard"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:548
+msgid "Id"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:126
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:218
-msgid "Standard"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:550
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:562
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:577
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:585
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:595
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:603
+msgid "Initials"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:127
-msgid "Extensive"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:552
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:561
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:579
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:586
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:597
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:604
+msgid "Name"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:128
-msgid "Full Case Assessment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:554
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:563
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:581
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:599
+msgid "User Group"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:129
-msgid "Exam Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:556
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:583
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:601
+msgid "Active?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:131
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3155
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3192
-msgid "Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:558
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:569
+msgid "DeActivation Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:132
-msgid "Pt c/o"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:559
+msgid "Modify Selected User"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:133
-msgid "nil"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:560
+msgid "New User Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:134
-msgid "Broken Tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:564
+msgid "Standard User"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:135
-msgid "Denture Problems"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:566
+msgid "Hygienist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:136
-msgid "Lost Filling"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:567
+msgid "Receptionist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:137
-msgid "Pain"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:568
+msgid "Active User"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:138
-msgid "Sensitive Teeth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:570
+msgid "Add a New User"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:139
-msgid "Soft Tissues Checked"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:573
+msgid "Users"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:140
-msgid "OHI given"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:574
+msgid ""
+"The Following dentists have notes in this database\n"
+"(note - dentists should not be removed from the database, as this could create lookup issues for cashbooks and notes) "
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py:141
-msgid "Palpated for upper canines - NAD"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:584
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:602
+msgid "Add a Dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_feeTableTreatment.py:64
-msgid "Add Fee Table Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:587
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:605
+msgid "Registration"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_feeTableTreatment.py:67
-msgid "Patient Contribution"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:588
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:606
+msgid "Active Appointment Book"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:217
-msgid "UserCode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:591
+msgid "Dentists"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:219
-msgid "Regex"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:592
+msgid ""
+"The Following hygienists have notes in this database\n"
+"(note - hygienists should not be removed from the database, as this could create lookup issues for cashbooks and notes) "
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:220
-msgid "Multiple Regex"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:609
+msgid "Hygienists"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:221
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_model.py:155
-msgid "Regulations"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:610
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:474
+msgid "Monday"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:222
-msgid "Regulation Wizard"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:611
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:474
+msgid "Tuesday"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:223
-msgid "Feescale Category"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:612
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:415
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:474
+msgid "Wednesday"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:224
-msgid "Category for treatment Planning"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:613
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:474
+msgid "Thursday"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:225
-msgid "Patient's Description"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:614
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:475
+msgid "Friday"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:226
-msgid "Clinical Description(s)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:615
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:475
+msgid "Saturday"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:227
-msgid "Gross Fees (csv)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:616
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:475
+msgid "Sunday"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:228
-msgid "Net Fees (csv)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:619
+msgid "Practice Hours"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:229
-msgid "Wizard"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:622
+msgid "View XML"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:230
-msgid "Below is the XML for this item (this is how they are stored in the database)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:623
+msgid "File"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:231
-msgid "Original (read only)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:624
+msgid "L&oad Template"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:232
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3176
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3230
-msgid "New"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:625
+msgid "&Save Template"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:233
-msgid "XML"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3171
+msgid "Open Molar"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_fee_item_wizard.py:234
-msgid "Test Fee Item Logic"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3172
+msgid "Exit the Current Patient Record."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:64
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:67
-msgid "Appointment Time"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3173
+msgid "Esc"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:65
-msgid "Space Before Appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3175
+msgid "Add a New Patient to the database."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:66
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:70
-msgid "0 mins"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3177
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3474
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3508
+msgid "Click on this Button to search for in patient in your database."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:68
-msgid "00:00 - 00:00"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3178
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3509
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:194
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:126
+msgid "Find"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py:69
-msgid "Space After Appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3179
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3475
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3510
+msgid "Ctrl+F"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py:79
-msgid "Forum Input"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3181
+msgid "This cycles back through the history of records loaded today."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py:80
-msgid "Topic"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3183
+msgid "Reload the patient from the database."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py:82
-msgid "Comment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3184
+msgid "Ctrl+R"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py:83
-msgid "(0 Characters)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3186
+msgid "This cycles forwards through the history of records loaded today."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:77
-msgid "Hygenist Wizard"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3188
+msgid "Show patients who live at the same address, or who have a similar name."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:79
-msgid "Scale and Polish"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3189
+msgid "&Relatives"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:80
-msgid "Extensive Scaling"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3190
+msgid "Ctrl+G"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:81
-msgid "Part 1 of 2 visit treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3192
+msgid "A drop down box of all patients who have an appointment today."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:82
-msgid "Part 2 of 2 visit treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3193
+msgid "Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:83
-msgid "Dentist/Hygenist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3194
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:183
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:162
+msgid "Date of Birth"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py:84
-msgid "Debridement"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3195
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+msgid "Address3"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:603
-msgid "OpenMolar - database wizard"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3196
+msgid "send an sms"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:604
-msgid "What do you want to do?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3197
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
+msgid "sms"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:605
-msgid "Modify an existing openmolar database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3198
+msgid "email2"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:606
-msgid "Create a New database from scratch"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3203
+msgid "email1"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:607
-msgid "Create a New database (from a known template)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3204
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3211
+msgid "send an email"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:609
-msgid "Practice Name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3205
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3212
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
+msgid "email"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:610
-msgid "Used in receipts, appointment cards etc."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3206
+msgid "Occupation"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:611
-msgid "Address Line 1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3209
+msgid "Tel (mob)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:612
-msgid "Address Line 2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3210
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+msgid "Address2"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:613
-msgid "Address Line 3"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3213
+msgid "Sex"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:616
-msgid "Postcode / Zip"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3214
+msgid "M"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:617
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:149
-msgid "Telephone"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3215
+msgid "F"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:618
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3062
-msgid "Fax"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3216
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:190
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:43
+msgid "Postcode"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:619
-msgid "Website"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3217
+msgid "Tel (home)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:620
-msgid "Email"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3218
+msgid "send a fax"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:621
-msgid "Practice Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3219
+msgid "fax"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:622
-msgid "The Following users can login to the application"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3220
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+msgid "Address1"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:623
-msgid "Id"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3222
+msgid "Tel (work)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:624
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:632
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:644
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:649
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:657
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:662
-msgid "Initials"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3223
+msgid "Abort New Patient Entry"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:625
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:631
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:645
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:650
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:658
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:663
-msgid "Name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3225
+msgid "Higlighted Fields are Mandatory for New Patients"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:626
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:633
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:646
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:659
-msgid "User Group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3226
+msgid "Save New Patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:627
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:647
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:660
-msgid "Active?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3227
+msgid "Family Groups"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:628
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:639
-msgid "DeActivation Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3229
+msgid "Raise a dialog to edit the patients family grouping"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:629
-msgid "Modify Selected User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3230
+msgid "Edit family group"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:630
-msgid "New User Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3231
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3163
+msgid "Not a member of a known family"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:634
-msgid "Standard User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3233
+msgid "Use the Sname and Address details from the previous patient."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:636
-msgid "Hygienist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3234
+msgid "Apply Address of previous record"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:637
-msgid "Receptionist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3237
+msgid "Patient Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:638
-msgid "Active User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3238
+msgid "Pt is registered with Dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:640
-msgid "Add a New User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3239
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:88
+msgid "Course Type"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:641
-msgid "Users"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3240
+msgid "Status"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:642
-msgid ""
-"The Following dentists have notes in this database\n"
-"(note - dentists should not be removed from the database, as this could create lookup issues for cashbooks and notes) "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3241
+msgid "Write Off Bad Debt"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:648
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:661
-msgid "Add a Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3243
+msgid "This label is for displaying Private contractual stuff"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:651
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:664
-msgid "Registration"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3247
+msgid "Private"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:652
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:665
-msgid "Active Appointment Book"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3249
+msgid "This label is for displaying HDP contractual stuff"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:653
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:666
-msgid "Patients can be assigned to this dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3253
+msgid "Highland Dental Plan"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:654
-msgid "Dentists"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3255
+msgid "This label is for displaying NHS contractual stuff"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:655
-msgid ""
-"The Following hygienists have notes in this database\n"
-"(note - hygienists should not be removed from the database, as this could create lookup issues for cashbooks and notes) "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3256
+msgid "View Claims History"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:667
-msgid "Hygienists"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3258
+msgid "Exemption"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:668
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:438
-msgid "Monday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3259
+msgid "Exemption Text"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:669
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:438
-msgid "Tuesday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3262
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3301
+msgid "NHS"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:670
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:388
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:438
-msgid "Wednesday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3264
+msgid "No Details of Pt's Registered Dentist Found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:671
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:438
-msgid "Thursday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3268
+msgid "Registered Elsewhere"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:672
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:439
-msgid "Friday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3271
+msgid "Contract"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:673
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:439
-msgid "Saturday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3272
+msgid "Letters TO the patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:674
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:439
-msgid "Sunday"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3274
+msgid " Custom Letter to the patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:675
-msgid "Practice Hours"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3276
+msgid "Print a recall saying the patient is due now."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:676
-msgid "The Following Categories are used in this database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3277
+msgid "Recall for An Examination"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:677
-msgid "Category"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3279
+msgid "Print a receipt - useful for duplicates."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:678
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:684
-msgid "Category Name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3280
+msgid "Duplicate Receipt"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:679
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:685
-msgid "Image"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3281
+msgid "Print An Account Letter"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:680
-msgid "Age Category"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3282
+msgid "Referrals (Letters about the patient)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:681
-msgid "Minimum Age"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3283
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3398
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3427
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3440
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:53
+msgid "Print"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:682
-msgid "Maximum Age"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3284
+msgid "Patient \"Notes\""
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:683
-msgid "Add a Category"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3286
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3295
+msgid "Print a summary of the patient's notes (for them to take on). Includes No fee details."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:686
-msgid "..."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3287
+msgid "Print the patient's notes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:687
-msgid "Age Limit"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3288
+msgid "Previous Correspondence"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:688
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:175
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:945
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:946
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:514
-msgid "None"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3289
+msgid "Generated By OpenMolar"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:689
-msgid "Under 18"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3290
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:126
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:132
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:138
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:144
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:150
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:156
+msgid "1"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:691
-msgid "OAP"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3291
+msgid "Imported into database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:693
-msgid "Category Letter"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3292
+msgid "Import A Document"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:694
-msgid "Category Active"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3293
+msgid "Medical History"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:695
-msgid "Patient Categories"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3296
+msgid "Print a medical history form"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:696
-msgid "Treatments and Fees"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3299
+msgid "Correspondence"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:697
-msgid "Referral Centres"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3300
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3312
+msgid "Reception"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:698
-msgid "View XML"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3302
+msgid "Print A GP17"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:699
-msgid "File"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3303
+msgid "Apply an Exemption"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:700
-msgid "L&oad Template"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3304
+msgid "Custom Estimate on File"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:701
-msgid "&Save Template"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3305
+msgid "Print &Account"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3032
-msgid "Open Molar - YOUR dental database application"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3306
+msgid "Take &Payment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3033
-msgid "Exit the Current Patient Record."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3307
+msgid "Print &Estimate"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3034
-msgid "Esc"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3308
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3343
+msgid "Notes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3035
-msgid "Add a New Patient to the database."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3309
+msgid "Patient's Diary"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3036
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3347
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3377
-msgid "Click on this Button to search for in patient in your database."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3315
+msgid "Update the Basic Perio Exam (CPITN) score"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3037
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3378
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:38
-msgid "Find"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3316
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3373
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:79
+msgid "New"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3038
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3348
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3379
-msgid "Ctrl+F"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3317
+msgid "perform a clinical exam"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3039
-msgid "This cycles back through the history of records loaded today."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3320
+msgid "add x-rays to the patient's current course."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3040
-msgid "Reload the patient from the database."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3321
+msgid "X-ray"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3041
-msgid "Ctrl+R"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3323
+msgid "perform common perio treatments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3042
-msgid "This cycles forwards through the history of records loaded today."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3324
+msgid "Hyg"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3043
-msgid "Show patients who live at the same address, or who have a similar name."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3325
+msgid "Close This Course"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3044
-msgid "&Related"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3326
+msgid "ChildSmile"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3045
-msgid "Ctrl+G"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3328
+msgid "check / update the patients medical history"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3046
-msgid "A drop down box of all patients who have an appointment today."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3329
+msgid "Med Notes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3047
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3222
-msgid "Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3332
+msgid "Clinical Summary"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3049
-msgid "Sex"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3333
+msgid "Include"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3050
-msgid "M"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3334
+msgid "Printing Notes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3051
-msgid "F"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3335
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:203
+msgid "Payments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3052
-msgid "Tel (home)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3336
+msgid "Timestamps"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3053
-msgid "More Fields are available. Click Here to Edit."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3337
+msgid "Metadata"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3054
-msgid "More"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3339
+msgid "<html><head/><body><p>Use these settings for the clinical summary notes also.</p></body></html>"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3056
-msgid "Tel (work)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3340
+msgid "clinical summary"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3058
-msgid "Tel (mob)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3344
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:55
+msgid "Static"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3059
-msgid "send an sms"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3345
+msgid "Plan"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3060
-msgid "sms"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3346
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:67
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:59
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:1138
+msgid "Completed"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3061
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:146
-msgid "Date of Birth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3347
+msgid "Treatment Planning"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3063
-msgid "send a fax"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3348
+msgid "X-Rays"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3064
-msgid "fax"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3349
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:625
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:639
+msgid "Perio"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3065
-msgid "Address1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3350
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:629
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:643
+msgid "Dentures"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3066
-msgid "email1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3352
+msgid "Custom"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3067
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3071
-msgid "send an email"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3353
+msgid "Advanced Tx Planning"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3068
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3072
-msgid "email"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3355
+msgid "Patient is not currently under treatment - click here to begin"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3069
-msgid "Address2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3358
+msgid "Charts / Planning"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3070
-msgid "email2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3360
+msgid "Custom Estimate Letter"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3073
-msgid "Address3"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3361
+msgid ""
+"Use this feature to re-price all items in the \"tooth\" category of treatments. i.e all those which appear on the charts.\n"
+"\n"
+"Note - this will not remove items which are currently there. "
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3074
-msgid "Occupation"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3364
+msgid "ReCalculate Estimate"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3078
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:151
-msgid "Postcode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3365
+msgid "Apply Exemption"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3079
-msgid "New Patients"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3366
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:87
+msgid "Course Dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3080
-msgid "Use the Sname and Address details from the previous patient."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3367
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1340
+msgid "Close Course"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3081
-msgid "Default Sname / Address"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3371
+msgid "Choose Data"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3082
-msgid "Not implemented yet."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3372
+msgid "Chart Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3083
-msgid "Family"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3377
+msgid "Perio Charts"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3084
-msgid "Higlighted Fields are Mandatory for New Patients"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3379
+msgid "See all payments in the database made by this patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3085
-msgid "Patient Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3380
+msgid "Past Payments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3086
-msgid "Pt is registered with Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3382
+msgid "View treatments completed, by date order"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3087
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:67
-msgid "Course Type"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3383
+msgid "Past Treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3088
-msgid "Status"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3385
+msgid "display a combination of courses and estimates."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3089
-msgid "Active"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3386
+msgid "Courses / Estimates"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3090
-msgid "Moved Away"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3388
+msgid "View all Courses of treatment. This includes treatment that was planned but not completed."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3091
-msgid "Deceased"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3389
+msgid "Courses"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3092
-msgid "Bad Debt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3391
+msgid "Estimate history for this patient."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3093
-msgid "No More Appts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3392
+msgid "Estimates"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3094
-msgid "Write Off Bad Debt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3393
+msgid "Current Estimate"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3095
-msgid "This label is for displaying Private contractual stuff"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3394
+msgid "NHS Claims"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3096
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3099
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3103
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3108
-msgid "Edit"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3395
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3414
+msgid "Memos"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3097
-msgid "Private"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3397
+msgid "Print the text displayed on this page."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3098
-msgid "This label is for displaying HDP contractual stuff"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3399
+msgid ""
+"Advanced options for developer use. Don't expect this to make much sense!\n"
+"\n"
+"If the \"changes only\" checkbox is checked, only data which has been changed will be displayed."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3100
-msgid "Highland Dental Plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3402
+msgid "debug tools"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3101
-msgid "This label is for displaying NHS contractual stuff"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3403
+msgid "changes only"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3102
-msgid "View Claims History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3406
+msgid "History"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3104
-msgid "Exemption"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3407
+msgid "Today's Notes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3105
-msgid "Exemption Text"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3408
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:106
+msgid "PhraseBook"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3106
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3148
-msgid "NHS"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3409
+msgid "Ins"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3107
-msgid "No Details of Pt's Registered Dentist Found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3410
+msgid "Save the changes made to this record."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3109
-msgid "Registered Elsewhere"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3411
+msgid "Save Changes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3110
-msgid "Contract"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3412
+msgid "Ctrl+S"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3111
-msgid "Letters TO the patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3413
+msgid "Enter Notes."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3112
-msgid " Custom Letter to the patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3415
+msgid "Phrases"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3113
-msgid "Recall management"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3418
+msgid "Patient Database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3114
-msgid "Set the date for a recall to be generated automatically"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3421
+msgid "Appointments / Diary"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3115
-msgid "Date Shortcuts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3424
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3436
+msgid "Registered Dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3116
-msgid "1 Month hence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3425
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3438
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:241
+msgid "Go"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3117
-msgid "3 Months hence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3426
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3439
+msgid "Print the Data"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3118
-msgid "6 Months hence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3428
+msgid "All payments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3119
-msgid "12 Months hence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3429
+msgid "Sundries_only"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3120
-msgid "Print a recall saying the patient is due now."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3430
+msgid "Treatment_only"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3121
-msgid "Print Recall Now"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3433
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3534
+msgid "Cashbook"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3122
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3330
-msgid "Accounts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3437
+msgid "Treating Dentist / Hygenist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3123
-msgid "\"A\" letter"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3443
+msgid "Daybook"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3124
-msgid "\"B\" letter"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3445
+msgid "Find Patient Records where the patient is in"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3125
-msgid "\"C\" letter"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3446
+msgid "Debt"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3126
-msgid "Print A Statement of Account"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3447
+msgid "Credit"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3127
-msgid "Duplicate Receipt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3448
+msgid "By More than"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3129
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_raiseCharge.py:57
-msgid "Amount"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3449
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3458
+msgid "Load Table"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3130
-msgid "Print a receipt - useful for duplicates."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3450
+msgid "Print Table"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3131
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3138
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3245
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3311
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3319
-msgid "Print"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3452
+msgid "Print Selected Letters"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3132
-msgid "Previous Correspondence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3454
+msgid "TOTAL OUTSTANDING"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3133
-msgid "Generated By OpenMolar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3457
+msgid "Accounts"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3135
-msgid "Imported into database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3459
+msgid "Print Letters"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3136
-msgid "Import A Document"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3460
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:75
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:388
+msgid "Expand All"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3137
-msgid "Referrals (Letters about the patient)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3461
+msgid "Letter Options"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3139
-msgid "Export this record card"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3464
+msgid "Bulk Mailings"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3140
-msgid "Print a patient's static chart."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3466
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:174
+msgid "Fee Scales Available"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3141
-msgid "Print the Patient's static Chart"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3468
+msgid "Use this control to select a feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3142
-msgid "Print a summary of the patient's notes (for them to take on). Includes No fee details."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3469
+msgid "Search For an Item"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3143
-msgid "Print A Summary of the Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3471
+msgid "search for the given phrase in description columns"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3144
-msgid "Print a summary of the patient's notes. Includes FEE and ESTIMATE details."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3472
+msgid "Search Descriptions"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3145
-msgid "Print Detailed Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3477
+msgid "only search for the given phrase in the usercode column"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3146
-msgid "Correspondence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3478
+msgid "Search Itemcodes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3147
-msgid "Account"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3481
+msgid "Hide Rarely Used Codes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3149
-msgid "Print A GP17"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3482
+msgid "Quickly expand all items"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3150
-msgid "Apply an Exemption"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3483
+msgid "Expand All Sections"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3151
-msgid "Custom Estimate on File"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3485
+msgid "Quickly compress all items"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3152
-msgid "Print &Estimate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3486
+msgid "Compress All Sections"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3153
-msgid "Print &Account"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3487
+msgid "Resources"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3154
-msgid "Take &Payment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3489
+msgid "Open A PDF of the latest NHS Regulations"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3156
-msgid "Patient's Diary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3490
+msgid "Documents"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3157
-msgid "A Wizard to select some common appointment combinations"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3491
+msgid "Advanced Options"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3158
-msgid "Appointment Shortcuts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3492
+msgid "FeeScale Editor"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3159
-msgid "A New Appointment for this patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3493
+msgid "FeeScale Tester"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3160
-msgid "&New"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3494
+msgid "Reload Fee Scales"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3161
-msgid "delete or cancel the appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3497
+msgid "Feescales"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3162
-msgid "Clear/Cancel"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3499
+msgid "Reply"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3163
-msgid "Make the selected appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3500
+msgid "Alt+R"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3164
-msgid "Schedule"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3501
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:323
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:370
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:372
+msgid "Delete"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3165
-msgid "Housekeeping - remove all past appointments from the patient's diary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3502
+msgid "Del, Backspace"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3166
-msgid "Delete All Past Appointments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3503
+msgid "&set parent"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3167
-msgid "Find the appointment in the the practice appointment list"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3504
+msgid "Alt+S"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3168
-msgid "Find in Book"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3505
+msgid "New Topic"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3169
-msgid "Print out the next 5 appointments for this patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3506
+msgid "Search by keyword"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3170
-msgid "Print Card"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3511
+msgid "Show Topics for"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3171
-msgid "Allows modifcation of certain criteria for this appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3512
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/forum_gui_module.py:59
+msgid "Everyone"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3172
-msgid "Modify"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3514
+msgid "Include Deleted Posts"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3173
-msgid "Reception"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3515
+msgid "Split Replies"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3175
-msgid "Update the Basic Perio Exam (CPITN) score"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3516
+msgid "Group replies"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3177
-msgid "perform a clinical exam"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3517
+msgid "&Collapse Replies"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3179
-msgid "add x-rays to the patient's current course."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3518
+msgid "&Expand Replies"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3180
-msgid "X-ray"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3521
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1475
+msgid "FORUM"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3181
-msgid "perform common perio treatments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3524
+msgid "Wiki"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3182
-msgid "Hyg"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3525
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:153
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:109
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:84
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:57
+msgid "&File"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3183
-msgid "Close This Course"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3526
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:95
+msgid "&Help"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3184
-msgid "check / update the patients medical history"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3527
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:157
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:112
+msgid "&Preferences"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3185
-msgid "Med Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3528
+msgid "View"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3186
-msgid "Clinical Summary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3529
+msgid "Appointments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3187
-msgid "Verbosity Level"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3530
+msgid "Printing"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3188
-msgid "minimum"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3531
+msgid "Forum"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3189
-msgid "medium"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3532
+msgid "Charts"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3190
-msgid "maximum"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3533
+msgid "Mode (reception or surgery)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3191
-msgid "reception only"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3535
+msgid "Tools"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3193
-msgid "Charts View"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3536
+msgid "&Export Patient to disk"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3194
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:248
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:32
-msgid "Static"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3537
+msgid "&Import Patient from disk"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3195
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3224
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:256
-msgid "Plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3538
+msgid "About &OpenMolar"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3197
-msgid "Charts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3539
+msgid "&About QT"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3198
-msgid "Estimate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3542
+msgid "Clear Today's Emergency Slots"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3199
-msgid "Course Management"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3544
+msgid "Select Interface Language"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3200
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:66
-msgid "Course Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3546
+msgid "Full Screen Mode (Ctrl-Alt-F)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3201
-msgid "New Course Of Treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3547
+msgid "Ctrl+Alt+F"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3202
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1699
-msgid "Close Course"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3548
+msgid "Font Size"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3203
-msgid "Estimate Management"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3550
+msgid "Show Advanced Options"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3204
-msgid "Custom Estimate Letter"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3552
+msgid "Table View For Charting"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3205
-msgid ""
-"Use this feature to re-price all items in the \"tooth\" category of treatments. i.e all those which appear on the charts.\n"
-"\n"
-"Note - this will not remove items which are currently there. "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3553
+msgid "NHS Form Settings"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3208
-msgid "ReCalculate Estimate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3554
+msgid "Test Print a GP17"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3209
-msgid "Apply Exemption"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3555
+msgid "Print Daylists"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3210
-msgid "Standard View"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3556
+msgid "Set Clinician"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3211
-msgid "Expanded View"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3557
+msgid "Set Assistant"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3212
-msgid "Plan/Completed (standard)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3558
+msgid "Surgery Mode"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3213
-msgid "Plan/Completed (expanded)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3560
+msgid "Advanced Record Management"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3214
-msgid "Treatment Planning"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3562
+msgid "Fix Locked New Course of Treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3215
-msgid "Perform Exam"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3563
+msgid "Allow Full Edit"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3216
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:543
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:555
-msgid "Perio"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3564
+msgid "Set Surgery Number"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3217
-msgid "X-Rays"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3566
+msgid "Set Surgery Number (used so other applications can see which record is loaded)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3218
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:547
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:559
-msgid "Dentures"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3567
+msgid "Edit Phrasebooks"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3219
-msgid "Ortho"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3568
+msgid "Documents Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3220
-msgid "Other Tx"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:196
+msgid "Medical Notes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3221
-msgid "Add Custom Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:197
+msgid "Doctor's details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3227
-msgid "Estimate/Plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:198
+msgid "Doctor's Name"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3228
-msgid "Choose Data"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:199
+msgid "Address / Tel No"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3229
-msgid "Chart Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:200
+msgid "Known Conditions"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3232
-msgid "Perio Charts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:201
+msgid "Current Medication"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3233
-msgid "See all payments in the database made by this patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:202
+msgid "Past Medication"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3234
-msgid "Past Payments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:203
+msgid "Allergies"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3235
-msgid "View treatments completed, by date order"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:204
+msgid "Heart"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3236
-msgid "Past Treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:205
+msgid "Lungs"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3237
-msgid "View all Courses of treatment. This includes treatment that was planned but not completed."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:206
+msgid "Liver"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3238
-msgid "Courses"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:207
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:353
+msgid "Bleeding"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3239
-msgid "Estimate history for this patient."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:208
+msgid "Kidneys"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3240
-msgid "Estimates"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:209
+msgid "Anaesthetic / operations"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3241
-msgid "display a combination of courses and estimates."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:211
+msgid "Mark as Checked Today"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3242
-msgid "Courses / Estimates"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:212
+msgid "Checked"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3243
-msgid "NHS Claims"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:213
+msgid "Mark Patient as Med Alert"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3244
-msgid "Print the text displayed on this page."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:124
+msgid "New CPITN score"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3246
-msgid "Custom Options"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:125
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:131
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:137
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:143
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:149
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:155
+msgid "0"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3247
-msgid ""
-"Advanced options for developer use. Don't expect this to make much sense!\n"
-"\n"
-"If the \"changes only\" checkbox is checked, only data which has been changed will be displayed."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:127
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:133
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:139
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:145
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:151
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:157
+msgid "2"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3250
-msgid "debug tools"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:128
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:134
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:140
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:146
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:152
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:158
+msgid "3"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3251
-msgid "changes only"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:129
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:135
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:141
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:147
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:153
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:159
+msgid "4"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3252
-msgid "History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:130
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:136
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:142
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:148
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:160
+msgid "*"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3253
-msgid "Memos"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:83
+msgid "New Course"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3254
-msgid "Enter Notes."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:85
+msgid "Start a new Course of Treatment with the following Criteria?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3255
-msgid "Today's Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:86
+msgid "Contracted Dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3256
-msgid "Save the changes made to this record."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:89
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:118
+msgid "Acceptance Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3257
-msgid "Save Changes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:359
+msgid "OpenMolar - New Setup"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3258
-msgid "Ctrl+S"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:361
+msgid "Welcome to the OpenMolar settings wizard."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3259
-msgid "Tasks"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:362
+msgid ""
+"This first run application will \n"
+" - set your system password\n"
+" - make this client aware of your mysql server settings\n"
+" - install a small (3 patient) demo database if required."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3260
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:84
-msgid "PhraseBook"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:368
+msgid "Please enter a password to prevent unauthorised running of this application."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3261
-msgid "Ins"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:369
+msgid "Password"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3262
-msgid "Patient Database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:370
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:382
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:392
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:126
+msgid "show"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3263
-msgid "Go To Today"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:371
+msgid "Repeat Password"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3264
-msgid "Manual Clinicians"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:372
+msgid "Where is your mysql server located? **"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3265
-msgid "Schedule Appointments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:373
+msgid "Host"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3267
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3284
-msgid "Find the First Suitable Appointment. "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:374
+msgid "Port"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3268
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3285
-msgid "1st Available"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:375
+msgid ""
+"** If you do not have a mysql server on your network, please quit this setup, and install mysql server now.\n"
+"\n"
+"If you are a debian or ubuntu user, \"sudo apt-get install mysql-server\"\n"
+"and make a note of the root password you create during set up. "
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3269
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3286
-msgid ""
-"Find the Previous Appointment\n"
-"F5"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:379
+msgid "Database Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3271
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3288
-msgid "Prev"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:380
+msgid "(mysql) User"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3272
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3289
-msgid ""
-"Find the Next Available Appointment.\n"
-"F6"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:381
+msgid "(mysql) Password"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3274
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3291
-msgid "Next"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:383
+msgid "Database Name"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3275
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3292
-msgid "Current Patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:384
+msgid "Test this Connection"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3276
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3293
-msgid "Blocks etc.."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:385
+msgid "Create A Demo Database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3278
-msgid "Day View"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:386
+msgid "Use with an existing database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3279
-msgid "View Current Week"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:387
+msgid "Root mysql password"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3280
-msgid "show All appointments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:388
+msgid ""
+"To create a database, and set the privileges for user, requires logging into mysql as the root mysql user.\n"
+"OpenMolar does NOT store this password.\n"
+"Please enter the password of the ROOT mysql user.\n"
+"(note - on most mysql setups, root access is disabled unless the server is on localhost)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3281
-msgid "Manually Select Clinicians"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:393
+msgid "Creating Database.... please wait"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3282
-msgid "Schedule appointments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:394
+msgid "OK.... you are all set to go!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3294
-msgid "Week View"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:395
+msgid "Back"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3295
-msgid "Month"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:396
+msgid "Proceed"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3296
-msgid "Print Month View"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:214
+msgid "Dental History"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3297
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3300
-msgid "All Clinicians"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:215
+msgid "Previous Referral Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3298
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3301
-msgid "Select Clinicians"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:216
+msgid "1st referral"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3299
-msgid "Month View"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:217
+msgid "re - referral"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3302
-msgid "Year"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:219
+msgid "I am Willing to carry out simple treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3303
-msgid "Year View"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:220
+msgid "Teeth With Poor Prognosis"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3304
-msgid "Staff Diaries"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:221
+msgid "Relevant Medical History"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3305
-msgid "Appointments / Diary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:222
+msgid "Reason for Referral"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3308
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3315
-msgid "Registered Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:223
+msgid "Crowding"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3309
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3317
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:242
-msgid "Go"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:224
+msgid "Severe"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3310
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3318
-msgid "Print the Data"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:225
+msgid "Moderate"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3312
-msgid "Cashbook"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:226
+msgid "Mild"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3316
-msgid "Treating Dentist / Hygenist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:227
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:553
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:570
+msgid "None"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3320
-msgid "Daybook"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:228
+msgid "Spaced"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3321
-msgid "Find Patient Records where the patient is in"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:229
+msgid "Incisal Relationship"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3322
-msgid "Debt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:230
+msgid "Overjet:"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3323
-msgid "Credit"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:231
+msgid "mm"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3324
-msgid "By More than"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:232
+msgid "Overbite"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3325
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3338
-msgid "Load Table"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:233
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:367
+msgid "Complete"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3326
-msgid "Print Table"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:234
+msgid "InComplete"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3327
-msgid "Print Selected Letters"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:235
+msgid "Traumatic"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3329
-msgid "TOTAL OUTSTANDING"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:236
+msgid "%"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3331
-msgid "Find Patient Records where"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:237
+msgid "Patient Motivation"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3333
-msgid "is between"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:238
+msgid "Fixed Appliance"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3334
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3336
-msgid "dd/MM/yyyy"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:239
+msgid "Removable Applicance"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3335
-msgid "and"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:199
+msgid "<html><head/><body><p>A place to keep a reminder of the patients appointment preferences.</p><p>Eg. "30 minute appointments for examinations" etc. </p></body></html>"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3337
-msgid "(Inclusive)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:200
+msgid "Recall Settings"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3339
-msgid "Print Letters"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:202
+msgid "A Wizard to select some common appointment combinations"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3341
-msgid "Letter Options"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:203
+msgid "Appointment Shortcuts"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3342
-msgid "Bulk Mailings"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:205
+msgid "A New Appointment for this patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3344
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:170
-msgid "Fee Scales Available"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:206
+msgid "&New"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3345
-msgid "Use this control to select a feescale"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:208
+msgid "delete or cancel the appointment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3346
-msgid "Search For an Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:209
+msgid "Clear/Cancel"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3349
-msgid "only search for the given phrase in the usercode column"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:211
+msgid "Make the selected appointment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3350
-msgid "Search Usercodes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:212
+msgid "Schedule"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3351
-msgid "search for the given phrase in description columns"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:214
+msgid "Find the appointment in the the practice appointment list"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3352
-msgid "Search Descriptions"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:215
+msgid "Find in Book"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3354
-msgid "Quickly expand all items"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:217
+msgid "Print out the next 5 appointments for this patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3355
-msgid "Expand All Sections"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:218
+msgid "Print Card"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3356
-msgid "Quickly compress all items"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:220
+msgid "Allows modifcation of certain criteria for this appointment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3357
-msgid "Compress All Sections"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:221
+msgid "Modify"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3358
-msgid "NHS Regulation Document"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:163
+msgid "Patient Finder"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3359
-msgid "Open A PDF of the latest NHS Regulations"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:165
+msgid "Fill in a few of the following fields to get a list of possible patients"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3360
-msgid "Open"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:166
+msgid "Repeat Last Search"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3361
-msgid "Feescale Adjustment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:167
+msgid "SNO or Surname"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3362
-msgid "If checked, then the user can modify the underlying fees and fee items."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:168
+msgid ""
+"Enter either the full name or the first few letters of the name.\n"
+"\n"
+"If you are unsure of the spelling, type in the COMPLETE name,\n"
+"and check the adjacent \"sounds like\" box."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3363
-msgid "Allow Adjust FeeScales"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:173
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:182
+msgid "check to search for a similar sounding name"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3364
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:34
-msgid "Commit Changes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:175
+msgid ""
+"Enter either the full name or the first few letters of the name.\n"
+"\n"
+"If you are unsure of the spelling, type in the COMPLETE name,\n"
+"and check the adjacent \"sounds like\" box.\n"
+"Be wary of middle names. \n"
+"eg. \"Neil\" does NOT sound like \"Neil Alexander\"!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3365
-msgid "show table xml"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:184
+msgid "Address includes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3366
-msgid "Feesscale Tester"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:186
+msgid "openMolar will search line1 and line2 of the address for this text"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3367
-msgid "Feescales"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:189
+msgid "open molar will search tel1, tel2 and mobile for numbers present here."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3369
-msgid "Reply"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:191
+msgid "search for a postcode"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3370
-msgid "Alt+R"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:204
+msgid "Payments for treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3371
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:306
-msgid "Delete"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:206
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:208
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:210
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:212
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:167
+msgid "-"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3372
-msgid "Del, Backspace"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:209
+msgid "Debit Card"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3373
-msgid "&set parent"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:211
+msgid "Credit Card"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3374
-msgid "Alt+S"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:213
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:57
+msgid "Other Payments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3375
-msgid "New Topic"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:214
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:92
+msgid "Sundries"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3376
-msgid "Search by keyword"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:215
+msgid "Annual HDP"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3380
-msgid "Show Topics for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:216
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:655
+msgid "Miscellaneous"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3383
-msgid "Include Deleted Posts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:218
+msgid "Amount which will appear on receipt (read only)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3384
-msgid "Split Replies"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py:56
+msgid "Raise Permissions"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3385
-msgid "Group replies"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py:57
+msgid ""
+"Supervisor Rights required to Perform This Action.\n"
+"Please enter password."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3386
-msgid "&Collapse Replies"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:66
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:73
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1406
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:375
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:390
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:40
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:60
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:68
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/gp17/gp17_printer.py:53
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:434
+msgid "Question"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3387
-msgid "&Expand Replies"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:67
+msgid "Print Formatting"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3388
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1918
-msgid "FORUM"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:68
+msgid "Minimal"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3389
-msgid "Wiki"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:69
+msgid "Full Page"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3390
-msgid "&File"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:585
+msgid "Advanced Record Alteration"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3391
-msgid "&Help"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:586
+msgid "NHS current fees (money0)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3392
-msgid "&Preferences"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:587
+msgid "NHS payments (money2)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3393
-msgid "View"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:588
+msgid "NHS estimated (money4)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3394
-msgid "Appointments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:589
+msgid "private estimate (money5)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3395
-msgid "Tools"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:591
+msgid "Exempt - nhs gross - completed treatment (money6)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:593
+msgid "Exempt - NHS gross - estimated current (money7)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:594
+msgid "credit (money8)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:595
+msgid "debt (money9)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:596
+msgid "debt2 (money10)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:597
+msgid "money 11 (always 0!)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:598
+msgid "private current fees (money1) "
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:599
+msgid "private payments (money3)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:600
+msgid "ALL AMOUNTS ARE IN PENCE (cents)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:601
+msgid "Outstanding <br />amount"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:602
+msgid "0.00"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:603
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:605
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:623
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:637
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:652
+msgid "Apply Changes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:604
+msgid "Money"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:606
+msgid "Last CE (pd5)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:607
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:609
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:611
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:613
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:615
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:617
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:619
+msgid "Add Date"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:608
+msgid "Last ECE (pd6)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:610
+msgid "Last FCA (pd7)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:612
+msgid "Last OPT (pd8)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:614
+msgid "Last intraoral Xrays (pd9)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:616
+msgid "Last SP (pd10)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:618
+msgid "Last Account sent (billdate)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:622
+msgid "Dates"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:624
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:638
+msgid "Xray"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:626
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:640
+msgid "anaesthetics"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:630
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:644
+msgid "new upper"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:631
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:645
+msgid "new lower"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:632
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:646
+msgid "repair upper"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:633
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:647
+msgid "repair lower"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:636
+msgid "Treatment Plan"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:650
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:73
+msgid "Completed Treatment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:651
+msgid "Hidden Notes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:97
+msgid "Post a memo about this Patient"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:98
+msgid "Expiry Policy"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:99
+msgid "Do Not Expire"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:100
+msgid "Expire on this date"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:101
+msgid "Viewable by"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:103
+msgid "Surgery Machines"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:104
+msgid "Reception Machines"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_select_patient.py:54
+msgid "Make a Selection"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:66
+msgid "Delete this memo when I close this"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:186
+msgid "Enter an appointment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:187
+msgid "Appointment with"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:189
+msgid "5 minutes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:190
+msgid "10 minutes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:191
+msgid "15 minutes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:192
+msgid "20 minutes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:193
+msgid "30 minutes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:194
+msgid "40 minutes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:195
+msgid "45 minutes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:196
+msgid "1 hour"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:197
+msgid "1 hour 15 minutes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:198
+msgid "1 hour 20 minutes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:199
+msgid "1 hour 30 minutes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:200
+msgid "1 hour 45 minutes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:201
+msgid "2 hours"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:202
+msgid "2 hours 30 minutes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:203
+msgid "3 hours"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:206
+msgid "Combined Appointment With Hygenist?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:207
+msgid "Reason 1"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:208
+msgid "Reason 3"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:209
+msgid "Reason 2"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:210
+msgid "Brief Note for Clinician (optional)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:211
+msgid "Schedule Appointment Now"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:156
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:162
+msgid "Summary"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:165
+msgid "Messages and Tasks"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:168
+msgid "My Calendar"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:171
+msgid "Holiday Planner"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:166
+msgid "openMolar"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:167
+msgid "System Password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:168
+msgid "User 1(required)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:169
+msgid "User 2 (optional)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:170
+msgid "Surgery Machine"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:171
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:75
+msgid "Reception Machine"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:173
+msgid "change"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:74
+msgid "Please set the Surgery Number"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:76
+msgid "Surgery One"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:77
+msgid "Surgery Two"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:78
+msgid "Surgery Three"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:79
+msgid "Surgery Four"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:80
+msgid "Surgery Five"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:81
+msgid "Surgery Six"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:152
+msgid "ToothId"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:153
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:352
+msgid "Pocketing"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:155
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:352
+msgid "Plaque"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:156
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:352
+msgid "Recession"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:157
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:354
+msgid "Furcation"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:158
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:353
+msgid "Suppuration"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:159
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:355
+msgid "Mobility"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:161
+msgid "Copy &All"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:162
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:164
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:226
+msgid "delete tooth data"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:163
+msgid "Cp"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:165
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:247
+msgid "Apply and move Back a tooth"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:166
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:252
+msgid "Apply & Move to Next Tooth"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:168
+msgid "I"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:169
+msgid "II"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:170
+msgid "III"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:227
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:371
+msgid "ADD COMMENTS"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:228
+msgid "!KUO"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:229
+msgid "!Mobile Tooth"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:230
+msgid "!Early Caries"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:231
+msgid "!Filling Missing"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:232
+msgid "!Chipped"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:233
+msgid "!Cracked"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:234
+msgid "!Poor Prognosis"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:235
+msgid "!Extract Soon"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:236
+msgid "!Implant required"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:237
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:373
+msgid "DELETE COMMENTS"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:238
+msgid "AM"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:239
+msgid "CO"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:240
+msgid "GL"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:242
+msgid "Po"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:243
+msgid "extract (plan only!)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:244
+msgid "EX"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:245
+msgid "root treatment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:246
+msgid "RT"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:248
+msgid "porcelain veneer"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:249
+msgid "DR"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:250
+msgid "Apply & Add Another Item"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:251
+msgid "&&"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:80
+msgid "Tooth Property Editor"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:81
+msgid "UR8"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:82
+msgid "Items"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:83
+msgid "Database Line"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/contract_gui_module.py:120
+msgid "erroneous exemption category entered"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:121
+msgid "Out Of Office"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:679
+msgid "Made"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:679
+msgid "at"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:683
+msgid "Made on"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:734
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:773
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:373
+msgid "Load Patient"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:737
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:776
+msgid "Add/Edit Memo"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:740
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:777
+msgid "Cancel Appointment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:744
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:784
+msgid "Clear Block"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:748
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:795
+msgid "Block or use this space"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:751
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:779
+msgid "Print A Medical Form"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:825
+msgid "Bad Time Sequence!"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:825
+msgid "Whoops!"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:148
+msgid "Public Holidays"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:149
+msgid "Enter the information for "
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:455
+msgid "DATE"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:722
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:729
+msgid "Edit day memos"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:723
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:731
+msgid "Edit Public Holiday information"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:314
+msgid "Toggle Deciduous State"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:328
+msgid "Delete All Restorations"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:334
+msgid "Add Comments"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:338
+msgid "Show History"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:476
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/simple_chartwidget.py:249
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/chart_widget.py:220
+msgid "Left"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:479
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/simple_chartwidget.py:252
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/chart_widget.py:223
+msgid "Right"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/confirming_check_box.py:58
+msgid "Are you Sure"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/confirming_check_box.py:58
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/base_dialogs.py:133
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/base_dialogs.py:162
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:83
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:117
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:290
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:360
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:73
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1386
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:187
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:139
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:164
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:528
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:565
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:352
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:470
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:629
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3100
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:216
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:404
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:420
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:76
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:409
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:108
+msgid "Confirm"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:52
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:80
+msgid "Browsing Mode"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:74
+msgid "Scheduling Mode"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:76
+msgid "Blocking Mode"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:78
+msgid "Notes Mode"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:393
+msgid "completed already"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:397
+msgid "There are multiple treatments associated with this estimate item"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:400
+msgid "All must be completed for the full charge to be applied"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:402
+msgid "information"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:419
+msgid "Delete examination from this treatment plan and estimate?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:69
+msgid "CSET"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:113
+msgid "Planned Items Total"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:114
+msgid "Interim Charges"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:115
+msgid "Completed Items Total"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:116
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:196
+msgid "TOTAL"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:373
+msgid "from treatment plan and estimate"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:101
+msgid "Open the patient's diary"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:105
+msgid "Launch the Appointment Wizard"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:109
+msgid "Previous appointment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:113
+msgid "Next available appointment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:202
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:305
+msgid "No patient Selected"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:427
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:133
+msgid "error"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:428
+msgid "No patient selected"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:450
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:222
+msgid "Close"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:42
+msgid "Mark the selected tooth as missing"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:46
+msgid "Mark the selected tooth as artificial"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:50
+msgid "Mark the selected tooth as root present"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:54
+msgid "Permanent Tooth Also Present"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:58
+msgid "Supernumary Tooth Present"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:62
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:70
+msgid "Mark the selected tooth as partially erupted"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:66
+msgid "Mark the selected tooth as over erupted"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:74
+msgid "Toggle selected tooth/teeth as deciduous"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:272
+msgid "Toggle Pin Retention for current Filling"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:290
+msgid "Crowns"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:291
+msgid "Posts"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:292
+msgid "Bridges"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:293
+msgid "Implants"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:294
+msgid "Fissure Sealants"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:295
+msgid "Endodontics"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:296
+msgid "Surgical Tx"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:37
+msgid "Account Dialog"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:38
+msgid "Please Choose the tone of this letter"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:41
+msgid "Normal Account - Very Polite"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:42
+msgid "Mildly assertive request"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:44
+msgid "Threaten with Debt Collector"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py:75
+msgid "Complete Treatments"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py:76
+msgid "What treatment has been performed?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:36
+msgid "Forename"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+msgid "dob"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:38
+msgid "POSTCODE"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:48
+msgid "Address Matches"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:81
+msgid "Top 12 address matches for"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:100
+msgid "Advanced Treatment Planning"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:108
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:132
+msgid "Planned Text"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:111
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:135
+msgid "Completed Text"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:117
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:141
+msgid "Field"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:170
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:195
+msgid "Show Chart Items"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:193
+msgid "Hide Chart Items"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alterAday.py:150
+msgid "Clinician Times"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alterAday.py:170
+msgid "values from"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:49
+msgid "Alter Cashbook Entry"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:70
+msgid "Patient Number"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:71
+msgid "Patient Name"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:74
+msgid "Payment Type"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:88
+msgid "Enable Full Edit"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:52
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:55
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:54
+msgid "Choose from the following options"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:76
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:78
+msgid "You haven't completed this option"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:94
+msgid "What are you Modifying?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:97
+msgid "An existing Upper Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:99
+msgid "An existing Lower Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:174
+msgid "What best describes the denture type?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:176
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:160
+msgid "Acrylic Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:177
+msgid "Metal Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:205
+msgid "Please select teeth to be added to this denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:251
+msgid "How Many Clasps?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:281
+msgid "Does this work require the taking of an impression?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:314
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:230
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:257
+msgid "You have completed your input."
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:315
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:231
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:258
+msgid "Please click on Apply"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:325
+msgid "Alterations to an existing Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:359
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:133
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:299
+msgid "Upper Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:360
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:134
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:300
+msgid "Lower Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:365
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:270
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:305
+msgid "Next"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:385
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:69
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:103
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:288
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:325
+msgid "Whoops"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:440
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:451
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:377
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:387
+msgid "Warning"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:441
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:378
+msgid "Your upper denture input is invalid"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:452
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:388
+msgid "Your lower denture input is invalid"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_todays_notes.py:56
+msgid "Open Phrasebook"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:43
+msgid "Appointment Card for"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:49
+msgid "Include Today's appointments?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3396
-msgid "&Export Patient to disk"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:106
+msgid "No appointments to print!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3397
-msgid "&Import Patient from disk"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:47
+msgid "User choice"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3398
-msgid "About &OpenMolar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:49
+msgid "Set the Appointment Viewing Mode"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3399
-msgid "&About QT"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:53
+msgid "Browsing"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3401
-msgid "Appointment Font Size"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:58
+msgid "Scheduling"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3402
-msgid "Table View For Charting"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:59
+msgid "make appointments for a patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3403
-msgid "Clear Today's Emergency Slots"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:63
+msgid "Blocking"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3404
-msgid "Test Print an NHS Form"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:64
+msgid "block time periods. eg. lunch times etc."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3405
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3420
-msgid "options"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:68
+msgid "Note Checking"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3406
-msgid "log queries in underlying terminal"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:69
+msgid "check notes for today's patients"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3407
-msgid "Set Clinician"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:63
+msgid "Appointment Preferences for Patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3409
-msgid "Choose Database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:68
+msgid "Recall Patient Periodically"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3410
-msgid "FeeScale Adjuster"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:72
+msgid "Dentist Recall"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3411
-msgid "Select && Print Daylists"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:87
+msgid "dentist recall period (months)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3412
-msgid "Change Language"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:89
+msgid "Next Recall Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3413
-msgid "Full Screen Mode (Ctrl-Alt-F)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:90
+msgid "Shortcuts (months from today)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3414
-msgid "Ctrl+Alt+F"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:94
+msgid "Hygienist Recall"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3415
-msgid "Create/Modify database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:107
+msgid "hygienist recall period (months)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3416
-msgid "Advanced Record Management"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:109
+msgid "Next Recall"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3417
-msgid "Show Geek Column"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
+msgid "Post"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3418
-msgid "test"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:125
+msgid "Recall method"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3419
-msgid "t"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:34
+msgid "Select an Assitant"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3421
-msgid "Font Size"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:43
+msgid "No Assistant"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3422
-msgid "Forum - show advanced options"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:38
+msgid "Apply Saved Address"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3423
-msgid "Set Assistant"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:46
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:48
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:42
+msgid "Address 1"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:157
-msgid "Medical Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:47
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:42
+msgid "Address 2"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:158
-msgid "Doctor's details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:51
+msgid "Post Code"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:159
-msgid "Doctor's Name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:52
+msgid "Home Telephone"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:160
-msgid "Address / Tel No"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:78
+msgid "Existing"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:161
-msgid "Known Conditions"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:151
+msgid "No previous address details found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:162
-msgid "Current Medication"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/base_dialogs.py:133
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:185
+msgid "Abandon Changes?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:163
-msgid "Past Medication"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:46
+msgid "Begin Make Appointment Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:164
-msgid "Allergies"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:49
+msgid "Please set criteria for making this appointment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:165
-msgid "Heart"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:57
+msgid "When to Look"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:166
-msgid "Lungs"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:63
+msgid "Find First Available Appointment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:167
-msgid "Liver"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:67
+msgid "7 Days Hence"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:168
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:126
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:319
-msgid "Bleeding"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:69
+msgid "After Patient's last appointment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:169
-msgid "Kidneys"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:77
+msgid "Day or Week Graphical View"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:170
-msgid "Anaesthetic / operations"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:92
+msgid "Clinician selection policy"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:172
-msgid "Mark as Checked Today"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:97
+msgid "Specified Clinician"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:173
-msgid "Checked"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:99
+msgid "Any Dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:174
-msgid "Mark Patient as Med Alert"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:100
+msgid "Any Hygienist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:105
-msgid "New CPITN score"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:102
+msgid "Any Clinician"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:106
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:112
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:118
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:124
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:130
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:136
-msgid "0"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:113
+msgid "Emergency time management"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:108
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:114
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:120
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:126
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:132
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:138
-msgid "2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:115
+msgid "Ignore Emergency Spaces"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:109
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:115
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:121
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:127
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:133
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:139
-msgid "3"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:124
+msgid "Look for appointments on these days"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:110
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:116
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:122
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:128
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:134
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:140
-msgid "4"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:132
+msgid "Look for Joint Appointments with the hygienist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:111
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:117
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:123
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:129
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:135
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:141
-msgid "*"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:142
+msgid "Search Now"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:63
-msgid "New Course"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:195
+msgid "begin making appointment for patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:64
-msgid "Start a new Course of Treatment with the following Criteria?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/block_wizard.py:111
+msgid "applying changes for"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:65
-msgid "Contracted Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:58
+msgid "No patient chosen!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:68
-msgid "Acceptance Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:109
+msgid "Start is outwith slot bounds (too early)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:289
-msgid "OpenMolar - First Run"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:112
+msgid "Start is outwith slot bounds (too late)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:291
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Droid Sans'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
-"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">This first run application will </p>\n"
-"<ul style=\"-qt-list-indent: 1;\"><li style=\" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">set your system password</li>\n"
-"<li style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">make this client aware of your mysql server settings</li>\n"
-"<li style=\" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">install a small (4 patient) demo database if required.</li></ul></body></html>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:115
+msgid "Finish is outwith slot bounds (too late"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:300
-msgid "Please enter a password to prevent unauthorised running of this application."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:118
+msgid "Finish is outwith slot bounds (too early"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:302
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:314
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:338
-msgid "show"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:120
+msgid "length of appointment is too short"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:303
-msgid "Repeat Password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:123
+msgid "no reason for the block given"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:304
-msgid "Where is your mysql server located? **"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:126
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:113
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1686
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:112
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:135
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:206
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:227
+msgid "no patient selected"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:306
-msgid "Port"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:132
+msgid "Unable to commit because"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:307
-msgid ""
-"** If you do not have a mysql server on your network, please quit this setup, and install mysql server now.\n"
-"\n"
-"If you are a debian or ubuntu user, \"sudo apt-get install mysql-server\"\n"
-"and make a note of the root password you create during set up. "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:150
+msgid "patient not found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:311
-msgid "Database Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:160
+msgid "Chosen Patient is"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:313
-msgid "(mysql)Password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:162
+msgid "no patient chosen"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:315
-msgid "Database Name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:43
+msgid "Bridge Treatment Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:316
-msgid "Test this Connection"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:51
+msgid "Plan a New Bridge"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:317
-msgid "Create A Demo Database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:53
+msgid "Recement/Repairs"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:318
-msgid "Use with an existing database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:36
+msgid "Fissure Sealant"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:319
-msgid ""
-"OK.... you are all set to go.\n"
-"\n"
-"When running openMolar, you are presented a login screen.\n"
-"\n"
-"Password = the one you specified earlier\n"
-"User1 = any registered user (demo database has one user \"user\")\n"
-"User2 = any registered user (can be left blank)\n"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:37
+msgid "PRR restoration with composite"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:327
-msgid "Launch OpenMolar Now"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:41
+msgid "Pulp Extirpation - 1 canal"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:328
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Droid Sans'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
-"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">To create a database, and set the privileges for user, requires logging into mysql as the root mysql user.</p>\n"
-"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"></p>\n"
-"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">OpenMolar does NOT store this password.</p>\n"
-"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br />Please enter the password of the ROOT mysql user.</p>\n"
-"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">(note - on most mysql setups, root access is disabled unless the server is on localhost)</p></body></html>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:42
+msgid "Pulp Extirpation - multiple canals"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:337
-msgid "Root mysql password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:43
+msgid "Root Canal"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:339
-msgid "Creating Database.... please wait"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:44
+msgid "Incomplete Endodontics"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:340
-msgid "Back"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:48
+msgid "Extraction"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:341
-msgid "Proceed"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:49
+msgid "Surgical Extraction"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_options.py:46
-msgid "NHS Form Printer Settings"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:50
+msgid "Apicectomy"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_options.py:47
-msgid "Left Margin Width"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:61
+msgid "Chart Treatment Choice Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_options.py:48
-msgid "Top Margin Width"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:78
+msgid "Show Treatments from all feescales"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:168
-msgid "1st referral"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:106
+msgid "No Matching items to show. Perhaps this is due to the feescale for this patient?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:169
-msgid "re - referral"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:126
+msgid "No items of this type have found in any feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:170
-msgid "Previous Referral Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:85
+msgid "ToothBrushing Instruction Given"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:171
-msgid "I am Willing to carry out simple treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:88
+msgid "Dietary Advice Given"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:172
-msgid "Reason for Referral"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:91
+msgid "Fluoride Varnish Applied"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:173
-msgid "Crowding"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:93
+msgid "Fee claimable for patients betwen 2 and 5"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:174
-msgid "Spaced"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:126
+msgid "Please enter a valid postcode"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:176
-msgid "Mild"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:138
+msgid "KNOWN SIMD"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:177
-msgid "Moderate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:145
+msgid "Polling website with Postcode"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:178
-msgid "Severe"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:161
+msgid "Error polling website"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:179
-msgid "Incisal Relationship"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:164
+msgid "Timeout polling website"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:180
-msgid "Overjet:"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:168
+msgid "RESULT"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:181
-msgid "mm"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:186
+msgid "Manual Input Required"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:182
-msgid "Overbite"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:188
+msgid "Online lookup has failed, please enter the SIMD manually"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:183
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:288
-msgid "Complete"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:34
+msgid "Select a Clinician"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:184
-msgid "InComplete"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:43
+msgid "NONE"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:185
-msgid "Traumatic"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:84
+msgid "Set assistant as"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:186
-msgid "%"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:47
+msgid "Complete Multiple Treatments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:187
-msgid "Relevant Medical History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:50
+msgid "You have selected multiple treatments."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:188
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Droid Serif'; font-size:7pt; font-weight:400; font-style:normal;\">\n"
-"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"></p></body></html>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:51
+msgid "Please complete, reverse or delete then apply changes."
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:67
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:57
+msgid "Planned"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:112
+msgid "Complete All"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:115
+msgid "Reverse All"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:36
+msgid "Porcelain Jacket"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:37
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:37
+msgid "Gold"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:38
+msgid "Porcelain/Metal"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:39
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:39
+msgid "Lava"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:40
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:40
+msgid "Opalite"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:41
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:41
+msgid "Emax"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:42
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:42
+msgid "Everest"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:43
+msgid "Stainless"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:44
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:43
+msgid "Resin"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:59
+msgid "Crown Choice Dialog"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:77
+msgid "Show Crowns types from all feescales"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:43
+msgid "Denture Treatment Dialog"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:51
+msgid "Plan a New Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:53
+msgid "Alter an Existing Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:91
+msgid "Openmolar Documents Dialog"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:95
+msgid "Please choose a document to open"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:101
+msgid "For help configuring this feature, see"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:112
+msgid "You have no documents stored in"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:136
+msgid "docs.xml is not parseable"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:170
+msgid "Error opening PDF file"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:51
+msgid "Duplicate receipts for Patient"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:56
+msgid "No previous receipts found!"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:59
+msgid "Reprint an existing receipt"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:66
+msgid "Generate a Duplicate receipt"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:165
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:899
+msgid "error reviewing PDF file"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:178
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:98
+msgid "Professional Services"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:184
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:102
+msgid "duplicate receipt for"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:68
+msgid "Please enter the examining Dentist"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:87
+msgid "is now both the registered and course dentist"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:88
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:103
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:528
+msgid "Is this correct?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:89
+msgid "confirming this will remove reference to"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:102
+msgid "performed this exam"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:107
+msgid "confirming this will change the course dentist"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:108
+msgid "but not the registered dentist"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:112
+msgid "consider making"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:114
+msgid "the registered dentist"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:135
+msgid "You already have a completed exam on this course of treatment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:137
+msgid "Unable to perform exam"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:144
+msgid "Examination not applied"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:180
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:145
+msgid "performed by"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:188
+msgid "WARNING - Not updating recall due to patients recall settings"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:42
+msgid "Address 3"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:43
+msgid "TOWN"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:193
-msgid "Dental History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:104
+msgid "Add Record"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:194
-msgid "Teeth With Poor Prognosis"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:105
+msgid "to this family group?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:195
-msgid "Patient Motivation"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:125
+msgid "Which address should be used?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:196
-msgid "Removable Applicance"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:167
+msgid "Synchronise Addresses"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:197
-msgid "Fixed Appliance"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:171
+msgid "Standard Search"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:129
-msgid "Patient Finder"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:174
+msgid "Address Search"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:130
-msgid "Fill in a few of the following fields to get a list of possible patients"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:178
+msgid "Delete this group"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:131
-msgid "Repeat Last Search"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:183
+msgid "Add members"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:132
-msgid "SNO or Surname"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:188
+msgid "Manage Group"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:133
-msgid ""
-"Enter either the full name or the first few letters of the name.\n"
-"\n"
-"If you are unsure of the spelling, type in the COMPLETE name,\n"
-"and check the adjacent \"sounds like\" box."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:204
+msgid "Manage Family Group"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:137
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:145
-msgid "check to search for a similar sounding name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:237
+msgid "from group"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:139
-msgid ""
-"Enter either the full name or the first few letters of the name.\n"
-"\n"
-"If you are unsure of the spelling, type in the COMPLETE name,\n"
-"and check the adjacent \"sounds like\" box.\n"
-"Be wary of middle names. \n"
-"eg. \"Neil\" does NOT sound like \"Neil Alexander\"!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:237
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:255
+msgid "Unlink"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:147
-msgid "Address includes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:270
+msgid "This patient does not belong to any family group."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:148
-msgid "openMolar will search line1 and line2 of the address for this text"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:272
+msgid "Create a New Family Group"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:150
-msgid "open molar will search tel1, tel2 and mobile for numbers present here."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:275
+msgid "Show similar addresses"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:152
-msgid "search for a postcode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:291
+msgid "Remove"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:171
-msgid "Payments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:292
+msgid "from this family group?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:172
-msgid "Payments for treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:330
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:337
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/feescale_tester.py:169
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py:252
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:446
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:264
+msgid "Information"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:173
-msgid "Cash"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:331
+msgid "Addresses are all identical - nothing to do!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:174
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:176
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:178
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:180
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:139
-msgid "-"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:338
+msgid "Address(es) updated"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:175
-msgid "Cheque"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:361
+msgid "Delete this family group?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:177
-msgid "Debit Card"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:83
+msgid "no match found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:179
-msgid "Credit Card"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:38
+msgid "Form options"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:181
-msgid "Other Payments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:48
+msgid "use test mode (print boxes)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:182
-msgid "Sundries"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:50
+msgid "use a background image for the form (if available)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:183
-msgid "Annual HDP"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:74
+msgid "Prior Approval"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:184
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:567
-msgid "Miscellaneous"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:96
+msgid "GP17 Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:185
-msgid "Amount which will appear on receipt (read only)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:98
+msgid "Print a GP17 Form"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py:40
-msgid "Raise Permissions"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:110
+msgid "Use this dentists stamp?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py:41
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
-"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Supervisor Rights required to Perform This Action.<br />Please enter password.</p></body></html>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:115
+msgid "Chart"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:84
-msgid "This does nothing at the moment - the idea is you leave a task for someone about this patient."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:120
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:585
+msgid "Treatments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:85
-msgid "Task assigned to"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:122
+msgid "Include Chart Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:86
-msgid "Neil"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:129
+msgid "Include Course Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:87
-msgid "Bea"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:51
+msgid "WARNING - THE FOLLOWING TREATMENTS ARE ALREADY PLANNED."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:88
-msgid "Helen"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:102
+msgid "Please enter a dentist / hygienist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:89
-msgid "Andy"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:36
+msgid "Titanium Implant"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:90
-msgid "Frances"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:37
+msgid "Implant Abutment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:91
-msgid "etc...."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:38
+msgid "Implant Crown"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:92
-msgid "Write Today's notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:39
+msgid "Implant Bridge Retainer"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:93
-msgid "Contact this patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:40
+msgid "Implant Bridge Pontic"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:94
-msgid "Decision needed"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:54
+msgid "Implant Choice Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:96
-msgid "Urgent"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/newCourse.py:72
+msgid "Some fields are missing, please check"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:97
-msgid "ASAP"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:38
+msgid "Bonded Porcelain"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:98
-msgid "Routine"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:97
+msgid "Upper Bridge"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:99
-msgid "By deadline"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:98
+msgid "Lower Bridge"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_pt_task.py:100
-msgid "Note"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:120
+msgid "Bridge Type"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:51
-msgid "Print Formatting"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:121
+msgid "Conventional Bridge"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:52
-msgid "Minimal"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:122
+msgid "Resin Retained Bridge"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:53
-msgid "Full Page"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:144
+msgid "Material"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_raiseCharge.py:54
-msgid "Raise A Charge"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:176
+msgid "Please select teeth which are to be used as retainers"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_raiseCharge.py:55
-msgid "Raise A charge for today's treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:203
+msgid "Please select teeth which are to be used as pontics"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_raiseCharge.py:56
-msgid "Description (eg \"CE\" or \"MOD\" or \"Bleach\"... )"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py:242
+msgid "Chart/Plan a Bridge"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_raiseCharge.py:58
-msgid "\302\243"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:98
+msgid "Complete Denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_raiseCharge.py:59
-msgid "Repeat as many times as necessary - amounts will accumulate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:100
+msgid "Partial Denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:507
-msgid "Advanced Record Alteration"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:161
+msgid "Chrome Denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:508
-msgid "NHS current fees (money0)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:162
+msgid "Flexible Denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:509
-msgid "NHS payments (money2)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:184
+msgid "Please select teeth which this denture is to replace"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:510
-msgid "NHS estimated (money4)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:226
+msgid "You may wish to add the following optional items"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:511
-msgid "private estimate (money5)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:229
+msgid "Special Tray"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:512
-msgid "Exempt - nhs gross - completed treatment (money6)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:230
+msgid "Soft Lining"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:513
-msgid "Exempt - NHS gross - estimated current (money7)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:268
+msgid "Add A New Denture To The Treatment Plan"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:514
-msgid "credit (money8)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/nhs_forms_config_dialog.py:45
+msgid "Left Offset"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:515
-msgid "debt (money9)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/nhs_forms_config_dialog.py:46
+msgid "Top Offset"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:516
-msgid "debt2 (money10)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/nhs_forms_config_dialog.py:47
+msgid "Horizontal Scaling"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:517
-msgid "money 11 (always 0!)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/nhs_forms_config_dialog.py:48
+msgid "Vertical Scaling"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:518
-msgid "private current fees (money1) "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/nhs_forms_config_dialog.py:79
+msgid "NHS Form Configuration"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:519
-msgid "private payments (money3)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:56
+msgid "Annual Hdp Payment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:520
-msgid "ALL AMOUNTS ARE IN PENCE (cents)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:58
+msgid "Patient Refunds"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:521
-msgid "Outstanding <br />amount"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:93
+msgid "Total"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:522
-msgid "0.00"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:175
+msgid "unusual payments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:523
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:525
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:541
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:553
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:566
-msgid "Apply Changes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/post_choice_dialog.py:38
+msgid "Cast Precious Metal"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:524
-msgid "Money"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/post_choice_dialog.py:39
+msgid "Cast Non-Precious Metal"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:526
-msgid "Last CE (pd5)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/post_choice_dialog.py:50
+msgid "Post Choice Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:527
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:529
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:531
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:533
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:535
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:537
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:539
-msgid "Add Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/post_choice_dialog.py:68
+msgid "Show Post types from all feescales"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:528
-msgid "Last ECE (pd6)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/print_record_dialog.py:43
+msgid "Print the record of"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:530
-msgid "Last FCA (pd7)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_dialog.py:45
+msgid "start date (inclusive)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:532
-msgid "Last OPT (pd8)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_dialog.py:50
+msgid "end date (inclusive)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:534
-msgid "Last intraoral Xrays (pd9)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_dialog.py:56
+msgid "Dentist choice (leave unchecked for all)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:536
-msgid "Last SP (pd10)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:42
+msgid "What's changed?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:538
-msgid "Last Account sent (billdate)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:53
+msgid "Discard All Changes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:540
-msgid "Dates"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:55
+msgid "Cancel and Continue Editing"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:542
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:554
-msgid "Xray"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:74
+msgid "Are you sure you want to discard these changes?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:544
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:556
-msgid "anaesthetics"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:50
+msgid "English (United Kingdom)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:548
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:560
-msgid "new upper"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:51
+msgid "English (Australia)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:549
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:561
-msgid "new lower"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:52
+msgid "Afrikaans"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:550
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:562
-msgid "repair upper"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:53
+msgid "Danish"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:551
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:563
-msgid "repair lower"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:54
+msgid "French"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:552
-msgid "Treatment Plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:55
+msgid "German"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:564
-msgid "Completed Treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:56
+msgid "Hungarian"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:565
-msgid "Hidden Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:57
+msgid "Indonesian"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:59
-msgid "Related Patients"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:58
+msgid "Italian"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:60
-msgid "This Patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:59
+msgid "Occitan"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:61
-msgid "Known Family Members"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:60
+msgid "Polish"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_related_patients.py:62
-msgid "Address Matches"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:61
+msgid "Portuguese"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveDiscardCancel.py:60
-msgid "Confirmation Required"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:62
+msgid "Slovak"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveDiscardCancel.py:61
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/saveDiscardCancel.py:65
-msgid "What's Changed?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:63
+msgid "Spanish"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:75
-msgid "Post a memo about this Patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:64
+msgid "Turkish"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:76
-msgid "Expiry Policy"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:65
+msgid "Romanian"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:77
-msgid "Do Not Expire"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:66
+msgid "Greek"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:78
-msgid "Expire on this date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:113
+msgid "no translation file found for %s"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:79
-msgid "Viewable by"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:71
+msgid "Demote"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:80
-msgid "All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:71
+msgid "Erase"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:81
-msgid "Surgery Machines"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:71
+msgid "Item Shortcut"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:82
-msgid "Reception Machines"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:102
+msgid "click to edit Item - "
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:83
-msgid "Author"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:115
+msgid "click to delete item - "
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_select_patient.py:37
-msgid "Make a Selection"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:122
+msgid "click to promote Item - "
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:50
-msgid "Delete this memo when I close this"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:205
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:329
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:206
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:193
+msgid "advisory"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:149
-msgid "Enter an appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:387
+msgid "Please select an appointment to schedule"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:150
-msgid "Appointment with"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:391
+msgid "appointment already scheduled for"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:152
-msgid "5 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:461
+msgid "Reached"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:153
-msgid "10 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:463
+msgid "which is specified as the book end point"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:154
-msgid "15 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:512
+msgid "Please select an appointment to place here"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:155
-msgid "20 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:516
+msgid "Please choose another appointment - this one is made already!"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:156
-msgid "30 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:526
+msgid "You have chosen an appointment with"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:157
-msgid "40 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:555
+msgid "Confirm Make appointment for"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:158
-msgid "45 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:602
+msgid "Error putting appointment back into patient diary"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:159
-msgid "1 hour"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:610
+msgid "more appointments to schedule"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:160
-msgid "1 hour 15 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:617
+msgid "Error making appointment - sorry!"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:161
-msgid "1 hour 20 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:618
+msgid "It is most likely that another user utilised this space."
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:162
-msgid "1 hour 30 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:620
+msgid "Please try again."
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:163
-msgid "1 hour 45 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:819
+msgid "This date is beyond the diary limit."
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:164
-msgid "2 hours"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:820
+msgid "If the appointment wizard has brought you here"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:165
-msgid "2 hours 30 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:822
+msgid "you should search again with different criteria."
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:166
-msgid "3 hours"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:824
+msgid "for instance..."
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:168
-msgid "Combined Appointment With Hygenist?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:825
+msgid "no excluded days"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:169
-msgid "Reason 1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:826
+msgid "ignore emergencies"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:170
-msgid "Reason 3"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:827
+msgid "add or view more clinicians."
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:171
-msgid "Reason 2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:831
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:975
+msgid "You can't schedule an appointment in the past"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:172
-msgid "Brief Note for Clinician (optional)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:837
+msgid "No matching appointments found"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:173
-msgid "Schedule Appointment Now"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1236
+msgid "No books to show!"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:133
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:137
-msgid "Summary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1382
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:414
+msgid "Confirm Delete appointment at"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:135
-msgid "Agenda"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1384
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:418
+msgid "with"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:138
-msgid "Messages and Tasks"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1407
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:435
+msgid "Removed from appointment book - keep for rescheduling?"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:139
-msgid "My Calendar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1413
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:393
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:441
+msgid "Sucessfully removed appointment"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:140
-msgid "Holiday Planner"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1416
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:443
+msgid "Error removing from patient diary"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:131
-msgid "openMolar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1421
+msgid "Error Removing from Appointment Book"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:132
-msgid "System Password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1434
+msgid "Do you want to unblock the selected slot?"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:133
-msgid "User 1(required)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1463
+msgid "unable to block - has the book been altered elsewhere?"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:134
-msgid "User 2 (optional)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1481
+msgid "unable to make appointment - has the book been altered elsewhere?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:135
-msgid "Surgery Machine"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/cashbook_module.py:73
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/daybook_module.py:137
+msgid "bad date sequence"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:136
-msgid "Reception Machine"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:53
+msgid "Please save the old course changes before continuing"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:138
-msgid "change"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:62
+msgid "It looks as if another user is starting a course of treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:49
-msgid "Please set the Surgery Number"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:64
+msgid "Please allow this other user to commit their changes then reload this record before continuing."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:50
-msgid "Surgery One"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:66
+msgid "If you are seeing this message and are sure no other user is using this record, use menu->tools->Fix Locked New Course of Treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:51
-msgid "Surgery Two"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:75
+msgid "unable to plan or perform treatment if the patient does not have an active course"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:52
-msgid "Surgery Three"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:139
+msgid "Sucessfully started new course of treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_taskWidget.py:51
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_task_widget.py:51
-msgid "Neil's Tasks"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:140
+msgid "Using Feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_taskWidget.py:52
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_task_widget.py:52
-msgid "Edit Selected Task"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:188
+msgid "are you sure you wish to close this course of treatment?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_taskWidget.py:53
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_task_widget.py:53
-msgid "Add a New Task"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:219
+msgid "Resume the previous course of treatment?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:124
-msgid "ToothId"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:240
+msgid "no zombied course found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:125
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:318
-msgid "Pocketing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:243
+msgid "a situation COULD arise where a new course was started but the client lost connectivity crashed (without cleaning up the temporary row in the currtrtmt2 table)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:127
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:318
-msgid "Plaque"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:246
+msgid "Do you wish to recover this row now?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:128
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:318
-msgid "Recession"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:247
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:278
+msgid "question"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:129
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:319
-msgid "Furcation"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fee_table_model.py:175
+msgid "Usercode"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:130
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:319
-msgid "Suppuration"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fee_table_model.py:179
+msgid "brief description"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:131
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:320
-msgid "Mobility"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fee_table_model.py:181
+msgid "Gross Fee"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:133
-msgid "Copy &All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fee_table_model.py:183
+msgid "Charge to Patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:134
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:136
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:226
-msgid "delete tooth data"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:145
+msgid "error applying payment.... sorry!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:135
-msgid "Cp"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:146
+msgid "This shouldn't happen - please report as an urgent bug"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:137
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:243
-msgid "Apply and move Back a tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:232
+msgid "Add to tx plan"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:138
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:246
-msgid "Apply & Move to Next Tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:240
+msgid "Add to tx plan of patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:140
-msgid "I"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:279
+msgid "Items containing"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:141
-msgid "II"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:285
+msgid "phrase not found in feetable"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:142
-msgid "III"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:287
+msgid "itemcodes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:227
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:309
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:352
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:374
-msgid "ADD COMMENTS"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:289
+msgid "usercodes or descriptions"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:228
-msgid "!KUO"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:303
+msgid "IN CURRENT USE"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:229
-msgid "!Mobile Tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:316
+msgid "fee table error"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:230
-msgid "!Early Caries"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:352
+msgid "changed patients status to BAD DEBT"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:231
-msgid "!Filling Missing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/feescale_tester.py:110
+msgid "Shortcut tester"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:232
-msgid "!Chipped"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/feescale_tester.py:171
+msgid "This feescale handles"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:233
-msgid "!Cracked"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/feescale_tester.py:172
+msgid "as a complex code for the following attributes."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:234
-msgid "!Poor Prognosis"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:142
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:167
+msgid "was not found in the patient's default feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:235
-msgid "!Extract Soon"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:144
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:169
+msgid "It is matched in another feescale -"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:236
-msgid "!Implant required"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:147
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:172
+msgid "Shall we add this item from this feescale?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:237
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:376
-msgid "DELETE COMMENTS"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:231
+msgid "WARNING"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:238
-msgid "AM"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:232
+msgid "treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:239
-msgid "CO"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:234
+msgid "has not been succesfully priced"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:240
-msgid "GL"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:235
+msgid "Please edit the estimate manually"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:241
-msgid "Po"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:279
+msgid "Were these xrays taken today?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:244
-msgid "Apply & Add Another Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:377
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:424
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:93
+msgid "Cancel"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:245
-msgid "&&"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:415
+msgid "Reverse and Delete"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:247
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:255
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:263
-msgid "Toggle between static and plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:420
+msgid "Reverse"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:249
-msgid "toggle between deciduous and permanent tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:505
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:358
+msgid "Choose"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:250
-msgid "Dec"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:506
+msgid "OK to add"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:251
-msgid "denture tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:506
+msgid "to patient attribute"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:252
-msgid "AT"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:507
+msgid "Recommended"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:253
-msgid "tooth missing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:508
+msgid "to overide this behaviour"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:254
-msgid "TM"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:508
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:568
+msgid "Use Feescale Method"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:257
-msgid "extract (plan only!)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:509
+msgid "Cancel to abandon this addition entirely"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:258
-msgid "Ex"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:511
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:149
+msgid "Help"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:259
-msgid "root treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:523
+msgid "Confirm you wish to use feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:260
-msgid "RT"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:525
+msgid "for this item"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:261
-msgid "porcelain veneer"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:526
+msgid "The patient's default table is"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:262
-msgid "Cr"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:559
+msgid "You appear to be adding a relatively straightforward code to the patient's treatment plan using their default feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:264
-msgid "Comp"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:561
+msgid "It is normally advisable to add this code conventionally."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:57
-msgid "Tooth Property Editor"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:562
+msgid "Would you like to do this now?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:58
-msgid "UR8"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:586
+msgid "were added conventionally"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:59
-msgid "Items"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:594
+msgid "Exam items can never be added this way"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:60
-msgid "Database Line"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:597
+msgid "This item can not be added to the treatment plan using the feescale method, sorry"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/contract_gui_module.py:98
-msgid "erroneous exemption category entered"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:640
+msgid "added to estimate"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:88
-msgid "Out Of Office"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:640
+msgid "from feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:519
-msgid "Made"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:868
+msgid "Couldn't find"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:519
-msgid "at"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:870
+msgid "in the patient's estimate"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:523
-msgid "Made on"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:871
+msgid "This Shouldn't Happen!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:594
-msgid "Bad Time Sequence!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:933
+msgid "couldn't pass on delete message for"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:594
-msgid "Whoops!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:999
+msgid "Estimate recalculated"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:121
-msgid "Public Holidays"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_choice_dialog.py:36
+msgid "Feescale Choice Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:122
-msgid "Enter the information for "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_compare_items_dockwidget.py:52
+msgid "No Match Found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:428
-msgid "DATE"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_compare_items_dockwidget.py:60
+msgid "Compare Items"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:685
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:692
-msgid "Edit day memos"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py:48
+msgid "Diff Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:686
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/calendars.py:694
-msgid "Edit Public Holiday information"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py:53
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:139
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:100
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:63
+msgid "Toolbar"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:278
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:318
-msgid "Toggle Deciduous State"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py:73
+msgid "Show Standard Diffs"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:284
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:349
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/addTreat.py:59
-msgid "Complete Treatments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py:74
+msgid "Show Full Diffs"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:294
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:321
-msgid "Change Crown Type"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py:77
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:219
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:103
+msgid "Quit"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:298
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:328
-msgid "Change Material of"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py:253
+msgid "Files are identical"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:302
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:335
-msgid "Delete All Restorations"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:91
+msgid "Compare"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:310
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:346
-msgid "Show History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:92
+msgid "with similar ids in other feescales"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:339
-msgid "Delete "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:119
+msgid "Feescale Editor"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:482
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/simple_chartwidget.py:266
-msgid "Left"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:143
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:104
+msgid "Preferences Toolbar"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/chartwidget.py:485
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/simple_chartwidget.py:269
-msgid "Right"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:147
+msgid "Diffs Toolbar"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/notification_widget.py:34
-msgid "close"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:110
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:88
+msgid "&Edit"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/staff_diaries.py:51
-msgid "Diary for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:155
+msgid "&Database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:19
-msgid "Fissure Sealants"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:156
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:111
+msgid "&Tools"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:20
-msgid "Fissure Sealant"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:158
+msgid "Diffs"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:21
-msgid "Fissure Sealant/Composite"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:168
+msgid "Pull"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:25
-msgid "Crowns"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:170
+msgid "generate local files containing the database feescales"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:26
-msgid "Porcelain Bonded Crown"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:173
+msgid "Commit"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:27
-msgid "Gold Crown"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:174
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:123
+msgid "Commit changes to database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:28
-msgid "Lava Crown"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:177
+msgid "Save File"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:29
-msgid "Porcelain Jacket Crown"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:179
+msgid "Save Current File"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:30
-msgid "Temporary Crown"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:182
+msgid "Save File As"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:31
-msgid "Resin Crown"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:183
+msgid "Save Current File to a new location"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:32
-msgid "Other Crown"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:186
+msgid "Save All Files"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:36
-msgid "Bridge Retainers"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:187
+msgid "Save All Local Files"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:39
-msgid "Lava Retainer"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:190
+msgid "Refresh"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:41
-msgid "Adhesive Wing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:191
+msgid "refresh local files"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:45
-msgid "Bridge Pontics"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:197
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:129
+msgid "Search current file for first forward match of entered text"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:46
-msgid "Bonded_"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:199
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:131
+msgid "Find Again"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:47
-msgid "Gold_"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:201
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:133
+msgid "Search current file again for text"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:48
-msgid "Lava_"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:203
+msgid "Increase/decrease fees"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:49
-msgid "Other_"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:204
+msgid "Apply a percentage"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:53
-msgid "Endodontics"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:206
+msgid "Round fees up/down"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:54
-msgid "Pulp Extirpation - 1 canal"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:208
+msgid "Round fees up or down to a specified accuracy"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:55
-msgid "Pulp Extirpation - multiple canals"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:211
+msgid "Relate charges to fees by percentage"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:56
-msgid "Root Canal"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:214
+msgid "Zero Patient Contributions"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:57
-msgid "Incomplete Endodontics"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:216
+msgid "Set all patient charges to Zero in the current feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:61
-msgid "Surgical"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:221
+msgid "Show Database Diff"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:62
-msgid "Extraction"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:223
+msgid "Show the diff between the current file and the corresponding file stored in the database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:63
-msgid "Surgical Extraction"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:226
+msgid "Compare 2 Feescales"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:64
-msgid "Apicectomy"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:228
+msgid "Show the diff between the current file and a selected other"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:68
-msgid "Static Only"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:264
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:149
+msgid "XML tidy"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:69
-msgid "Tooth Missing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:268
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:153
+msgid "Check Well Formed"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:70
-msgid "Denture Tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:271
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:156
+msgid "Check Validity"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:71
-msgid "Root Present"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:349
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:213
+msgid "WARNING - you have unsaved changes!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:72
-msgid "Permanent Tooth Present"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:350
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:214
+msgid "Are you sure you want to quit?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:73
-msgid "Partially Erupted Tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:373
+msgid "has been deleted!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/customwidgets/toothProps.py:74
-msgid "Unerupted Tooth"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:374
+msgid "Save now?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/addTreat.py:60
-msgid "What treatment has been performed?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:380
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:687
+msgid "File Saved"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/alterAday.py:127
-msgid "Clinician Times"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:386
+msgid "has been modified!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/alterAday.py:147
-msgid "values from"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:387
+msgid "Do you want to reload now and lose current changes?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:17
-msgid "Select an Assitant"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:388
+msgid "Do you want to reload now?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:26
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:26
-msgid "NONE"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:417
+msgid "unable to parse file"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/block_wizard.py:93
-msgid "applying changes for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:447
+msgid "You appear to have no feescales installed in your database"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:40
-msgid "No patient chosen!"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:465
+msgid "Local Feescale"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:91
-msgid "Start is outwith slot bounds (too early)"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:466
+msgid "differs from the database version"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:94
-msgid "Start is outwith slot bounds (too late)"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:467
+msgid "Do you wish to overwrite it with the stored data?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:97
-msgid "Finish is outwith slot bounds (too late"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:473
+msgid "Show Diff"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:100
-msgid "Finish is outwith slot bounds (too early"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:475
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:487
+msgid "Keep Local File Unchanged"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:102
-msgid "length of appointment is too short"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:477
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:486
+msgid "Overwrite Local File"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:105
-msgid "no reason for the block given"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:528
+msgid "feescale is well formed"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:108
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2164
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:90
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:118
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:188
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:207
-msgid "no patient selected"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:532
+msgid "feescale is not well formed"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:114
-msgid "Unable to commit because"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:539
+msgid "feescale is valid"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:115
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:187
-msgid "error"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:587
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:338
+msgid "Find Text"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:159
-msgid "no match found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:588
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:339
+msgid "Please enter the text you wish to search for"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:172
-msgid "patient not found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:596
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:347
+msgid "not found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:182
-msgid "Chosen Patient is"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:630
+msgid "Zero all patient charges in the current feescale?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/blockslot.py:184
-msgid "no patient chosen"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:638
+msgid "Save all files?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:17
-msgid "Select a Clinician"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:654
+msgid "Files saved"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:68
-msgid "Set assistant as"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:669
+msgid "save as"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:52
-msgid "Please enter a dentist / hygenist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:670
+msgid "xml_files"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/newCourse.py:37
-msgid "Please set a Valid Course Type"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:679
+msgid "Copy saved to"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/newCourse.py:54
-msgid "Some fields are missing, please check"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:681
+msgid "Reload files to edit the new feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/phrasebook_dialog.py:21
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/phrasebook_dialog.py:41
-msgid "Shade"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:690
+msgid "File not saved"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/phrasebook_dialog.py:46
-msgid "Phrase Book"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:696
+msgid "Warning - you have unsaved changes, if you refresh now, these will be lost"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/saveDiscardCancel.py:28
-msgid "You have unsaved changes to the record of"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:698
+msgid "Refresh anyway?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/saveDiscardCancel.py:68
-msgid "Hide"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:709
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:367
+msgid "commit all local files to database?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:28
-msgid "English (United Kingdom)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:745
+msgid "whoops"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:29
-msgid "English (Australia)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:746
+msgid "you have no other files available for comparison"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:30
-msgid "Afrikaans"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:750
+msgid "Which feescale would you like to compare with the current feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:31
-msgid "Danish"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:754
+msgid "Please make a choice"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:32
-msgid "French"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:45
+msgid "Input Required"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:33
-msgid "German"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:52
+msgid "apply to gross fees"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:34
-msgid "Hungarian"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:54
+msgid "apply to charges"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:35
-msgid "Indonesian"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:83
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:165
+msgid "Please enter a percentage"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:36
-msgid "Italian"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:94
+msgid "gross fees have been increased by"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:37
-msgid "Occitan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:96
+msgid "charges have been increased by"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:38
-msgid "Polish"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:107
+msgid "Please enter the precision you require"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:39
-msgid "Portuguese"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:111
+msgid "round down"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:40
-msgid "Slovak"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:112
+msgid "round up"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:41
-msgid "Spanish"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:114
+msgid "round up/down to nearest value"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:42
-msgid "Turkish"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:148
+msgid "rounded up to the nearest"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/select_language.py:88
-msgid "no translation file found for %s"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:150
+msgid "rounded down to the nearest"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:33
-msgid "Planned"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:152
+msgid "rounded to the nearest"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:48
-msgid "Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:155
+msgid "gross fees have been"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:76
-msgid "click to edit Item - "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:157
+msgid "charges have been"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:88
-msgid "click to delete item - "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:172
+msgid "Leave Zero Charges as Zero"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:97
-msgid "click to promote Item - "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:183
+msgid "charges set at"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/add_tx_to_plan.py:86
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/add_tx_to_plan.py:332
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/add_tx_to_plan.py:351
-msgid "question"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py:183
+msgid "of the fees"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/add_tx_to_plan.py:87
-msgid "Were these xrays taken today?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_parser.py:97
+msgid "feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/add_tx_to_plan.py:333
-msgid "<p>Credit Patient %s for undoing this item?</p>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_parser.py:288
+msgid "Unknown TableName"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/add_tx_to_plan.py:341
-msgid "couldn't pass on delete message - "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_parser.py:298
+msgid "Unknown Description"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/add_tx_to_plan.py:342
-msgid "badly formed est.type??? %s"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/forum_gui_module.py:201
+msgid "Delete %d Posts?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/add_tx_to_plan.py:352
-msgid "remove %s %s from the estimate?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/forum_gui_module.py:213
+msgid "Delete selected Post?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/cashbook_module.py:21
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/daybook_module.py:107
-msgid "bad date sequence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/forum_gui_module.py:260
+msgid "Parenting Cancelled"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/course_module.py:32
-msgid "Please save the old course changes before continuing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/forum_gui_module.py:265
+msgid "Click on the Parent Item"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/course_module.py:35
-msgid ""
-"<p>unable to plan or perform treatment if pt \n"
-"does not have an active course</p>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:188
+msgid "connected to"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/course_module.py:85
-msgid "Sucessfully started new course of treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:407
+msgid "changed clinician to"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/course_module.py:97
-msgid "ERROR STARTING NEW COURSE, sorry"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:414
+msgid "changed assistant to"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:177
-msgid "Bad XML"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:541
+msgid "You have unsaved changes to the record of"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:189
-msgid "OK"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:797
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:814
+msgid "is no longer an active dentist in this practice"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:190
-msgid "all tests passed"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:801
+msgid "unknown contract dentist - please correct this"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:209
-msgid "regex error"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:819
+msgid "unknown course dentist - please correct this"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:240
-msgid "Fee item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:872
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:884
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:946
+msgid "Re-open"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:293
-msgid "Apply changes?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:873
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:885
+msgid "Do you want to review and/or reprint this item?"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:300
-msgid "You have altered a usercode."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:904
+msgid "No information available about this document, sorry"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/edit_feeitem_dialog.py:301
-msgid "Do you want to apply this change to selected other fee tables?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:913
+msgid "Date imported"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/examdialog.py:34
-msgid ""
-"<p>You already have a completed exam on this \n"
-"course of treatment</p>Unable to perform exam"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:914
+msgid "Size"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/examdialog.py:59
-msgid ""
-"<p>%s is now both the registered and \n"
-"course dentist.<br />Is this correct?<br />\n"
-"<i>confirming this will remove reference to %s</i></p>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:931
+msgid "opening"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/examdialog.py:78
-msgid ""
-"<<br /><i>confirming this will change the \n"
-"course dentist, but not the registered dentist</i>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:935
+msgid "error importing file"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/examdialog.py:81
-msgid "<i>consider making %s the registered dentist</i>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:937
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1519
+msgid "no file chosen"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/examdialog.py:108
-msgid ""
-"%s examination performed by %s\n"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:947
+msgid "Do you want to open a copy of this document?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/examdialog.py:125
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/perio_tx_dialog.py:53
-msgid "different (outdated?) fee found in estimate - please check"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:963
+msgid "error opening document"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/examdialog.py:147
-msgid "Examination not applied"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:974
+msgid "Today's Patients"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:36
-msgid "check parseable"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:977
+msgid "Today's Patients (ALL)"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:40
-msgid "Find Again"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1032
+msgid "Reached end of the List"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:42
-msgid "Document Statistics"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1046
+msgid "Reached Start of the List"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:69
-msgid "Statistics"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1119
+msgid "Patient already loaded"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:77
-msgid "Information"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1122
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1375
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1504
+msgid "Not loading patient"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:89
-msgid "Sucess!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1131
+msgid "Error populating interface"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:90
-msgid "Database updated"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1137
+msgid "error getting serialno"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:116
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:119
-msgid "result"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1138
+msgid "please check this number is correct?"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:117
-msgid "data parses ok with xml.minidom"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1150
+msgid "Reloading record"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:120
-msgid "PARSING DATA FAILED with xml.minidom"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1224
+msgid "Please set a Valid Course Type for this patient"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:127
-msgid "Enter Phrase to Search for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1258
+msgid "Message from"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:127
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:139
-msgid "Search"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1260
+msgid "Dated"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:140
-msgid "Phrase not Found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1352
+msgid "Active Course"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_editor.py:159
-msgid "Fee Table Editor"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1353
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1361
+msgid "started"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_model.py:151
-msgid "Usercode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1363
+msgid "completed"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fee_table_model.py:157
-msgid "brief description"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1367
+msgid "Resume Existing Course"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:218
-msgid "The following tables were altered"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1391
+msgid "NO CLINICIAN SET"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:224
-msgid "No changes apllied"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1393
+msgid "you are in surgery mode without a clinician"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:234
-msgid "Make Selection"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1398
+msgid "CLINICIAN"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:235
-msgid "Choose other tables to alter"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1402
+msgid "team"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:239
-msgid "Select All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1403
+msgid "using"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:307
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:322
-msgid "Adjust / edit this Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1404
+msgid "mode"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:309
-msgid "Add to tx plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1415
+msgid "Miss"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:317
-msgid "Add to tx plan of patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1415
+msgid "Mr"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:323
-msgid "Delete Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1415
+msgid "Mrs"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:324
-msgid "Insert New Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1415
+msgid "Ms"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:361
-msgid "Items containing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1416
+msgid "Dr"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:367
-msgid "phrase not found in feetable"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1416
+msgid "Master"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:369
-msgid "usercodes or descriptions"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1416
+msgid "Professor"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:371
-msgid "usercodes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1469
+msgid "NEW FORUM POSTS"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:373
-msgid "descriptions"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1508
+msgid "opening patient file"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:377
-msgid "nothing to search"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1661
+msgid "POTENTIALLY SERIOUS CONFUSION PROBLEM WITH PT RECORDS"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:378
-msgid "please select usercodes and/or descriptions then search again"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1814
+msgid "no record selected"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:408
-msgid "Error opening PDF file"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1824
+msgid "FontSize"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:418
-msgid "IN CURRENT USE"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1825
+msgid "Enter your preferred font size for appointment book"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/fees_module.py:431
-msgid "fee table error"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:2416
+msgid "use the checkboxes on the notes tab to control what is printed."
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/manipulate_tx_plan.py:42
-msgid "Remove"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3078
+msgid "Recalculate Estimate is for active courses only"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/manipulate_tx_plan.py:43
-msgid "From the Treatment Plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3082
+msgid "Scrap the estimate and re-price everything?"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/fees/perio_tx_dialog.py:77
-msgid "performed by"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3084
+msgid "Custom items and items added using feescale method will be unaffected"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:182
-msgid "Delete %d Posts?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3101
+msgid "apply an exemption to the NHS items on this estimate?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:194
-msgid "Delete selected Post?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3107
+msgid "input needed"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:238
-msgid "Parenting Cancelled"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3108
+msgid "maximum charge for the patient"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/forum_gui_module.py:243
-msgid "Click on the Parent Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3108
+msgid "please enter the amount in pence, or leave as 0 for full exemption"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:176
-msgid "advisory"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3150
+msgid "Relatives"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:218
-msgid "Decision Required"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3153
+msgid "Family ID"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:219
-msgid "you have unsaved changes to your feetables"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3156
+msgid "Member(s)"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:220
-msgid "commit now?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3161
+msgid "No Patient Loaded"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:505
-msgid "changed clinician to"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3185
+msgid "error loading feetable"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:512
-msgid "changed assistant to"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3198
+msgid "Reloading feescales from database"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:704
-msgid "Switching off appointment mode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:41
+msgid "Use details from the previous record?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1087
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1104
-msgid "is no longer an active dentist in this practice"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:61
+msgid "Start a new family group?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1091
-msgid "unknown contract dentist - please correct this"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:69
+msgid "Add the new patient to this family group?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1109
-msgid "unknown course dentist - please correct this"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:138
+msgid "Error saving new patient, sorry!"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1154
-msgid "SAVE NEW PATIENT"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:145
+msgid "insufficient data to create a new record.please fill in all highlighted fields"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1166
-msgid "SAVE CHANGES"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:184
+msgid "New Patient not saved."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1200
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1209
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1270
-msgid "Re-open"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_dialog.py:47
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_dialog.py:68
+msgid "Shade"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1201
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1210
-msgid "Do you want to review and/or reprint this item?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_dialog.py:128
+msgid "Phrase Book"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1223
-msgid "error reviewing PDF file"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:84
+msgid "Phrasebook Editor"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1228
-msgid "No information available about this document, sorry"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:118
+msgid "New Phrasebook"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1237
-msgid "Date imported"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:119
+msgid "Create a new clinician phrasebook"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1238
-msgid "Size"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:122
+msgid "Commit to Database"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1255
-msgid "opening"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:244
+msgid "Global Phrasebook"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1259
-msgid "error importing file"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:265
+msgid "You appear to have no phrasebooks installed in your database"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1261
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1963
-msgid "no file chosen"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:291
+msgid "Phrasebook is well formed"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1271
-msgid "Do you want to open a copy of this document?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:295
+msgid "Phrasebook is not well formed"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1286
-msgid "error opening document"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:301
+msgid "Phrasebook is valid"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1297
-msgid "Today's Patients"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:355
+msgid "Everyone has a phrasebook already!"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1300
-msgid "Today's Patients (ALL)"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:359
+msgid "A phrasebook for which clinician?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1417
-msgid "Reached end of the List"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:378
+msgid "Phrasebook"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1432
-msgid "Reached Start of the List"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:378
+msgid "is not valid"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1507
-msgid ""
-"Error populating interface\n"
-"%s"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:384
+msgid "Books"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1511
-msgid "error getting serialno"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:384
+msgid "Updated"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1512
-msgid "please check this number is correct?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:127
+msgid "STATEMENT OF ACCOUNT - FINAL REMINDER"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1630
-msgid ""
-"<center>Message from %s <br />\n"
-"Dated %s<br /><br />%s</center>"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:132
+msgid "We are concerned that despite previous correspondance,"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1643
-msgid "problem getting a memo %s"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:137
+msgid "your account still stands as follows: "
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1822
-msgid "NO CLINICIAN SET"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:142
+msgid "Please note that your account stands as follows:- "
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1823
-msgid "you are in surgery mode without a clinician"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:144
+msgid "Amount : %s"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1827
-msgid "CLINICIAN"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:147
+msgid "This amount is now due in full. *"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1831
-msgid "team"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:152
+msgid "A previous account was sent out to you on %s"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1832
-msgid "using"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:158
+msgid "It would be appreciated if you would settle this matter as soon as possible."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1833
-msgid "mode"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:163
+msgid "It would be appreciated if this account is settled within seven days."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1846
-msgid "Miss"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:168
+msgid "On this deadline, we will pass this debt to"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1846
-msgid "Mr"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:173
+msgid "Scott & Company Sheriff Officers for collection."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1846
-msgid "Mrs"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:176
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:55
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:106
+msgid "Yours sincerely,"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1846
-msgid "Ms"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:191
+msgid ""
+"* Cheques payable to: \"Academy Dental Practice\"\n"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1847
-msgid "Dr"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/accountPrint.py:192
+msgid "Or telephone us with your switch/visa/mastercard details."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1847
-msgid "Master"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:42
+msgid "Dear"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1847
-msgid "Professor"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:45
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:93
+msgid "We are writing to inform you that your dental examination is now due."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1912
-msgid "NEW FORUM POSTS"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:46
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:98
+msgid "Please contact the surgery to arrange an appointment. *"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1947
-msgid "Not loading patient"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:50
+msgid "We are writing to inform you that your dental examinations are now due."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:1951
-msgid "opening patient file"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:52
+msgid "Please contact the surgery to arrange suitable appointments. *"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2129
-msgid "POTENTIALLY SERIOUS CONFUSION PROBLEM WITH PT RECORDS"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:59
+msgid ""
+"* If you already have a future appointment with us -\n"
+"please accept our apologies and ignore this letter."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2189
-msgid "Sucessfully altered the following items"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:141
+msgid "our ref"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2423
-msgid "no record selected"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:159
+msgid "Patients"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2469
-msgid "FontSize"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:334
+msgid "no data loaded"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2470
-msgid "Enter your preferred font size for appointment book"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:366
+msgid "options set"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:2782
-msgid "error commiting changes"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:385
+msgid "Collapse All"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:4070
-msgid "Scrap the estimate and re-price everything?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/estimatePrint.py:103
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:247
+msgid "NHS items"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:4086
-msgid "apply an exemption to this estimate?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/estimatePrint.py:104
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:248
+msgid "Private items"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:4091
-msgid "input needed"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/gp17/gp17_printer.py:54
+msgid "Print an NHS form now?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:4092
-msgid "maximum charge for the patient"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:139
+msgid "PLEASE CHECK/COMPLETE THESE DETAILS"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/maingui.py:4092
-msgid "please enter the amount in pence, or leave as 0 for full exemption"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:163
+msgid "Home tel"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/new_patient_gui.py:49
-msgid ""
-"<div align=\"center\">\n"
-"<h3>Enter New Patient</h3>Please enter at least the required fields,\n"
-"then use the Save Changes button to commit this patient to the database.\n"
-"</div>"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:164
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:170
+msgid "Work tel"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/new_patient_gui.py:80
-msgid "Error saving new patient, sorry!"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:165
+msgid "Mobile"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/new_patient_gui.py:83
-msgid ""
-"insufficient data to create a new record...\n"
-"please fill in all highlighted fields"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:167
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:170
+msgid "Alternate Email"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/new_patient_gui.py:95
-msgid "Error saving patient"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:186
+msgid "Please Circle"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/new_patient_gui.py:132
-msgid "New Patient not saved. Abandon Changes?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:188
+msgid "Give Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:91
-msgid "STATEMENT OF ACCOUNT - FINAL REMINDER"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:190
+msgid "ARE YOU CURRENTLY?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:93
-msgid "We are concerned that despite previous correspondance,"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:194
+msgid "Taking any prescribed medicines?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:95
-msgid "your account still stands as follows: "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:203
+msgid "Carrying a Medical Warning Card?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:97
-msgid "Please note that your account stands as follows:- "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:210
+msgid "Pregnant or Breast Feeding?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:99
-msgid "Amount : %s"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:222
+msgid "DO YOU SUFFER FROM?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:102
-msgid "This amount is now due in full. *"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:241
+msgid "Allergies to Any Medicines or Substances?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:106
-msgid "A previous account was sent out to you on %s"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:246
+msgid "eg. Penicillin, aspirin or latex."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:108
-msgid "It would be appreciated if you would settle this matter as soon as possible."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:251
+msgid "Bronchitis, Asthma, other Chest Conditions?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:110
-msgid "It would be appreciated if this account is settled within seven days."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:276
+msgid "Heart Problems, Angina, Blood pressure"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:112
-msgid "On this deadline, we will pass this debt to"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:281
+msgid "problems, or a stroke?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:114
-msgid "Scott & Company Sheriff Officers for collection."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:285
+msgid "Diabetes?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:117
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:29
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:35
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/recallprint.py:70
-msgid "Yours sincerely,"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:292
+msgid "Arthritis?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:132
-msgid ""
-"* Cheques payable to: \"Academy Dental Practice\"\n"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:314
+msgid "Bruising or persistant bleeding after"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/accountPrint.py:133
-msgid "Or telephone us with your switch/visa/mastercard details."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:319
+msgid "surgery or tooth extraction?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:25
-msgid "Dear"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:337
+msgid "Any Infectious Diseases"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:26
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/recallprint.py:63
-msgid "We are writing to inform you that your dental examination is now due."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:339
+msgid "(including HIV and Hepatitis)?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:27
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/recallprint.py:65
-msgid "Please contact the surgery to arrange an appointment. *"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:344
+msgid "DID YOU, AS A CHILD OR SINCE HAVE"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:28
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:34
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/recallprint.py:67
-msgid "We look forward to seeing you in the near future."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:351
+msgid "Bacterial Endocarditis?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:31
-msgid "Dear Patients"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:359
+msgid "Liver Disease (eg. Jaundice or Hepatitis)?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:32
-msgid "We are writing to inform you that your dental examinations are now due."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:370
+msgid "A bad reaction to a Local or General Anaesthetic?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:33
-msgid "Please contact the surgery to arrange suitable appointments. *"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:380
+msgid "A joint replacement or other implant?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:39
-msgid ""
-"* If you already have a future appointment with us -\n"
-"please accept our apologies and ignore this letter."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:387
+msgid "Heart Surgery?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:198
-msgid "no data loaded"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:394
+msgid "Brain Surgery?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:230
-msgid "options set"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:415
+msgid "Treatment that required you to be"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:249
-msgid "Collapse All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:417
+msgid "in Hospital?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/bulk_mail.py:301
-msgid "our ref"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:421
+msgid "A close relative with Creutzfeldt Jacob Disease?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:65
-msgid "PDF is NONE - (tell devs this happened)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:434
+msgid "PLEASE GIVE ANY OTHER DETAILS WHICH YOU THINK MAY BE RELEVANT TO YOUR DENTIST"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:73
-msgid "Error saving PDF copy %s"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:438
+msgid "Patient's Signature"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:81
-msgid "Professional Services"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:80
+msgid "PDF is NONE - (tell devs this happened)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:83
-msgid "duplicate receipt for %.02f"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:88
+msgid "Error saving PDF copy %s"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:150
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:167
msgid "Nothing to print - have you loaded the table?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:171
msgid ""
"<tr><th>Dent</th><th>SerialNo</th><th>Cset</th>\n"
"<th>FName</th><th>Sname</th><th>DOB</th><th>Memo</th><th>Last Appt</th>\n"
@@ -6763,456 +8192,649 @@ msgid ""
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:179
-msgid "TOTAL"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:212
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:232
msgid "Estimate for your current course of treatment."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:232
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:269
msgid ""
"<tr><td></td><td><b>TOTAL</b></td>\n"
-"<td align=\"right\">%s</td></tr>"
+"<td align=\"right\"><b>%s</b></td></tr>"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:236
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:273
msgid ""
"<p><i>Please note, this estimate may be subject\n"
"to change if clinical circumstances dictate.</i></p>"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:360
-msgid "Previous Course (%s - %s)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:89
+msgid "Dear %s %s,"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/om_printing.py:379
-msgid "Print an NHS form now?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:103
+msgid "We look forward to seeing you in the near future."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/printing/recallprint.py:60
-msgid "Dear %s %s,"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/receiptPrint.py:154
+msgid "Thankyou for your custom."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:56
-msgid "OpenMolar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:301
+msgid "Please specify a clinician"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:70
-msgid ""
-"<h3>Update required</h3>\n"
-"Your Openmolar database schema is out of date for this version of the client.\n"
-"<br /> \n"
-"Your database is at version %s, and %s is required.<br />\n"
-"Would you like to Upgrade Now?<br />\n"
-"WARNING - PLEASE ENSURE ALL OTHER STATIONS ARE LOGGED OFF"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:93
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:115
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:137
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:159
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:181
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:203
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:225
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:247
-msgid "upgrading to schema version"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:395
+msgid "Error removing proposed appointment"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:108
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:130
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:152
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:174
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:196
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:218
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:240
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:262
-msgid "Conversion to %s failed"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:400
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:493
+msgid "No appointment selected"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:266
-msgid ""
-"<p>Sorry, we seem unable to update your schema at this point,\n"
-"Perhaps you have grabbed a development version of the program?</p>\n"
-"If so, please revert to a release version.<br />\n"
-"If this is not the case, something odd has happened,\n"
-"please let the developers of openmolar know ASAP.</p>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:405
+msgid "Delete Unscheduled Appointment?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:280
-msgid "Unexpected Error updating the schema"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:577
+msgid "Error putting into dentist's book"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:282
-msgid "Please File A bug by visiting "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:40
+msgid "Update required"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/schema_updater.py:286
-msgid ""
-"<p>Sorry, you cannot run this version of the \n"
-"openmolar client without updating your database schema.</p>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:41
+msgid "Your Openmolar database schema is out of date for this version of the client."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:45
+msgid "Would you like to Upgrade Now?"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:46
+msgid "WARNING - PLEASE ENSURE ALL OTHER STATIONS ARE LOGGED OFF"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:49
+msgid "Sorry, you cannot run this version of the openmolar client without updating your database schema."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:53
+msgid "Sorry, we seem unable to update your schema at this point, Perhaps you have grabbed a development version of the program?"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:56
+msgid "If this is not the case, something odd has happened, please let the developers of openmolar know ASAP."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:117
+msgid "upgrading to schema version"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:53
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:129
+msgid "Conversion to %s failed"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:148
+msgid "OpenMolar"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:71
msgid "Books Currently end on"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:55
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:74
msgid "extend the books now?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:65
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:84
msgid "How many months?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:85
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/apptTools.py:92
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:104
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:111
msgid "not yet implemented"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:72
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:91
msgid "Please enter initials for this user"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:74
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:93
msgid "Please set a name for this user"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:156
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:178
msgid "this action will overwrite any current data stored"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:157
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:180
msgid "proceed?"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:168
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:191
msgid "save template file"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:169
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:193
msgid "openmolar template files "
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:176
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:200
msgid "Template Saved"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:178
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:200
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:202
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:225
msgid "operation cancelled"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:180
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:204
msgid "Template not saved"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:189
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:213
msgid "load an existing template file"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:190
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:215
msgid "openmolar template files"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:195
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:220
msgid "template loaded sucessfully"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:198
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:223
msgid "error parsing template file"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:295
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:305
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:342
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:320
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:330
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:367
msgid "Modify Now"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:295
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:326
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:320
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:351
msgid "Apply Now"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/new_setup.py:316
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:341
msgid "Add New User"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/recordtools.py:85
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/recordtools.py:103
msgid "money changes applied"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/recordtools.py:168
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/recordtools.py:186
msgid "date changes applied"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/recordtools.py:233
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/recordtools.py:253
msgid "plan changes applied"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/recordtools.py:280
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/recordtools.py:303
msgid "completed treatment changes applied"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/qt4gui/tools/recordtools.py:299
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/recordtools.py:337
msgid "updated hidden notes list"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_1to1_2.py:124
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_2to1_3.py:95
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_3to1_4.py:349
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_4to1_5.py:146
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:214
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:359
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_7to1_8.py:172
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_1to1_2.py:144
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:114
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:370
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:167
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:236
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:399
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:195
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:152
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:158
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:295
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:232
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:162
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:143
msgid "updating stored schema version"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_1to1_2.py:126
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_2to1_3.py:97
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_3to1_4.py:351
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_4to1_5.py:148
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:216
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:361
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_7to1_8.py:174
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_1to1_2.py:146
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:116
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:372
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:169
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:238
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:401
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:197
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:160
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:297
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:234
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:164
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:145
msgid "ALL DONE - sucessfully moved db to"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_2to1_3.py:86
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_3to1_4.py:331
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:105
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:352
msgid "creating new tables"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_2to1_3.py:88
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_3to1_4.py:344
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_4to1_5.py:141
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:209
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:354
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_7to1_8.py:167
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:107
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:365
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:162
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:231
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:394
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:190
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:147
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:153
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:290
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:227
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:157
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:138
msgid "updating settings"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_2to1_3.py:101
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:120
msgid "couldn't create tables, rolled back to"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_3to1_4.py:336
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:357
msgid "copying data across from old feetable"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_3to1_4.py:356
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_4to1_5.py:153
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:221
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:366
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_7to1_8.py:179
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:377
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:174
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:243
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:406
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:202
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:159
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:165
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:302
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:239
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:169
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:150
msgid "rolled back to"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_4to1_5.py:129
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:190
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:342
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_7to1_8.py:157
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:150
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:212
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:382
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:180
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:137
msgid "executing statements"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_4to1_5.py:133
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:194
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:216
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:332
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:283
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:312
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:214
msgid "transfering data"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_5to1_6.py:201
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:346
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_7to1_8.py:159
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:223
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:386
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:182
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:139
msgid "inserting values"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar/src/openmolar/schema_upgrades/schema1_6to1_7.py:362
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:402
msgid "you may now remove old feetables"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:45
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:125
+msgid "converting note"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:147
+msgid "creating new appt_prefs table"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:149
+msgid "copying data"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:151
+msgid "statements executed"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:281
+msgid "creating currtrtmt2 table"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:283
+msgid "transferring data"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:287
+msgid "deleting void courses"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:218
+msgid "creating tables"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:221
+msgid "populating est_link table"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:224
+msgid "populating feescales"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:148
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:129
+msgid "creating est_link2 table"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:151
+msgid "populating est_link2 table"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:154
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:135
+msgid "executing cleanup statements"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/fee_tables.py:249
+msgid "feesscale"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/fee_tables.py:251
+msgid "Failed to Load"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/fee_tables.py:538
+msgid "OTHER TREATMENT"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/fee_tables.py:672
+msgid "No reason given by feescale author."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:57
msgid "translation tools are installed sucessfully"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:67
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:82
msgid "Please try and give at least 24 hours notice"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:68
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:83
msgid "if you need to change an appointment."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:299
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:88
+msgid "Confidential Medical History Questionaire"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:300
msgid "EXAM"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:300
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:301
msgid "BITE"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:301
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:302
msgid "BT"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:302
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:303
msgid "FAMILY"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:303
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:304
msgid "FILL"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:304
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:305
msgid "FIT"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:305
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:306
msgid "HYG"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:306
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:307
msgid "IMPS"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:307
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:308
msgid "LF"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:308
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:309
msgid "ORTHO"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:309
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:310
msgid "PAIN"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:310
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:311
msgid "PREP"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:311
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:312
msgid "RCT"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:312
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:313
msgid "RECEMENT"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:313
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:314
msgid "REVIEW"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:314
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:315
msgid "SP"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:315
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:316
msgid "TRY"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:316
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:317
msgid "XLA"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:473
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:510
msgid "January"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:474
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:511
msgid "February"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:475
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:512
msgid "March"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:476
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:513
msgid "April"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:477
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:514
msgid "May"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:478
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:515
msgid "June"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:479
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:516
msgid "July"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:480
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:517
msgid "August"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:481
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:518
msgid "September"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:482
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:519
msgid "October"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:483
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:520
msgid "November"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:484
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:521
msgid "December"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:517
-msgid "Today"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:519
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:558
msgid "Tomorrow"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:521
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:560
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:570
msgid "Yesterday"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:871
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:925
msgid "Welcome to OpenMolar!"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:872
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:926
msgid "Version"
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:873
-msgid "Revision"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:875
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:929
msgid "Your Data is Accessible, and the server reports no issues."
msgstr ""
-#: /home/neil/openmolar/openmolar/src/openmolar/settings/localsettings.py:876
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:930
msgid "Have a great day!"
msgstr ""
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/config_dialog.py:42
+msgid "Please complete the following form"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/config_dialog.py:56
+msgid "host"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/config_dialog.py:57
+msgid "port"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/config_dialog.py:58
+msgid "database"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/config_dialog.py:59
+msgid "user"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/config_dialog.py:60
+msgid "password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/config_dialog.py:61
+msgid "Surgery number"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:119
+msgid "Show Status&bar"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:126
+msgid "FullScreen Mode"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:138
+msgid "About"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:141
+msgid "About Qt"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:144
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:350
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:373
+msgid "License"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:163
+msgid "Help Toolbar"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:386
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:109
+msgid "Quit Application?"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:131
+msgid "Manual Select"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:132
+msgid "Select a serialno to load"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:179
+msgid "Do you really want to reconfigure this application?"
+msgstr ""
+
diff --git a/src/openmolar/locale/update_messages.py b/src/openmolar/locale/update_messages.py
deleted file mode 100755
index e060a16..0000000
--- a/src/openmolar/locale/update_messages.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
-
-
-'''
-get all translatable strings into a single messages.pot
-requires pygettext available on the command line - i.e. NOT windows friendly.
-'''
-
-import os
-import subprocess
-
-def source_files(PATH):
- retarg = []
- for root, dir, files in os.walk(os.path.dirname(PATH)):
- for name in files:
- if name.endswith('.py'):
- retarg.append(os.path.abspath(os.path.join(root, name)))
- return retarg
-
-def main(PATH):
- files = source_files(os.path.dirname(PATH))
- print "%d py files found"% len(files)
- print "using pygettext to create a messages.pot.....",
- pr = subprocess.Popen(["pygettext"]+files)
- pr.wait()
- print "finished"
-
-if __name__ == "__main__":
-
- main(os.getcwd())
-
\ No newline at end of file
diff --git a/src/openmolar/main.py b/src/openmolar/main.py
index b7bab7a..9b0bbaa 100755
--- a/src/openmolar/main.py
+++ b/src/openmolar/main.py
@@ -1,14 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 2 of the License, or
-# version 3 of the License, or (at your option) any later version. It is
-# provided for educational purposes and is distributed in the hope that
-# it will be useful, but WITHOUT ANY WARRANTY; without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
-# the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module puts the "openmolar" modules onto the python path,
@@ -23,22 +35,25 @@ import hashlib
from PyQt4 import QtGui, QtCore
from xml.dom import minidom
-## a variable to force the first run and database update tools
+# a variable to force the first run and database update tools
FIRST_RUN_TESTING = False
IGNORE_SCHEMA_CHECK = False
SHORTARGS = "v"
-LONGARGS = ["help","version","setup","firstrun","user=", "db=", "port=",
-"ignore-schema-check"]
+LONGARGS = ["help", "version", "setup", "firstrun", "user=", "db=", "port=",
+ "ignore-schema-check"]
LOGGER = logging.getLogger("openmolar")
+
class LoginError(Exception):
+
'''
a custom exception thrown when the user gets password or username incorrect
'''
pass
+
def proceed():
'''
check db schema, and proceed if all is well
@@ -62,28 +77,28 @@ def proceed():
elif localsettings.CLIENT_SCHEMA_VERSION < sv:
print "client is out of date....."
- compatible = schema_version.clientCompatibility(
+ compatible = schema_version.clientCompatibility(
localsettings.CLIENT_SCHEMA_VERSION)
if not compatible:
QtGui.QMessageBox.warning(None, _("Update Client"),
- _('''<p>Sorry, you cannot run this version of the openMolar client
+ _('''<p>Sorry, you cannot run this version of the openMolar client
because your database schema is more advanced.</p>
<p>this client requires schema version %s, but your database is at %s</p>
-<p>Please Update openMolar now</p>''')% (
- localsettings.CLIENT_SCHEMA_VERSION, sv))
+<p>Please Update openMolar now</p>''') % (
+ localsettings.CLIENT_SCHEMA_VERSION, sv))
else:
result = QtGui.QMessageBox.question(None,
- _("Proceed without upgrade?"),
- _('''<p>This openMolar client has fallen behind your database
+ _("Proceed without upgrade?"),
+ _('''<p>This openMolar client has fallen behind your database
schema version<br />this client was written for schema version %s,
but your database is now at %s<br />However, the differences are not critical,
and you can continue if you wish</p>
<p><i>It would still be wise to update this client ASAP</i></p>
-<hr /><p>Do you wish to continue?</p>''')% (
- localsettings.CLIENT_SCHEMA_VERSION, sv),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+<hr /><p>Do you wish to continue?</p>''') % (
+ localsettings.CLIENT_SCHEMA_VERSION, sv),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
run_main = True
@@ -94,6 +109,7 @@ and you can continue if you wish</p>
else:
sys.exit()
+
def main():
'''
main function
@@ -107,9 +123,7 @@ def main():
uninitiated = True
- AUTOUSER = ""
-
- def autoreception(arg): #arg is a QString
+ def autoreception(arg): # arg is a QString
'''
check to see if the user is special user "rec"
which implies a reception machine
@@ -124,11 +138,11 @@ def main():
i = actions.index(chosenAction)
message = localsettings.server_names[i] + "<br />" + _(
- "This is not the default database - are you sure?")
+ "This is not the default database - are you sure?")
if i != 0:
if QtGui.QMessageBox.question(my_dialog, _("confirm"), message,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
i = 0
dl.chosenServer = i
@@ -143,7 +157,7 @@ def main():
def_string = " (" + _("DEFAULT") + ")"
dl.chosenServer_label.setText(_("Chosen server") + " - " +
- localsettings.server_names[i] + def_string)
+ localsettings.server_names[i] + def_string)
if not FIRST_RUN_TESTING:
cf_Found = True
@@ -158,25 +172,22 @@ def main():
cf_Found = False
if not cf_Found:
- message = _('''<center><p>
-This appears to be your first running of openMolar<br />
-Before you run this application, we need to generate a settings file.<br />
-So that openmolar knows where your mysql server resides<hr />
-If you do not have a database, you will be prompted to create one<</p>
-Are you ready to proceed?</center>''')
+ message = "<center>%s<br />%s<hr /><em>%s</em></center>" % (
+ _("This appears to be your first running of OpenMolar."),
+ _("We need to generate a settings file."),
+ _("Are you ready to proceed?")
+ )
result = QtGui.QMessageBox.question(None, _("First Run"),
- message,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ message,
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
import firstRun
if not firstRun.run():
my_app.closeAllWindows()
sys.exit()
- else:
- AUTOUSER="user"
else:
my_app.closeAllWindows()
sys.exit()
@@ -187,26 +198,32 @@ Are you ready to proceed?</center>''')
"system_password")[0].firstChild.data
servernames = dom.getElementsByTagName("connection")
- for server in servernames:
+
+ for i, server in enumerate(servernames):
nameDict = server.attributes
- if nameDict.has_key("name"):
+ try:
localsettings.server_names.append(nameDict["name"].value)
+ except KeyError:
+ localsettings.server_names.append("%d" % i + 1)
- if localsettings.server_names == []:
- localsettings.server_names.append("")
-
- except IOError, e:
- print "still no settings... %s\nquitting politely"% e
+ except IOError as e:
+ LOGGER.warning("still no settings file. quitting politely")
QtGui.QMessageBox.information(None, _("Unable to Run OpenMolar"),
- _("Good Bye!"))
+ _("Good Bye!"))
- my_app.closeAllWindows()
+ QtGui.QApplication.instance().closeAllWindows()
sys.exit("unable to run - openMolar couldn't find a settings file")
my_dialog = QtGui.QDialog()
dl = Ui_startscreen.Ui_Dialog()
dl.setupUi(my_dialog)
- dl.user1_lineEdit.setText(AUTOUSER)
+
+ PASSWORD, USER1, USER2 = localsettings.autologin()
+ dl.password_lineEdit.setText(PASSWORD)
+ dl.user1_lineEdit.setText(USER1)
+ dl.user2_lineEdit.setText(USER2)
+ autoreception(QtCore.QString(USER1))
+ autoreception(QtCore.QString(USER2))
servermenu = QtGui.QMenu()
dl.chosenServer = 0
@@ -222,13 +239,14 @@ Are you ready to proceed?</center>''')
dl.advanced_frame.hide()
servermenu.connect(servermenu,
- QtCore.SIGNAL("triggered (QAction *)"), chosenServer)
+ QtCore.SIGNAL("triggered (QAction *)"), chosenServer)
QtCore.QObject.connect(dl.user1_lineEdit,
- QtCore.SIGNAL("textEdited (const QString&)"), autoreception)
+ QtCore.SIGNAL("textEdited (const QString&)"), autoreception)
while True:
- if my_dialog.exec_():
+ if (PASSWORD != "" and USER1 != "") or my_dialog.exec_():
+ PASSWORD = ""
changedServer = localsettings.chosenserver != dl.chosenServer
@@ -237,11 +255,11 @@ Are you ready to proceed?</center>''')
try:
#--"salt" the password
pword = "diqug_ADD_SALT_3i2some" + str(
- dl.password_lineEdit.text())
+ dl.password_lineEdit.text())
#-- hash the salted password (twice!) and compare to the value
#-- stored in /etc/openmolar/openmolar.conf (linux)
stored_password = hashlib.md5(
- hashlib.sha1(pword).hexdigest()).hexdigest()
+ hashlib.sha1(pword).hexdigest()).hexdigest()
if stored_password != sys_password:
#-- end password check
@@ -265,8 +283,8 @@ Are you ready to proceed?</center>''')
#-- allowed_logins in a list of practice staff.
if not u1_qstring in localsettings.allowed_logins:
raise LoginError
- if (u2_qstring !="" and
- not u2_qstring in localsettings.allowed_logins):
+ if (u2_qstring != "" and
+ not u2_qstring in localsettings.allowed_logins):
raise LoginError
#-- set a variable to allow the main program to run
@@ -280,16 +298,16 @@ Are you ready to proceed?</center>''')
except LoginError:
QtGui.QMessageBox.warning(my_dialog,
- _("Login Error"),
- u'<h2>%s %s</h2><em>%s</em>'% (
- _('Incorrect'),
- _("User/password combination!"),
- _('Please Try Again.')
- )
- )
+ _("Login Error"),
+ u'<h2>%s %s</h2><em>%s</em>' % (
+ _('Incorrect'),
+ _("User/password combination!"),
+ _('Please Try Again.')
+ )
+ )
except Exception as exc:
LOGGER.exception("UNEXPECTED ERROR")
- message = u'<p>%s</p><p>%s</p><hr /><pre>%s</pre>'% (
+ message = u'<p>%s</p><p>%s</p><hr /><pre>%s</pre>' % (
_("UNEXPECTED ERROR"),
_("application cannot run"),
exc)
@@ -298,7 +316,8 @@ Are you ready to proceed?</center>''')
break
else:
break
- my_app.closeAllWindows()
+ QtGui.QApplication.instance().closeAllWindows()
+
def setup(argv):
'''
@@ -308,17 +327,21 @@ def setup(argv):
from openmolar.qt4gui.tools import new_setup
new_setup.main(argv)
+
def usage():
'''
called by --help, bad arguments, or no arguments
simply importing the localsettings will display some system info
'''
- from openmolar.settings import localsettings
- print '''command line options are as follows
---help \tshow this text
---firstrun\toffer the firstrun config and demodatabase generation
---setup \ttakes you to the admin page
---version \tshow the versioning and exit'''
+ print '''
+command line options are as follows
+--help \t : show this text
+--firstrun \t : offer the firstrun config and demodatabase generation
+--ignore-schema-check\t : proceed even if client and database versions clash (NOT ADVISABLE!)
+--setup \t : takes you to the admin page
+--version \t : show the versioning and exit
+'''
+
def version():
'''
@@ -327,6 +350,7 @@ def version():
from openmolar.settings import localsettings
localsettings.showVersion()
+
def run():
'''
the real entry point for the app
@@ -336,16 +360,16 @@ def run():
try:
opts, args = getopt.gnu_getopt(sys.argv[1:], SHORTARGS, LONGARGS)
except getopt.GetoptError as exc:
- # print help information and exit:
- LOGGER.exception("FATAL ERROR - config file not parseable!")
- # above will print something like "option -foo not recognized"
- sys.exit(2)
+ print
+ print exc
+ print
+ opts = (("--help", ""),)
- #some backward compatibility stuff here...
+ # some backward compatibility stuff here...
if "setup" in sys.argv:
- opts.append(("--setup",""))
+ opts.append(("--setup", ""))
if "firstrun" in sys.argv:
- opts.append(("--firstrun",""))
+ opts.append(("--firstrun", ""))
for option, arg in opts:
if option == "--help":
@@ -370,21 +394,21 @@ def run():
if __name__ == "__main__":
#-- put "openmolar" on the pyth path and go....
- LOGGER.debug("starting openMolar.... using main.py as __main__")
+ LOGGER.info("starting openMolar.... using main.py as __main__")
- def determine_path ():
+ def determine_path():
"""Borrowed from wxglade.py"""
try:
root = __file__
- if os.path.islink (root):
- root = os.path.realpath (root)
- retarg = os.path.dirname (os.path.abspath (root))
+ if os.path.islink(root):
+ root = os.path.realpath(root)
+ retarg = os.path.dirname(os.path.abspath(root))
return retarg
except:
LOGGER.exception(
- "There is no __file__ variable.\n"
- "OpenMolar cannot run in this environment")
- sys.exit ()
+ "There is no __file__ variable.\n"
+ "OpenMolar cannot run in this environment")
+ sys.exit()
wkdir = determine_path()
sys.path.insert(0, os.path.dirname(wkdir))
diff --git a/src/openmolar/ptModules/__init__.py b/src/openmolar/ptModules/__init__.py
index e69de29..c701215 100644
--- a/src/openmolar/ptModules/__init__.py
+++ b/src/openmolar/ptModules/__init__.py
@@ -0,0 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/openmolar/ptModules/debug_html.py b/src/openmolar/ptModules/debug_html.py
index 32163f2..b6fac66 100644
--- a/src/openmolar/ptModules/debug_html.py
+++ b/src/openmolar/ptModules/debug_html.py
@@ -1,14 +1,32 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009-2013 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from openmolar.dbtools import patient_class
from openmolar.dbtools.treatment_course import CURRTRT_ATTS
-existing=""
+existing = ""
+
def toHtml(pt, tableCalled=None, changesOnly=False):
'''
@@ -18,11 +36,11 @@ def toHtml(pt, tableCalled=None, changesOnly=False):
'''
global existing
- retarg='<html><body><div align="center">'
- #attribs=p1.__dict__.keys()
- #attribs.sort()
+ retarg = '<html><body><div align="center">'
+ # attribs=p1.__dict__.keys()
+ # attribs.sort()
- attributesDict={}
+ attributesDict = {}
if tableCalled == "Patient":
attributesDict["Patient Table"] = patient_class.patientTableAtts
elif tableCalled == "Treatment":
@@ -31,18 +49,19 @@ def toHtml(pt, tableCalled=None, changesOnly=False):
attributesDict["HDP"] = ("plandata",)
elif tableCalled == "Estimates":
attributesDict["Estimates"] = ("estimates", )
- elif tableCalled=="Perio":
+ elif tableCalled == "Perio":
attributesDict["Perio Data"] = ("perioData",)
else:
attributesDict["all attributes"] = pt.dbstate.__dict__.keys()
- changes=False
+ changes = False
for key in sorted(attributesDict.keys()):
attribs = attributesDict[key]
if changesOnly:
- title = "%s (changes only)"%key
- else: title = key
- retarg += "<h2>%s</h2>"%title
+ title = "%s (changes only)" % key
+ else:
+ title = key
+ retarg += "<h2>%s</h2>" % title
retarg += '<table width="100%" border="1">'
retarg += '<tr><th>Attribute</th><th>orig</th><th>changed</th>'
for att in sorted(attribs):
@@ -52,7 +71,7 @@ def toHtml(pt, tableCalled=None, changesOnly=False):
changes = True
retarg += '''<tr>
<td>%s</td><td>%s</td><td>%s</td>
- </tr>'''% (att,orig,new)
+ </tr>''' % (att, orig, new)
retarg += "</table>"
existing = key
if not changes:
@@ -66,9 +85,9 @@ if __name__ == "__main__":
import sys
localsettings.initiate()
try:
- serialno=int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
- serialno=29283
+ serialno = 29283
pt = patient_class.patient(serialno)
print toHtml(pt, changesOnly=True)
diff --git a/src/openmolar/ptModules/dec_perm.py b/src/openmolar/ptModules/dec_perm.py
index 4d6bc07..9517802 100644
--- a/src/openmolar/ptModules/dec_perm.py
+++ b/src/openmolar/ptModules/dec_perm.py
@@ -1,54 +1,71 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
def toSignedByte(val):
- lav=list(val)
- if lav[0]=="1":
- retarg=-128
- i=6
+ lav = list(val)
+ if lav[0] == "1":
+ retarg = -128
+ i = 6
for c in lav[1:8]:
- if c =="1":
- retarg+=2**i
- i-=1
+ if c == "1":
+ retarg += 2 ** i
+ i -= 1
else:
- retarg=0
- i=7
+ retarg = 0
+ i = 7
for c in lav:
- if c =="1":
- retarg+=2**i
- i-=1
+ if c == "1":
+ retarg += 2 ** i
+ i -= 1
return retarg
+
def fromSignedByte(val):
'''this returns a bit by bit representation of a signed byte - used for deciduous tooth'''
- if val>=0:
- base=(128,64,32,16,8,4,2,1)
- bstring=""
+ if val >= 0:
+ base = (128, 64, 32, 16, 8, 4, 2, 1)
+ bstring = ""
for b in base:
- if val>=b:
- bstring+="1"
- val-=b
+ if val >= b:
+ bstring += "1"
+ val -= b
else:
- bstring+="0"
+ bstring += "0"
else:
- base=(-64,-32,-16,-8,-4,-2,-1)
- bstring="1" #set the negative bit
+ base = (-64, -32, -16, -8, -4, -2, -1)
+ bstring = "1" # set the negative bit
for b in base:
- if val<b:
- bstring+="0"
- val-=b
+ if val < b:
+ bstring += "0"
+ val -= b
else:
- bstring+="1"
+ bstring += "1"
return bstring
-if __name__=="__main__":
- for byte in(-127,-126,-125,-8,120,32):
+if __name__ == "__main__":
+ for byte in(-127, -126, -125, -8, 120, 32):
print byte,
result = fromSignedByte(int(byte))
- print "chart =",result,
- print "and back =",toSignedByte(result)
+ print "chart =", result,
+ print "and back =", toSignedByte(result)
diff --git a/src/openmolar/ptModules/estimates.py b/src/openmolar/ptModules/estimates.py
index 8819f8a..7af3684 100644
--- a/src/openmolar/ptModules/estimates.py
+++ b/src/openmolar/ptModules/estimates.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
import copy
@@ -17,7 +33,9 @@ from openmolar.ptModules import plan
LOGGER = logging.getLogger("openmolar")
+
class TXHash(object):
+
def __init__(self, hash_, completed=False):
self.hash = hash_
self.completed = completed
@@ -27,20 +45,23 @@ class TXHash(object):
compare the object with another hash
note - completion state is irrelevant
'''
- if type(other) == TXHash:
+ if isinstance(other, TXHash):
return self.hash == other.hash
return self.hash == other
def __repr__(self):
- return ("TXHash %s completed=%s"% (self.hash, self.completed))
+ return ("TXHash %s completed=%s" % (self.hash, self.completed))
+
class Estimate(object):
+
'''
this class has attributes suitable for storing in the estimates table
'''
COMPLETED = 2
PARTIALLY_COMPLETED = 1
PLANNED = 0
+
def __init__(self):
self.ix = None
self.serialno = None
@@ -62,7 +83,7 @@ class Estimate(object):
the replacement of "-" with "Z" ensures that "other" items are last
'''
return cmp(
- self.itemcode.replace("-", "Z"), other.itemcode.replace("-", "Z"))
+ self.itemcode.replace("-", "Z"), other.itemcode.replace("-", "Z"))
@property
def completed(self):
@@ -90,19 +111,19 @@ class Estimate(object):
def interim_fee(self):
if self.tx_hashes == []:
return 0
- return self.n_completed * self.fee//len(self.tx_hashes)
+ return self.n_completed * self.fee // len(self.tx_hashes)
@property
def interim_pt_fee(self):
if self.tx_hashes == []:
return 0
- return self.n_completed * self.ptfee//len(self.tx_hashes)
+ return self.n_completed * self.ptfee // len(self.tx_hashes)
def __repr__(self):
return self.__str__()
def __str__(self):
- return "\nEstimate\n (%s %s %s %s %s %s %s %s %s %s %s %s)"% (
+ return "\nEstimate\n (%s %s %s %s %s %s %s %s %s %s %s %s)" % (
self.ix,
self.serialno,
self.courseno,
@@ -122,7 +143,7 @@ class Estimate(object):
estimate data formatted so as to be useful in a log
|| can be used to separate values
'''
- return "%s || %s || %s || %s || %s || %s || %s || %s||\n"% (
+ return "%s || %s || %s || %s || %s || %s || %s || %s||\n" % (
self.number, self.itemcode, self.description, self.csetype,
self.feescale, self.dent, self.fee, self.ptfee)
@@ -132,9 +153,9 @@ class Estimate(object):
def toHtmlRow(self):
hash_string = ""
for tx_hash in self.tx_hashes:
- hash_string += "<li>%s</li>"% tx_hash.hash
+ hash_string += "<li>%s</li>" % tx_hash.hash
if hash_string:
- hash_string = "<ul>%s</ul>"% hash_string
+ hash_string = "<ul>%s</ul>" % hash_string
else:
hash_string = _("no treatments")
@@ -157,17 +178,17 @@ class Estimate(object):
<td>%s</td>
<td>%s</td>
</tr>
- '''%(
- localsettings.ops.get(self.dent),
- self.number,
- self.itemcode,
- self.description,
- localsettings.formatMoney(self.fee),
- localsettings.formatMoney(self.ptfee),
- self.feescale,
- self.csetype,
- completed,
- hash_string)
+ ''' % (
+ localsettings.ops.get(self.dent),
+ self.number,
+ self.itemcode,
+ self.description,
+ localsettings.formatMoney(self.fee),
+ localsettings.formatMoney(self.ptfee),
+ self.feescale,
+ self.csetype,
+ completed,
+ hash_string)
def htmlHeader(self):
return '''<tr><th>Dentist</th><th>number</th><th>code</th>
@@ -209,6 +230,7 @@ class Estimate(object):
def has_multi_txs(self):
return len(self.tx_hashes) > 1
+
def strip_curlies(description):
'''
comments such as {2 of 2} are present in the estimates...
@@ -219,6 +241,7 @@ def strip_curlies(description):
else:
return description
+
def sorted_estimates(ests):
'''
compresses a list of estimates down into number*itemcode
@@ -227,17 +250,18 @@ def sorted_estimates(ests):
'define how ests are sorted'
return cmp(a.itemcode, b.itemcode)
- sortedEsts=[]
+ sortedEsts = []
+
def combineEsts(est):
for se in sortedEsts:
if se.itemcode == est.itemcode:
if se.description == strip_curlies(est.description):
#--don't combine items where description has changed
- if est.number != None and se.number != None:
+ if est.number is not None and se.number is not None:
se.number += est.number
se.fee += est.fee
se.ptfee += est.ptfee
- #se.type += "|" + est.type
+ # se.type += "|" + est.type
return True
for est in ests:
if not combineEsts(est):
@@ -248,6 +272,7 @@ def sorted_estimates(ests):
return sortedEsts
+
def apply_exemption(pt, maxCharge=0):
'''
apply an exemption
@@ -273,7 +298,7 @@ if __name__ == "__main__":
from openmolar.dbtools import patient_class
localsettings.initiate()
try:
- serialno = int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
serialno = 23664
diff --git a/src/openmolar/ptModules/formatted_notes.py b/src/openmolar/ptModules/formatted_notes.py
index cbb5f43..4b50318 100644
--- a/src/openmolar/ptModules/formatted_notes.py
+++ b/src/openmolar/ptModules/formatted_notes.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
This module replaces notes.py with schema version 1.9
@@ -22,14 +39,14 @@ LOGGER = logging.getLogger("openmolar")
try:
from collections import OrderedDict
except ImportError:
- #OrderedDict only came in python 2.7
+ # OrderedDict only came in python 2.7
LOGGER.warning("using openmolar.backports for OrderedDict")
from openmolar.backports import OrderedDict
-## some user variables which determine the verbosity of the notes
+# some user variables which determine the verbosity of the notes
show_printed = False
-show_payments = False
+show_payments = False
show_timestamps = False
show_metadata = False
@@ -41,7 +58,8 @@ HEADER = '''<html>
<link rel="stylesheet" href="%s" type="text/css">
</head>
<body>
-<!HEADER>'''% localsettings.stylesheet
+<!HEADER>''' % localsettings.stylesheet
+
def get_notes_dict(serialno, today_only=False):
'''
@@ -53,21 +71,23 @@ def get_notes_dict(serialno, today_only=False):
ops = op1
if op2:
- ops += "/%s"% op2
+ ops += "/%s" % op2
key = (ndate, ops)
- if notes_dict.has_key(key):
- notes_dict[key].append((ntype,note))
+ if key in notes_dict:
+ notes_dict[key].append((ntype, note))
else:
- notes_dict[key] = [(ntype,note)]
+ notes_dict[key] = [(ntype, note)]
return notes_dict
+
def s_t_l(note):
'''
strip trailing linebreaks
'''
return re.sub("(<br /> *)*$", "", note)
+
def get_notes_for_date(lines, full_notes=False):
'''
this is the actual user clinically relevant stuff!
@@ -77,8 +97,8 @@ def get_notes_for_date(lines, full_notes=False):
tx, note, metadata = "", "", ""
for ntype, noteline in lines:
if "NOTE" in ntype and noteline != "":
- note += "%s "% noteline.replace(
- "<","<").replace(">",">")
+ note += "%s " % noteline.replace(
+ "<", "<").replace(">", ">")
else:
if "TC" in ntype:
txs.append((ntype, noteline))
@@ -89,32 +109,33 @@ def get_notes_for_date(lines, full_notes=False):
receipt_text = noteline.replace("sundries 0.00", "")
receipt_text = receipt_text.replace("treatment 0.00", "")
if show_payments:
- tx += "%s %s<br />"% (ntype, receipt_text)
+ tx += "%s %s<br />" % (ntype, receipt_text)
elif "PRINT" in ntype:
if show_printed:
- tx += "%s %s<br />"% (ntype, noteline)
+ tx += "%s %s<br />" % (ntype, noteline)
elif ntype in ("opened", "closed"):
if show_timestamps:
- note += "<i>%s %s</i><br />"% (ntype, noteline)
+ note += "<i>%s %s</i><br />" % (ntype, noteline)
elif show_metadata:
- metadata += "<b>%s</b>%s<br />"% (ntype, noteline)
+ metadata += "<b>%s</b>%s<br />" % (ntype, noteline)
- note = note.replace("\n","<br />")
+ note = note.replace("\n", "<br />")
for tuple_ in set(txs):
n = txs.count(tuple_)
ntype, treatment = tuple_
if n != 1:
- tx += "<b>%d%s</b><br />"% (n, treatment)
+ tx += "<b>%d%s</b><br />" % (n, treatment)
else:
- tx += "<b>%s</b><br />"% treatment
+ tx += "<b>%s</b><br />" % treatment
for tuple_ in rev_txs:
ntype, treatment = tuple_
- tx += "<b>%s</b><br />"% treatment
+ tx += "<b>%s</b><br />" % treatment
return s_t_l(tx), s_t_l(note), s_t_l(metadata)
+
def get_rec_summary(lines):
'''
this is the reception summary (what has been charged and/or printed)
@@ -122,12 +143,12 @@ def get_rec_summary(lines):
note = ""
for ntype, noteline in lines:
if "PRINTED" in ntype:
- note += '<img src=%s height="12" align="right"> %s<br />'% (
+ note += '<img src=%s height="12" align="right"> %s<br />' % (
localsettings.printer_png, noteline)
elif "RECEIVED:" in ntype:
noteline = noteline.replace("sundries 0.00", "")
noteline = noteline.replace("treatment 0.00", "")
- note += '<img src=%s height="12" align="right"> %s<br />'% (
+ note += '<img src=%s height="12" align="right"> %s<br />' % (
localsettings.money_png, noteline)
return s_t_l(note)
@@ -141,10 +162,10 @@ def rec_notes(notes_dict, startdate=None):
retarg = HEADER + '<table border="1">'
if startdate:
- retarg += "<h4>%s</h4>"% _("Course Activity")
+ retarg += "<h4>%s</h4>" % _("Course Activity")
keys = notes_dict.keys()
- #keys.sort()
+ # keys.sort()
for key in keys:
date, op = key
@@ -152,7 +173,7 @@ def rec_notes(notes_dict, startdate=None):
data = notes_dict[key]
note = get_rec_summary(data)
if note:
- retarg += '<tr><td>%s</td><td>%s</td></tr>'% (
+ retarg += '<tr><td>%s</td><td>%s</td></tr>' % (
localsettings.formatDate(date), note)
retarg += '</table></body></html>'
@@ -163,6 +184,7 @@ def rec_notes(notes_dict, startdate=None):
def summary_notes(notes_dict):
return notes(notes_dict, same_for_clinical)
+
def notes(notes_dict, full_notes=True):
'''
returns an html string of notes...
@@ -184,7 +206,7 @@ def notes(notes_dict, full_notes=True):
retarg += '</tr>'
- previousdate = "" #necessary to group notes on same day
+ previousdate = "" # necessary to group notes on same day
rowspan = 1
newline = ""
for key in keys:
@@ -198,27 +220,27 @@ def notes(notes_dict, full_notes=True):
retarg += newline
link = ""
- newline = '<td class="date">%s %s</td>'% (
+ newline = '<td class="date">%s %s</td>' % (
localsettings.notesDate(date), link)
else:
- #alter the previous html, so that the rows are spanned
+ # alter the previous html, so that the rows are spanned
rowspan += 1
newline = re.sub(
- 'class="date"( rowspan="\d")*',
- 'class="date" rowspan="%d"'% rowspan, newline)
+ 'class="date"( rowspan="\d")*',
+ 'class="date" rowspan="%d"' % rowspan, newline)
- subline = '<td class="ops">%s'% op
+ subline = '<td class="ops">%s' % op
if (date == localsettings.currentDay() and
- op == localsettings.operator):
- subline += '<br /><a href="edit_notes?||SNO||">%s</a>'% _("Edit")
+ op == localsettings.operator):
+ subline += '<br /><a href="edit_notes?||SNO||">%s</a>' % _("Edit")
newline += '''%s</td>
<td class="tx">%s</td>
- <td width="70%%" class="notes">%s</td>'''% (subline, tx, notes)
+ <td width="70%%" class="notes">%s</td>''' % (subline, tx, notes)
if show_metadata:
- newline += '<td class="reception">%s</td></tr>'% metadata
+ newline += '<td class="reception">%s</td></tr>' % metadata
else:
newline += '</tr>'
retarg += newline
@@ -226,15 +248,16 @@ def notes(notes_dict, full_notes=True):
return retarg
+
def todays_notes(serialno):
html = notes(get_notes_dict(serialno, True))
if not _("Today") in html:
html = HEADER
- html += "%s <a href='edit_notes?%s'>%s</a></body></html>"% (
+ html += "%s <a href='edit_notes?%s'>%s</a></body></html>" % (
_("No notes found"), serialno, _("Add a note"))
name = db_patients.name(serialno)
- header = "<h3>%s %s</h3>"% (_("Todays notes for"), name)
+ header = "<h3>%s %s</h3>" % (_("Todays notes for"), name)
html = html.replace("<!HEADER>", header)
html = html.replace("||SNO||", str(serialno))
@@ -244,10 +267,9 @@ if __name__ == "__main__":
LOGGER.setLevel(logging.DEBUG)
from openmolar.dbtools import patient_class
try:
- serialno = int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
serialno = 1
notes_ = notes(patient_class.patient(serialno).notes_dict)
print notes_.encode("ascii", "replace")
-
diff --git a/src/openmolar/ptModules/hidden_notes.py b/src/openmolar/ptModules/hidden_notes.py
index 0052747..edf7874 100644
--- a/src/openmolar/ptModules/hidden_notes.py
+++ b/src/openmolar/ptModules/hidden_notes.py
@@ -1,21 +1,38 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import re
from openmolar.settings import localsettings
+
def toHtml(pt):
'''
return the patient HiddenNotes in a readable form
'''
retarg = ""
for ntype, note in pt.HIDDENNOTES:
- retarg +="%s<br />"% note
+ retarg += "%s<br />" % note
return retarg
if __name__ == "__main__":
@@ -23,12 +40,12 @@ if __name__ == "__main__":
from openmolar.dbtools import patient_class
localsettings.initiate()
try:
- serialno=int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
- serialno=1
- pt=patient_class.patient(serialno)
+ serialno = 1
+ pt = patient_class.patient(serialno)
- pt.addHiddenNote("exam","CE")
- pt.addHiddenNote("perio_treatment","SP")
+ pt.addHiddenNote("exam", "CE")
+ pt.addHiddenNote("perio_treatment", "SP")
pt.addHiddenNote("printed", "appt card")
- print toHtml(pt)
\ No newline at end of file
+ print toHtml(pt)
diff --git a/src/openmolar/ptModules/nhsDetails.py b/src/openmolar/ptModules/nhsDetails.py
index a9bde94..1482d26 100644
--- a/src/openmolar/ptModules/nhsDetails.py
+++ b/src/openmolar/ptModules/nhsDetails.py
@@ -1,39 +1,63 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
from openmolar.settings import localsettings
+
def toHtml(pt):
'''
returns an HTML table of the patients pt
'''
-
- retarg='''<html><body><center>
+
+ retarg = '''<html><body><center>
<h3>NHS DETAILS</h3>
<table width ="100%" border="1">
'''
- retarg+="<tr><td>EXEMPTION</td><td>%s</td></tr>"%pt.exemption
- retarg+="<tr><td>EXEMPTION TEXT</td><td>%s</td></tr>"%pt.exempttext
- retarg+="<tr><td>PREVIOUS SURNAME</td><td>%s</td></tr>"%pt.psn
- retarg+="<tr><td>NHS NUMBER</td><td>%s</td></tr>"%pt.nhsno
-
- retarg+="<tr><td>LAST CLAIM</td><td>%s</td></tr>"% localsettings.formatDate(pt.pd3)
- retarg+="<tr><td>INITIAL ACCEPTANCE</td><td>%s</td></tr>"% localsettings.formatDate(pt.pd12)
- retarg+="<tr><td>LAST REACCEPTANCE</td><td>%s</td></tr>"% localsettings.formatDate(pt.pd14)
- retarg+="<tr><td>EXPIRY</td><td>%s</td></tr>"% localsettings.formatDate(pt.expiry)
- retarg+="<tr><td>CSTATUS</td><td>%s</td></tr>"% localsettings.formatDate(pt.cstatus)
- retarg+="<tr><td>TRANSFER</td><td>%s</td></tr>"% localsettings.formatDate(pt.transfer)
-
- if pt.sex=="F":
- retarg+="<tr><td>CONFINEMENT DATE</td><td>%s</td></tr>"% localsettings.formatDate(pt.cnfd)
-
- retarg+='</table></body></html>'
+ retarg += "<tr><td>EXEMPTION</td><td>%s</td></tr>" % pt.exemption
+ retarg += "<tr><td>EXEMPTION TEXT</td><td>%s</td></tr>" % pt.exempttext
+ retarg += "<tr><td>PREVIOUS SURNAME</td><td>%s</td></tr>" % pt.psn
+ retarg += "<tr><td>NHS NUMBER</td><td>%s</td></tr>" % pt.nhsno
+
+ retarg += "<tr><td>LAST CLAIM</td><td>%s</td></tr>" % localsettings.formatDate(
+ pt.pd3)
+ retarg += "<tr><td>INITIAL ACCEPTANCE</td><td>%s</td></tr>" % localsettings.formatDate(
+ pt.pd12)
+ retarg += "<tr><td>LAST REACCEPTANCE</td><td>%s</td></tr>" % localsettings.formatDate(
+ pt.pd14)
+ retarg += "<tr><td>EXPIRY</td><td>%s</td></tr>" % localsettings.formatDate(
+ pt.expiry)
+ retarg += "<tr><td>CSTATUS</td><td>%s</td></tr>" % localsettings.formatDate(
+ pt.cstatus)
+ retarg += "<tr><td>TRANSFER</td><td>%s</td></tr>" % localsettings.formatDate(
+ pt.transfer)
+
+ if pt.sex == "F":
+ retarg += "<tr><td>CONFINEMENT DATE</td><td>%s</td></tr>" % localsettings.formatDate(
+ pt.cnfd)
+
+ retarg += '</table></body></html>'
return retarg
@@ -41,9 +65,9 @@ if __name__ == "__main__":
from openmolar.dbtools import patient_class
localsettings.initiate(False)
try:
- serialno=int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
- serialno=707
+ serialno = 707
- pt=patient_class.patient(serialno)
+ pt = patient_class.patient(serialno)
print toHtml(pt.pt)
diff --git a/src/openmolar/ptModules/notes.py b/src/openmolar/ptModules/notes.py
index 11d3296..c935005 100644
--- a/src/openmolar/ptModules/notes.py
+++ b/src/openmolar/ptModules/notes.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
This module is deprecated with schema version 1.9
@@ -13,23 +30,25 @@ It is, however, legacy code required for the upgrade schema process
import datetime
-import re, sys
+import re
+import sys
from openmolar.settings import localsettings
CHART = {
-136:"UR8", 135:"UR7", 134:"UR6", 133:"UR5",
-132:"UR4", 131:"UR3", 130:"UR2", 129:"UR1",
-144:"UL1", 145:"UL2", 146:"UL3", 147:"UL4",
-148:"UL5", 149:"UL6", 150:"UL7", 151:"UL8",
-166:"LL8", 165:"LL7", 164:"LL6", 163:"LL5",
-162:"LL4", 161:"LL3", 160:"LL2", 159:"LL1",
-174:"LR1", 175:"LR2", 176:"LR3", 177:"LR4",
-178:"LR5", 179:"LR6", 180:"LR7", 181:"LR8",
-142:"URE", 141:"URD", 140:"URC", 139:"URB",
-138:"URA", 153:"ULA", 154:"ULB", 155:"ULC",
-156:"ULD", 157:"ULE", 172:"LLE", 171:"LLD",
-170:"LLC", 169:"LLB", 168:"LLA", 183:"LRA",
-184:"LRB", 185:"LRC", 186:"LRD", 187:"LRE"}
+ 136: "UR8", 135: "UR7", 134: "UR6", 133: "UR5",
+ 132: "UR4", 131: "UR3", 130: "UR2", 129: "UR1",
+ 144: "UL1", 145: "UL2", 146: "UL3", 147: "UL4",
+ 148: "UL5", 149: "UL6", 150: "UL7", 151: "UL8",
+ 166: "LL8", 165: "LL7", 164: "LL6", 163: "LL5",
+ 162: "LL4", 161: "LL3", 160: "LL2", 159: "LL1",
+ 174: "LR1", 175: "LR2", 176: "LR3", 177: "LR4",
+ 178: "LR5", 179: "LR6", 180: "LR7", 181: "LR8",
+ 142: "URE", 141: "URD", 140: "URC", 139: "URB",
+ 138: "URA", 153: "ULA", 154: "ULB", 155: "ULC",
+ 156: "ULD", 157: "ULE", 172: "LLE", 171: "LLD",
+ 170: "LLC", 169: "LLB", 168: "LLA", 183: "LRA",
+ 184: "LRB", 185: "LRC", 186: "LRD", 187: "LRE"}
+
def rec_notes(notes_dict):
'''
@@ -38,12 +57,11 @@ def rec_notes(notes_dict):
'''
retarg = '''<html><head><link rel="stylesheet"
- href="%s" type="text/css"></head><body>'''% localsettings.stylesheet
- keys = notes_dict.keys()
- keys.sort()
+ href="%s" type="text/css"></head><body>''' % localsettings.stylesheet
+ keys = sorted(notes_dict.keys())
- previousdate = "" #necessary to group notes on same day
- divopen=False
+ previousdate = "" # necessary to group notes on same day
+ divopen = False
for key in keys:
date, op = key
notes = get_notes_for_date(notes_dict[key])
@@ -53,20 +71,20 @@ def rec_notes(notes_dict):
if ests or rec:
if d != previousdate:
previousdate = d
- retarg += '<div class="recep_date">%s'% d
+ retarg += '<div class="recep_date">%s' % d
divopen = True
retarg += "<ul>"
if ests:
- retarg += '<li class="recep_note">%s</li>'% ests
+ retarg += '<li class="recep_note">%s</li>' % ests
if rec:
- rec = rec.replace("<li>",'<li class="recep_note">')
+ rec = rec.replace("<li>", '<li class="recep_note">')
rec = rec.replace("PRINTED:",
- '<img src=%s height="12" align="left">'% (
- localsettings.printer_png))
+ '<img src=%s height="12" align="left">' % (
+ localsettings.printer_png))
rec = rec.replace("RECEIVED:",
- '<img src=%s height="12" align="left">'% (
- localsettings.money_png))
+ '<img src=%s height="12" align="left">' % (
+ localsettings.money_png))
retarg += rec
retarg += "</ul>"
if divopen:
@@ -86,9 +104,8 @@ def notes(notes_dict, verbosity=0, ignoreRec=False):
'''
retarg = '''<html><head><link rel="stylesheet"
- href="%s" type="text/css"></head><body>'''% localsettings.stylesheet
- keys = notes_dict.keys()
- keys.sort()
+ href="%s" type="text/css"></head><body>''' % localsettings.stylesheet
+ keys = sorted(notes_dict.keys())
retarg += '''<table>
<tr>
<th>Date</th>
@@ -100,55 +117,55 @@ def notes(notes_dict, verbosity=0, ignoreRec=False):
if verbosity > 0:
retarg += '<th>reception</th>'
- if verbosity == 2: #this is for development/debugging purposes
+ if verbosity == 2: # this is for development/debugging purposes
retarg += '<th>Detailed</th>'
retarg += '</tr>'
wstring = "70%"
- previousdate="" #necessary to group notes on same day
+ previousdate = "" # necessary to group notes on same day
rowspan = 1
newline = ""
for key in keys:
date, op = key
notes = get_notes_for_date(notes_dict[key])
if ("REC" in op and notes != "") or (
- "REC" in op and not ignoreRec) or not "REC" in op:
+ "REC" in op and not ignoreRec) or not "REC" in op:
newline += "<tr>"
d = get_date_from_date(date)
if d != previousdate:
previousdate = d
rowspan = 1
retarg += newline
- newline = '<td class="date">%s</td>'% d
+ newline = '<td class="date">%s</td>' % d
else:
- #alter the previous html, so that the rows are spanned
+ # alter the previous html, so that the rows are spanned
rowspan += 1
newline = re.sub(
- 'class="date"( rowspan="\d")*',
- 'class="date" rowspan="%d"'% rowspan, newline)
+ 'class="date"( rowspan="\d")*',
+ 'class="date" rowspan="%d"' % rowspan, newline)
newline += '''<td class="ops">%s</td>
- <td class="tx">%s</td><td width="%s" class="notes">%s</td>'''% (
- op, get_codes_for_date(notes_dict[key]),
- wstring, notes)
+ <td class="tx">%s</td><td width="%s" class="notes">%s</td>''' % (
+ op, get_codes_for_date(notes_dict[key]),
+ wstring, notes)
ests = get_estimate_for_date(notes_dict[key])
rec = get_reception_for_date(notes_dict[key])
if verbosity > 0:
newline += '<td class="reception">'
if rec != "" and ests == "":
- newline += '%s</td>'% rec
+ newline += '%s</td>' % rec
elif rec == "" and ests != "":
- newline += '%s</td>'% ests
+ newline += '%s</td>' % ests
else:
- newline += "%s<br />%s</td>"% (ests, rec)
+ newline += "%s<br />%s</td>" % (ests, rec)
if verbosity == 2:
text = ""
for item in notes_dict[key]:
- text += "%s<br />"% str(item)
- newline += "<td class=verbose>%s</td>"% text
+ text += "%s<br />" % str(item)
+ newline += "<td class=verbose>%s</td>" % text
newline += "</tr>"
retarg += newline
@@ -156,6 +173,7 @@ def notes(notes_dict, verbosity=0, ignoreRec=False):
return retarg
+
def get_date_from_date(key):
'''
converts to a readable date
@@ -164,41 +182,44 @@ def get_date_from_date(key):
k = key.split('_')
d = datetime.date(int(k[0]), int(k[1]), int(k[2]))
return localsettings.formatDate(d)
- #return k[2]+"/"+k[1]+"/"+k[0]
+ # return k[2]+"/"+k[1]+"/"+k[0]
except IndexError:
- return "IndexERROR converting date %s" %key
+ return "IndexERROR converting date %s" % key
except ValueError:
- return "TypeERROR converting date %s" %key
+ return "TypeERROR converting date %s" % key
+
def get_codes_for_date(line):
- code=""
+ code = ""
for l in line:
if "TC" in l[0]:
- code+="<b>"
- tx=l[1]
- while len(tx)>8 and " " in tx[8:]:
- pos=tx.index(" ",8)
- code+="%s <br />"%tx[:pos]
- tx=tx[pos:]
- code+="%s </b>"%tx
- if code=="":
+ code += "<b>"
+ tx = l[1]
+ while len(tx) > 8 and " " in tx[8:]:
+ pos = tx.index(" ", 8)
+ code += "%s <br />" % tx[:pos]
+ tx = tx[pos:]
+ code += "%s </b>" % tx
+ if code == "":
return "-"
else:
return code
+
def get_notes_for_date(line):
'''
this is the actual user entered stuff!
'''
- note=""
+ note = ""
for l in line:
if "NOTE" in l[0]:
- mytext = l[1].replace("<","<").replace(">",">")
- note += "%s "% mytext
+ mytext = l[1].replace("<", "<").replace(">", ">")
+ note += "%s " % mytext
match = re.search(r"[\n ]*$", note)
if match:
note = note[:note.rindex(match.group())]
- return note.replace("\n","<br />")
+ return note.replace("\n", "<br />")
+
def get_reception_for_date(line):
'''
@@ -209,28 +230,30 @@ def get_reception_for_date(line):
value = value.replace("sundries 0.00", "")
value = value.replace("==========", "")
if (("PRINT" in action) or ("RECEIVED" in action) or
- ("FINAL" in action) or ("UNKNOWN" in action) or
- ("UPDATE" in action) or ("COURSE" in action)):
- recep += "<li>%s %s</li>"% (action, value)
+ ("FINAL" in action) or ("UNKNOWN" in action) or
+ ("UPDATE" in action) or ("COURSE" in action)):
+ recep += "<li>%s %s</li>" % (action, value)
return recep
+
def get_estimate_for_date(line):
est = ""
for l in line:
if "ESTIMATE" in l[0]:
- est += "%s%s"% (l[0],l[1])
+ est += "%s%s" % (l[0], l[1])
return est
+
def decipher_noteline(noteline):
'''
returns a list. ["type","note","operator","date"]
'''
- retarg=["","","",""]
+ retarg = ["", "", "", ""]
- if len(noteline) == 0: #sometimes a line is blank
- return retarg
+ if len(noteline) == 0: # sometimes a line is blank
+ return retarg
- #important - this line give us operator and date.
+ # important - this line give us operator and date.
if noteline[0] == chr(1):
retarg[0] = "opened"
operator = ""
@@ -239,24 +262,24 @@ def decipher_noteline(noteline):
operator += noteline[i]
i += 1
- ## arghh!!! 2 character year field!!!!!!
- workingdate = "%s_%02d_%02d"% (
- 1900+char(noteline[i+2]),char(noteline[i+1]),char(noteline[i]))
+ # arghh!!! 2 character year field!!!!!!
+ workingdate = "%s_%02d_%02d" % (
+ 1900 + char(noteline[i + 2]), char(noteline[i + 1]), char(noteline[i]))
retarg[2] = operator
retarg[3] = workingdate
try:
- systemdate = "%s/%s/%s"% (
- char(noteline[i+3]), char(noteline[i+4]),
- 1900 + char(noteline[i+5]))
+ systemdate = "%s/%s/%s" % (
+ char(noteline[i + 3]), char(noteline[i + 4]),
+ 1900 + char(noteline[i + 5]))
- #systemdate includes time
- systemdate += " %02d:%02d"% (
- char(noteline[i+6]), char(noteline[i+7]))
+ # systemdate includes time
+ systemdate += " %02d:%02d" % (
+ char(noteline[i + 6]), char(noteline[i + 7]))
- retarg[1] += "System date - %s"% systemdate
+ retarg[1] += "System date - %s" % systemdate
- except IndexError, e:
+ except IndexError as e:
print "error getting system date for patient notes - %s", e
retarg[1] += "System date - ERROR!!!!!"
@@ -267,150 +290,151 @@ def decipher_noteline(noteline):
while noteline[i] >= "A" or noteline[i] == "/":
operator += noteline[i]
i += 1
- systemdate = "%s/%s/%s"%(
- char(noteline[i]), char(noteline[i+1]),
- 1900+char(noteline[i+2]))
+ systemdate = "%s/%s/%s" % (
+ char(noteline[i]), char(noteline[i + 1]),
+ 1900 + char(noteline[i + 2]))
- systemdate+=" %02d:%02d"%(
- char(noteline[i+3]),char(noteline[i+4]))
+ systemdate += " %02d:%02d" % (
+ char(noteline[i + 3]), char(noteline[i + 4]))
- retarg[1] += "%s %s"% (operator, systemdate)
+ retarg[1] += "%s %s" % (operator, systemdate)
elif noteline[0] == chr(3):
#-- hidden nodes start with chr(3) then another character
- if noteline[1]==chr(97):
- retarg[0]="COURSE CLOSED"
- retarg[1]="="*10
- elif noteline[1]==chr(100):
- retarg[0]="UPDATED:"
- retarg[1]="Medical Notes "+noteline[2:]
- elif noteline[1]==chr(101):
- retarg[0]="UPDATED:"
- retarg[1]="Perio Chart"
- elif noteline[1]==chr(104):
- retarg[0]="TC: XRAY"
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(105):
- retarg[0]="TC: PERIO"
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(106):
- retarg[0]="TC: ANAES"
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(107):
- retarg[0]="TC: OTHER"
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(108):
- retarg[0]="TC: NEW Denture Upper"
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(109):
- retarg[0]="TC: NEW Denture Lower"
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(110):
- retarg[0]="TC: Existing Denture Upper"
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(111):
- retarg[0]="TC: Existing Denture Lower"
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(112):
- retarg[0]="TC: EXAM"
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(113):
- retarg[0]="TC:"
- retarg[1]=tooth(noteline[2:])
- elif noteline[1]==chr(114):
- retarg[0]="STATIC: " #(1st line):"
- retarg[1]=tooth(noteline[2:])
- elif noteline[1]==chr(115):
- retarg[0]="PRINTED: "
- retarg[1]="GP17(A)"
- elif noteline[1]==chr(116):
- retarg[0]="PRINTED: "
- retarg[1]="GP17(C)"
- elif noteline[1]==chr(117):
- retarg[0]="PRINTED: "
- retarg[1]="GP17(DC)"
- elif noteline[1]==chr(119):
- retarg[0]="RECEIVED: "
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(120):
- retarg[0]="REVERSE PAYMENT:"
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(121):
- retarg[0]="STATIC: " #(additional Line):"
- retarg[1]=tooth(noteline[2:])
- elif noteline[1]==chr(123):
- retarg[0]="PRINTED: "
- retarg[1]="GP17"
- elif noteline[1]==chr(124):
- retarg[0]="PRINTED: "
- retarg[1]="GP17PR"
- elif noteline[1]==chr(130):
- retarg[0]="ESTIMATE: "
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(131):
- retarg[0]="INTERIM: "
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(132):
- retarg[0]="FINAL: "
- retarg[1]=noteline[2:]
- elif noteline[1]==chr(133):
- retarg[0]="ACTUAL: "
- retarg[1]=tooth(noteline[2:])
- elif noteline[1]==chr(134):
- retarg[0]="FILED: "
- retarg[1]="Claim"
- elif noteline[1]==chr(136):
- retarg[0]="FILED: "
- retarg[1]="Registration"
- elif noteline[1]=="v":
- retarg[0]="PRINTED: "
- retarg[1]=noteline[2:]
-
-
- elif noteline[1]==chr(125):
- retarg[0]="PRINTED: "
- retarg[1]="GP17RA"
-
- elif noteline[1]==chr(98):
- retarg[0]="WYSDOM ERROR: "
- retarg[1]="PREVIOUS NOTES LOST"
+ if noteline[1] == chr(97):
+ retarg[0] = "COURSE CLOSED"
+ retarg[1] = "=" * 10
+ elif noteline[1] == chr(100):
+ retarg[0] = "UPDATED:"
+ retarg[1] = "Medical Notes " + noteline[2:]
+ elif noteline[1] == chr(101):
+ retarg[0] = "UPDATED:"
+ retarg[1] = "Perio Chart"
+ elif noteline[1] == chr(104):
+ retarg[0] = "TC: XRAY"
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(105):
+ retarg[0] = "TC: PERIO"
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(106):
+ retarg[0] = "TC: ANAES"
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(107):
+ retarg[0] = "TC: OTHER"
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(108):
+ retarg[0] = "TC: NEW Denture Upper"
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(109):
+ retarg[0] = "TC: NEW Denture Lower"
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(110):
+ retarg[0] = "TC: Existing Denture Upper"
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(111):
+ retarg[0] = "TC: Existing Denture Lower"
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(112):
+ retarg[0] = "TC: EXAM"
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(113):
+ retarg[0] = "TC:"
+ retarg[1] = tooth(noteline[2:])
+ elif noteline[1] == chr(114):
+ retarg[
+ 0] = "STATIC: " # (1st line):"
+ retarg[1] = tooth(noteline[2:])
+ elif noteline[1] == chr(115):
+ retarg[0] = "PRINTED: "
+ retarg[1] = "GP17(A)"
+ elif noteline[1] == chr(116):
+ retarg[0] = "PRINTED: "
+ retarg[1] = "GP17(C)"
+ elif noteline[1] == chr(117):
+ retarg[0] = "PRINTED: "
+ retarg[1] = "GP17(DC)"
+ elif noteline[1] == chr(119):
+ retarg[0] = "RECEIVED: "
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(120):
+ retarg[0] = "REVERSE PAYMENT:"
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(121):
+ retarg[
+ 0] = "STATIC: " # (additional Line):"
+ retarg[1] = tooth(noteline[2:])
+ elif noteline[1] == chr(123):
+ retarg[0] = "PRINTED: "
+ retarg[1] = "GP17"
+ elif noteline[1] == chr(124):
+ retarg[0] = "PRINTED: "
+ retarg[1] = "GP17PR"
+ elif noteline[1] == chr(130):
+ retarg[0] = "ESTIMATE: "
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(131):
+ retarg[0] = "INTERIM: "
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(132):
+ retarg[0] = "FINAL: "
+ retarg[1] = noteline[2:]
+ elif noteline[1] == chr(133):
+ retarg[0] = "ACTUAL: "
+ retarg[1] = tooth(noteline[2:])
+ elif noteline[1] == chr(134):
+ retarg[0] = "FILED: "
+ retarg[1] = "Claim"
+ elif noteline[1] == chr(136):
+ retarg[0] = "FILED: "
+ retarg[1] = "Registration"
+ elif noteline[1] == "v":
+ retarg[0] = "PRINTED: "
+ retarg[1] = noteline[2:]
+
+ elif noteline[1] == chr(125):
+ retarg[0] = "PRINTED: "
+ retarg[1] = "GP17RA"
+
+ elif noteline[1] == chr(98):
+ retarg[0] = "WYSDOM ERROR: "
+ retarg[1] = "PREVIOUS NOTES LOST"
else:
- retarg[0]='UNKNOWN LINE: '
- retarg[1]+="%s | "%noteline[1:]
+ retarg[0] = 'UNKNOWN LINE: '
+ retarg[1] += "%s | " % noteline[1:]
for ch in noteline[1:]:
- retarg[1]+="'%s' "%str(char(ch))
-
-
+ retarg[1] += "'%s' " % str(char(ch))
if "TC" in retarg[0]:
- retarg[1]="%s"%retarg[1]
+ retarg[1] = "%s" % retarg[1]
- elif noteline[0]=="\t":
- #this is the first character of any REAL line of old (pre MYSQL) notes
- retarg[0]= "oldNOTE"
- retarg[1]="%s"%noteline[1:]
+ elif noteline[0] == "\t":
+ # this is the first character of any REAL line of old (pre MYSQL) notes
+ retarg[0] = "oldNOTE"
+ retarg[1] = "%s" % noteline[1:]
else:
- #new note lines don't have the tab
- retarg[0]="newNOTE"
- retarg[1]+="%s"%noteline
+ # new note lines don't have the tab
+ retarg[0] = "newNOTE"
+ retarg[1] += "%s" % noteline
return retarg
+
def char(c):
- i=0
+ i = 0
while i < 256:
- if chr(i)==c:
+ if chr(i) == c:
return i
break
- i+=1
+ i += 1
+
def tooth(data):
- #return str(data.split("\t"))
- retarg=""
+ # return str(data.split("\t"))
+ retarg = ""
for c in data:
- i=char(c)
- if CHART.has_key(i):
- retarg += CHART[i]+" "
+ i = char(c)
+ if i in CHART:
+ retarg += CHART[i] + " "
else:
retarg += c
return retarg
@@ -420,14 +444,13 @@ if __name__ == "__main__":
sys.path.append("/home/neil/openmolar")
from openmolar.dbtools import patient_class
try:
- serialno=int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
- serialno=1
+ serialno = 1
if "-v" in sys.argv:
- verbose=True
+ verbose = True
else:
- verbose=False
- #print "getting notes"
- #print rec_notes(patient_class.patient(serialno).notes_dict)
+ verbose = False
+ # print "getting notes"
+ # print rec_notes(patient_class.patient(serialno).notes_dict)
print notes(patient_class.patient(serialno).notes_dict, verbose)
-
diff --git a/src/openmolar/ptModules/patientDetails.py b/src/openmolar/ptModules/patientDetails.py
index f732690..2502e1c 100644
--- a/src/openmolar/ptModules/patientDetails.py
+++ b/src/openmolar/ptModules/patientDetails.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module provides an html summary of the patient's details
@@ -20,48 +36,51 @@ from openmolar.dbtools import patient_class
LOGGER = logging.getLogger("openmolar")
+
def getAge(pt):
'''
display the patient's age in human readable form
'''
ageYears, months, isToday = pt.getAge()
if isToday:
- return "<h5> %s TODAY!</h5>"% ageYears
+ return "<h5> %s TODAY!</h5>" % ageYears
if ageYears > 18:
- return "(%syo)<hr />"% ageYears
+ return "(%syo)<hr />" % ageYears
else:
- retarg = "<br />%s years"% ageYears
+ retarg = "<br />%s years" % ageYears
if ageYears == 1:
retarg = retarg.strip("s")
- retarg += " %s months"% months
+ retarg += " %s months" % months
if months == 1:
retarg = retarg.strip("s")
return retarg + "<hr />"
+
def header(pt):
retarg = '''<html>
<head><link rel="stylesheet" href="%s" type="text/css"></head>
<body><div align = "center">
<h4>Patient %d</h4>
<h3>%s %s %s</h3>
- '''% (
+ ''' % (
localsettings.stylesheet, pt.serialno, pt.title.title(),
pt.fname.title(), pt.sname.title())
- retarg += '%s %s'% (localsettings.formatDate(pt.dob), getAge(pt))
+ retarg += '%s %s' % (localsettings.formatDate(pt.dob), getAge(pt))
for line in (pt.addr1, pt.addr2, pt.addr3, pt.town, pt.county):
if str(line) != '':
- retarg += "%s <br />"% line
+ retarg += "%s <br />" % line
if pt.pcde == "":
retarg += "<b>!UNKNOWN POSTCODE!</b>"
else:
- retarg += "%s"% pt.pcde
+ retarg += "%s" % pt.pcde
if not pt.status in ("Active", "", None):
- retarg += "<hr /><h1>%s</h1>"% pt.status
-
+ retarg += "<hr /><h1>%s</h1>" % pt.status
+
return retarg
+
def details(pt, Saved=True):
'''returns an html set showing pt name etc...'''
@@ -69,64 +88,60 @@ def details(pt, Saved=True):
retarg = header(pt) + '<hr />'
if "N" in pt.cset:
retarg += '''<img src="%s/nhs_scot.png" alt="NHS" />
- <br />'''% localsettings.resources_path
+ <br />''' % localsettings.resources_path
if pt.exemption != "":
- retarg += " exemption=%s"% str(pt.exemption)
+ retarg += " exemption=%s" % str(pt.exemption)
else:
retarg += "NOT EXEMPT"
retarg += "<br />"
elif "I" in pt.cset:
retarg += '''<img src="%s/hdp_small.png" alt="HDP" />
- <br />'''% localsettings.resources_path
+ <br />''' % localsettings.resources_path
elif "P" in pt.cset:
retarg += '''<img src="%s/private.png" alt="PRIVATE" />
- <br />'''% localsettings.resources_path
+ <br />''' % localsettings.resources_path
else:
- retarg += 'UNKNOWN COURSETYPE = %s <br />'% str(pt.cset)
- #-- removed this next code as feescale is always the same
- #if pt.pf11!=0:
- # retarg += '(feescale %s)<br />'%chr(pt.pf11)
+ retarg += 'UNKNOWN COURSETYPE = %s <br />' % str(pt.cset)
- retarg += "%s<br />"% pt.fee_table.briefName
+ retarg += "%s<br />" % pt.fee_table.briefName
try:
- retarg += 'dentist = %s'% localsettings.ops[pt.dnt1]
+ retarg += 'dentist = %s' % localsettings.ops[pt.dnt1]
if pt.dnt2 != 0 and pt.dnt1 != pt.dnt2:
- retarg += '/%s'% localsettings.ops[pt.dnt2]
- except KeyError, e:
+ retarg += '/%s' % localsettings.ops[pt.dnt2]
+ except KeyError as e:
retarg += '<h4>Please Set a Dentist for this patient!</h4><hr />'
if pt.memo != '':
- retarg += '<h4>Memo</h4>%s<hr />'% pt.memo
+ retarg += '<h4>Memo</h4>%s<hr />' % pt.memo
retarg += '''<table border="1">'
<tr><td>Last IO Xrays</td><td>%s</td></tr>
<tr><td>Last OPG</td><td>%s</td></tr>
<tr><td>Last Sp</td><td>%s</td></tr>
- '''% (localsettings.formatDate(pt.pd9),
- localsettings.formatDate(pt.pd8), localsettings.formatDate(pt.pd10))
+ ''' % (localsettings.formatDate(pt.pd9),
+ localsettings.formatDate(pt.pd8), localsettings.formatDate(pt.pd10))
letype = ""
- lastexam = datetime.date(1,1,1)
+ lastexam = datetime.date(1, 1, 1)
i = 0
for date in (pt.pd5, pt.pd6, pt.pd7):
if date and date > lastexam:
lastexam = date
letype = ("(CE)", "(ECE)", "(FCA)")[i]
i += 1
- if lastexam == datetime.date(1,1,1):
+ if lastexam == datetime.date(1, 1, 1):
lastexam = None
if letype != "":
- retarg += '<tr><td>Last Exam %s</td><td>%s</td></tr>'% (
- letype, localsettings.formatDate(lastexam))
-
+ retarg += '<tr><td>Last Exam %s</td><td>%s</td></tr>' % (
+ letype, localsettings.formatDate(lastexam))
if pt.recall_active:
retarg += '''<tr><td>Recall Date</td><td>%s</td></tr>
</table>''' % localsettings.formatDate(pt.recd)
else:
- retarg += '<tr><td colspan="2">%s</td></tr></table>'% _(
+ retarg += '<tr><td colspan="2">%s</td></tr></table>' % _(
"DO NOT RECALL")
if not Saved:
@@ -135,30 +150,29 @@ def details(pt, Saved=True):
alert = ""
if pt.fees > 0:
amount = localsettings.formatMoney(pt.fees)
- retarg += '<hr /><h3 class="debt">Account = %s %s</h3>'% (
- amount, alert)
+ retarg += '<hr /><h3 class="debt">Account = %s %s</h3>' % (
+ amount, alert)
if pt.fees < 0:
amount = localsettings.formatMoney(-pt.fees)
- retarg += '<hr /><h3>%s in credit %s</h3>'% (amount, alert)
+ retarg += '<hr /><h3>%s in credit %s</h3>' % (amount, alert)
if pt.underTreatment:
retarg += '<hr /><h2 class="ut_label">UNDER TREATMENT</h2><hr />'
- return '''%s\n</div></body></html>'''% retarg
+ return '''%s\n</div></body></html>''' % retarg
except Exception as exc:
LOGGER.exception("error in patientDetails.details")
- return "error displaying details, sorry <br />%s"% exc
+ return "error displaying details, sorry <br />%s" % exc
if __name__ == '__main__':
localsettings.initiate()
localsettings.loadFeeTables()
try:
- serialno = int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
serialno = 4792
if '-v' in sys.argv:
verbose = True
else:
- verbose = False
+ verbose = False
print details(patient_class.patient(serialno))
-
diff --git a/src/openmolar/ptModules/perio.py b/src/openmolar/ptModules/perio.py
index 09aa5ff..24c0366 100755
--- a/src/openmolar/ptModules/perio.py
+++ b/src/openmolar/ptModules/perio.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''gets and decodes the perio charts'''
@@ -13,40 +30,50 @@ from openmolar.connect import connect
import struct
+
def get_perioData(data):
- perioData={}
-
- i=0
- for tooth in ('ur8','ur7','ur6','ur5','ur4','ur3','ur2','ur1','ul1','ul2','ul3','ul4','ul5','ul6','ul7','ul8',
- 'lr8','lr7','lr6','lr5','lr4','lr3','lr2','lr1','ll1','ll2','ll3','ll4','ll5','ll6','ll7','ll8'):
- d=struct.unpack_from('b'*45,data,i)
- recession=(d[0],d[1],d[2],d[3],d[4],d[5])
- pocketing=(d[6],d[7],d[8],d[9],d[10],d[11])
- plaque=(d[12],d[13],d[14],d[15],d[16],d[17])
- bleeding=(d[18],d[19],d[20],d[21],d[22],d[23])
- other=(d[24],d[25],d[26],d[27],d[28],d[29])
- mobility=d[34]
- furcation=(d[30],d[31],d[32],d[33])
- suppuration=(d[35],d[36],d[37],d[38],d[39],d[40])
- perioData[tooth]=(recession,pocketing,plaque,bleeding,other,suppuration,furcation,mobility)
- i+=45
+ perioData = {}
+
+ i = 0
+ for tooth in (
+ 'ur8', 'ur7', 'ur6', 'ur5', 'ur4', 'ur3', 'ur2', 'ur1', 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8',
+ 'lr8', 'lr7', 'lr6', 'lr5', 'lr4', 'lr3', 'lr2', 'lr1', 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'):
+ d = struct.unpack_from('b' * 45, data, i)
+ recession = (d[0], d[1], d[2], d[3], d[4], d[5])
+ pocketing = (d[6], d[7], d[8], d[9], d[10], d[11])
+ plaque = (d[12], d[13], d[14], d[15], d[16], d[17])
+ bleeding = (d[18], d[19], d[20], d[21], d[22], d[23])
+ other = (d[24], d[25], d[26], d[27], d[28], d[29])
+ mobility = d[34]
+ furcation = (d[30], d[31], d[32], d[33])
+ suppuration = (d[35], d[36], d[37], d[38], d[39], d[40])
+ perioData[tooth] = (
+ recession,
+ pocketing,
+ plaque,
+ bleeding,
+ other,
+ suppuration,
+ furcation,
+ mobility)
+ i += 45
return perioData
if __name__ == "__main__":
try:
- serialno=int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
- serialno=707 #29833
- db=connect()
- cursor=db.cursor()
- cursor.execute('select chartdata from perio where serialno=%d'%serialno)
- chartdata=cursor.fetchall()
+ serialno = 707 # 29833
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute('select chartdata from perio where serialno=%d' % serialno)
+ chartdata = cursor.fetchall()
cursor.close()
- #db.close()
- perioData=get_perioData(chartdata[0][0])
- newdict={}
+ # db.close()
+ perioData = get_perioData(chartdata[0][0])
+ newdict = {}
for key in perioData.keys():
# print key,perioData[key]
- newdict[key]=perioData[key][1]
- print newdict
\ No newline at end of file
+ newdict[key] = perioData[key][1]
+ print newdict
diff --git a/src/openmolar/ptModules/plan.py b/src/openmolar/ptModules/plan.py
index c03f774..5f8e5d6 100644
--- a/src/openmolar/ptModules/plan.py
+++ b/src/openmolar/ptModules/plan.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import re
@@ -15,30 +31,40 @@ from openmolar.settings import localsettings
LOGGER = logging.getLogger("openmolar")
treatmentTypeHeaders = {
- "Diagnosis":("Exam","xray", "Diagnosis", "Preventive"),
- "Perio":("perio", ),
- "Tooth":("UL", "LL", "UR", "LR", "Conservation" ),
- "Prosthetics":("ndu", "nld", "odu", "odl", "Prosthetics" ),
- "Other":("other", "Surgical", "Occasional",),
- "Orthodontics":("Orthodontics",),
- "Child Specific":("Capitation",),
- "Custom":("custom",)}
+ "Diagnosis": ("Exam", "xray", "Diagnosis", "Preventive"),
+ "Perio": ("perio", ),
+ "Tooth": ("UL", "LL", "UR", "LR", "Conservation"),
+ "Prosthetics": ("ndu", "nld", "odu", "odl", "Prosthetics"),
+ "Other": ("other", "Surgical", "Occasional",),
+ "Orthodontics": ("Orthodontics",),
+ "Child Specific": ("Capitation",),
+ "Custom": ("custom",)}
templist = []
for quad in ("ur", "ul", "ll", "lr"):
for tooth in range(1, 9):
- templist.append("%s%d"%(quad, tooth))
+ templist.append("%s%d" % (quad, tooth))
tup_toothAtts = tuple(templist)
-tup_Atts = ('xray','perio','anaes','other','ndu','ndl','odu','odl','custom')
+tup_Atts = (
+ 'xray',
+ 'perio',
+ 'anaes',
+ 'other',
+ 'ndu',
+ 'ndl',
+ 'odu',
+ 'odl',
+ 'custom')
+
def plannedItems(pt):
plannedList = []
if pt.treatment_course.examt != "" and not pt.treatment_course.examd:
plannedList.append(("Exam", pt.treatment_course.examt),)
for attrib in tup_Atts + tup_toothAtts:
- tx = pt.treatment_course.__dict__[attrib+"pl"]
+ tx = pt.treatment_course.__dict__[attrib + "pl"]
if not tx in ("", None):
items = tx.strip(" ").split(" ")
for item in set(items):
@@ -46,50 +72,52 @@ def plannedItems(pt):
continue
n = items.count(item)
if n != 1:
- item = "%d%s"% (n, item)
- if re.match("[ul][lr][1-8]",attrib):
- #check for deciduous
+ item = "%d%s" % (n, item)
+ if re.match("[ul][lr][1-8]", attrib):
+ # check for deciduous
toothName = str(pt.chartgrid.get(attrib)).upper()
plannedList.append((toothName, item),)
else:
plannedList.append((attrib, item), )
return plannedList
+
def completedItems(pt, teethOnly=False):
compList = []
if teethOnly:
for tooth in tup_toothAtts:
- tx = pt.treatment_course.__dict__[tooth+"cmp"]
+ tx = pt.treatment_course.__dict__[tooth + "cmp"]
if not tx in ("", None):
items = tx.strip(" ").split(" ")
for item in items:
if item == "":
continue
item = item.decode("latin-1")
- if re.match("[ul][lr][1-8]",tooth):
+ if re.match("[ul][lr][1-8]", tooth):
compList.append((tooth, item),)
else:
- if pt.treatment_course.examt!="" and pt.treatment_course.examd:
+ if pt.treatment_course.examt != "" and pt.treatment_course.examd:
compList.append(("Exam", pt.treatment_course.examt),)
- for attrib in tup_Atts+tup_toothAtts:
- tx = pt.treatment_course.__dict__[attrib+"cmp"]
- if not tx in ("",None):
+ for attrib in tup_Atts + tup_toothAtts:
+ tx = pt.treatment_course.__dict__[attrib + "cmp"]
+ if not tx in ("", None):
items = tx.strip(" ").split(" ")
for item in set(items):
if item == "":
continue
n = items.count(item)
if n != 1:
- item = "%d%s"% (n, item)
- if re.match("[ul][lr][1-8]",attrib):
- #check for deciduous
+ item = "%d%s" % (n, item)
+ if re.match("[ul][lr][1-8]", attrib):
+ # check for deciduous
toothName = str(pt.chartgrid.get(attrib)).upper()
compList.append((toothName, item),)
else:
compList.append((attrib, item), )
return compList
+
def summary(pt):
'''
returns html set showing a summary of planned or completed treatment
@@ -100,33 +128,33 @@ def summary(pt):
retarg = '''<html><body><head>
<link rel="stylesheet" href="%s" type="text/css">
- </head>\n'''%localsettings.stylesheet
+ </head>\n''' % localsettings.stylesheet
if not pt.underTreatment:
- retarg += "<H4>%s</H4>"% _("Previous Course")
- if pt.treatment_course.accd != None:
- retarg += '%s %s<br />'% ( _("Start"),
- localsettings.formatDate(pt.treatment_course.accd))
- if pt.treatment_course.cmpd != None:
- retarg += '%s %s<br />'% (_('End'),
- localsettings.formatDate(pt.treatment_course.cmpd))
+ retarg += "<H4>%s</H4>" % _("Previous Course")
+ if pt.treatment_course.accd is not None:
+ retarg += '%s %s<br />' % (_("Start"),
+ localsettings.formatDate(pt.treatment_course.accd))
+ if pt.treatment_course.cmpd is not None:
+ retarg += '%s %s<br />' % (_('End'),
+ localsettings.formatDate(pt.treatment_course.cmpd))
plan = ""
for item in plannedItems(pt):
- plan+='%s - %s<br />'%(item)
+ plan += '%s - %s<br />' % (item)
if plan != "":
- plan = "<h5>%s</h5>%s"% (_("PLAN"), plan)
+ plan = "<h5>%s</h5>%s" % (_("PLAN"), plan)
comp = ""
for item in completedItems(pt):
- comp += '%s - %s<br />'% (item)
+ comp += '%s - %s<br />' % (item)
if comp != "":
- comp = "<h5>%s</h5>%s"% (_("COMPLETED"), comp)
+ comp = "<h5>%s</h5>%s" % (_("COMPLETED"), comp)
if plan != "":
plan = "<hr />" + plan
if plan == "" and comp == "":
- return "%s%s</body></html>"% (retarg, _("No treatment"))
+ return "%s%s</body></html>" % (retarg, _("No treatment"))
else:
- return '%s%s%s</body></html>'% (retarg, plan, comp)
+ return '%s%s%s</body></html>' % (retarg, plan, comp)
return retarg
@@ -140,19 +168,19 @@ def completedFillsToStatic(pt):
for tooth, prop in items:
tooth = tooth.lower()
if re.match("EX", prop):
- pt.treatment_course.__dict__["%sst"% tooth] = "TM "
+ pt.treatment_course.__dict__["%sst" % tooth] = "TM "
else:
- existing = pt.__dict__.get("%sst"% tooth)
- new = "%s %s "% (existing, prop)
- #add the space just to be on the safe side.
- new = new.replace(" "," ")
- #34 characters is a database limit.
+ existing = pt.__dict__.get("%sst" % tooth)
+ new = "%s %s " % (existing, prop)
+ # add the space just to be on the safe side.
+ new = new.replace(" ", " ")
+ # 34 characters is a database limit.
while len(new) > 34:
- new = new[new.index(" ")+1:]
- pt.__dict__["%sst"% tooth] = new
+ new = new[new.index(" ") + 1:]
+ pt.__dict__["%sst" % tooth] = new
- except Exception, e:
- #shouldn't happen, but safety first.
+ except Exception as e:
+ # shouldn't happen, but safety first.
LOGGER.exception("FAILED TO TRANSFER FILLS TO STATIC")
@@ -161,7 +189,7 @@ if __name__ == "__main__":
localsettings.initiate()
try:
- serialno = int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
serialno = 14860
pt = patient_class.patient(serialno)
diff --git a/src/openmolar/ptModules/planDetails.py b/src/openmolar/ptModules/planDetails.py
index 68697c8..d97d500 100644
--- a/src/openmolar/ptModules/planDetails.py
+++ b/src/openmolar/ptModules/planDetails.py
@@ -1,39 +1,56 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
from openmolar.settings import localsettings
+
def toHtml(plandata):
'''
returns an HTML table of the patients plandata
'''
if not plandata.retrieved:
return "There was an error retrieving this information"
-
- retarg='''<html><body><center>
+
+ retarg = '''<html><body><center>
<h3>PLAN DETAILS</h3>
<table width ="100%" border="1">
'''
- retarg+="<tr><td>PLAN TYPE</td><td>%s</td></tr>"%plandata.plantype
- retarg+="<tr><td>BAND</td><td>%s</td></tr>"%plandata.band
- retarg+="<tr><td>GROSS CHARGE</td><td>%s</td></tr>"%(
- localsettings.formatMoney(plandata.grosschg))
-
- retarg+="<tr><td>DISCOUNT</td><td>%s%</td></tr>"%plandata.discount
- retarg+="<tr><td>NET CHARGE</td><td>%s</td></tr>"%(
- localsettings.formatMoney(plandata.netchg))
-
- retarg+="<tr><td>CATEGORY</td><td>%s</td></tr>"%plandata.catcode
- retarg+="<tr><td>DATE JOINED</td><td>%s</td></tr>"%plandata.planjoin
- retarg+="<tr><td>REGISTRATION NUMBER</td><td>%s</td></tr>"%plandata.regno
-
- retarg+='</table></body></html>'
+ retarg += "<tr><td>PLAN TYPE</td><td>%s</td></tr>" % plandata.plantype
+ retarg += "<tr><td>BAND</td><td>%s</td></tr>" % plandata.band
+ retarg += "<tr><td>GROSS CHARGE</td><td>%s</td></tr>" % (
+ localsettings.formatMoney(plandata.grosschg))
+
+ retarg += "<tr><td>DISCOUNT</td><td>%s%</td></tr>" % plandata.discount
+ retarg += "<tr><td>NET CHARGE</td><td>%s</td></tr>" % (
+ localsettings.formatMoney(plandata.netchg))
+
+ retarg += "<tr><td>CATEGORY</td><td>%s</td></tr>" % plandata.catcode
+ retarg += "<tr><td>DATE JOINED</td><td>%s</td></tr>" % plandata.planjoin
+ retarg += "<tr><td>REGISTRATION NUMBER</td><td>%s</td></tr>" % plandata.regno
+
+ retarg += '</table></body></html>'
return retarg
@@ -41,9 +58,9 @@ if __name__ == "__main__":
from openmolar.dbtools import patient_class
localsettings.initiate()
try:
- serialno=int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
- serialno=707
+ serialno = 707
- pt=patient_class.patient(serialno)
+ pt = patient_class.patient(serialno)
print toHtml(pt.plandata)
diff --git a/src/openmolar/ptModules/reception_summary.py b/src/openmolar/ptModules/reception_summary.py
index 1dc12ac..f126155 100644
--- a/src/openmolar/ptModules/reception_summary.py
+++ b/src/openmolar/ptModules/reception_summary.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module provides an html summary of the patient's reception activity
@@ -40,41 +42,44 @@ HTML_TEMPLATE = u'''
{{PAYMENTS}}
</html>
</body>
-'''% localsettings.stylesheet
+''' % localsettings.stylesheet
+
def header_html(pt):
if pt.underTreatment:
- html_ = u"<h3>Patient is under Treatment</h3>course started %s"% (
+ html_ = u"<h3>Patient is under Treatment</h3>course started %s" % (
localsettings.readableDate(pt.treatment_course.accd))
else:
- html_ = u"<h3>Last course of treatment</h3>completed %s"% (
+ html_ = u"<h3>Last course of treatment</h3>completed %s" % (
localsettings.readableDate(pt.treatment_course.cmpd))
-
- return html_
+
+ return html_
+
def treatment_html(pt):
- return u"<h4>Treatments (courseno %s)</h4>%s"% (
+ return u"<h4>Treatments (courseno %s)</h4>%s" % (
pt.courseno0, estimate_synopsis.html(pt.courseno0))
+
def payments_html(pt):
return u'''<h4>Payments Since this course began (excluding Sundries)</h4>
- %s '''% paymentHistory.summary_details(
- pt.serialno, pt.treatment_course.accd)
+ %s ''' % paymentHistory.summary_details(
+ pt.serialno, pt.treatment_course.accd)
+
def html(pt):
- html_ = HTML_TEMPLATE.replace("{{TREATMENTS}}",treatment_html(pt))
- html_ = html_.replace("{{PAYMENTS}}",payments_html(pt))
- html_ = html_.replace("{{HEADER}}",header_html(pt))
+ html_ = HTML_TEMPLATE.replace("{{TREATMENTS}}", treatment_html(pt))
+ html_ = html_.replace("{{PAYMENTS}}", payments_html(pt))
+ html_ = html_.replace("{{HEADER}}", header_html(pt))
return html_
if __name__ == '__main__':
from openmolar.dbtools.patient_class import patient
localsettings.initiate()
-
+
pt = patient(1314)
html = html(pt)
- html = html.encode("ascii","replace")
+ html = html.encode("ascii", "replace")
print html
-
diff --git a/src/openmolar/ptModules/referral.py b/src/openmolar/ptModules/referral.py
index c818bfd..c3a869a 100644
--- a/src/openmolar/ptModules/referral.py
+++ b/src/openmolar/ptModules/referral.py
@@ -1,86 +1,129 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from xml.dom import minidom
-import time,datetime
+import time
+import datetime
from openmolar.settings import localsettings
+
def getDescriptions():
try:
- d=minidom.parse(localsettings.referralfile)
- descriptions=d.getElementsByTagName("description")
- desclist=[]
+ d = minidom.parse(localsettings.referralfile)
+ descriptions = d.getElementsByTagName("description")
+ desclist = []
for description in descriptions:
desclist.append(description.firstChild.data)
return desclist
- except :
- return ["error getting settings",localsettings.referralfile]
-def getHtml(desc,pt):
+ except:
+ return ["error getting settings", localsettings.referralfile]
+
+
+def getHtml(desc, pt):
try:
- d=minidom.parse(localsettings.referralfile)
- descriptions=d.getElementsByTagName("description")
- desclist=[]
- found=False
+ d = minidom.parse(localsettings.referralfile)
+ descriptions = d.getElementsByTagName("description")
+ desclist = []
+ found = False
for description in descriptions:
- if description.firstChild.data==desc:
- found=True
+ if description.firstChild.data == desc:
+ found = True
break
if found:
'''this means we have a node with the required address fields etc...'''
- refnode=description.parentNode
- surgeon_postal=refnode.getElementsByTagName("surgeon_postal")[0].firstChild.data
- addressNode=refnode.getElementsByTagName("address")
- lines=addressNode[0].getElementsByTagName("line")
- address=[]
+ refnode = description.parentNode
+ surgeon_postal = refnode.getElementsByTagName(
+ "surgeon_postal")[0].firstChild.data
+ addressNode = refnode.getElementsByTagName("address")
+ lines = addressNode[0].getElementsByTagName("line")
+ address = []
for line in lines:
address.append(line.firstChild.data)
- greeting=refnode.getElementsByTagName("surgeon_greeting")[0].firstChild.data
- retarg="<html><body>"
- retarg+="<br />"*6
- retarg+="<b>%s<br />"%surgeon_postal
+ greeting = refnode.getElementsByTagName(
+ "surgeon_greeting")[0].firstChild.data
+ retarg = "<html><body>"
+ retarg += "<br />" * 6
+ retarg += "<b>%s<br />" % surgeon_postal
for line in address:
- retarg+="%s<br />"%line
- retarg+="</b>"+"<br />"*2
- today=time.localtime()[:3]
- d=datetime.date(today[0],today[1],today[2])
- retarg+="%s, " %("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")[d.weekday()]
- retarg+="%s "%d.day
- retarg+="%s, "%("January","February","March","April","May","June","July","August","September","October","November","December")[d.month-1]
- retarg+= '%s <br /><br />'%d.year
- retarg+="Dear %s,<br />"%greeting
- retarg+='<div align="center"><b>Re. %s %s %s - '%(pt.title.title(),pt.fname.title(),pt.sname.title())
- retarg+='DOB %s</b><br />'% localsettings.formatDate(pt.dob)
- for val in (pt.addr1,pt.addr2,pt.addr3,pt.town,pt.county):
- if val!="":
- retarg+=val+","
- if pt.pcde!="":
- retarg+=pt.pcde+"."
- retarg+="<br />Tel - "
- i=0
- for val in (pt.tel1,pt.tel2,pt.mobile):
- if val!="":
- retarg+=("home ","work ","mobile ")[i]+ val+" "
- i+=1
- retarg+="</div>"
- retarg+="<br />"*(12)
- retarg+="Yours Sincerely,"+"<br />"*4
- retarg+="</body></html>"
+ retarg += "%s<br />" % line
+ retarg += "</b>" + "<br />" * 2
+ today = time.localtime()[:3]
+ d = datetime.date(today[0], today[1], today[2])
+ retarg += "%s, " % (
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday",
+ "Sunday")[d.weekday()]
+ retarg += "%s " % d.day
+ retarg += "%s, " % (
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December")[d.month - 1]
+ retarg += '%s <br /><br />' % d.year
+ retarg += "Dear %s,<br />" % greeting
+ retarg += '<div align="center"><b>Re. %s %s %s - ' % (
+ pt.title.title(), pt.fname.title(), pt.sname.title())
+ retarg += 'DOB %s</b><br />' % localsettings.formatDate(pt.dob)
+ for val in (pt.addr1, pt.addr2, pt.addr3, pt.town, pt.county):
+ if val != "":
+ retarg += val + ","
+ if pt.pcde != "":
+ retarg += pt.pcde + "."
+ retarg += "<br />Tel - "
+ i = 0
+ for val in (pt.tel1, pt.tel2, pt.mobile):
+ if val != "":
+ retarg += ("home ", "work ", "mobile ")[i] + val + " "
+ i += 1
+ retarg += "</div>"
+ retarg += "<br />" * (12)
+ retarg += "Yours Sincerely," + "<br />" * 4
+ retarg += "</body></html>"
return retarg
else:
- return ("<html><body>SORRY - we couldn't find letter data for % </body></html>"%desc)
+ return ("<html><body>SORRY - we couldn't find letter data for % </body></html>" % desc)
- except Exception,e:
+ except Exception as e:
print e
return False
if __name__ == "__main__":
localsettings.initiate()
from openmolar.dbtools import patient_class
- pt=patient_class.patient(4)
- d= getDescriptions()
+ pt = patient_class.patient(4)
+ d = getDescriptions()
print d
- print getHtml(d[0],pt)
\ No newline at end of file
+ print getHtml(d[0], pt)
diff --git a/src/openmolar/ptModules/standardletter.py b/src/openmolar/ptModules/standardletter.py
index fb18016..9db82a5 100644
--- a/src/openmolar/ptModules/standardletter.py
+++ b/src/openmolar/ptModules/standardletter.py
@@ -1,41 +1,83 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
-import time,datetime
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+import time
+import datetime
+
def getHtml(pt):
- #try:
- retarg="<html><body>"
- retarg+="<br />"*6
- retarg+="<b>%s. %s %s<br />"%(pt.title.title(),pt.fname.title(),pt.sname.title())
- for val in (pt.addr1.title(),pt.addr2.title(),pt.addr3.title(),pt.town,pt.county.title(),pt.pcde):
- if str(val)!="":
- retarg+=str(val)+"<br />"
- retarg+="</b>"+"<br />"*2
- today=time.localtime()[:3]
- d=datetime.date(today[0],today[1],today[2])
- retarg+="%s, " %("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")[d.weekday()]
- retarg+="%s "%d.day
- retarg+="%s, "%("January","February","March","April","May","June","July","August","September","October","November","December")[d.month-1]
- retarg+= '%s <br /><br />'%d.year
- retarg+="Dear %s. %s,<br />"%(pt.title.title(),pt.sname.title())
- #######################################################
+ # try:
+ retarg = "<html><body>"
+ retarg += "<br />" * 6
+ retarg += "<b>%s. %s %s<br />" % (
+ pt.title.title(),
+ pt.fname.title(),
+ pt.sname.title())
+ for val in (pt.addr1.title(), pt.addr2.title(), pt.addr3.title(), pt.town, pt.county.title(), pt.pcde):
+ if str(val) != "":
+ retarg += str(val) + "<br />"
+ retarg += "</b>" + "<br />" * 2
+ today = time.localtime()[:3]
+ d = datetime.date(today[0], today[1], today[2])
+ retarg += "%s, " % (
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday",
+ "Sunday")[d.weekday()]
+ retarg += "%s " % d.day
+ retarg += "%s, " % (
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December")[d.month - 1]
+ retarg += '%s <br /><br />' % d.year
+ retarg += "Dear %s. %s,<br />" % (
+ pt.title.title(),
+ pt.sname.title())
+ #
#-- this next line is used to insert text for estimates
#-- do not change
- retarg+="<br />"*(12)
- #######################################################
- retarg+="Yours Sincerely,"+"<br />"*4
- retarg+="</body></html>"
+ retarg += "<br />" * (12)
+ #
+ retarg += "Yours Sincerely," + "<br />" * 4
+ retarg += "</body></html>"
return retarg
- #except Exception,e:
- #return False
+ # except Exception,e:
+ # return False
if __name__ == "__main__":
from openmolar.dbtools import patient_class
- pt=patient_class.patient(4)
+ pt = patient_class.patient(4)
print getHtml(pt)
-
diff --git a/src/openmolar/ptModules/tooth_history.py b/src/openmolar/ptModules/tooth_history.py
index 2b3e302..8e8e02e 100644
--- a/src/openmolar/ptModules/tooth_history.py
+++ b/src/openmolar/ptModules/tooth_history.py
@@ -1,43 +1,59 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import re
from openmolar.settings import localsettings
+
def getHistory(pt, tooth):
'''
get daybook history for this tooth
'''
tooth = tooth.upper()
hist = ""
- for tdate, apptix, item in pt.dayBookHistory:
- regex = "%s (.*)\n?"% tooth
- m = re.search(regex, item.replace(" ","\n"))
- if m:
- for group in m.groups():
- hist += "<li>%s - %s - %s</li>"%(
- localsettings.formatDate(tdate),
- localsettings.ops.get(int(apptix)),
- group)
+ for tdate, apptix, items in pt.dayBookHistory:
+ regex = "%s (.*)" % tooth
+ for item in items.split(" "):
+ for tx in re.findall(regex, item):
+ hist += "<li>%s - %s - %s</li>" % (
+ localsettings.formatDate(tdate),
+ localsettings.ops.get(int(apptix)),
+ tx)
if hist == "":
hist = "None Found"
else:
- hist = "<ul>%s</ul>"% hist
- return "History for %s<hr />%s"% (tooth, hist)
+ hist = "<ul>%s</ul>" % hist
+ return "History for %s<hr />%s" % (tooth, hist)
if __name__ == "__main__":
import sys
from openmolar.dbtools import patient_class
localsettings.initiate()
try:
- serialno=int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
- serialno=11283
- pt=patient_class.patient(serialno)
+ serialno = 11283
+ pt = patient_class.patient(serialno)
print pt.dayBookHistory
- print getHistory(pt, "lr5")
\ No newline at end of file
+ print getHistory(pt, "lr5")
diff --git a/src/openmolar/qt-designer/main.ui b/src/openmolar/qt-designer/main.ui
index d3604d6..c2ec465 100644
--- a/src/openmolar/qt-designer/main.ui
+++ b/src/openmolar/qt-designer/main.ui
@@ -464,7 +464,7 @@
<x>0</x>
<y>0</y>
<width>469</width>
- <height>462</height>
+ <height>644</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
@@ -1214,10 +1214,46 @@
</property>
</widget>
</item>
- <item row="10" column="0" colspan="8">
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="new_patient_frame">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_12">
+ <item row="2" column="0">
+ <widget class="QPushButton" name="abort_new_patient_pushButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>100</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Abort New Patient Entry</string>
+ </property>
+ <property name="icon">
+ <iconset theme="window-close">
+ <normaloff/>
+ </iconset>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="3">
<widget class="QLabel" name="highlighted_fields_label">
<property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -1230,6 +1266,58 @@
</property>
</widget>
</item>
+ <item row="2" column="2">
+ <widget class="QPushButton" name="save_new_patient_pushButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>100</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string extracomment="Save the new patient to the database"/>
+ </property>
+ <property name="text">
+ <string>Save New Patient</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../resources/resources.qrc">
+ <normaloff>:/save_all.png</normaloff>:/save_all.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <spacer name="verticalSpacer_13">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="0" colspan="3">
+ <spacer name="verticalSpacer_15">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
</layout>
</widget>
</item>
@@ -1284,6 +1372,19 @@
</property>
</widget>
</item>
+ <item row="3" column="0">
+ <spacer name="verticalSpacer_16">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
</layout>
</widget>
</item>
@@ -3284,6 +3385,12 @@ Note - this will not remove items which are currently there. </string>
<string>History</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_29">
+ <property name="spacing">
+ <number>3</number>
+ </property>
+ <property name="margin">
+ <number>3</number>
+ </property>
<item>
<widget class="QTextBrowser" name="debugBrowser"/>
</item>
@@ -3302,6 +3409,12 @@ Note - this will not remove items which are currently there. </string>
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_25">
+ <property name="spacing">
+ <number>3</number>
+ </property>
+ <property name="margin">
+ <number>3</number>
+ </property>
<item>
<widget class="QPushButton" name="pastPayments_pushButton">
<property name="toolTip">
@@ -3453,7 +3566,7 @@ If the "changes only" checkbox is checked, only data which has been ch
</layout>
</widget>
</widget>
- <widget class="QFrame" name="frame">
+ <widget class="QFrame" name="new_notes_frame">
<property name="minimumSize">
<size>
<width>0</width>
@@ -3512,7 +3625,7 @@ If the "changes only" checkbox is checked, only data which has been ch
<x>0</x>
<y>0</y>
<width>118</width>
- <height>110</height>
+ <height>118</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_20">
@@ -3876,148 +3989,217 @@ If the "changes only" checkbox is checked, only data which has been ch
<attribute name="title">
<string>Daybook</string>
</attribute>
- <layout class="QGridLayout">
- <item row="0" column="0">
- <widget class="QLabel" name="label_29">
- <property name="text">
- <string>Start Date</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="label_30">
- <property name="text">
- <string>End Date</string>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QLabel" name="label_28">
- <property name="text">
- <string>Registered Dentist</string>
- </property>
- </widget>
- </item>
- <item row="0" column="3">
- <widget class="QLabel" name="label_31">
- <property name="text">
- <string>Treating Dentist / Hygenist</string>
- </property>
- </widget>
- </item>
- <item row="0" column="4" rowspan="2">
- <widget class="QPushButton" name="daybookGoPushButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Go</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="0" column="5" rowspan="2">
- <widget class="QPushButton" name="daybookPrintButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Print the Data</string>
- </property>
- <property name="text">
- <string>Print</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>32</width>
- <height>32</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="0" column="6" rowspan="2">
- <spacer>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>654</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="0">
- <widget class="QDateEdit" name="daybookStartDateEdit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QDateEdit" name="daybookEndDateEdit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="calendarPopup">
- <bool>true</bool>
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <property name="margin">
+ <number>3</number>
+ </property>
+ <item>
+ <layout class="QGridLayout" name="gridLayout_17">
+ <property name="verticalSpacing">
+ <number>0</number>
</property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QComboBox" name="daybookDent1ComboBox"/>
- </item>
- <item row="1" column="3">
- <widget class="QComboBox" name="daybookDent2ComboBox"/>
+ <item row="1" column="1">
+ <widget class="QDateEdit" name="daybookEndDateEdit">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="calendarPopup">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_29">
+ <property name="text">
+ <string>Start Date</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QComboBox" name="daybookDent1ComboBox">
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="5" rowspan="2">
+ <widget class="QPushButton" name="daybookGoPushButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Go</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../resources/resources.qrc">
+ <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QComboBox" name="daybookDent2ComboBox">
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QLabel" name="label_31">
+ <property name="text">
+ <string>Treating Clinician</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_30">
+ <property name="text">
+ <string>End Date</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QDateEdit" name="daybookStartDateEdit">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="calendarPopup">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="6" rowspan="2">
+ <widget class="QPushButton" name="daybookPrintButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Print the Data</string>
+ </property>
+ <property name="text">
+ <string>Print</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../resources/resources.qrc">
+ <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_28">
+ <property name="text">
+ <string>Dentist</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" rowspan="2">
+ <widget class="QFrame" name="daybook_filters_frame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_18">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string>Extra Filters</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QPushButton" name="daybook_filters_pushButton">
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset theme="help">
+ <normaloff/>
+ </iconset>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QLineEdit" name="daybook_filters_lineEdit"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
</item>
- <item row="2" column="0" colspan="7">
+ <item>
<widget class="QTextBrowser" name="daybookTextBrowser"/>
</item>
</layout>
@@ -4968,9 +5150,9 @@ If the "changes only" checkbox is checked, only data which has been ch
<property name="title">
<string>&File</string>
</property>
- <addaction name="action_save_patient"/>
<addaction name="action_Open_Patient"/>
<addaction name="separator"/>
+ <addaction name="action_save_patient"/>
<addaction name="actionPrint_Daylists"/>
<addaction name="separator"/>
<addaction name="action_Quit"/>
@@ -4988,48 +5170,56 @@ If the "changes only" checkbox is checked, only data which has been ch
</property>
<widget class="QMenu" name="menuView">
<property name="title">
- <string>View</string>
+ <string>&View</string>
</property>
<addaction name="actionFull_Screen_Mode_Ctrl_Alt_F"/>
<addaction name="separator"/>
</widget>
<widget class="QMenu" name="menuAppointments">
<property name="title">
- <string>Appointments</string>
+ <string>&Appointments</string>
</property>
<addaction name="actionSet_Font_Size"/>
</widget>
<widget class="QMenu" name="menuPrinting">
<property name="title">
- <string>Printing</string>
+ <string>&Printing</string>
</property>
<addaction name="actionNHS_Form_Settings"/>
<addaction name="actionTest_Print_a_GP17"/>
</widget>
<widget class="QMenu" name="menuForum">
<property name="title">
- <string>Forum</string>
+ <string>&Forum</string>
</property>
<addaction name="action_forum_show_advanced_options"/>
</widget>
<widget class="QMenu" name="menuCharts">
<property name="title">
- <string>Charts</string>
+ <string>&Charts</string>
</property>
<addaction name="actionTable_View_For_Charting"/>
</widget>
<widget class="QMenu" name="menuMode">
<property name="title">
- <string>Mode (reception or surgery)</string>
+ <string>&Mode (reception or surgery)</string>
</property>
<addaction name="actionSurgery_Mode"/>
</widget>
<widget class="QMenu" name="menuCashbook">
<property name="title">
- <string>Cashbook</string>
+ <string>&Cashbook</string>
</property>
<addaction name="actionAllow_Full_Edit"/>
</widget>
+ <widget class="QMenu" name="menuDaybook">
+ <property name="title">
+ <string>&Daybook</string>
+ </property>
+ <addaction name="separator"/>
+ <addaction name="actionAllow_Edit"/>
+ <addaction name="actionEnable_Filters"/>
+ </widget>
<addaction name="actionChange_Language"/>
<addaction name="separator"/>
<addaction name="menuView"/>
@@ -5037,13 +5227,14 @@ If the "changes only" checkbox is checked, only data which has been ch
<addaction name="menuAppointments"/>
<addaction name="menuForum"/>
<addaction name="menuCashbook"/>
+ <addaction name="menuDaybook"/>
<addaction name="menuPrinting"/>
<addaction name="separator"/>
<addaction name="menuMode"/>
</widget>
<widget class="QMenu" name="menuTools">
<property name="title">
- <string>Tools</string>
+ <string>&Tools</string>
</property>
<addaction name="actionClear_Today_s_Emergency_Slots"/>
<addaction name="actionAppointment_Tools"/>
@@ -5209,6 +5400,22 @@ If the "changes only" checkbox is checked, only data which has been ch
<string>Documents Dialog</string>
</property>
</action>
+ <action name="actionAllow_Edit">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Allow &Edit</string>
+ </property>
+ </action>
+ <action name="actionEnable_Filters">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Enable &Filters</string>
+ </property>
+ </action>
</widget>
<customwidgets>
<customwidget>
@@ -5226,7 +5433,6 @@ If the "changes only" checkbox is checked, only data which has been ch
<tabstop>cashbookStartDateEdit</tabstop>
<tabstop>cashbookEndDateEdit</tabstop>
<tabstop>cashbookDentComboBox</tabstop>
- <tabstop>daybookGoPushButton</tabstop>
<tabstop>daybookPrintButton</tabstop>
<tabstop>daybookStartDateEdit</tabstop>
<tabstop>daybookEndDateEdit</tabstop>
diff --git a/src/openmolar/qt-designer/newSetup.ui b/src/openmolar/qt-designer/newSetup.ui
index 29129fc..07bdd26 100644
--- a/src/openmolar/qt-designer/newSetup.ui
+++ b/src/openmolar/qt-designer/newSetup.ui
@@ -1,705 +1,685 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
- <width>429</width>
- <height>405</height>
+ <width>589</width>
+ <height>413</height>
</rect>
</property>
<property name="windowTitle">
- <string>OpenMolar - First Run</string>
+ <string>OpenMolar - New Setup</string>
</property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="title_label">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Welcome to the openMolar settings wizard.</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QStackedWidget" name="stackedWidget">
- <property name="currentIndex">
- <number>0</number>
- </property>
- <widget class="QWidget" name="page">
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <item>
- <widget class="QLabel" name="label_7">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>100</height>
- </size>
- </property>
- <property name="text">
- <string>This first run application will
+ <widget class="QWidget" name="centralwidget">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="title_label">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Welcome to the OpenMolar settings wizard.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QStackedWidget" name="stackedWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="start_page">
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QLabel" name="label_7">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>100</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>This first run application will
- set your system password
- make this client aware of your mysql server settings
- - install a small (4 patient) demo database if required.</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="sysAdvice_label">
- <property name="text">
- <string>TextLabel</string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_8">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="page_2">
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0" colspan="3">
- <widget class="QLabel" name="mainPassword_label">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>80</height>
- </size>
- </property>
- <property name="font">
- <font>
- <weight>50</weight>
- <bold>false</bold>
- </font>
- </property>
- <property name="text">
- <string>Please enter a password to prevent unauthorised running of this application.</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>Password</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLineEdit" name="main_password_lineEdit">
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="echoMode">
- <enum>QLineEdit::Password</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QCheckBox" name="mainpassword_checkBox">
- <property name="focusPolicy">
- <enum>Qt::NoFocus</enum>
- </property>
- <property name="text">
- <string>show</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_8">
- <property name="text">
- <string>Repeat Password</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLineEdit" name="repeat_password_lineEdit">
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="echoMode">
- <enum>QLineEdit::Password</enum>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="page_3">
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="0" colspan="3">
- <widget class="QLabel" name="label_13">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>40</height>
- </size>
- </property>
- <property name="font">
- <font>
- <weight>50</weight>
- <bold>false</bold>
- </font>
- </property>
- <property name="text">
- <string>Where is your mysql server located? **</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_12">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Host</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QLineEdit" name="host_lineEdit">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string notr="true">localhost</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_14">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Port</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QLineEdit" name="port_lineEdit">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string notr="true">3306</string>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="3">
- <widget class="QLabel" name="label_9">
- <property name="text">
- <string>** If you do not have a mysql server on your network, please quit this setup, and install mysql server now.
+ - install a small (3 patient) demo database if required.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="sysAdvice_label">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_8">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="application_password_page">
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="3">
+ <widget class="QLabel" name="mainPassword_label">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>80</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <weight>50</weight>
+ <bold>false</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Please enter a password to prevent unauthorised running of this application.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Password</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="main_password_lineEdit">
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QCheckBox" name="mainpassword_checkBox">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>show</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>Repeat Password</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="repeat_password_lineEdit">
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="mysql_server_location">
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0" colspan="3">
+ <widget class="QLabel" name="label_13">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <weight>50</weight>
+ <bold>false</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Where is your mysql server located? **</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_12">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Host</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLineEdit" name="host_lineEdit">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true">localhost</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_14">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Port</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLineEdit" name="port_lineEdit">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true">3306</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="3">
+ <widget class="QLabel" name="label_9">
+ <property name="text">
+ <string>** If you do not have a mysql server on your network, please quit this setup, and install mysql server now.
If you are a debian or ubuntu user, "sudo apt-get install mysql-server"
and make a note of the root password you create during set up. </string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="2">
- <spacer name="verticalSpacer_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="page_4">
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="4" column="0" rowspan="2" colspan="2">
- <widget class="QGroupBox" name="groupBox">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="title">
- <string>Database Details</string>
- </property>
- <property name="flat">
- <bool>false</bool>
- </property>
- <layout class="QGridLayout" name="gridLayout_5">
- <item row="2" column="0">
- <widget class="QLabel" name="label_2">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>User</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QLineEdit" name="user_lineEdit">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string notr="true">OMuser</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="label_3">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>(mysql)Password</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="2">
- <widget class="QLineEdit" name="password_lineEdit">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string notr="true">password</string>
- </property>
- <property name="echoMode">
- <enum>QLineEdit::Password</enum>
- </property>
- </widget>
- </item>
- <item row="3" column="3">
- <widget class="QCheckBox" name="dbpassword_checkBox">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="focusPolicy">
- <enum>Qt::NoFocus</enum>
- </property>
- <property name="text">
- <string>show</string>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QLineEdit" name="database_lineEdit">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string notr="true">openmolar_demo</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Database Name</string>
- </property>
- </widget>
- </item>
- <item row="4" column="2">
- <widget class="QPushButton" name="testDB_pushButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="focusPolicy">
- <enum>Qt::NoFocus</enum>
- </property>
- <property name="text">
- <string>Test this Connection</string>
- </property>
- </widget>
- </item>
- <item row="5" column="2">
- <spacer name="verticalSpacer_3">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QRadioButton" name="createDemo_radioButton">
- <property name="text">
- <string>Create A Demo Database</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QRadioButton" name="existingDB_radioButton">
- <property name="text">
- <string>Use with an existing database</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="page_5">
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>OK.... you are all set to go.
-
-When running openMolar, you are presented a login screen.
-
-Password = the one you specified earlier
-User1 = any registered user (demo database has one user "user")
-User2 = any registered user (can be left blank)
-</string>
- </property>
- <property name="textFormat">
- <enum>Qt::PlainText</enum>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_7">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QCheckBox" name="checkBox">
- <property name="layoutDirection">
- <enum>Qt::LeftToRight</enum>
- </property>
- <property name="text">
- <string>Launch OpenMolar Now</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_6">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="page_6">
- <layout class="QGridLayout" name="gridLayout_4">
- <item row="0" column="0" colspan="3">
- <widget class="QLabel" name="mainPassword_label_2">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>100</height>
- </size>
- </property>
- <property name="font">
- <font>
- <weight>50</weight>
- <bold>false</bold>
- </font>
- </property>
- <property name="text">
- <string>To create a database, and set the privileges for user, requires logging into mysql as the root mysql user.
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="database_choice">
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="4" column="0" rowspan="2" colspan="2">
+ <widget class="QGroupBox" name="groupBox">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Database Details</string>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_5">
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>(mysql) User</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLineEdit" name="user_lineEdit">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true">OMuser</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>(mysql) Password</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QLineEdit" name="password_lineEdit">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true">password</string>
+ </property>
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3">
+ <widget class="QCheckBox" name="dbpassword_checkBox">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>show</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLineEdit" name="database_lineEdit">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true">openmolar_demo</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Database Name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <widget class="QPushButton" name="testDB_pushButton">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Test this Connection</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QRadioButton" name="createDemo_radioButton">
+ <property name="text">
+ <string>Create A Demo Database</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QRadioButton" name="existingDB_radioButton">
+ <property name="text">
+ <string>Use with an existing database</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="create_database_page">
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Root mysql password</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="3">
+ <widget class="QLabel" name="mainPassword_label_2">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>100</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <weight>50</weight>
+ <bold>false</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>To create a database, and set the privileges for user, requires logging into mysql as the root mysql user.
OpenMolar does NOT store this password.
Please enter the password of the ROOT mysql user.
(note - on most mysql setups, root access is disabled unless the server is on localhost)</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>Root mysql password</string>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <spacer name="verticalSpacer_4">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="3" column="0">
- <widget class="QLineEdit" name="rootPassword_lineEdit">
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="echoMode">
- <enum>QLineEdit::Password</enum>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QCheckBox" name="rootPassword_checkBox">
- <property name="focusPolicy">
- <enum>Qt::NoFocus</enum>
- </property>
- <property name="text">
- <string>show</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <spacer name="verticalSpacer_5">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLineEdit" name="rootPassword_lineEdit">
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QCheckBox" name="rootPassword_checkBox">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>show</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <spacer name="verticalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="database_creation_progress_page">
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <spacer name="verticalSpacer_14">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_10">
+ <property name="text">
+ <string>Creating Database.... please wait</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_13">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QProgressBar" name="progressBar">
+ <property name="value">
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_12">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="finish_page">
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <spacer name="verticalSpacer_7">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>OK.... you are all set to go!</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_6">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
</widget>
- <widget class="QWidget" name="page_7">
- <layout class="QVBoxLayout" name="verticalLayout_4">
+ </item>
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
- <spacer name="verticalSpacer_14">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
+ <widget class="QPushButton" name="back_pushButton">
+ <property name="focusPolicy">
+ <enum>Qt::TabFocus</enum>
</property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="label_10">
<property name="text">
- <string>Creating Database.... please wait</string>
+ <string>Back</string>
</property>
</widget>
</item>
<item>
- <spacer name="verticalSpacer_13">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QProgressBar" name="progressBar">
- <property name="value">
- <number>0</number>
+ <widget class="QPushButton" name="go_pushButton">
+ <property name="text">
+ <string>Proceed</string>
</property>
</widget>
</item>
- <item>
- <spacer name="verticalSpacer_12">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
</layout>
</widget>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="frame">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <item>
- <widget class="QPushButton" name="back_pushButton">
- <property name="focusPolicy">
- <enum>Qt::TabFocus</enum>
- </property>
- <property name="text">
- <string>Back</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="go_pushButton">
- <property name="text">
- <string>Proceed</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menubar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>589</width>
+ <height>17</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
diff --git a/src/openmolar/qt-designer/saveDiscardCancel.ui b/src/openmolar/qt-designer/saveDiscardCancel.ui
deleted file mode 100644
index ab4faf8..0000000
--- a/src/openmolar/qt-designer/saveDiscardCancel.ui
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>552</width>
- <height>283</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="windowTitle">
- <string>Confirmation Required</string>
- </property>
- <widget class="QListWidget" name="listWidget">
- <property name="geometry">
- <rect>
- <x>9</x>
- <y>161</y>
- <width>534</width>
- <height>113</height>
- </rect>
- </property>
- </widget>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="geometry">
- <rect>
- <x>9</x>
- <y>95</y>
- <width>531</width>
- <height>27</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Discard|QDialogButtonBox::Save</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- <widget class="QPushButton" name="pushButton">
- <property name="geometry">
- <rect>
- <x>322</x>
- <y>128</y>
- <width>221</width>
- <height>27</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>What's Changed?</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/down.png</normaloff>:/down.png</iconset>
- </property>
- <property name="flat">
- <bool>true</bool>
- </property>
- </widget>
- <widget class="QLabel" name="label">
- <property name="geometry">
- <rect>
- <x>9</x>
- <y>9</y>
- <width>531</width>
- <height>80</height>
- </rect>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>80</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>80</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </widget>
- <resources>
- <include location="../resources/resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt4gui/__init__.py b/src/openmolar/qt4gui/__init__.py
index e69de29..c701215 100755
--- a/src/openmolar/qt4gui/__init__.py
+++ b/src/openmolar/qt4gui/__init__.py
@@ -0,0 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/openmolar/qt4gui/appointment_gui_modules/__init__.py b/src/openmolar/qt4gui/appointment_gui_modules/__init__.py
index 139597f..c701215 100644
--- a/src/openmolar/qt4gui/appointment_gui_modules/__init__.py
+++ b/src/openmolar/qt4gui/appointment_gui_modules/__init__.py
@@ -1,2 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
-
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py b/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py
index 6d8818b..2a7d711 100644
--- a/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py
+++ b/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py
@@ -1,34 +1,39 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.dbtools import appointments
from openmolar.settings import localsettings
+
class ClinicianSelectModel(QtCore.QAbstractListModel):
+
'''
A simple model used to populate a combobox to select how the
appointment books are managed.
'''
+
def __init__(self, parent=None):
QtCore.QAbstractListModel.__init__(self, parent)
@@ -37,15 +42,15 @@ class ClinicianSelectModel(QtCore.QAbstractListModel):
_("Available Dentists"),
_("Available Hygenists"),
_("All")
- ]
+ ]
self.om_gui = parent
- #if localsettings.activehygs == []:
+ # if localsettings.activehygs == []:
# self.options_list.remove(_("Available Hygenists"))
- self.manual_index = 5 #used if manual is called by another widget
+ self.manual_index = 5 # used if manual is called by another widget
- def rowCount(self, parent = QtCore.QModelIndex()):
+ def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.options_list)
def data(self, index, role):
@@ -73,15 +78,15 @@ class ClinicianSelectModel(QtCore.QAbstractListModel):
'''
if row == 0:
return appointments.getWorkingDents(date,
- include_non_working=False)
+ include_non_working=False)
elif row == 1:
chkset = localsettings.activedent_ixs
return appointments.getWorkingDents(date, chkset,
- include_non_working=False)
+ include_non_working=False)
elif row == 2:
chkset = localsettings.activehyg_ixs
return appointments.getWorkingDents(date, chkset,
- include_non_working=False)
+ include_non_working=False)
return appointments.getAllClinicians(date)
@@ -91,8 +96,8 @@ if __name__ == "__main__":
def but_clicked():
message = ""
for d_day in model.clinician_list(
- cb.currentIndex(), cal.date().toPyDate()):
- message += "%s <br />"% d_day
+ cb.currentIndex(), cal.date().toPyDate()):
+ message += "%s <br />" % d_day
QtGui.QMessageBox.information(mw, "result", message)
localsettings.initiate()
diff --git a/src/openmolar/qt4gui/appointment_gui_modules/draggable_list.py b/src/openmolar/qt4gui/appointment_gui_modules/draggable_list.py
index 5f5ec4b..71ff1a8 100644
--- a/src/openmolar/qt4gui/appointment_gui_modules/draggable_list.py
+++ b/src/openmolar/qt4gui/appointment_gui_modules/draggable_list.py
@@ -1,3 +1,27 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
import datetime
import cPickle
import pickle
@@ -7,10 +31,13 @@ from PyQt4 import QtGui, QtCore
from openmolar.dbtools import appointments
from openmolar.settings import localsettings
+
class DraggableList(QtGui.QListView):
+
'''
a listView whose items can be moved
'''
+
def __init__(self, multiSelect, parent=None):
super(DraggableList, self).__init__(parent)
self.setDragEnabled(True)
@@ -30,7 +57,7 @@ class DraggableList(QtGui.QListView):
if not index.isValid():
return
- ## selected is the relevant person object
+ # selected is the relevant person object
selectedApp = self.model().data(index, QtCore.Qt.UserRole)
if not selectedApp.unscheduled:
@@ -39,7 +66,7 @@ class DraggableList(QtGui.QListView):
if index not in self.selectedIndexes():
self.setCurrentIndex(index)
- ## convert to a bytestream
+ # convert to a bytestream
bstream = cPickle.dumps(selectedApp)
mimeData = QtCore.QMimeData()
mimeData.setData("application/x-appointment", bstream)
@@ -51,7 +78,7 @@ class DraggableList(QtGui.QListView):
pixmap = QtGui.QPixmap()
pixmap = pixmap.grabWidget(self, self.rectForIndex(index))
drag.setPixmap(pixmap)
- drag.setHotSpot(QtCore.QPoint(-10,0))
+ drag.setHotSpot(QtCore.QPoint(-10, 0))
drag.start(QtCore.Qt.CopyAction)
diff --git a/src/openmolar/qt4gui/appointment_gui_modules/list_models.py b/src/openmolar/qt4gui/appointment_gui_modules/list_models.py
index d9bfb62..0cd6dc4 100644
--- a/src/openmolar/qt4gui/appointment_gui_modules/list_models.py
+++ b/src/openmolar/qt4gui/appointment_gui_modules/list_models.py
@@ -1,3 +1,27 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
import datetime
import logging
import cPickle
@@ -10,6 +34,7 @@ from openmolar.settings import localsettings
LOGGER = logging.getLogger("openmolar")
+
class SimpleListModel(QtCore.QAbstractListModel):
appointment_selected = QtCore.pyqtSignal(object)
@@ -28,7 +53,7 @@ class SimpleListModel(QtCore.QAbstractListModel):
self.selectedAppts = []
self.normal_icon = QtGui.QIcon()
self.normal_icon.addPixmap(QtGui.QPixmap(":/schedule.png"),
- QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.selected_icon = QtGui.QIcon()
self.selected_icon.addPixmap(
QtGui.QPixmap(":/icons/schedule_active.png"))
@@ -101,7 +126,7 @@ class SimpleListModel(QtCore.QAbstractListModel):
else:
self.set_current_appt(None)
- def rowCount(self, parent = QtCore.QModelIndex()):
+ def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.list)
def data(self, index, role):
@@ -110,24 +135,24 @@ class SimpleListModel(QtCore.QAbstractListModel):
app = self.list[index.row()]
if role == QtCore.Qt.DisplayRole:
if app.flag == -128:
- info = "%s (%s)"% (app.name, app.length)
+ info = "%s (%s)" % (app.name, app.length)
elif app.unscheduled:
- info = "%s %s - %s"% (app.length,
- app.trt1, app.dent_inits)
+ info = "%s %s - %s" % (app.length,
+ app.trt1, app.dent_inits)
else:
- info = "%s %s with %s"% (app.readableDate,
- app.readableTime, app.dent_inits)
+ info = "%s %s with %s" % (app.readableDate,
+ app.readableTime, app.dent_inits)
return QtCore.QVariant(info)
elif role == QtCore.Qt.ForegroundRole:
if app.unscheduled:
return QtCore.QVariant(QtGui.QBrush(QtGui.QColor("red")))
elif role == QtCore.Qt.DecorationRole:
- #if app in self.selectedAppts: #
+ # if app in self.selectedAppts: #
if app.unscheduled:
if app == self.currentAppt:
return QtCore.QVariant(self.selected_icon)
return QtCore.QVariant(self.normal_icon)
- elif role == QtCore.Qt.UserRole: #return the whole python object
+ elif role == QtCore.Qt.UserRole: # return the whole python object
return app
return QtCore.QVariant()
@@ -154,7 +179,7 @@ class SimpleListModel(QtCore.QAbstractListModel):
'''
LOGGER.debug("SimpleListModel.set_current_appt")
self.currentAppt = appt
- if appt == None:
+ if appt is None:
self.selection_model.clear()
self.min_slot_length = 0
else:
@@ -162,7 +187,7 @@ class SimpleListModel(QtCore.QAbstractListModel):
index = self.index(self.list.index(appt))
self.min_slot_length = appt.length
self.selection_model.select(index,
- QtGui.QItemSelectionModel.Select)
+ QtGui.QItemSelectionModel.Select)
return index
except ValueError:
pass
@@ -183,21 +208,24 @@ class SimpleListModel(QtCore.QAbstractListModel):
self.set_appointments(appts, None)
self.set_current_appt(app)
+
class BlockListModel(SimpleListModel):
+
'''
customise the above model just for blocks
'''
+
def __init__(self, parent=None):
super(BlockListModel, self).__init__(parent)
self.list = []
for val, length in (
- (_("Lunch"), 60),
- (_("Lunch"), 30),
- (_("staff meeting"), 10),
- (_("emergency"), 15),
- (_("emergency"), 20),
- (_("emergency"), 30),
- (_("Out of Office"), 30)):
+ (_("Lunch"), 60),
+ (_("Lunch"), 30),
+ (_("staff meeting"), 10),
+ (_("emergency"), 15),
+ (_("emergency"), 20),
+ (_("emergency"), 30),
+ (_("Out of Office"), 30)):
block = appointments.APR_Appointment()
block.name = val
block.length = length
@@ -206,4 +234,3 @@ class BlockListModel(SimpleListModel):
def reset(self):
pass
-
diff --git a/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py b/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py
index 190b111..8b67a24 100644
--- a/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py
+++ b/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module provides the model class
@@ -17,21 +33,23 @@ from openmolar.settings import localsettings
from openmolar.qt4gui import colours
import datetime
-CATEGORIES = ("", _("View Past Appointments") ,_("Unscheduled"))
+CATEGORIES = ("", _("View Past Appointments"), _("Unscheduled"))
HORIZONTAL_HEADERS = (_("Date & Time"), _("Practitioner"), _("Length"),
-_("Treatment"), "ix", _("Memo"))
+ _("Treatment"), "ix", _("Memo"))
+
class TreeItem(object):
+
def __init__(self, category, appointment, parent=None, index=0):
self.appointment = appointment
self.isAppointment = True
try:
if appointment.date:
self.headerCol = (
- localsettings.wystimeToHumanTime(appointment.atime) + "\t" +
- localsettings.readableDate(appointment.date))
+ localsettings.wystimeToHumanTime(appointment.atime) + "\t" +
+ localsettings.readableDate(appointment.date))
else:
- self.headerCol = "TBA" ## used to be "TBA"
+ self.headerCol = "TBA" # used to be "TBA"
except AttributeError:
self.headerCol = category
self.isAppointment = False
@@ -61,8 +79,8 @@ class TreeItem(object):
if column == 2:
return QtCore.QVariant(self.appointment.length)
if column == 3:
- trt = "%s %s %s"% (self.appointment.trt1,
- self.appointment.trt2, self.appointment.trt3)
+ trt = "%s %s %s" % (self.appointment.trt1,
+ self.appointment.trt2, self.appointment.trt3)
return QtCore.QVariant(trt)
if column == 5:
return QtCore.QVariant(self.appointment.memo)
@@ -79,20 +97,23 @@ class TreeItem(object):
return self.parentItem.childItems.index(self)
return 0
+
class treeModel(QtCore.QAbstractItemModel):
+
'''
a model to display a feetables data
'''
+
def __init__(self, parent=None):
super(treeModel, self).__init__(parent)
self.appointments = []
- self.rootItem = TreeItem("Appointments",None, None, None)
- self.parents = {0 : self.rootItem}
+ self.rootItem = TreeItem("Appointments", None, None, None)
+ self.parents = {0: self.rootItem}
self.om_gui = parent
self.selectedAppt = None
self.normal_icon = QtGui.QIcon()
self.normal_icon.addPixmap(QtGui.QPixmap(":/schedule.png"),
- QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.selected_icon = QtGui.QIcon()
self.selected_icon.addPixmap(
QtGui.QPixmap(":/icons/schedule_active.png"))
@@ -109,14 +130,14 @@ class treeModel(QtCore.QAbstractItemModel):
appt.name = pt.fname + " " + pt.sname
appt.cset = pt.cset
self.selectedAppt = appt
- self.emit(QtCore.SIGNAL("selectedAppt"),appt)
+ self.emit(QtCore.SIGNAL("selectedAppt"), appt)
def clear(self):
-
+
self.selectedAppt = None
self.appointments = []
- self.rootItem = TreeItem("Appointments",None, None, None)
- self.parents = {0 : self.rootItem}
+ self.rootItem = TreeItem("Appointments", None, None, None)
+ self.parents = {0: self.rootItem}
self.setupModelData()
self.reset()
@@ -145,13 +166,13 @@ class treeModel(QtCore.QAbstractItemModel):
return QtCore.QVariant(brush)
elif role == QtCore.Qt.DecorationRole:
if (index.column() == 0 and
- item.appointment and item.appointment.unscheduled):
+ item.appointment and item.appointment.unscheduled):
if (self.selectedAppt and
- item.appointment.aprix == self.selectedAppt.aprix):
+ item.appointment.aprix == self.selectedAppt.aprix):
return QtCore.QVariant(self.selected_icon)
return QtCore.QVariant(self.normal_icon)
if role == QtCore.Qt.UserRole:
- ## a user role which simply returns the python object
+ # a user role which simply returns the python object
if item:
return item.appointment
@@ -165,7 +186,7 @@ class treeModel(QtCore.QAbstractItemModel):
def headerData(self, column, orientation, role):
if (orientation == QtCore.Qt.Horizontal and
- role == QtCore.Qt.DisplayRole):
+ role == QtCore.Qt.DisplayRole):
try:
return QtCore.QVariant(HORIZONTAL_HEADERS[column])
except IndexError:
@@ -198,7 +219,7 @@ class treeModel(QtCore.QAbstractItemModel):
parentItem = childItem.parent()
- if parentItem == None:
+ if parentItem is None:
return QtCore.QModelIndex()
return self.createIndex(parentItem.row(), 0, parentItem)
@@ -217,8 +238,8 @@ class treeModel(QtCore.QAbstractItemModel):
def setupModelData(self):
unscheduled = []
scheduled = []
- ## jump through hoops to ensure "unscheduled appear at the bottom
- ## of the model
+ # jump through hoops to ensure "unscheduled appear at the bottom
+ # of the model
for appt in self.appointments:
if appt.unscheduled:
unscheduled.append(appt)
@@ -227,23 +248,23 @@ class treeModel(QtCore.QAbstractItemModel):
for appt in scheduled + unscheduled:
if appt.past:
cat = 1
- #elif appt.date is None: #a seperate parent for unscheduled?
+ # elif appt.date is None: #a seperate parent for unscheduled?
# cat = 2
else:
cat = 0
- if not self.parents.has_key(cat) :
+ if cat not in self.parents:
try:
category = CATEGORIES[cat]
except IndexError:
- category = "CATEGORY %d"% cat
+ category = "CATEGORY %d" % cat
parent = TreeItem(category, None, None, self.rootItem)
self.rootItem.appendChild(parent)
self.parents[cat] = parent
self.parents[cat].appendChild(TreeItem("", appt,
- self.parents[cat]))
+ self.parents[cat]))
def searchModel(self, appt):
'''
@@ -267,7 +288,6 @@ class treeModel(QtCore.QAbstractItemModel):
return searchNode(self.parents[0])
-
def findItem(self, apr_ix):
'''
get the model index of a specific appointment
@@ -287,6 +307,7 @@ if __name__ == "__main__":
from openmolar.qt4gui import resources_rc
class duckPt(object):
+
def __init__(self):
self.serialno = 20791
self.sname = "Neil"
@@ -319,7 +340,7 @@ if __name__ == "__main__":
model.addAppointments(appts)
mw = QtGui.QMainWindow()
- mw.setMinimumSize(800,300)
+ mw.setMinimumSize(800, 300)
frame = QtGui.QFrame(mw)
layout = QtGui.QVBoxLayout(frame)
@@ -342,20 +363,18 @@ if __name__ == "__main__":
index = model.parents.get(1, None)
if index:
- tv.collapse(model.createIndex(0,0,index))
+ tv.collapse(model.createIndex(0, 0, index))
resize()
QtCore.QObject.connect(tv, QtCore.SIGNAL("expanded(QModelIndex)"),
- resize)
+ resize)
QtCore.QObject.connect(tv, QtCore.SIGNAL("clicked (QModelIndex)"),
- appt_clicked)
-
+ appt_clicked)
but = QtGui.QPushButton("Clear Selection")
layout.addWidget(but)
but.clicked.connect(tv.clearSelection)
-
mw.setCentralWidget(frame)
mw.show()
app.exec_()
diff --git a/src/openmolar/qt4gui/charts/__init__.py b/src/openmolar/qt4gui/charts/__init__.py
index e69de29..c701215 100755
--- a/src/openmolar/qt4gui/charts/__init__.py
+++ b/src/openmolar/qt4gui/charts/__init__.py
@@ -0,0 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/openmolar/qt4gui/charts/charts_gui.py b/src/openmolar/qt4gui/charts/charts_gui.py
index 746f913..02c861c 100644
--- a/src/openmolar/qt4gui/charts/charts_gui.py
+++ b/src/openmolar/qt4gui/charts/charts_gui.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
provides some logic functions for the charts within openmolar gui.
@@ -20,6 +36,7 @@ from openmolar.settings import localsettings
LOGGER = logging.getLogger("openmolar")
+
def navigateCharts(om_gui, direction):
'''
called by a keypress in the tooth prop LineEdit or a click on one of
@@ -42,7 +59,7 @@ def navigateCharts(om_gui, direction):
#--lower teeth
if direction == "up":
if x == 15:
- x, y=15, 0
+ x, y = 15, 0
else:
x += 1
else:
@@ -52,23 +69,25 @@ def navigateCharts(om_gui, direction):
selectChartedTooth(om_gui, x, y)
tooth = om_gui.ui.staticChartWidget.grid[y][x]
- row = (16*y) + x
+ row = (16 * y) + x
om_gui.ui.chartsTableWidget.setCurrentCell(row, 0)
om_gui.ui.toothPropsWidget.setTooth(tooth, om_gui.selectedChartWidget)
+
def deleteComments(om_gui):
'''
called when user has trigger deleted comments in the toothProp
'''
tooth = str(om_gui.ui.chartsTableWidget.item(
- om_gui.ui.chartsTableWidget.currentRow(), 0).text())
+ om_gui.ui.chartsTableWidget.currentRow(), 0).text())
if tooth in om_gui.ui.staticChartWidget.commentedTeeth:
om_gui.ui.staticChartWidget.commentedTeeth.remove(tooth)
om_gui.ui.staticChartWidget.update()
- existing = om_gui.pt.__dict__[tooth+"st"]
- om_gui.pt.__dict__[tooth+"st"] = re.sub("![^ ]* ","",existing)
+ existing = om_gui.pt.__dict__[tooth + "st"]
+ om_gui.pt.__dict__[tooth + "st"] = re.sub("![^ ]* ", "", existing)
+
def updateCharts(om_gui, arg):
'''
@@ -88,16 +107,18 @@ def updateCharts(om_gui, arg):
om_gui.handle_chart_treatment_input(
tooth, arg, om_gui.selectedChartWidget == "cmp")
+
def updateChartsAfterTreatment(om_gui, tooth, newplan, newcompleted):
'''
update the charts when a planned item has moved to completed
'''
- #print "update charts after treatment", tooth, newplan, newcompleted
+ # print "update charts after treatment", tooth, newplan, newcompleted
om_gui.ui.planChartWidget.setToothProps(tooth, newplan)
om_gui.ui.planChartWidget.update()
om_gui.ui.completedChartWidget.setToothProps(tooth, newcompleted)
om_gui.ui.completedChartWidget.update()
+
def flipDeciduous(om_gui):
'''
change a tooth state from deciduous to permanent
@@ -106,20 +127,21 @@ def flipDeciduous(om_gui):
if om_gui.selectedChartWidget == "st":
selectedCells = om_gui.ui.chartsTableWidget.selectedIndexes()
for cell in selectedCells:
- row=cell.row()
- selectedTooth=str(
- om_gui.ui.chartsTableWidget.item(row, 0).text().toAscii())
+ row = cell.row()
+ selectedTooth = str(
+ om_gui.ui.chartsTableWidget.item(row, 0).text().toAscii())
om_gui.pt.flipDec_Perm(selectedTooth)
for chart in (om_gui.ui.staticChartWidget, om_gui.ui.planChartWidget,
- om_gui.ui.completedChartWidget, om_gui.ui.perioChartWidget,
- om_gui.ui.summaryChartWidget):
+ om_gui.ui.completedChartWidget, om_gui.ui.perioChartWidget,
+ om_gui.ui.summaryChartWidget):
chart.chartgrid = om_gui.pt.chartgrid
#--necessary to restore the chart to full dentition
chart.update()
else:
om_gui.advise(
- _("you need to be in the static chart to change tooth state"), 1)
+ _("you need to be in the static chart to change tooth state"), 1)
+
def checkPreviousEntry(om_gui):
'''
@@ -130,6 +152,7 @@ def checkPreviousEntry(om_gui):
else:
return om_gui.ui.toothPropsWidget.lineEdit.additional()
+
def chartNavigation(om_gui, teeth, callerIsTable=False):
'''
one way or another, a tooth has been selected...
@@ -137,11 +160,11 @@ def chartNavigation(om_gui, teeth, callerIsTable=False):
'''
#--called by a navigating a chart or the underlying table
#--convert from QString
- #print "chartNavigation", teeth, callerIsTable
+ # print "chartNavigation", teeth, callerIsTable
grid = (["ur8", "ur7", "ur6", "ur5", 'ur4', 'ur3', 'ur2', 'ur1',
- 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8'],
- ["lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1',
- 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'])
+ 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8'],
+ ["lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1',
+ 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'])
if teeth == []:
print '''chartNavigation called with teeth=[]\n
@@ -159,31 +182,32 @@ def chartNavigation(om_gui, teeth, callerIsTable=False):
x = grid[y].index(tooth)
selectChartedTooth(om_gui, x, y)
- om_gui.ui.chartsTableWidget.setCurrentCell(x+y*16, 0)
+ om_gui.ui.chartsTableWidget.setCurrentCell(x + y * 16, 0)
for tooth in teeth:
- #other teeth have been selected
- #ie. ctrl-click or shift ciick
+ # other teeth have been selected
+ # ie. ctrl-click or shift ciick
if tooth in grid[0]:
y = 0
else:
y = 1
x = grid[y].index(tooth)
- om_gui.ui.chartsTableWidget.setCurrentCell(x+y*16, 0,
- QtGui.QItemSelectionModel.Select)
+ om_gui.ui.chartsTableWidget.setCurrentCell(x + y * 16, 0,
+ QtGui.QItemSelectionModel.Select)
+
def selectChartedTooth(om_gui, x, y):
'''
only one tooth can be 'selected'
'''
- om_gui.ui.planChartWidget.setSelected(x, y, showSelection =
- om_gui.selectedChartWidget == "pl")
+ om_gui.ui.planChartWidget.setSelected(x, y, showSelection=
+ om_gui.selectedChartWidget == "pl")
- om_gui.ui.completedChartWidget.setSelected(x, y, showSelection =
- om_gui.selectedChartWidget == "cmp")
+ om_gui.ui.completedChartWidget.setSelected(x, y, showSelection=
+ om_gui.selectedChartWidget == "cmp")
- om_gui.ui.staticChartWidget.setSelected(x, y, showSelection =
- om_gui.selectedChartWidget == "st")
+ om_gui.ui.staticChartWidget.setSelected(x, y, showSelection=
+ om_gui.selectedChartWidget == "st")
def bpe_dates(om_gui):
@@ -197,11 +221,12 @@ def bpe_dates(om_gui):
om_gui.ui.bpeDateComboBox.addItem(QtCore.QString("NO BPE"))
else:
l = copy.deepcopy(om_gui.pt.bpe)
- l.reverse() #show newest first
+ l.reverse() # show newest first
for sets in l:
bpedate = localsettings.formatDate(sets[0])
om_gui.ui.bpeDateComboBox.addItem(bpedate)
+
def bpe_table(om_gui, arg):
'''
updates the BPE chart on the clinical summary page
@@ -209,25 +234,26 @@ def bpe_table(om_gui, arg):
if om_gui.pt.bpe != []:
last_bpe_date = localsettings.formatDate(om_gui.pt.bpe[-1][0])
om_gui.ui.bpe_groupBox.setTitle("BPE " + last_bpe_date)
- l=copy.deepcopy(om_gui.pt.bpe)
+ l = copy.deepcopy(om_gui.pt.bpe)
l.reverse()
- bpestring=l[arg][1]
- bpe_html='<table width="100%" border="1"><tr>'
+ bpestring = l[arg][1]
+ bpe_html = '<table width="100%" border="1"><tr>'
for i in range(len(bpestring)):
if i == 3:
- bpe_html+="</tr><tr>"
- bpe_html+='<td align="center">%s</td>'%bpestring[i]
- for i in range(i+1, 6):
+ bpe_html += "</tr><tr>"
+ bpe_html += '<td align="center">%s</td>' % bpestring[i]
+ for i in range(i + 1, 6):
if i == 3:
- bpe_html+="</tr><tr>"
- bpe_html+='<td align="center">_</td>'
- bpe_html+='</tr></table>'
+ bpe_html += "</tr><tr>"
+ bpe_html += '<td align="center">_</td>'
+ bpe_html += '</tr></table>'
om_gui.ui.bpe_textBrowser.setHtml(bpe_html)
else:
#--necessary in case of the "NO DATA FOUND" option
om_gui.ui.bpe_groupBox.setTitle(_("BPE"))
om_gui.ui.bpe_textBrowser.setHtml("")
+
def periochart_dates(om_gui):
'''
multiple perio charts on multiple dates....
@@ -239,13 +265,14 @@ def periochart_dates(om_gui):
if om_gui.pt.perioData == {}:
om_gui.ui.perioChartDateComboBox.addItem(_("NO CHARTS"))
+
def layoutPerioCharts(om_gui):
'''
layout the perio charts
'''
#--convert from QString
- selected_date=str(om_gui.ui.perioChartDateComboBox.currentText())
- if om_gui.pt.perioData.has_key(selected_date):
+ selected_date = str(om_gui.ui.perioChartDateComboBox.currentText())
+ if selected_date in om_gui.pt.perioData:
perioD = om_gui.pt.perioData[selected_date]
#--headers=("Recession", "Pocketing", "Plaque", "Bleeding", "Other",
#--"Suppuration", "Furcation", "Mobility")
@@ -259,6 +286,7 @@ def layoutPerioCharts(om_gui):
for chart in om_gui.ui.perioChartWidgets:
chart.update()
+
def chartsTable(om_gui):
'''
update the charts table
@@ -266,28 +294,28 @@ def chartsTable(om_gui):
om_gui.ui.chartsTableWidget.clear()
om_gui.ui.chartsTableWidget.setSortingEnabled(False)
om_gui.ui.chartsTableWidget.setRowCount(32)
- headers=["Tooth", "Deciduous", "Static", "Plan", "Completed"]
+ headers = ["Tooth", "Deciduous", "Static", "Plan", "Completed"]
om_gui.ui.chartsTableWidget.setColumnCount(5)
om_gui.ui.chartsTableWidget.setHorizontalHeaderLabels(headers)
om_gui.ui.chartsTableWidget.verticalHeader().hide()
for chart in (om_gui.ui.summaryChartWidget,
- om_gui.ui.staticChartWidget,
- om_gui.ui.planChartWidget,
- om_gui.ui.completedChartWidget,
- om_gui.ui.perioChartWidget):
- chart.chartgrid=om_gui.pt.chartgrid
+ om_gui.ui.staticChartWidget,
+ om_gui.ui.planChartWidget,
+ om_gui.ui.completedChartWidget,
+ om_gui.ui.perioChartWidget):
+ chart.chartgrid = om_gui.pt.chartgrid
#--sets the tooth numbering
- row=0
+ row = 0
for tooth in ("ur8", "ur7", "ur6", "ur5", 'ur4', 'ur3', 'ur2', 'ur1',
- 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8',
- "lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1',
- 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'):
- item1=QtGui.QTableWidgetItem(tooth)
- static_text=om_gui.pt.__dict__[tooth+"st"]
- staticitem=QtGui.QTableWidgetItem(static_text)
- decidousitem=QtGui.QTableWidgetItem(om_gui.pt.chartgrid[tooth])
+ 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8',
+ "lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1',
+ 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'):
+ item1 = QtGui.QTableWidgetItem(tooth)
+ static_text = om_gui.pt.__dict__[tooth + "st"]
+ staticitem = QtGui.QTableWidgetItem(static_text)
+ decidousitem = QtGui.QTableWidgetItem(om_gui.pt.chartgrid[tooth])
om_gui.ui.chartsTableWidget.setRowHeight(row, 15)
om_gui.ui.chartsTableWidget.setItem(row, 0, item1)
om_gui.ui.chartsTableWidget.setItem(row, 1, decidousitem)
@@ -295,8 +323,8 @@ def chartsTable(om_gui):
row += 1
om_gui.ui.summaryChartWidget.setToothProps(tooth, static_text)
om_gui.ui.staticChartWidget.setToothProps(tooth, static_text)
- pItem = om_gui.pt.treatment_course.__dict__[tooth+"pl"]
- cItem = om_gui.pt.treatment_course.__dict__[tooth+"cmp"]
+ pItem = om_gui.pt.treatment_course.__dict__[tooth + "pl"]
+ cItem = om_gui.pt.treatment_course.__dict__[tooth + "cmp"]
planitem = QtGui.QTableWidgetItem(pItem)
cmpitem = QtGui.QTableWidgetItem(cItem)
om_gui.ui.chartsTableWidget.setItem(row, 3, planitem)
diff --git a/src/openmolar/qt4gui/colours.py b/src/openmolar/qt4gui/colours.py
index 012daab..1ae8ec3 100644
--- a/src/openmolar/qt4gui/colours.py
+++ b/src/openmolar/qt4gui/colours.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
@@ -27,7 +29,7 @@ CHARTTEXT = QtGui.QColor("#111111")
TOOTHLINES = QtGui.QColor("#aaaaaa")
IVORY = QtGui.QColor("#ffeedd")
-#these numbers are grabbed for the stylesheet of the toothprop buttons
+# these numbers are grabbed for the stylesheet of the toothprop buttons
GI_ = "#75d185"
GOLD_ = "#ffff00"
COMP_ = "#ffffff"
@@ -44,7 +46,7 @@ FISSURE = QtGui.QColor("#bbd0d0")
METAL = QtGui.QColor("#000075")
DRESSING = QtGui.QColor("magenta")
GUTTA_PERCHA = QtGui.QColor("#bb0000")
-FILL_OUTLINE = QtGui.QColor("#333333") #used to be blue
+FILL_OUTLINE = QtGui.QColor("#333333") # used to be blue
TRANSPARENT = QtCore.Qt.transparent
med_warning = "red"
BACKGROUND = QtGui.QPalette().window()
@@ -52,35 +54,34 @@ APPT_Background = QtCore.Qt.white
APPT_LINECOLOUR = QtGui.QColor("#dddddd")
DIARY = {
-"Unscheduled":QtGui.QColor("red"),
-"Past":QtGui.QColor("#8c7d3b"),
-"TODAY":QtGui.QColor("#3b8c55"),
-"Future":QtGui.QColor("#3b4a8c")
+ "Unscheduled": QtGui.QColor("red"),
+ "Past": QtGui.QColor("#8c7d3b"),
+ "TODAY": QtGui.QColor("#3b8c55"),
+ "Future": QtGui.QColor("#3b4a8c")
}
BOOKED_TODAY = QtCore.Qt.red
APPTCOLORS = {
- "N":QtGui.QColor("#d9d9ff"),
- "I":QtGui.QColor("#d9ffec"),
- "P":QtGui.QColor("#ffffd9"),
- "RESERVED CLINICAL TIME":QtGui.QColor("#ffcc99"),
- "LUNCH":QtGui.QColor("#dddddd"),
- "FREE":QtCore.Qt.transparent,
- "EMERGENCY":QtGui.QColor("#ffd9ec"),
- "default":QtGui.QColor("#adb3ff"),
- "//BLOCKED//":QtCore.Qt.lightGray,
- "DOUBLE":QtCore.Qt.blue,
- "SLOT" : QtGui.QColor("#ffff99"),
- "HEADER" : QtCore.Qt.white,
- "BACKGROUND" : QtCore.Qt.white,
- "ACTIVE_SLOT" : QtGui.QColor("#ffff33"),
- "ACTIVE_SLOT_BOLD" : QtGui.QColor("#dddd11"),
- "BUSY" : QtGui.QColor("#d9d9ff"),
- "current_patient" : QtGui.QColor("orange"),
- }
+ "N": QtGui.QColor("#d9d9ff"),
+ "I": QtGui.QColor("#d9ffec"),
+ "P": QtGui.QColor("#ffffd9"),
+ "RESERVED CLINICAL TIME": QtGui.QColor("#ffcc99"),
+ "LUNCH": QtGui.QColor("#dddddd"),
+ "FREE": QtCore.Qt.transparent,
+ "EMERGENCY": QtGui.QColor("#ffd9ec"),
+ "default": QtGui.QColor("#adb3ff"),
+ "//BLOCKED//": QtCore.Qt.lightGray,
+ "DOUBLE": QtCore.Qt.blue,
+ "SLOT": QtGui.QColor("#ffff99"),
+ "HEADER": QtCore.Qt.white,
+ "BACKGROUND": QtCore.Qt.white,
+ "ACTIVE_SLOT": QtGui.QColor("#ffff33"),
+ "ACTIVE_SLOT_BOLD": QtGui.QColor("#dddd11"),
+ "BUSY": QtGui.QColor("#d9d9ff"),
+ "current_patient": QtGui.QColor("orange"),
+}
if __name__ == "__main__":
print BACKGROUND
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py b/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py
index d7d6184..0622101 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/activeDentStartFinish.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Form(object):
+
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(562, 25)
@@ -28,7 +30,11 @@ class Ui_Form(object):
self.checkBox.setLayoutDirection(QtCore.Qt.RightToLeft)
self.checkBox.setObjectName(_fromUtf8("checkBox"))
self.horizontalLayout.addWidget(self.checkBox)
- spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem = QtGui.QSpacerItem(
+ 40,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.widget = QtGui.QWidget(Form)
self.widget.setMinimumSize(QtCore.QSize(80, 0))
@@ -62,4 +68,3 @@ if __name__ == "__main__":
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py b/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py
index d6aee29..11ce195 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/addTreatment.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(459, 245)
@@ -32,8 +34,10 @@ class Ui_Dialog(object):
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
self.scrollAreaWidgetContents = QtGui.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 439, 173))
- self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
- self.horizontalLayout = QtGui.QHBoxLayout(self.scrollAreaWidgetContents)
+ self.scrollAreaWidgetContents.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents"))
+ self.horizontalLayout = QtGui.QHBoxLayout(
+ self.scrollAreaWidgetContents)
self.horizontalLayout.setSpacing(0)
self.horizontalLayout.setMargin(0)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
@@ -46,19 +50,27 @@ class Ui_Dialog(object):
self.verticalLayout.addWidget(self.scrollArea)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(False)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_("Plan Treatment"))
- self.label.setText(_("Add the following Treatment Items to the Current Treatment Plan"))
+ self.label.setText(
+ _("Add the following Treatment Items to the Current Treatment Plan"))
if __name__ == "__main__":
@@ -71,4 +83,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py b/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py
index bf08a01..ce41835 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/appointment_length.ui'
@@ -17,12 +18,16 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.setWindowModality(QtCore.Qt.NonModal)
Dialog.resize(256, 134)
icon = QtGui.QIcon()
- icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/logo.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/logo.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
Dialog.setWindowIcon(icon)
self.gridLayout = QtGui.QGridLayout(Dialog)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
@@ -45,7 +50,11 @@ class Ui_Dialog(object):
self.mins_spinBox.setSingleStep(5)
self.mins_spinBox.setObjectName(_fromUtf8("mins_spinBox"))
self.gridLayout.addWidget(self.mins_spinBox, 1, 1, 1, 1)
- spacerItem = QtGui.QSpacerItem(20, 29, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 29,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem, 2, 0, 1, 2)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
@@ -55,8 +64,14 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.buttonBox, 3, 0, 1, 2)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(Dialog, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ Dialog,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.accept)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -76,4 +91,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py b/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py
index 6bfc62b..09382d9 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/apptOpenDay.ui'
@@ -17,22 +18,29 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(540, 377)
self.gridLayout_2 = QtGui.QGridLayout(Dialog)
self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
self.label_2 = QtGui.QLabel(Dialog)
- self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_2.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.gridLayout_2.addWidget(self.label_2, 0, 1, 1, 1)
self.comboBox = QtGui.QComboBox(Dialog)
self.comboBox.setObjectName(_fromUtf8("comboBox"))
self.gridLayout_2.addWidget(self.comboBox, 0, 2, 1, 1)
- spacerItem = QtGui.QSpacerItem(141, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem = QtGui.QSpacerItem(
+ 141,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem, 0, 3, 1, 1)
self.label_3 = QtGui.QLabel(Dialog)
- self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_3.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.gridLayout_2.addWidget(self.label_3, 1, 1, 1, 1)
self.dateEdit = QtGui.QDateEdit(Dialog)
@@ -56,97 +64,129 @@ class Ui_Dialog(object):
self.gridLayout = QtGui.QGridLayout(self.frame)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.label_10 = QtGui.QLabel(self.frame)
- self.label_10.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_10.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_10.setObjectName(_fromUtf8("label_10"))
self.gridLayout.addWidget(self.label_10, 0, 1, 1, 1)
self.dayStart_timeEdit = QtGui.QTimeEdit(self.frame)
self.dayStart_timeEdit.setObjectName(_fromUtf8("dayStart_timeEdit"))
self.gridLayout.addWidget(self.dayStart_timeEdit, 0, 2, 1, 1)
self.es1_checkBox = QtGui.QCheckBox(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.es1_checkBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.es1_checkBox.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.es1_checkBox.setSizePolicy(sizePolicy)
self.es1_checkBox.setObjectName(_fromUtf8("es1_checkBox"))
self.gridLayout.addWidget(self.es1_checkBox, 1, 0, 1, 1)
self.label_4 = QtGui.QLabel(self.frame)
- self.label_4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_4.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_4.setObjectName(_fromUtf8("label_4"))
self.gridLayout.addWidget(self.label_4, 1, 1, 1, 1)
self.es1Start_timeEdit = QtGui.QTimeEdit(self.frame)
self.es1Start_timeEdit.setObjectName(_fromUtf8("es1Start_timeEdit"))
self.gridLayout.addWidget(self.es1Start_timeEdit, 1, 2, 1, 1)
self.label_7 = QtGui.QLabel(self.frame)
- self.label_7.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_7.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_7.setObjectName(_fromUtf8("label_7"))
self.gridLayout.addWidget(self.label_7, 1, 3, 1, 1)
self.es1Finish_timeEdit = QtGui.QTimeEdit(self.frame)
self.es1Finish_timeEdit.setObjectName(_fromUtf8("es1Finish_timeEdit"))
self.gridLayout.addWidget(self.es1Finish_timeEdit, 1, 4, 1, 1)
self.lunch_checkBox = QtGui.QCheckBox(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.lunch_checkBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.lunch_checkBox.sizePolicy().hasHeightForWidth())
self.lunch_checkBox.setSizePolicy(sizePolicy)
self.lunch_checkBox.setObjectName(_fromUtf8("lunch_checkBox"))
self.gridLayout.addWidget(self.lunch_checkBox, 2, 0, 1, 1)
self.label_5 = QtGui.QLabel(self.frame)
- self.label_5.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_5.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_5.setObjectName(_fromUtf8("label_5"))
self.gridLayout.addWidget(self.label_5, 2, 1, 1, 1)
self.lunchStart_timeEdit = QtGui.QTimeEdit(self.frame)
- self.lunchStart_timeEdit.setObjectName(_fromUtf8("lunchStart_timeEdit"))
+ self.lunchStart_timeEdit.setObjectName(
+ _fromUtf8("lunchStart_timeEdit"))
self.gridLayout.addWidget(self.lunchStart_timeEdit, 2, 2, 1, 1)
self.label_8 = QtGui.QLabel(self.frame)
- self.label_8.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_8.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_8.setObjectName(_fromUtf8("label_8"))
self.gridLayout.addWidget(self.label_8, 2, 3, 1, 1)
self.lunchFinish_timeEdit = QtGui.QTimeEdit(self.frame)
- self.lunchFinish_timeEdit.setObjectName(_fromUtf8("lunchFinish_timeEdit"))
+ self.lunchFinish_timeEdit.setObjectName(
+ _fromUtf8("lunchFinish_timeEdit"))
self.gridLayout.addWidget(self.lunchFinish_timeEdit, 2, 4, 1, 1)
self.es2_checkBox = QtGui.QCheckBox(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.es2_checkBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.es2_checkBox.sizePolicy().hasHeightForWidth())
self.es2_checkBox.setSizePolicy(sizePolicy)
self.es2_checkBox.setObjectName(_fromUtf8("es2_checkBox"))
self.gridLayout.addWidget(self.es2_checkBox, 3, 0, 1, 1)
self.label_6 = QtGui.QLabel(self.frame)
- self.label_6.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_6.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_6.setObjectName(_fromUtf8("label_6"))
self.gridLayout.addWidget(self.label_6, 3, 1, 1, 1)
self.es2Start_timeEdit = QtGui.QTimeEdit(self.frame)
self.es2Start_timeEdit.setObjectName(_fromUtf8("es2Start_timeEdit"))
self.gridLayout.addWidget(self.es2Start_timeEdit, 3, 2, 1, 1)
self.label_9 = QtGui.QLabel(self.frame)
- self.label_9.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_9.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_9.setObjectName(_fromUtf8("label_9"))
self.gridLayout.addWidget(self.label_9, 3, 3, 1, 1)
self.es2Finish_timeEdit = QtGui.QTimeEdit(self.frame)
self.es2Finish_timeEdit.setObjectName(_fromUtf8("es2Finish_timeEdit"))
self.gridLayout.addWidget(self.es2Finish_timeEdit, 3, 4, 1, 1)
self.label_11 = QtGui.QLabel(self.frame)
- self.label_11.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_11.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_11.setObjectName(_fromUtf8("label_11"))
self.gridLayout.addWidget(self.label_11, 4, 3, 1, 1)
self.dayFinish_timeEdit = QtGui.QTimeEdit(self.frame)
self.dayFinish_timeEdit.setObjectName(_fromUtf8("dayFinish_timeEdit"))
self.gridLayout.addWidget(self.dayFinish_timeEdit, 4, 4, 1, 1)
self.gridLayout_2.addWidget(self.frame, 3, 0, 1, 4)
- spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem1 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem1, 4, 0, 1, 1)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout_2.addWidget(self.buttonBox, 5, 0, 1, 4)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -177,4 +217,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py b/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py
index b761438..35de4f1 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/apptTools.ui'
@@ -17,11 +18,15 @@ except AttributeError:
class Ui_MainWindow(object):
+
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(599, 255)
icon = QtGui.QIcon()
- icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/logo.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/logo.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
@@ -35,13 +40,16 @@ class Ui_MainWindow(object):
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout.addWidget(self.label, 0, 0, 5, 1)
self.extendBook_pushButton = QtGui.QPushButton(self.centralwidget)
- self.extendBook_pushButton.setObjectName(_fromUtf8("extendBook_pushButton"))
+ self.extendBook_pushButton.setObjectName(
+ _fromUtf8("extendBook_pushButton"))
self.gridLayout.addWidget(self.extendBook_pushButton, 0, 1, 1, 1)
self.removeOld_pushButton = QtGui.QPushButton(self.centralwidget)
- self.removeOld_pushButton.setObjectName(_fromUtf8("removeOld_pushButton"))
+ self.removeOld_pushButton.setObjectName(
+ _fromUtf8("removeOld_pushButton"))
self.gridLayout.addWidget(self.removeOld_pushButton, 2, 1, 1, 1)
self.editWeeks_pushButton = QtGui.QPushButton(self.centralwidget)
- self.editWeeks_pushButton.setObjectName(_fromUtf8("editWeeks_pushButton"))
+ self.editWeeks_pushButton.setObjectName(
+ _fromUtf8("editWeeks_pushButton"))
self.gridLayout.addWidget(self.editWeeks_pushButton, 3, 1, 1, 1)
self.openDay_pushButton = QtGui.QPushButton(self.centralwidget)
self.openDay_pushButton.setObjectName(_fromUtf8("openDay_pushButton"))
@@ -66,10 +74,12 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_("Appointment Tools"))
- self.extendBook_pushButton.setToolTip(_("Move the end date for making appointments."))
+ self.extendBook_pushButton.setToolTip(
+ _("Move the end date for making appointments."))
self.extendBook_pushButton.setText(_("Extend Books"))
self.removeOld_pushButton.setText(_("Remove old weeks"))
- self.editWeeks_pushButton.setText(_("Edit Standard Working Weeks for Clinicians"))
+ self.editWeeks_pushButton.setText(
+ _("Edit Standard Working Weeks for Clinicians"))
self.openDay_pushButton.setText(_("Open A Day"))
self.blocks_pushButton.setText(_("Insert regular blocks"))
self.menu_Quit.setTitle(_("&Quit"))
@@ -86,4 +96,3 @@ if __name__ == "__main__":
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_apptWizard.py b/src/openmolar/qt4gui/compiled_uis/Ui_apptWizard.py
index 78c30f0..f244edd 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_apptWizard.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_apptWizard.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/apptWizard.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(721, 442)
@@ -30,8 +32,10 @@ class Ui_Dialog(object):
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
self.scrollAreaWidgetContents = QtGui.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 699, 360))
- self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
- self.verticalLayout_2 = QtGui.QVBoxLayout(self.scrollAreaWidgetContents)
+ self.scrollAreaWidgetContents.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents"))
+ self.verticalLayout_2 = QtGui.QVBoxLayout(
+ self.scrollAreaWidgetContents)
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
self.frame = QtGui.QFrame(self.scrollAreaWidgetContents)
self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
@@ -48,13 +52,20 @@ class Ui_Dialog(object):
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_("Appointment Wizard"))
- self.label.setText(_("Add a combination of proposed appointments to the patients diary."))
+ self.label.setText(
+ _("Add a combination of proposed appointments to the patients diary."))
if __name__ == "__main__":
@@ -67,4 +78,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py b/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py
index 4659b0d..b6ed953 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/apptWizardItem.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Form(object):
+
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(697, 34)
@@ -25,12 +27,16 @@ class Ui_Form(object):
self.horizontalLayout.setContentsMargins(-1, 3, -1, 3)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.label = QtGui.QLabel(Form)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.label.sizePolicy().hasHeightForWidth())
self.label.setSizePolicy(sizePolicy)
- self.label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+ self.label.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.label.setObjectName(_fromUtf8("label"))
self.horizontalLayout.addWidget(self.label)
self.comboBox = QtGui.QComboBox(Form)
@@ -61,4 +67,3 @@ if __name__ == "__main__":
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py b/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py
index 0117b1d..c1a4112 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/aslotEdit.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(602, 457)
@@ -30,16 +32,23 @@ class Ui_Dialog(object):
self.horizontalLayout.setContentsMargins(40, 0, 40, 0)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.label = QtGui.QLabel(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.label.sizePolicy().hasHeightForWidth())
self.label.setSizePolicy(sizePolicy)
self.label.setMinimumSize(QtCore.QSize(92, 0))
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName(_fromUtf8("label"))
self.horizontalLayout.addWidget(self.label)
- spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem = QtGui.QSpacerItem(
+ 40,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.label_3 = QtGui.QLabel(self.frame)
self.label_3.setMinimumSize(QtCore.QSize(80, 0))
@@ -64,8 +73,10 @@ class Ui_Dialog(object):
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
self.scrollAreaWidgetContents = QtGui.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 584, 380))
- self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
- self.verticalLayout_2 = QtGui.QVBoxLayout(self.scrollAreaWidgetContents)
+ self.scrollAreaWidgetContents.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents"))
+ self.verticalLayout_2 = QtGui.QVBoxLayout(
+ self.scrollAreaWidgetContents)
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
self.frame_2 = QtGui.QFrame(self.scrollAreaWidgetContents)
self.frame_2.setFrameShape(QtGui.QFrame.NoFrame)
@@ -77,11 +88,16 @@ class Ui_Dialog(object):
self.copy_pushButton = QtGui.QPushButton(Dialog)
self.copy_pushButton.setObjectName(_fromUtf8("copy_pushButton"))
self.gridLayout.addWidget(self.copy_pushButton, 2, 0, 1, 1)
- spacerItem1 = QtGui.QSpacerItem(188, 24, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem1 = QtGui.QSpacerItem(
+ 188,
+ 24,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem1, 2, 2, 1, 1)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(False)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout.addWidget(self.buttonBox, 2, 3, 1, 1)
@@ -90,8 +106,14 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.paste_pushButton, 2, 1, 1, 1)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -100,7 +122,8 @@ class Ui_Dialog(object):
self.label_3.setText(_("Start"))
self.label_4.setText(_("Finish"))
self.label_2.setText(_("Memo"))
- self.copy_pushButton.setToolTip(_("If you copy this day\'s setup to the clipboard, you can create a \"clone\" of this day when no data is set. This is useful when extending books."))
+ self.copy_pushButton.setToolTip(
+ _("If you copy this day\'s setup to the clipboard, you can create a \"clone\" of this day when no data is set. This is useful when extending books."))
self.copy_pushButton.setText(_("Copy To Clipboard"))
self.paste_pushButton.setToolTip(_("Paste the saved values."))
self.paste_pushButton.setText(_("Paste"))
@@ -116,4 +139,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py b/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py
index 8ff073f..740f105 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/blockSlot.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(345, 361)
@@ -33,11 +35,13 @@ class Ui_Dialog(object):
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout.addWidget(self.label, 0, 0, 1, 3)
self.label_3 = QtGui.QLabel(self.tab)
- self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_3.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
self.label_4 = QtGui.QLabel(self.tab)
- self.label_4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_4.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_4.setObjectName(_fromUtf8("label_4"))
self.gridLayout.addWidget(self.label_4, 2, 0, 1, 1)
self.label_2 = QtGui.QLabel(self.tab)
@@ -55,7 +59,11 @@ class Ui_Dialog(object):
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.gridLayout.addWidget(self.comboBox, 3, 1, 1, 2)
- spacerItem = QtGui.QSpacerItem(20, 34, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 34,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem, 5, 0, 1, 2)
self.blockStart_frame = QtGui.QFrame(self.tab)
self.blockStart_frame.setMinimumSize(QtCore.QSize(0, 0))
@@ -98,7 +106,8 @@ class Ui_Dialog(object):
self.pt_label.setObjectName(_fromUtf8("pt_label"))
self.gridLayout_2.addWidget(self.pt_label, 3, 0, 1, 3)
self.changePt_pushButton = QtGui.QPushButton(self.tab_2)
- self.changePt_pushButton.setObjectName(_fromUtf8("changePt_pushButton"))
+ self.changePt_pushButton.setObjectName(
+ _fromUtf8("changePt_pushButton"))
self.gridLayout_2.addWidget(self.changePt_pushButton, 3, 3, 1, 1)
self.label_9 = QtGui.QLabel(self.tab_2)
self.label_9.setTextFormat(QtCore.Qt.AutoText)
@@ -108,7 +117,11 @@ class Ui_Dialog(object):
self.reason_comboBox = QtGui.QComboBox(self.tab_2)
self.reason_comboBox.setObjectName(_fromUtf8("reason_comboBox"))
self.gridLayout_2.addWidget(self.reason_comboBox, 4, 3, 1, 1)
- spacerItem1 = QtGui.QSpacerItem(20, 99, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem1 = QtGui.QSpacerItem(
+ 20,
+ 99,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem1, 5, 2, 1, 1)
self.length_spinBox = QtGui.QSpinBox(self.tab_2)
self.length_spinBox.setMinimum(-600)
@@ -125,20 +138,28 @@ class Ui_Dialog(object):
self.verticalLayout.addWidget(self.tabWidget)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
self.tabWidget.setCurrentIndex(0)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_("Options"))
- self.label.setText(_("Would you like to Block (or partially Block) this Slot?"))
+ self.label.setText(
+ _("Would you like to Block (or partially Block) this Slot?"))
self.label_3.setText(_("Block Start"))
self.label_4.setText(_("Bock End"))
self.label_2.setText(_("Text to apply"))
@@ -150,7 +171,9 @@ class Ui_Dialog(object):
self.comboBox.setItemText(5, _("Catch up time"))
self.comboBox.setItemText(6, _("Phone Call"))
self.length_label.setText(_("minutes"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _("Insert a Block"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab),
+ _("Insert a Block"))
self.label_7.setText(_("Insert A Patient into this slot?"))
self.label_5.setText(_("Start Time"))
self.label_6.setText(_("Length"))
@@ -158,7 +181,9 @@ class Ui_Dialog(object):
self.changePt_pushButton.setText(_("Change"))
self.label_9.setText(_("Reason for appointment is"))
self.length_spinBox.setSuffix(_(" minutes"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _("Insert a Known Patient"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_2),
+ _("Insert a Known Patient"))
if __name__ == "__main__":
@@ -171,4 +196,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py b/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py
index 8e82688..8392740 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/block_wizard.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(403, 437)
@@ -34,7 +36,11 @@ class Ui_Dialog(object):
self.start_dateEdit.setCalendarPopup(True)
self.start_dateEdit.setObjectName(_fromUtf8("start_dateEdit"))
self.gridLayout_2.addWidget(self.start_dateEdit, 2, 1, 1, 1)
- spacerItem = QtGui.QSpacerItem(202, 21, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem = QtGui.QSpacerItem(
+ 202,
+ 21,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem, 2, 3, 1, 1)
self.label_3 = QtGui.QLabel(Dialog)
self.label_3.setObjectName(_fromUtf8("label_3"))
@@ -44,17 +50,29 @@ class Ui_Dialog(object):
self.end_dateEdit.setCalendarPopup(True)
self.end_dateEdit.setObjectName(_fromUtf8("end_dateEdit"))
self.gridLayout_2.addWidget(self.end_dateEdit, 3, 1, 1, 1)
- spacerItem1 = QtGui.QSpacerItem(202, 21, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem1 = QtGui.QSpacerItem(
+ 202,
+ 21,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem1, 3, 3, 1, 1)
self.label_4 = QtGui.QLabel(Dialog)
self.label_4.setObjectName(_fromUtf8("label_4"))
self.gridLayout_2.addWidget(self.label_4, 4, 0, 1, 1)
- spacerItem2 = QtGui.QSpacerItem(202, 21, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem2 = QtGui.QSpacerItem(
+ 202,
+ 21,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem2, 4, 3, 1, 1)
self.label_5 = QtGui.QLabel(Dialog)
self.label_5.setObjectName(_fromUtf8("label_5"))
self.gridLayout_2.addWidget(self.label_5, 5, 0, 1, 1)
- spacerItem3 = QtGui.QSpacerItem(202, 22, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem3 = QtGui.QSpacerItem(
+ 202,
+ 22,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem3, 5, 3, 1, 1)
self.label_6 = QtGui.QLabel(Dialog)
self.label_6.setObjectName(_fromUtf8("label_6"))
@@ -67,11 +85,16 @@ class Ui_Dialog(object):
self.gridLayout_2.addWidget(self.day_groupBox, 7, 0, 1, 4)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Apply|QtGui.QDialogButtonBox.Cancel)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Apply | QtGui.QDialogButtonBox.Cancel)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout_2.addWidget(self.buttonBox, 12, 0, 1, 4)
- spacerItem4 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem4 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem4, 8, 0, 1, 1)
self.time_frame = QtGui.QFrame(Dialog)
self.time_frame.setFrameShape(QtGui.QFrame.NoFrame)
@@ -79,14 +102,19 @@ class Ui_Dialog(object):
self.time_frame.setObjectName(_fromUtf8("time_frame"))
self.gridLayout_2.addWidget(self.time_frame, 4, 1, 1, 1)
self.clinicians_groupBox = QtGui.QGroupBox(Dialog)
- self.clinicians_groupBox.setObjectName(_fromUtf8("clinicians_groupBox"))
+ self.clinicians_groupBox.setObjectName(
+ _fromUtf8("clinicians_groupBox"))
self.gridLayout_2.addWidget(self.clinicians_groupBox, 1, 0, 1, 4)
self.spinBox = QtGui.QSpinBox(Dialog)
self.spinBox.setMaximum(300)
self.spinBox.setSingleStep(5)
self.spinBox.setObjectName(_fromUtf8("spinBox"))
self.gridLayout_2.addWidget(self.spinBox, 5, 1, 1, 1)
- spacerItem5 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem5 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem5, 11, 0, 1, 1)
self.progress_label = QtGui.QLabel(Dialog)
self.progress_label.setText(_fromUtf8(""))
@@ -98,13 +126,20 @@ class Ui_Dialog(object):
self.gridLayout_2.addWidget(self.progressBar, 10, 0, 1, 4)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_("Block Wizard"))
- self.label_7.setText(_("Insert a block into a book for a range of dates."))
+ self.label_7.setText(
+ _("Insert a block into a book for a range of dates."))
self.label_2.setText(_("Start Date"))
self.label_3.setText(_("End Date (inclusive)"))
self.label_4.setText(_("Time"))
@@ -125,4 +160,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py b/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py
index 2b14d05..be62174 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/bridge_denture.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(632, 480)
@@ -43,7 +45,11 @@ class Ui_Dialog(object):
self.radioButton_3 = QtGui.QRadioButton(self.tab)
self.radioButton_3.setObjectName(_fromUtf8("radioButton_3"))
self.verticalLayout_4.addWidget(self.radioButton_3)
- spacerItem = QtGui.QSpacerItem(20, 295, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 295,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.verticalLayout_4.addItem(spacerItem)
self.tabWidget.addTab(self.tab, _fromUtf8(""))
self.tab_2 = QtGui.QWidget()
@@ -104,14 +110,21 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.tabWidget, 0, 1, 1, 1)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout.addWidget(self.buttonBox, 1, 1, 1, 1)
self.retranslateUi(Dialog)
self.tabWidget.setCurrentIndex(0)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -119,7 +132,9 @@ class Ui_Dialog(object):
self.radioButton.setText(_("Porcelain / Precious Metal"))
self.radioButton_2.setText(_("Lava (or all ceramic)"))
self.radioButton_3.setText(_("Resin Retained"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _("Bridge"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab),
+ _("Bridge"))
self.label_2.setText(_("Upper"))
self.radioButton_4.setText(_("Full (acrylic)"))
self.radioButton_8.setText(_("Full (co-chrome)"))
@@ -132,7 +147,9 @@ class Ui_Dialog(object):
self.radioButton_10.setText(_("Partial (acrylic)"))
self.radioButton_11.setText(_("Partial (co-chrome)"))
self.radioButton_12.setText(_("Other"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _("Denture"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_2),
+ _("Denture"))
if __name__ == "__main__":
@@ -145,4 +162,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py b/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py
index b8ff38f..54d23f0 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/bulkmail_options.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(410, 367)
@@ -34,10 +36,12 @@ class Ui_Dialog(object):
self.gridLayout_2.addWidget(self.label, 0, 0, 2, 1)
self.fullDate_radioButton = QtGui.QRadioButton(self.frame)
self.fullDate_radioButton.setChecked(True)
- self.fullDate_radioButton.setObjectName(_fromUtf8("fullDate_radioButton"))
+ self.fullDate_radioButton.setObjectName(
+ _fromUtf8("fullDate_radioButton"))
self.gridLayout_2.addWidget(self.fullDate_radioButton, 0, 1, 1, 1)
self.abbrvDate_radioButton = QtGui.QRadioButton(self.frame)
- self.abbrvDate_radioButton.setObjectName(_fromUtf8("abbrvDate_radioButton"))
+ self.abbrvDate_radioButton.setObjectName(
+ _fromUtf8("abbrvDate_radioButton"))
self.gridLayout_2.addWidget(self.abbrvDate_radioButton, 1, 1, 1, 1)
self.verticalLayout.addWidget(self.frame)
self.line = QtGui.QFrame(Dialog)
@@ -63,7 +67,8 @@ class Ui_Dialog(object):
self.recd_radioButton.setObjectName(_fromUtf8("recd_radioButton"))
self.gridLayout.addWidget(self.recd_radioButton, 1, 1, 1, 1)
self.custDate_radioButton = QtGui.QRadioButton(self.frame_2)
- self.custDate_radioButton.setObjectName(_fromUtf8("custDate_radioButton"))
+ self.custDate_radioButton.setObjectName(
+ _fromUtf8("custDate_radioButton"))
self.gridLayout.addWidget(self.custDate_radioButton, 2, 1, 1, 1)
self.dateEdit = QtGui.QDateEdit(self.frame_2)
self.dateEdit.setEnabled(False)
@@ -71,17 +76,28 @@ class Ui_Dialog(object):
self.dateEdit.setObjectName(_fromUtf8("dateEdit"))
self.gridLayout.addWidget(self.dateEdit, 3, 1, 1, 1)
self.verticalLayout.addWidget(self.frame_2)
- spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -91,7 +107,8 @@ class Ui_Dialog(object):
self.abbrvDate_radioButton.setText(_("Month and Year Only"))
self.label_2.setText(_("Date to use"))
self.today_radioButton.setText(_("Today\'s Date"))
- self.recd_radioButton.setText(_("The actual recall date for the patient"))
+ self.recd_radioButton.setText(
+ _("The actual recall date for the patient"))
self.custDate_radioButton.setText(_("This Date"))
@@ -105,4 +122,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_choose_clinicians.py b/src/openmolar/qt4gui/compiled_uis/Ui_choose_clinicians.py
index fea9a04..4bd4f75 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_choose_clinicians.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_choose_clinicians.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/choose_clinicians.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(342, 385)
@@ -35,8 +37,14 @@ class Ui_Dialog(object):
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -53,4 +61,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py b/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py
index 1cec479..bcd2e34 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/choose_language.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(426, 602)
@@ -24,7 +26,8 @@ class Ui_Dialog(object):
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.label = QtGui.QLabel(Dialog)
self.label.setMinimumSize(QtCore.QSize(0, 60))
- self.label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+ self.label.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.label.setWordWrap(True)
self.label.setObjectName(_fromUtf8("label"))
self.verticalLayout.addWidget(self.label)
@@ -33,8 +36,10 @@ class Ui_Dialog(object):
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
self.scrollAreaWidgetContents = QtGui.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 406, 351))
- self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
- self.horizontalLayout = QtGui.QHBoxLayout(self.scrollAreaWidgetContents)
+ self.scrollAreaWidgetContents.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents"))
+ self.horizontalLayout = QtGui.QHBoxLayout(
+ self.scrollAreaWidgetContents)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.frame = QtGui.QFrame(self.scrollAreaWidgetContents)
self.frame.setFrameShape(QtGui.QFrame.NoFrame)
@@ -45,7 +50,8 @@ class Ui_Dialog(object):
self.verticalLayout.addWidget(self.scrollArea)
self.label_2 = QtGui.QLabel(Dialog)
self.label_2.setMinimumSize(QtCore.QSize(408, 40))
- self.label_2.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+ self.label_2.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.label_2.setWordWrap(True)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.verticalLayout.addWidget(self.label_2)
@@ -54,29 +60,39 @@ class Ui_Dialog(object):
font = QtGui.QFont()
font.setItalic(True)
self.label_3.setFont(font)
- self.label_3.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+ self.label_3.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.label_3.setWordWrap(True)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.verticalLayout.addWidget(self.label_3)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setMinimumSize(QtCore.QSize(0, 27))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(False)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_("Language Selector"))
self.label.setText(_("Choose from the following available languages.\n"
-"Please Note that some of these translations are not complete."))
- self.label_2.setText(_("Note - if your preferred language is not available (or incomplete), please visit https://launchpad.net/openmolar and add a translation of your own!"))
- self.label_3.setText(_("Many thanks to all who have helped internationalise openMolar, and to the folks behind the GNU tools and launchpad rosetta team who make this possible."))
+ "Please Note that some of these translations are not complete."))
+ self.label_2.setText(
+ _("Note - if your preferred language is not available (or incomplete), please visit https://launchpad.net/openmolar and add a translation of your own!"))
+ self.label_3.setText(
+ _("Many thanks to all who have helped internationalise openMolar, and to the folks behind the GNU tools and launchpad rosetta team who make this possible."))
if __name__ == "__main__":
@@ -89,4 +105,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_choose_tooth.py b/src/openmolar/qt4gui/compiled_uis/Ui_choose_tooth.py
index ae35b6e..64131a9 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_choose_tooth.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_choose_tooth.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/choose_tooth.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(736, 300)
@@ -34,19 +36,27 @@ class Ui_Dialog(object):
self.verticalLayout.addWidget(self.frame)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_("Choose A Tooth"))
- self.label.setText(_("Please Select the tooth to which this treatment is planned"))
+ self.label.setText(
+ _("Please Select the tooth to which this treatment is planned"))
if __name__ == "__main__":
@@ -59,4 +69,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py b/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py
index 91ea950..8fded05 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/codeChecker.ui'
@@ -17,16 +18,20 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(907, 686)
self.verticalLayout_3 = QtGui.QVBoxLayout(Dialog)
self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
self.splitter = QtGui.QSplitter(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.splitter.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.splitter.sizePolicy().hasHeightForWidth())
self.splitter.setSizePolicy(sizePolicy)
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setObjectName(_fromUtf8("splitter"))
@@ -56,10 +61,13 @@ class Ui_Dialog(object):
self.verticalLayout = QtGui.QVBoxLayout(self.frame_2)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.label_2 = QtGui.QLabel(self.frame_2)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.label_2.sizePolicy().hasHeightForWidth())
self.label_2.setSizePolicy(sizePolicy)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.verticalLayout.addWidget(self.label_2)
@@ -93,7 +101,8 @@ class Ui_Dialog(object):
Dialog.setWindowTitle(_("Dialog"))
self.label.setText(_("Deciduous Teeth"))
self.label_2.setText(_("Adult Teeth"))
- self.instruction_label.setText(_("Enter a Restoration Code (eg. MOD) to see how a feescale interprets the shortcut"))
+ self.instruction_label.setText(
+ _("Enter a Restoration Code (eg. MOD) to see how a feescale interprets the shortcut"))
self.pushButton.setText(_("GO"))
self.quit_pushButton.setText(_("QUIT"))
@@ -108,4 +117,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py b/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py
index bdd0f94..72cffc6 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/completionDate.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(340, 227)
@@ -31,7 +33,11 @@ class Ui_Dialog(object):
self.autoComplete_label.setWordWrap(True)
self.autoComplete_label.setObjectName(_fromUtf8("autoComplete_label"))
self.verticalLayout.addWidget(self.autoComplete_label)
- spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem)
self.horizontalLayout = QtGui.QHBoxLayout()
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
@@ -50,28 +56,40 @@ class Ui_Dialog(object):
self.label.setWordWrap(True)
self.label.setObjectName(_fromUtf8("label"))
self.verticalLayout.addWidget(self.label)
- spacerItem1 = QtGui.QSpacerItem(20, 14, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem1 = QtGui.QSpacerItem(
+ 20,
+ 14,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem1)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setFocusPolicy(QtCore.Qt.StrongFocus)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.No|QtGui.QDialogButtonBox.Yes)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.No | QtGui.QDialogButtonBox.Yes)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_("Completion Date"))
self.pt_label.setText(_("UNNAMED PT - (000000)"))
- self.autoComplete_label.setText(_("You have no further treatment proposed for this patient, yet they are deemed to be \"under treatment\"."))
+ self.autoComplete_label.setText(
+ _("You have no further treatment proposed for this patient, yet they are deemed to be \"under treatment\"."))
self.label_4.setText(_("Suggested completion Date"))
self.label.setText(_("Apply this Date Now?\n"
-"(course can be re-opened later if necessary)"))
+ "(course can be re-opened later if necessary)"))
if __name__ == "__main__":
@@ -84,4 +102,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py b/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py
index 7e741bb..8f7ba28 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/customTreatment.ui'
@@ -17,43 +18,55 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(346, 192)
self.gridLayout = QtGui.QGridLayout(Dialog)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.label = QtGui.QLabel(Dialog)
- self.label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+ self.label.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout.addWidget(self.label, 2, 0, 1, 3)
self.number_spinBox = QtGui.QSpinBox(Dialog)
- self.number_spinBox.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.number_spinBox.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.number_spinBox.setMinimum(1)
self.number_spinBox.setObjectName(_fromUtf8("number_spinBox"))
self.gridLayout.addWidget(self.number_spinBox, 2, 3, 1, 1)
self.label_3 = QtGui.QLabel(Dialog)
- self.label_3.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+ self.label_3.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.gridLayout.addWidget(self.label_3, 4, 0, 1, 3)
self.fee_doubleSpinBox = QtGui.QDoubleSpinBox(Dialog)
- self.fee_doubleSpinBox.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.fee_doubleSpinBox.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.fee_doubleSpinBox.setMaximum(3000.0)
self.fee_doubleSpinBox.setSingleStep(1.0)
self.fee_doubleSpinBox.setObjectName(_fromUtf8("fee_doubleSpinBox"))
self.gridLayout.addWidget(self.fee_doubleSpinBox, 4, 3, 1, 1)
- spacerItem = QtGui.QSpacerItem(20, 50, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 50,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem, 5, 2, 1, 1)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout.addWidget(self.buttonBox, 6, 1, 1, 3)
self.description_lineEdit = QtGui.QLineEdit(Dialog)
self.description_lineEdit.setMaxLength(50)
- self.description_lineEdit.setObjectName(_fromUtf8("description_lineEdit"))
+ self.description_lineEdit.setObjectName(
+ _fromUtf8("description_lineEdit"))
self.gridLayout.addWidget(self.description_lineEdit, 1, 0, 1, 4)
self.label_2 = QtGui.QLabel(Dialog)
- self.label_2.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+ self.label_2.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1)
self.label.setBuddy(self.number_spinBox)
@@ -61,8 +74,14 @@ class Ui_Dialog(object):
self.label_2.setBuddy(self.description_lineEdit)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
Dialog.setTabOrder(self.number_spinBox, self.fee_doubleSpinBox)
Dialog.setTabOrder(self.fee_doubleSpinBox, self.buttonBox)
@@ -84,4 +103,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py b/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py
index 1fff0fa..76f68bc 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/daylist_print.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(376, 486)
@@ -27,10 +29,13 @@ class Ui_Dialog(object):
self.verticalLayout = QtGui.QVBoxLayout(Dialog)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.label_2 = QtGui.QLabel(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.label_2.sizePolicy().hasHeightForWidth())
self.label_2.setSizePolicy(sizePolicy)
self.label_2.setMaximumSize(QtCore.QSize(16777215, 100))
font = QtGui.QFont()
@@ -43,19 +48,25 @@ class Ui_Dialog(object):
self.gridLayout = QtGui.QGridLayout()
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.label_3 = QtGui.QLabel(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.label_3.sizePolicy().hasHeightForWidth())
self.label_3.setSizePolicy(sizePolicy)
self.label_3.setAlignment(QtCore.Qt.AlignCenter)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.gridLayout.addWidget(self.label_3, 0, 0, 1, 1)
self.label_4 = QtGui.QLabel(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label_4.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.label_4.sizePolicy().hasHeightForWidth())
self.label_4.setSizePolicy(sizePolicy)
self.label_4.setAlignment(QtCore.Qt.AlignCenter)
self.label_4.setObjectName(_fromUtf8("label_4"))
@@ -70,49 +81,66 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.end_dateEdit, 1, 1, 1, 1)
self.verticalLayout.addLayout(self.gridLayout)
self.scrollArea = QtGui.QScrollArea(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.scrollArea.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.scrollArea.sizePolicy().hasHeightForWidth())
self.scrollArea.setSizePolicy(sizePolicy)
self.scrollArea.setMinimumSize(QtCore.QSize(0, 200))
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
self.scrollAreaWidgetContents = QtGui.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 354, 196))
- self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
+ self.scrollAreaWidgetContents.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents"))
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.verticalLayout.addWidget(self.scrollArea)
self.allOnePage_radioButton = QtGui.QRadioButton(Dialog)
self.allOnePage_radioButton.setChecked(True)
- self.allOnePage_radioButton.setObjectName(_fromUtf8("allOnePage_radioButton"))
+ self.allOnePage_radioButton.setObjectName(
+ _fromUtf8("allOnePage_radioButton"))
self.verticalLayout.addWidget(self.allOnePage_radioButton)
self.onePageMin_radioButton = QtGui.QRadioButton(Dialog)
self.onePageMin_radioButton.setChecked(False)
- self.onePageMin_radioButton.setObjectName(_fromUtf8("onePageMin_radioButton"))
+ self.onePageMin_radioButton.setObjectName(
+ _fromUtf8("onePageMin_radioButton"))
self.verticalLayout.addWidget(self.onePageMin_radioButton)
self.onePageFull_radioButton = QtGui.QRadioButton(Dialog)
- self.onePageFull_radioButton.setObjectName(_fromUtf8("onePageFull_radioButton"))
+ self.onePageFull_radioButton.setObjectName(
+ _fromUtf8("onePageFull_radioButton"))
self.verticalLayout.addWidget(self.onePageFull_radioButton)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_("Daylist Printing Wizard"))
- self.label_2.setText(_("Specify Dates and Practitioners for a Daylist Print Run"))
+ self.label_2.setText(
+ _("Specify Dates and Practitioners for a Daylist Print Run"))
self.label_3.setText(_("Start Date"))
self.label_4.setText(_("End Date"))
self.allOnePage_radioButton.setText(_("All Practioners on One Page"))
- self.onePageMin_radioButton.setText(_("One Practitioner Per Page - Minimal"))
- self.onePageFull_radioButton.setText(_("One Practioner Per Page - Fill Page"))
+ self.onePageMin_radioButton.setText(
+ _("One Practitioner Per Page - Minimal"))
+ self.onePageFull_radioButton.setText(
+ _("One Practioner Per Page - Fill Page"))
if __name__ == "__main__":
@@ -125,4 +153,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py b/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py
index 5ebef37..5a8ff33 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/diary_widget.ui'
@@ -17,16 +18,20 @@ except AttributeError:
class Ui_Form(object):
+
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(732, 551)
self.horizontalLayout = QtGui.QHBoxLayout(Form)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.diary_tabWidget = QtGui.QTabWidget(Form)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.diary_tabWidget.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.diary_tabWidget.sizePolicy().hasHeightForWidth())
self.diary_tabWidget.setSizePolicy(sizePolicy)
self.diary_tabWidget.setObjectName(_fromUtf8("diary_tabWidget"))
self.tab_dayview = QtGui.QWidget()
@@ -48,10 +53,13 @@ class Ui_Form(object):
self.verticalLayout_19.setMargin(3)
self.verticalLayout_19.setObjectName(_fromUtf8("verticalLayout_19"))
self.dayCalendar_frame = QtGui.QWidget(self.frame_18)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.dayCalendar_frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.dayCalendar_frame.sizePolicy().hasHeightForWidth())
self.dayCalendar_frame.setSizePolicy(sizePolicy)
self.dayCalendar_frame.setMinimumSize(QtCore.QSize(200, 180))
self.dayCalendar_frame.setMaximumSize(QtCore.QSize(16777215, 200))
@@ -61,29 +69,39 @@ class Ui_Form(object):
self.goTodayPushButton.setEnabled(False)
self.goTodayPushButton.setMaximumSize(QtCore.QSize(16777215, 24))
icon = QtGui.QIcon()
- icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/agt_reload.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/agt_reload.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.goTodayPushButton.setIcon(icon)
self.goTodayPushButton.setObjectName(_fromUtf8("goTodayPushButton"))
self.verticalLayout_19.addWidget(self.goTodayPushButton)
self.day_view_control_frame = QtGui.QFrame(self.frame_18)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.day_view_control_frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.day_view_control_frame.sizePolicy().hasHeightForWidth())
self.day_view_control_frame.setSizePolicy(sizePolicy)
self.day_view_control_frame.setFrameShape(QtGui.QFrame.NoFrame)
self.day_view_control_frame.setFrameShadow(QtGui.QFrame.Plain)
self.day_view_control_frame.setLineWidth(0)
- self.day_view_control_frame.setObjectName(_fromUtf8("day_view_control_frame"))
+ self.day_view_control_frame.setObjectName(
+ _fromUtf8("day_view_control_frame"))
self.verticalLayout_19.addWidget(self.day_view_control_frame)
self.horizontalLayout_3.addWidget(self.frame_18)
self.gridLayout_2 = QtGui.QGridLayout()
self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
self.dayView_splitter = QtGui.QSplitter(self.tab_dayview)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.dayView_splitter.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.dayView_splitter.sizePolicy().hasHeightForWidth())
self.dayView_splitter.setSizePolicy(sizePolicy)
self.dayView_splitter.setMinimumSize(QtCore.QSize(0, 300))
self.dayView_splitter.setOrientation(QtCore.Qt.Horizontal)
@@ -91,8 +109,14 @@ class Ui_Form(object):
self.gridLayout_2.addWidget(self.dayView_splitter, 1, 0, 1, 1)
self.emergency_dayview_scroll_bar = QtGui.QScrollBar(self.tab_dayview)
self.emergency_dayview_scroll_bar.setOrientation(QtCore.Qt.Vertical)
- self.emergency_dayview_scroll_bar.setObjectName(_fromUtf8("emergency_dayview_scroll_bar"))
- self.gridLayout_2.addWidget(self.emergency_dayview_scroll_bar, 1, 1, 1, 1)
+ self.emergency_dayview_scroll_bar.setObjectName(
+ _fromUtf8("emergency_dayview_scroll_bar"))
+ self.gridLayout_2.addWidget(
+ self.emergency_dayview_scroll_bar,
+ 1,
+ 1,
+ 1,
+ 1)
self.appt_notes_webView = QtWebKit.QWebView(self.tab_dayview)
self.appt_notes_webView.setMinimumSize(QtCore.QSize(0, 150))
self.appt_notes_webView.setMaximumSize(QtCore.QSize(16777215, 200))
@@ -100,10 +124,15 @@ class Ui_Form(object):
self.appt_notes_webView.setObjectName(_fromUtf8("appt_notes_webView"))
self.gridLayout_2.addWidget(self.appt_notes_webView, 2, 0, 1, 2)
self.daymemo_label = QtGui.QLabel(self.tab_dayview)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.daymemo_label.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.daymemo_label.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.daymemo_label.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setPointSize(12)
@@ -132,10 +161,15 @@ class Ui_Form(object):
self.verticalLayout_3.setMargin(3)
self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
self.weekCalendar_frame = QtGui.QWidget(self.frame_8)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.weekCalendar_frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.weekCalendar_frame.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.weekCalendar_frame.setSizePolicy(sizePolicy)
self.weekCalendar_frame.setMinimumSize(QtCore.QSize(30, 180))
self.weekCalendar_frame.setMaximumSize(QtCore.QSize(16777215, 200))
@@ -143,27 +177,36 @@ class Ui_Form(object):
self.verticalLayout_3.addWidget(self.weekCalendar_frame)
self.goto_current_week_PushButton = QtGui.QPushButton(self.frame_8)
self.goto_current_week_PushButton.setEnabled(False)
- self.goto_current_week_PushButton.setMaximumSize(QtCore.QSize(16777215, 24))
+ self.goto_current_week_PushButton.setMaximumSize(
+ QtCore.QSize(16777215, 24))
self.goto_current_week_PushButton.setIcon(icon)
- self.goto_current_week_PushButton.setObjectName(_fromUtf8("goto_current_week_PushButton"))
+ self.goto_current_week_PushButton.setObjectName(
+ _fromUtf8("goto_current_week_PushButton"))
self.verticalLayout_3.addWidget(self.goto_current_week_PushButton)
self.week_view_control_frame = QtGui.QFrame(self.frame_8)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.week_view_control_frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.week_view_control_frame.sizePolicy().hasHeightForWidth())
self.week_view_control_frame.setSizePolicy(sizePolicy)
self.week_view_control_frame.setFrameShape(QtGui.QFrame.NoFrame)
self.week_view_control_frame.setFrameShadow(QtGui.QFrame.Plain)
self.week_view_control_frame.setLineWidth(0)
- self.week_view_control_frame.setObjectName(_fromUtf8("week_view_control_frame"))
+ self.week_view_control_frame.setObjectName(
+ _fromUtf8("week_view_control_frame"))
self.verticalLayout_3.addWidget(self.week_view_control_frame)
self.gridLayout_11.addWidget(self.frame_8, 0, 0, 2, 1)
self.weekView_splitter = QtGui.QSplitter(self.tab_weekview)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.weekView_splitter.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.weekView_splitter.sizePolicy().hasHeightForWidth())
self.weekView_splitter.setSizePolicy(sizePolicy)
self.weekView_splitter.setOrientation(QtCore.Qt.Horizontal)
self.weekView_splitter.setObjectName(_fromUtf8("weekView_splitter"))
@@ -203,50 +246,69 @@ class Ui_Form(object):
self.day5_frame.setObjectName(_fromUtf8("day5_frame"))
self.gridLayout.addWidget(self.day5_frame, 0, 4, 1, 1)
self.appt_OV_Frame1 = QtGui.QFrame(self.layoutWidget)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.appt_OV_Frame1.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.appt_OV_Frame1.sizePolicy().hasHeightForWidth())
self.appt_OV_Frame1.setSizePolicy(sizePolicy)
self.appt_OV_Frame1.setFrameShape(QtGui.QFrame.StyledPanel)
self.appt_OV_Frame1.setFrameShadow(QtGui.QFrame.Sunken)
self.appt_OV_Frame1.setObjectName(_fromUtf8("appt_OV_Frame1"))
self.gridLayout.addWidget(self.appt_OV_Frame1, 1, 0, 1, 1)
self.appt_OV_Frame2 = QtGui.QFrame(self.layoutWidget)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.appt_OV_Frame2.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.appt_OV_Frame2.sizePolicy().hasHeightForWidth())
self.appt_OV_Frame2.setSizePolicy(sizePolicy)
self.appt_OV_Frame2.setFrameShape(QtGui.QFrame.StyledPanel)
self.appt_OV_Frame2.setFrameShadow(QtGui.QFrame.Sunken)
self.appt_OV_Frame2.setObjectName(_fromUtf8("appt_OV_Frame2"))
self.gridLayout.addWidget(self.appt_OV_Frame2, 1, 1, 1, 1)
self.appt_OV_Frame3 = QtGui.QFrame(self.layoutWidget)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.appt_OV_Frame3.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.appt_OV_Frame3.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.appt_OV_Frame3.setSizePolicy(sizePolicy)
self.appt_OV_Frame3.setFrameShape(QtGui.QFrame.StyledPanel)
self.appt_OV_Frame3.setFrameShadow(QtGui.QFrame.Sunken)
self.appt_OV_Frame3.setObjectName(_fromUtf8("appt_OV_Frame3"))
self.gridLayout.addWidget(self.appt_OV_Frame3, 1, 2, 1, 1)
self.appt_OV_Frame4 = QtGui.QFrame(self.layoutWidget)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.appt_OV_Frame4.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.appt_OV_Frame4.sizePolicy().hasHeightForWidth())
self.appt_OV_Frame4.setSizePolicy(sizePolicy)
self.appt_OV_Frame4.setFrameShape(QtGui.QFrame.StyledPanel)
self.appt_OV_Frame4.setFrameShadow(QtGui.QFrame.Sunken)
self.appt_OV_Frame4.setObjectName(_fromUtf8("appt_OV_Frame4"))
self.gridLayout.addWidget(self.appt_OV_Frame4, 1, 3, 1, 1)
self.appt_OV_Frame5 = QtGui.QFrame(self.layoutWidget)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.appt_OV_Frame5.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.appt_OV_Frame5.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.appt_OV_Frame5.setSizePolicy(sizePolicy)
self.appt_OV_Frame5.setFrameShape(QtGui.QFrame.StyledPanel)
self.appt_OV_Frame5.setFrameShadow(QtGui.QFrame.Sunken)
@@ -258,10 +320,13 @@ class Ui_Form(object):
self.verticalLayout_23.setMargin(0)
self.verticalLayout_23.setObjectName(_fromUtf8("verticalLayout_23"))
self.day6_frame = QtGui.QFrame(self.layoutWidget_2)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.day6_frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.day6_frame.sizePolicy().hasHeightForWidth())
self.day6_frame.setSizePolicy(sizePolicy)
self.day6_frame.setMinimumSize(QtCore.QSize(0, 40))
self.day6_frame.setFrameShape(QtGui.QFrame.StyledPanel)
@@ -269,20 +334,28 @@ class Ui_Form(object):
self.day6_frame.setObjectName(_fromUtf8("day6_frame"))
self.verticalLayout_23.addWidget(self.day6_frame)
self.appt_OV_Frame6 = QtGui.QFrame(self.layoutWidget_2)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.appt_OV_Frame6.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.appt_OV_Frame6.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.appt_OV_Frame6.setSizePolicy(sizePolicy)
self.appt_OV_Frame6.setFrameShape(QtGui.QFrame.StyledPanel)
self.appt_OV_Frame6.setFrameShadow(QtGui.QFrame.Sunken)
self.appt_OV_Frame6.setObjectName(_fromUtf8("appt_OV_Frame6"))
self.verticalLayout_23.addWidget(self.appt_OV_Frame6)
self.day7_frame = QtGui.QFrame(self.layoutWidget_2)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.day7_frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.day7_frame.sizePolicy().hasHeightForWidth())
self.day7_frame.setSizePolicy(sizePolicy)
self.day7_frame.setMinimumSize(QtCore.QSize(0, 40))
self.day7_frame.setFrameShape(QtGui.QFrame.StyledPanel)
@@ -290,10 +363,13 @@ class Ui_Form(object):
self.day7_frame.setObjectName(_fromUtf8("day7_frame"))
self.verticalLayout_23.addWidget(self.day7_frame)
self.appt_OV_Frame7 = QtGui.QFrame(self.layoutWidget_2)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.appt_OV_Frame7.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.appt_OV_Frame7.sizePolicy().hasHeightForWidth())
self.appt_OV_Frame7.setSizePolicy(sizePolicy)
self.appt_OV_Frame7.setFrameShape(QtGui.QFrame.StyledPanel)
self.appt_OV_Frame7.setFrameShadow(QtGui.QFrame.Sunken)
@@ -308,21 +384,32 @@ class Ui_Form(object):
self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
self.monthView_scrollArea = QtGui.QScrollArea(self.tab_monthview)
self.monthView_scrollArea.setWidgetResizable(True)
- self.monthView_scrollArea.setObjectName(_fromUtf8("monthView_scrollArea"))
+ self.monthView_scrollArea.setObjectName(
+ _fromUtf8("monthView_scrollArea"))
self.scrollAreaWidgetContents_14 = QtGui.QWidget()
- self.scrollAreaWidgetContents_14.setGeometry(QtCore.QRect(0, 0, 702, 456))
- self.scrollAreaWidgetContents_14.setObjectName(_fromUtf8("scrollAreaWidgetContents_14"))
+ self.scrollAreaWidgetContents_14.setGeometry(
+ QtCore.QRect(0, 0, 702, 456))
+ self.scrollAreaWidgetContents_14.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_14"))
self.monthView_scrollArea.setWidget(self.scrollAreaWidgetContents_14)
self.gridLayout_5.addWidget(self.monthView_scrollArea, 0, 0, 1, 4)
self.horizontalLayout_22 = QtGui.QHBoxLayout()
- self.horizontalLayout_22.setObjectName(_fromUtf8("horizontalLayout_22"))
- spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ self.horizontalLayout_22.setObjectName(
+ _fromUtf8("horizontalLayout_22"))
+ spacerItem = QtGui.QSpacerItem(
+ 40,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.horizontalLayout_22.addItem(spacerItem)
self.aptOVprevmonth = QtGui.QPushButton(self.tab_monthview)
self.aptOVprevmonth.setMaximumSize(QtCore.QSize(28, 20))
self.aptOVprevmonth.setText(_fromUtf8(""))
icon1 = QtGui.QIcon()
- icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/back.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon1.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/back.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.aptOVprevmonth.setIcon(icon1)
self.aptOVprevmonth.setObjectName(_fromUtf8("aptOVprevmonth"))
self.horizontalLayout_22.addWidget(self.aptOVprevmonth)
@@ -335,26 +422,45 @@ class Ui_Form(object):
self.aptOVnextmonth.setMaximumSize(QtCore.QSize(28, 20))
self.aptOVnextmonth.setText(_fromUtf8(""))
icon2 = QtGui.QIcon()
- icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/forward.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon2.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/forward.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.aptOVnextmonth.setIcon(icon2)
self.aptOVnextmonth.setObjectName(_fromUtf8("aptOVnextmonth"))
self.horizontalLayout_22.addWidget(self.aptOVnextmonth)
- spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem1 = QtGui.QSpacerItem(
+ 40,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.horizontalLayout_22.addItem(spacerItem1)
self.gridLayout_5.addLayout(self.horizontalLayout_22, 1, 2, 1, 1)
self.printMonth_pushButton = QtGui.QPushButton(self.tab_monthview)
icon3 = QtGui.QIcon()
- icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/ps.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon3.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/ps.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.printMonth_pushButton.setIcon(icon3)
- self.printMonth_pushButton.setObjectName(_fromUtf8("printMonth_pushButton"))
+ self.printMonth_pushButton.setObjectName(
+ _fromUtf8("printMonth_pushButton"))
self.gridLayout_5.addWidget(self.printMonth_pushButton, 1, 3, 1, 1)
self.monthClinicians_checkBox = QtGui.QCheckBox(self.tab_monthview)
self.monthClinicians_checkBox.setChecked(True)
- self.monthClinicians_checkBox.setObjectName(_fromUtf8("monthClinicians_checkBox"))
+ self.monthClinicians_checkBox.setObjectName(
+ _fromUtf8("monthClinicians_checkBox"))
self.gridLayout_5.addWidget(self.monthClinicians_checkBox, 1, 0, 1, 1)
- self.monthView_clinicians_pushButton = QtGui.QPushButton(self.tab_monthview)
- self.monthView_clinicians_pushButton.setObjectName(_fromUtf8("monthView_clinicians_pushButton"))
- self.gridLayout_5.addWidget(self.monthView_clinicians_pushButton, 1, 1, 1, 1)
+ self.monthView_clinicians_pushButton = QtGui.QPushButton(
+ self.tab_monthview)
+ self.monthView_clinicians_pushButton.setObjectName(
+ _fromUtf8("monthView_clinicians_pushButton"))
+ self.gridLayout_5.addWidget(
+ self.monthView_clinicians_pushButton,
+ 1,
+ 1,
+ 1,
+ 1)
self.diary_tabWidget.addTab(self.tab_monthview, _fromUtf8(""))
self.tab_yearview = QtGui.QWidget()
self.tab_yearview.setObjectName(_fromUtf8("tab_yearview"))
@@ -366,10 +472,13 @@ class Ui_Form(object):
self.year_textBrowser.setObjectName(_fromUtf8("year_textBrowser"))
self.gridLayout_22.addWidget(self.year_textBrowser, 0, 0, 1, 3)
self.yearView_frame = QtGui.QFrame(self.tab_yearview)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.yearView_frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.yearView_frame.sizePolicy().hasHeightForWidth())
self.yearView_frame.setSizePolicy(sizePolicy)
self.yearView_frame.setFrameShape(QtGui.QFrame.StyledPanel)
self.yearView_frame.setFrameShadow(QtGui.QFrame.Raised)
@@ -377,14 +486,26 @@ class Ui_Form(object):
self.gridLayout_22.addWidget(self.yearView_frame, 1, 0, 1, 3)
self.yearClinicians_checkBox = QtGui.QCheckBox(self.tab_yearview)
self.yearClinicians_checkBox.setChecked(True)
- self.yearClinicians_checkBox.setObjectName(_fromUtf8("yearClinicians_checkBox"))
+ self.yearClinicians_checkBox.setObjectName(
+ _fromUtf8("yearClinicians_checkBox"))
self.gridLayout_22.addWidget(self.yearClinicians_checkBox, 2, 0, 1, 1)
- self.yearView_clinicians_pushButton = QtGui.QPushButton(self.tab_yearview)
- self.yearView_clinicians_pushButton.setObjectName(_fromUtf8("yearView_clinicians_pushButton"))
- self.gridLayout_22.addWidget(self.yearView_clinicians_pushButton, 2, 1, 1, 1)
+ self.yearView_clinicians_pushButton = QtGui.QPushButton(
+ self.tab_yearview)
+ self.yearView_clinicians_pushButton.setObjectName(
+ _fromUtf8("yearView_clinicians_pushButton"))
+ self.gridLayout_22.addWidget(
+ self.yearView_clinicians_pushButton,
+ 2,
+ 1,
+ 1,
+ 1)
self.horizontalLayout_2 = QtGui.QHBoxLayout()
self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
- spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem2 = QtGui.QSpacerItem(
+ 40,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.horizontalLayout_2.addItem(spacerItem2)
self.aptOVprevyear = QtGui.QPushButton(self.tab_yearview)
self.aptOVprevyear.setMaximumSize(QtCore.QSize(28, 20))
@@ -403,7 +524,11 @@ class Ui_Form(object):
self.aptOVnextyear.setIcon(icon2)
self.aptOVnextyear.setObjectName(_fromUtf8("aptOVnextyear"))
self.horizontalLayout_2.addWidget(self.aptOVnextyear)
- spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem3 = QtGui.QSpacerItem(
+ 40,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.horizontalLayout_2.addItem(spacerItem3)
self.gridLayout_22.addLayout(self.horizontalLayout_2, 2, 2, 1, 1)
self.diary_tabWidget.addTab(self.tab_yearview, _fromUtf8(""))
@@ -414,15 +539,24 @@ class Ui_Form(object):
self.gridLayout_agenda.setSpacing(3)
self.gridLayout_agenda.setObjectName(_fromUtf8("gridLayout_agenda"))
self.agenda_calendar_frame = QtGui.QWidget(self.tab_agenda)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.agenda_calendar_frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.agenda_calendar_frame.sizePolicy().hasHeightForWidth())
self.agenda_calendar_frame.setSizePolicy(sizePolicy)
self.agenda_calendar_frame.setMinimumSize(QtCore.QSize(220, 180))
self.agenda_calendar_frame.setMaximumSize(QtCore.QSize(220, 200))
- self.agenda_calendar_frame.setObjectName(_fromUtf8("agenda_calendar_frame"))
- self.gridLayout_agenda.addWidget(self.agenda_calendar_frame, 0, 0, 1, 1)
+ self.agenda_calendar_frame.setObjectName(
+ _fromUtf8("agenda_calendar_frame"))
+ self.gridLayout_agenda.addWidget(
+ self.agenda_calendar_frame,
+ 0,
+ 0,
+ 1,
+ 1)
self.agenda_frame = QtGui.QFrame(self.tab_agenda)
self.agenda_frame.setFrameShape(QtGui.QFrame.StyledPanel)
self.agenda_frame.setFrameShadow(QtGui.QFrame.Raised)
@@ -433,20 +567,30 @@ class Ui_Form(object):
self.agenda_goTodayPushButton.setMinimumSize(QtCore.QSize(220, 0))
self.agenda_goTodayPushButton.setMaximumSize(QtCore.QSize(220, 24))
self.agenda_goTodayPushButton.setIcon(icon)
- self.agenda_goTodayPushButton.setObjectName(_fromUtf8("agenda_goTodayPushButton"))
- self.gridLayout_agenda.addWidget(self.agenda_goTodayPushButton, 1, 0, 1, 1)
+ self.agenda_goTodayPushButton.setObjectName(
+ _fromUtf8("agenda_goTodayPushButton"))
+ self.gridLayout_agenda.addWidget(
+ self.agenda_goTodayPushButton,
+ 1,
+ 0,
+ 1,
+ 1)
self.agenda_control_frame = QtGui.QFrame(self.tab_agenda)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.agenda_control_frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.agenda_control_frame.sizePolicy().hasHeightForWidth())
self.agenda_control_frame.setSizePolicy(sizePolicy)
self.agenda_control_frame.setMinimumSize(QtCore.QSize(220, 0))
self.agenda_control_frame.setMaximumSize(QtCore.QSize(220, 16777215))
self.agenda_control_frame.setFrameShape(QtGui.QFrame.NoFrame)
self.agenda_control_frame.setFrameShadow(QtGui.QFrame.Plain)
self.agenda_control_frame.setLineWidth(0)
- self.agenda_control_frame.setObjectName(_fromUtf8("agenda_control_frame"))
+ self.agenda_control_frame.setObjectName(
+ _fromUtf8("agenda_control_frame"))
self.gridLayout_agenda.addWidget(self.agenda_control_frame, 2, 0, 1, 1)
self.diary_tabWidget.addTab(self.tab_agenda, _fromUtf8(""))
self.horizontalLayout.addWidget(self.diary_tabWidget)
@@ -459,20 +603,30 @@ class Ui_Form(object):
Form.setWindowTitle(_("Form"))
self.goTodayPushButton.setText(_("Go To Today"))
self.daymemo_label.setText(_("TextLabel"))
- self.diary_tabWidget.setTabText(self.diary_tabWidget.indexOf(self.tab_dayview), _("Day View"))
+ self.diary_tabWidget.setTabText(
+ self.diary_tabWidget.indexOf(self.tab_dayview),
+ _("Day View"))
self.goto_current_week_PushButton.setText(_("View Current Week"))
- self.diary_tabWidget.setTabText(self.diary_tabWidget.indexOf(self.tab_weekview), _("Week View"))
+ self.diary_tabWidget.setTabText(
+ self.diary_tabWidget.indexOf(self.tab_weekview),
+ _("Week View"))
self.label_65.setText(_("Month"))
self.printMonth_pushButton.setText(_("Print Month View"))
self.monthClinicians_checkBox.setText(_("All Clinicians"))
self.monthView_clinicians_pushButton.setText(_("Select Clinicians"))
- self.diary_tabWidget.setTabText(self.diary_tabWidget.indexOf(self.tab_monthview), _("Month View"))
+ self.diary_tabWidget.setTabText(
+ self.diary_tabWidget.indexOf(self.tab_monthview),
+ _("Month View"))
self.yearClinicians_checkBox.setText(_("All Clinicians"))
self.yearView_clinicians_pushButton.setText(_("Select Clinicians"))
self.label_64.setText(_("Year"))
- self.diary_tabWidget.setTabText(self.diary_tabWidget.indexOf(self.tab_yearview), _("Year View"))
+ self.diary_tabWidget.setTabText(
+ self.diary_tabWidget.indexOf(self.tab_yearview),
+ _("Year View"))
self.agenda_goTodayPushButton.setText(_("Go To Today"))
- self.diary_tabWidget.setTabText(self.diary_tabWidget.indexOf(self.tab_agenda), _("Agenda"))
+ self.diary_tabWidget.setTabText(
+ self.diary_tabWidget.indexOf(self.tab_agenda),
+ _("Agenda"))
from PyQt4 import QtWebKit
from openmolar.qt4gui import resources_rc
@@ -487,4 +641,3 @@ if __name__ == "__main__":
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py b/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py
index 56dc0de..9cf34ca 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/editmemos.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(417, 395)
@@ -47,19 +49,27 @@ class Ui_Dialog(object):
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
self.scrollAreaWidgetContents = QtGui.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 399, 238))
- self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
+ self.scrollAreaWidgetContents.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents"))
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.gridLayout.addWidget(self.scrollArea, 3, 0, 1, 3)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout.addWidget(self.buttonBox, 4, 2, 1, 1)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -78,4 +88,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_enter_letter_text.py b/src/openmolar/qt4gui/compiled_uis/Ui_enter_letter_text.py
index bf4c637..95cd4b2 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_enter_letter_text.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_enter_letter_text.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/enter_letter_text.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.setWindowModality(QtCore.Qt.NonModal)
@@ -32,18 +34,26 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.textEdit, 1, 0, 1, 1)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Save)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout.addWidget(self.buttonBox, 2, 0, 1, 1)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_("Letter Text Entry"))
- self.label.setText(_("<b>Please enter the body text for your letter here.</b>"))
+ self.label.setText(
+ _("<b>Please enter the body text for your letter here.</b>"))
if __name__ == "__main__":
@@ -56,4 +66,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py b/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py
index 9ee50be..7682c2c 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/exam_wizard.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(333, 272)
@@ -65,18 +67,29 @@ class Ui_Dialog(object):
self.dents_comboBox = QtGui.QComboBox(Dialog)
self.dents_comboBox.setObjectName(_fromUtf8("dents_comboBox"))
self.gridLayout.addWidget(self.dents_comboBox, 4, 1, 1, 1)
- spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem, 5, 1, 1, 1)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout.addWidget(self.buttonBox, 6, 0, 1, 2)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -99,4 +112,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py b/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py
index ef5db22..308fe19 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/finalise_appt_time.ui'
@@ -17,13 +18,15 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(321, 159)
self.gridLayout = QtGui.QGridLayout(Dialog)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.label = QtGui.QLabel(Dialog)
- self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.minutesB4label = QtGui.QLabel(Dialog)
@@ -41,7 +44,8 @@ class Ui_Dialog(object):
self.verticalSlider.setObjectName(_fromUtf8("verticalSlider"))
self.gridLayout.addWidget(self.verticalSlider, 0, 2, 3, 1)
self.label_3 = QtGui.QLabel(Dialog)
- self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_3.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
self.apptTimelabel = QtGui.QLabel(Dialog)
@@ -49,7 +53,8 @@ class Ui_Dialog(object):
self.apptTimelabel.setObjectName(_fromUtf8("apptTimelabel"))
self.gridLayout.addWidget(self.apptTimelabel, 1, 1, 1, 1)
self.label_2 = QtGui.QLabel(Dialog)
- self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_2.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
self.minutesL8Rlabel = QtGui.QLabel(Dialog)
@@ -58,13 +63,20 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.minutesL8Rlabel, 2, 1, 1, 1)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout.addWidget(self.buttonBox, 3, 0, 1, 3)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -87,4 +99,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py b/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py
index 2b55786..f9db4eb 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/forumPost.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(502, 253)
@@ -27,14 +29,16 @@ class Ui_Dialog(object):
font.setBold(True)
font.setWeight(75)
self.label_3.setFont(font)
- self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_3.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.gridLayout.addWidget(self.label_3, 0, 0, 1, 1)
self.topic_lineEdit = QtGui.QLineEdit(Dialog)
self.topic_lineEdit.setObjectName(_fromUtf8("topic_lineEdit"))
self.gridLayout.addWidget(self.topic_lineEdit, 0, 1, 1, 3)
self.label_4 = QtGui.QLabel(Dialog)
- self.label_4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_4.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_4.setObjectName(_fromUtf8("label_4"))
self.gridLayout.addWidget(self.label_4, 1, 2, 1, 1)
self.to_comboBox = QtGui.QComboBox(Dialog)
@@ -46,7 +50,8 @@ class Ui_Dialog(object):
font.setBold(True)
font.setWeight(75)
self.label.setFont(font)
- self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout.addWidget(self.label, 2, 0, 1, 1)
self.comment_textEdit = QtGui.QTextEdit(Dialog)
@@ -55,12 +60,14 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.comment_textEdit, 2, 1, 2, 3)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Save)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout.addWidget(self.buttonBox, 4, 0, 1, 4)
self.count_label = QtGui.QLabel(Dialog)
- self.count_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.count_label.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.count_label.setWordWrap(True)
self.count_label.setObjectName(_fromUtf8("count_label"))
self.gridLayout.addWidget(self.count_label, 3, 0, 1, 1)
@@ -69,7 +76,8 @@ class Ui_Dialog(object):
font.setBold(True)
font.setWeight(75)
self.label_2.setFont(font)
- self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_2.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
self.from_comboBox = QtGui.QComboBox(Dialog)
@@ -78,8 +86,14 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.from_comboBox, 1, 1, 1, 1)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -101,4 +115,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py b/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py
index 311188b..13b5615 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/hygenist_wizard.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(339, 350)
@@ -52,7 +54,11 @@ class Ui_Dialog(object):
self.extsp_radioButton.setChecked(False)
self.extsp_radioButton.setObjectName(_fromUtf8("extsp_radioButton"))
self.verticalLayout.addWidget(self.extsp_radioButton)
- spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem)
self.verticalLayout_3.addWidget(self.groupBox)
self.clinicianGroupBox = QtGui.QGroupBox(Dialog)
@@ -60,7 +66,11 @@ class Ui_Dialog(object):
self.clinicianGroupBox.setObjectName(_fromUtf8("clinicianGroupBox"))
self.horizontalLayout = QtGui.QHBoxLayout(self.clinicianGroupBox)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
- spacerItem1 = QtGui.QSpacerItem(89, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem1 = QtGui.QSpacerItem(
+ 89,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.dents_comboBox = QtGui.QComboBox(self.clinicianGroupBox)
self.dents_comboBox.setMinimumSize(QtCore.QSize(100, 0))
@@ -71,21 +81,36 @@ class Ui_Dialog(object):
self.dents_comboBox.setFont(font)
self.dents_comboBox.setObjectName(_fromUtf8("dents_comboBox"))
self.horizontalLayout.addWidget(self.dents_comboBox)
- spacerItem2 = QtGui.QSpacerItem(88, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem2 = QtGui.QSpacerItem(
+ 88,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem2)
self.verticalLayout_3.addWidget(self.clinicianGroupBox)
- spacerItem3 = QtGui.QSpacerItem(20, 29, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem3 = QtGui.QSpacerItem(
+ 20,
+ 29,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.verticalLayout_3.addItem(spacerItem3)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout_3.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -110,4 +135,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py b/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py
index 301bdfb..1f60996 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/initialise.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_MainWindow(object):
+
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(800, 507)
@@ -35,7 +37,8 @@ class Ui_MainWindow(object):
self.gridLayout_3.addWidget(self.label_17, 0, 0, 1, 2)
self.modifydb_radioButton = QtGui.QRadioButton(self.tab_8)
self.modifydb_radioButton.setEnabled(False)
- self.modifydb_radioButton.setObjectName(_fromUtf8("modifydb_radioButton"))
+ self.modifydb_radioButton.setObjectName(
+ _fromUtf8("modifydb_radioButton"))
self.gridLayout_3.addWidget(self.modifydb_radioButton, 4, 0, 1, 1)
self.comboBox = QtGui.QComboBox(self.tab_8)
self.comboBox.setEnabled(False)
@@ -46,16 +49,27 @@ class Ui_MainWindow(object):
self.line.setFrameShadow(QtGui.QFrame.Sunken)
self.line.setObjectName(_fromUtf8("line"))
self.gridLayout_3.addWidget(self.line, 5, 0, 1, 3)
- spacerItem = QtGui.QSpacerItem(20, 407, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 407,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_3.addItem(spacerItem, 6, 1, 1, 1)
self.blankdb_radioButton = QtGui.QRadioButton(self.tab_8)
self.blankdb_radioButton.setChecked(True)
- self.blankdb_radioButton.setObjectName(_fromUtf8("blankdb_radioButton"))
+ self.blankdb_radioButton.setObjectName(
+ _fromUtf8("blankdb_radioButton"))
self.gridLayout_3.addWidget(self.blankdb_radioButton, 2, 0, 1, 1)
self.newdb_template_radioButton = QtGui.QRadioButton(self.tab_8)
self.newdb_template_radioButton.setChecked(False)
- self.newdb_template_radioButton.setObjectName(_fromUtf8("newdb_template_radioButton"))
- self.gridLayout_3.addWidget(self.newdb_template_radioButton, 3, 0, 1, 1)
+ self.newdb_template_radioButton.setObjectName(
+ _fromUtf8("newdb_template_radioButton"))
+ self.gridLayout_3.addWidget(
+ self.newdb_template_radioButton,
+ 3,
+ 0,
+ 1,
+ 1)
self.tabWidget.addTab(self.tab_8, _fromUtf8(""))
self.tab = QtGui.QWidget()
self.tab.setObjectName(_fromUtf8("tab"))
@@ -177,7 +191,11 @@ class Ui_MainWindow(object):
self.label_20.setObjectName(_fromUtf8("label_20"))
self.gridLayout.addWidget(self.label_20, 10, 2, 1, 1)
self.verticalLayout_3.addWidget(self.practice_frame)
- spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem1 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.verticalLayout_3.addItem(spacerItem1)
self.tabWidget.addTab(self.tab, _fromUtf8(""))
self.tab_2 = QtGui.QWidget()
@@ -189,8 +207,10 @@ class Ui_MainWindow(object):
self.verticalLayout_2.addWidget(self.label_12)
self.users_tableWidget = QtGui.QTableWidget(self.tab_2)
self.users_tableWidget.setAlternatingRowColors(True)
- self.users_tableWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
- self.users_tableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ self.users_tableWidget.setSelectionMode(
+ QtGui.QAbstractItemView.SingleSelection)
+ self.users_tableWidget.setSelectionBehavior(
+ QtGui.QAbstractItemView.SelectRows)
self.users_tableWidget.setObjectName(_fromUtf8("users_tableWidget"))
self.users_tableWidget.setColumnCount(6)
self.users_tableWidget.setRowCount(0)
@@ -216,7 +236,8 @@ class Ui_MainWindow(object):
self.verticalLayout_11 = QtGui.QVBoxLayout()
self.verticalLayout_11.setObjectName(_fromUtf8("verticalLayout_11"))
self.modifyUser_pushButton = QtGui.QPushButton(self.frame_2)
- self.modifyUser_pushButton.setObjectName(_fromUtf8("modifyUser_pushButton"))
+ self.modifyUser_pushButton.setObjectName(
+ _fromUtf8("modifyUser_pushButton"))
self.verticalLayout_11.addWidget(self.modifyUser_pushButton)
self.horizontalLayout.addLayout(self.verticalLayout_11)
self.user_groupBox = QtGui.QGroupBox(self.frame_2)
@@ -248,7 +269,8 @@ class Ui_MainWindow(object):
self.userActive_checkBox = QtGui.QCheckBox(self.user_groupBox)
self.userActive_checkBox.setLayoutDirection(QtCore.Qt.RightToLeft)
self.userActive_checkBox.setChecked(True)
- self.userActive_checkBox.setObjectName(_fromUtf8("userActive_checkBox"))
+ self.userActive_checkBox.setObjectName(
+ _fromUtf8("userActive_checkBox"))
self.gridLayout_8.addWidget(self.userActive_checkBox, 2, 2, 1, 1)
self.user_date_label = QtGui.QLabel(self.user_groupBox)
self.user_date_label.setObjectName(_fromUtf8("user_date_label"))
@@ -480,9 +502,11 @@ class Ui_MainWindow(object):
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.actionLoad_Template = QtGui.QAction(MainWindow)
- self.actionLoad_Template.setObjectName(_fromUtf8("actionLoad_Template"))
+ self.actionLoad_Template.setObjectName(
+ _fromUtf8("actionLoad_Template"))
self.action_Save_Template = QtGui.QAction(MainWindow)
- self.action_Save_Template.setObjectName(_fromUtf8("action_Save_Template"))
+ self.action_Save_Template.setObjectName(
+ _fromUtf8("action_Save_Template"))
self.menuFile.addAction(self.actionLoad_Template)
self.menuFile.addAction(self.action_Save_Template)
self.menubar.addAction(self.menuFile.menuAction())
@@ -494,10 +518,15 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_("OpenMolar - database wizard"))
self.label_17.setText(_("What do you want to do?"))
- self.modifydb_radioButton.setText(_("Modify an existing openmolar database"))
- self.blankdb_radioButton.setText(_("Create a New database from scratch"))
- self.newdb_template_radioButton.setText(_("Create a New database (from a known template)"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_8), _("Start"))
+ self.modifydb_radioButton.setText(
+ _("Modify an existing openmolar database"))
+ self.blankdb_radioButton.setText(
+ _("Create a New database from scratch"))
+ self.newdb_template_radioButton.setText(
+ _("Create a New database (from a known template)"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_8),
+ _("Start"))
self.label.setText(_("Practice Name"))
self.label_18.setText(_("Used in receipts, appointment cards etc."))
self.label_2.setText(_("Address Line 1"))
@@ -510,8 +539,11 @@ class Ui_MainWindow(object):
self.label_9.setText(_("Fax"))
self.label_10.setText(_("Website"))
self.label_11.setText(_("Email"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _("Practice Details"))
- self.label_12.setText(_("The Following users can login to the application"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab),
+ _("Practice Details"))
+ self.label_12.setText(
+ _("The Following users can login to the application"))
item = self.users_tableWidget.horizontalHeaderItem(0)
item.setText(_("Id"))
item = self.users_tableWidget.horizontalHeaderItem(1)
@@ -536,9 +568,11 @@ class Ui_MainWindow(object):
self.userActive_checkBox.setText(_("Active User"))
self.user_date_label.setText(_("DeActivation Date"))
self.newUser_pushButton.setText(_("Add a New User"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _("Users"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_2),
+ _("Users"))
self.label_33.setText(_("The Following dentists have notes in this database\n"
-"(note - dentists should not be removed from the database, as this could create lookup issues for cashbooks and notes) "))
+ "(note - dentists should not be removed from the database, as this could create lookup issues for cashbooks and notes) "))
item = self.tableWidget_2.horizontalHeaderItem(0)
item.setText(_("Initials"))
item = self.tableWidget_2.horizontalHeaderItem(1)
@@ -552,9 +586,11 @@ class Ui_MainWindow(object):
self.label_31.setText(_("Name"))
self.label_45.setText(_("Registration"))
self.checkBox_2.setText(_("Active Appointment Book"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _("Dentists"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_3),
+ _("Dentists"))
self.label_38.setText(_("The Following hygienists have notes in this database\n"
-"(note - hygienists should not be removed from the database, as this could create lookup issues for cashbooks and notes) "))
+ "(note - hygienists should not be removed from the database, as this could create lookup issues for cashbooks and notes) "))
item = self.tableWidget_3.horizontalHeaderItem(0)
item.setText(_("Initials"))
item = self.tableWidget_3.horizontalHeaderItem(1)
@@ -568,7 +604,9 @@ class Ui_MainWindow(object):
self.label_35.setText(_("Name"))
self.label_46.setText(_("Registration"))
self.checkBox_3.setText(_("Active Appointment Book"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _("Hygienists"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_4),
+ _("Hygienists"))
self.checkBox_7.setText(_("Monday"))
self.checkBox_8.setText(_("Tuesday"))
self.checkBox_9.setText(_("Wednesday"))
@@ -576,8 +614,12 @@ class Ui_MainWindow(object):
self.checkBox_11.setText(_("Friday"))
self.checkBox_12.setText(_("Saturday"))
self.checkBox_13.setText(_("Sunday"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_5), _("Practice Hours"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_7), _("View XML"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_5),
+ _("Practice Hours"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_7),
+ _("View XML"))
self.menuFile.setTitle(_("File"))
self.actionLoad_Template.setText(_("L&oad Template"))
self.action_Save_Template.setText(_("&Save Template"))
@@ -593,4 +635,3 @@ if __name__ == "__main__":
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_main.py b/src/openmolar/qt4gui/compiled_uis/Ui_main.py
index df65668..8141858 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_main.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_main.py
@@ -1,8 +1,9 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/main.ui'
#
-# Created: Wed Mar 26 16:50:07 2014
+# Created: Thu May 1 15:04:57 2014
# by: PyQt4 UI code generator 4.10.3
#
# WARNING! All changes made in this file will be lost!
@@ -17,19 +18,26 @@ except AttributeError:
class Ui_MainWindow(object):
+
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(964, 631)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setMaximumSize(QtCore.QSize(16777215, 16777215))
font = QtGui.QFont()
MainWindow.setFont(font)
icon = QtGui.QIcon()
- icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/openmolar.svg")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/openmolar.svg")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
MainWindow.setStyleSheet(_fromUtf8(""))
MainWindow.setDockNestingEnabled(False)
@@ -45,13 +53,17 @@ class Ui_MainWindow(object):
self.scrollArea_main.setWidgetResizable(True)
self.scrollArea_main.setObjectName(_fromUtf8("scrollArea_main"))
self.scrollAreaWidgetContents_12 = QtGui.QWidget()
- self.scrollAreaWidgetContents_12.setGeometry(QtCore.QRect(0, 0, 964, 592))
- self.scrollAreaWidgetContents_12.setObjectName(_fromUtf8("scrollAreaWidgetContents_12"))
- self.horizontalLayout_7 = QtGui.QHBoxLayout(self.scrollAreaWidgetContents_12)
+ self.scrollAreaWidgetContents_12.setGeometry(
+ QtCore.QRect(0, 0, 964, 592))
+ self.scrollAreaWidgetContents_12.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_12"))
+ self.horizontalLayout_7 = QtGui.QHBoxLayout(
+ self.scrollAreaWidgetContents_12)
self.horizontalLayout_7.setSpacing(0)
self.horizontalLayout_7.setMargin(0)
self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7"))
- self.main_tabWidget = QtGui.QTabWidget(self.scrollAreaWidgetContents_12)
+ self.main_tabWidget = QtGui.QTabWidget(
+ self.scrollAreaWidgetContents_12)
self.main_tabWidget.setTabPosition(QtGui.QTabWidget.North)
self.main_tabWidget.setTabShape(QtGui.QTabWidget.Rounded)
self.main_tabWidget.setDocumentMode(False)
@@ -60,12 +72,18 @@ class Ui_MainWindow(object):
self.tab_patient.setObjectName(_fromUtf8("tab_patient"))
self.horizontalLayout_24 = QtGui.QHBoxLayout(self.tab_patient)
self.horizontalLayout_24.setMargin(6)
- self.horizontalLayout_24.setObjectName(_fromUtf8("horizontalLayout_24"))
+ self.horizontalLayout_24.setObjectName(
+ _fromUtf8("horizontalLayout_24"))
self.details_frame = QtGui.QFrame(self.tab_patient)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.details_frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.details_frame.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.details_frame.setSizePolicy(sizePolicy)
self.details_frame.setMinimumSize(QtCore.QSize(180, 16))
self.details_frame.setMaximumSize(QtCore.QSize(200, 16777215))
@@ -89,36 +107,54 @@ class Ui_MainWindow(object):
self.home_pushButton.setMaximumSize(QtCore.QSize(32, 28))
self.home_pushButton.setText(_fromUtf8(""))
icon1 = QtGui.QIcon()
- icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/kfm_home.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon1.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/kfm_home.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.home_pushButton.setIcon(icon1)
self.home_pushButton.setIconSize(QtCore.QSize(32, 24))
self.home_pushButton.setObjectName(_fromUtf8("home_pushButton"))
self.horizontalLayout_3.addWidget(self.home_pushButton)
self.newPatientPushButton = QtGui.QPushButton(self.frame_15)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.newPatientPushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.newPatientPushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.newPatientPushButton.setSizePolicy(sizePolicy)
self.newPatientPushButton.setMinimumSize(QtCore.QSize(32, 0))
self.newPatientPushButton.setMaximumSize(QtCore.QSize(32, 28))
self.newPatientPushButton.setText(_fromUtf8(""))
icon2 = QtGui.QIcon()
- icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/add_user.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon2.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/add_user.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.newPatientPushButton.setIcon(icon2)
self.newPatientPushButton.setIconSize(QtCore.QSize(32, 16))
- self.newPatientPushButton.setObjectName(_fromUtf8("newPatientPushButton"))
+ self.newPatientPushButton.setObjectName(
+ _fromUtf8("newPatientPushButton"))
self.horizontalLayout_3.addWidget(self.newPatientPushButton)
self.findButton = QtGui.QPushButton(self.frame_15)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.findButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.findButton.sizePolicy().hasHeightForWidth())
self.findButton.setSizePolicy(sizePolicy)
self.findButton.setMinimumSize(QtCore.QSize(80, 28))
self.findButton.setMaximumSize(QtCore.QSize(16777215, 28))
icon3 = QtGui.QIcon()
- icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/search.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon3.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/search.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.findButton.setIcon(icon3)
self.findButton.setIconSize(QtCore.QSize(24, 24))
self.findButton.setObjectName(_fromUtf8("findButton"))
@@ -133,42 +169,60 @@ class Ui_MainWindow(object):
self.horizontalLayout.setMargin(0)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.backButton = QtGui.QPushButton(self.frame_16)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.backButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.backButton.sizePolicy().hasHeightForWidth())
self.backButton.setSizePolicy(sizePolicy)
self.backButton.setMaximumSize(QtCore.QSize(24, 28))
self.backButton.setText(_fromUtf8(""))
icon4 = QtGui.QIcon()
- icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/back.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon4.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/back.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.backButton.setIcon(icon4)
self.backButton.setIconSize(QtCore.QSize(32, 16))
self.backButton.setObjectName(_fromUtf8("backButton"))
self.horizontalLayout.addWidget(self.backButton)
self.reloadButton = QtGui.QPushButton(self.frame_16)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.reloadButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.reloadButton.sizePolicy().hasHeightForWidth())
self.reloadButton.setSizePolicy(sizePolicy)
self.reloadButton.setMaximumSize(QtCore.QSize(24, 28))
self.reloadButton.setText(_fromUtf8(""))
icon5 = QtGui.QIcon()
- icon5.addPixmap(QtGui.QPixmap(_fromUtf8(":/agt_reload.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon5.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/agt_reload.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.reloadButton.setIcon(icon5)
self.reloadButton.setObjectName(_fromUtf8("reloadButton"))
self.horizontalLayout.addWidget(self.reloadButton)
self.nextButton = QtGui.QPushButton(self.frame_16)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.nextButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.nextButton.sizePolicy().hasHeightForWidth())
self.nextButton.setSizePolicy(sizePolicy)
self.nextButton.setMaximumSize(QtCore.QSize(24, 28))
self.nextButton.setText(_fromUtf8(""))
icon6 = QtGui.QIcon()
- icon6.addPixmap(QtGui.QPixmap(_fromUtf8(":/forward.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon6.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/forward.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.nextButton.setIcon(icon6)
self.nextButton.setIconSize(QtCore.QSize(32, 16))
self.nextButton.setObjectName(_fromUtf8("nextButton"))
@@ -176,26 +230,37 @@ class Ui_MainWindow(object):
self.relatedpts_pushButton = QtGui.QPushButton(self.frame_16)
self.relatedpts_pushButton.setMinimumSize(QtCore.QSize(60, 28))
icon7 = QtGui.QIcon()
- icon7.addPixmap(QtGui.QPixmap(_fromUtf8(":/agt_family.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon7.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/agt_family.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.relatedpts_pushButton.setIcon(icon7)
- self.relatedpts_pushButton.setObjectName(_fromUtf8("relatedpts_pushButton"))
+ self.relatedpts_pushButton.setObjectName(
+ _fromUtf8("relatedpts_pushButton"))
self.horizontalLayout.addWidget(self.relatedpts_pushButton)
self.verticalLayout.addWidget(self.frame_16)
self.dayList_comboBox = QtGui.QComboBox(self.details_frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.dayList_comboBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.dayList_comboBox.sizePolicy().hasHeightForWidth())
self.dayList_comboBox.setSizePolicy(sizePolicy)
self.dayList_comboBox.setMaxVisibleItems(40)
- self.dayList_comboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContentsOnFirstShow)
+ self.dayList_comboBox.setSizeAdjustPolicy(
+ QtGui.QComboBox.AdjustToContentsOnFirstShow)
self.dayList_comboBox.setObjectName(_fromUtf8("dayList_comboBox"))
self.verticalLayout.addWidget(self.dayList_comboBox)
self.detailsBrowser = QtGui.QTextBrowser(self.details_frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Fixed,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.detailsBrowser.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.detailsBrowser.sizePolicy().hasHeightForWidth())
self.detailsBrowser.setSizePolicy(sizePolicy)
self.detailsBrowser.setObjectName(_fromUtf8("detailsBrowser"))
self.verticalLayout.addWidget(self.detailsBrowser)
@@ -207,7 +272,8 @@ class Ui_MainWindow(object):
self.tabWidget = QtGui.QTabWidget(self.splitter_patient)
self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
self.tab_patient_details = QtGui.QWidget()
- self.tab_patient_details.setObjectName(_fromUtf8("tab_patient_details"))
+ self.tab_patient_details.setObjectName(
+ _fromUtf8("tab_patient_details"))
self.horizontalLayout_2 = QtGui.QHBoxLayout(self.tab_patient_details)
self.horizontalLayout_2.setSpacing(0)
self.horizontalLayout_2.setMargin(0)
@@ -216,41 +282,55 @@ class Ui_MainWindow(object):
self.scrollArea_4.setWidgetResizable(True)
self.scrollArea_4.setObjectName(_fromUtf8("scrollArea_4"))
self.scrollAreaWidgetContents_7 = QtGui.QWidget()
- self.scrollAreaWidgetContents_7.setGeometry(QtCore.QRect(0, 0, 469, 462))
- self.scrollAreaWidgetContents_7.setObjectName(_fromUtf8("scrollAreaWidgetContents_7"))
- self.verticalLayout_6 = QtGui.QVBoxLayout(self.scrollAreaWidgetContents_7)
+ self.scrollAreaWidgetContents_7.setGeometry(
+ QtCore.QRect(0, 0, 469, 644))
+ self.scrollAreaWidgetContents_7.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_7"))
+ self.verticalLayout_6 = QtGui.QVBoxLayout(
+ self.scrollAreaWidgetContents_7)
self.verticalLayout_6.setObjectName(_fromUtf8("verticalLayout_6"))
- self.patientEdit_groupBox = QtGui.QGroupBox(self.scrollAreaWidgetContents_7)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+ self.patientEdit_groupBox = QtGui.QGroupBox(
+ self.scrollAreaWidgetContents_7)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.patientEdit_groupBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.patientEdit_groupBox.sizePolicy().hasHeightForWidth())
self.patientEdit_groupBox.setSizePolicy(sizePolicy)
- self.patientEdit_groupBox.setObjectName(_fromUtf8("patientEdit_groupBox"))
+ self.patientEdit_groupBox.setObjectName(
+ _fromUtf8("patientEdit_groupBox"))
self.gridLayout_2 = QtGui.QGridLayout(self.patientEdit_groupBox)
self.gridLayout_2.setMargin(6)
self.gridLayout_2.setVerticalSpacing(3)
self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
self.label_18 = QtGui.QLabel(self.patientEdit_groupBox)
- self.label_18.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_18.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_18.setObjectName(_fromUtf8("label_18"))
self.gridLayout_2.addWidget(self.label_18, 3, 0, 1, 1)
self.label_9 = QtGui.QLabel(self.patientEdit_groupBox)
- self.label_9.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_9.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_9.setObjectName(_fromUtf8("label_9"))
self.gridLayout_2.addWidget(self.label_9, 6, 0, 1, 1)
self.pushButton_6 = QtGui.QPushButton(self.patientEdit_groupBox)
self.pushButton_6.setEnabled(False)
self.pushButton_6.setMaximumSize(QtCore.QSize(60, 16777215))
icon8 = QtGui.QIcon()
- icon8.addPixmap(QtGui.QPixmap(_fromUtf8(":/button_ok.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon8.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/button_ok.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.pushButton_6.setIcon(icon8)
self.pushButton_6.setIconSize(QtCore.QSize(8, 8))
self.pushButton_6.setObjectName(_fromUtf8("pushButton_6"))
self.gridLayout_2.addWidget(self.pushButton_6, 2, 7, 1, 1)
self.label_23 = QtGui.QLabel(self.patientEdit_groupBox)
self.label_23.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.label_23.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_23.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_23.setObjectName(_fromUtf8("label_23"))
self.gridLayout_2.addWidget(self.label_23, 5, 4, 1, 1)
self.dobEdit = QtGui.QDateEdit(self.patientEdit_groupBox)
@@ -259,11 +339,13 @@ class Ui_MainWindow(object):
self.gridLayout_2.addWidget(self.dobEdit, 3, 1, 1, 3)
self.label_15 = QtGui.QLabel(self.patientEdit_groupBox)
self.label_15.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.label_15.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_15.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_15.setObjectName(_fromUtf8("label_15"))
self.gridLayout_2.addWidget(self.label_15, 3, 4, 1, 1)
self.label_10 = QtGui.QLabel(self.patientEdit_groupBox)
- self.label_10.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_10.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_10.setObjectName(_fromUtf8("label_10"))
self.gridLayout_2.addWidget(self.label_10, 7, 0, 1, 1)
self.townEdit = QtGui.QLineEdit(self.patientEdit_groupBox)
@@ -272,33 +354,42 @@ class Ui_MainWindow(object):
self.townEdit.setObjectName(_fromUtf8("townEdit"))
self.gridLayout_2.addWidget(self.townEdit, 7, 1, 1, 3)
self.label_55 = QtGui.QLabel(self.patientEdit_groupBox)
- self.label_55.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_55.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_55.setObjectName(_fromUtf8("label_55"))
self.gridLayout_2.addWidget(self.label_55, 7, 4, 3, 1)
self.memoEdit = QtGui.QTextEdit(self.patientEdit_groupBox)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.memoEdit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.memoEdit.sizePolicy().hasHeightForWidth())
self.memoEdit.setSizePolicy(sizePolicy)
self.memoEdit.setMaximumSize(QtCore.QSize(16777215, 100))
self.memoEdit.setAcceptRichText(False)
self.memoEdit.setObjectName(_fromUtf8("memoEdit"))
self.gridLayout_2.addWidget(self.memoEdit, 7, 5, 3, 3)
self.label_19 = QtGui.QLabel(self.patientEdit_groupBox)
- self.label_19.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_19.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_19.setObjectName(_fromUtf8("label_19"))
self.gridLayout_2.addWidget(self.label_19, 8, 0, 1, 1)
self.label_16 = QtGui.QLabel(self.patientEdit_groupBox)
self.label_16.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.label_16.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_16.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_16.setObjectName(_fromUtf8("label_16"))
self.gridLayout_2.addWidget(self.label_16, 4, 4, 1, 1)
self.email1Edit = QtGui.QLineEdit(self.patientEdit_groupBox)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.email1Edit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.email1Edit.sizePolicy().hasHeightForWidth())
self.email1Edit.setSizePolicy(sizePolicy)
self.email1Edit.setMinimumSize(QtCore.QSize(150, 0))
self.email1Edit.setMaximumSize(QtCore.QSize(16777215, 100))
@@ -319,25 +410,33 @@ class Ui_MainWindow(object):
self.gridLayout_2.addWidget(self.addr3Edit, 6, 1, 1, 3)
self.label_25 = QtGui.QLabel(self.patientEdit_groupBox)
self.label_25.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.label_25.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_25.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_25.setObjectName(_fromUtf8("label_25"))
self.gridLayout_2.addWidget(self.label_25, 6, 4, 1, 1)
self.occupationEdit = QtGui.QLineEdit(self.patientEdit_groupBox)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.occupationEdit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.occupationEdit.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.occupationEdit.setSizePolicy(sizePolicy)
self.occupationEdit.setMaximumSize(QtCore.QSize(16777215, 100))
self.occupationEdit.setMaxLength(30)
self.occupationEdit.setObjectName(_fromUtf8("occupationEdit"))
self.gridLayout_2.addWidget(self.occupationEdit, 6, 5, 1, 3)
self.label = QtGui.QLabel(self.patientEdit_groupBox)
- self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
self.label_3 = QtGui.QLabel(self.patientEdit_groupBox)
- self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_3.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1)
self.snameEdit = QtGui.QLineEdit(self.patientEdit_groupBox)
@@ -348,11 +447,13 @@ class Ui_MainWindow(object):
self.gridLayout_2.addWidget(self.snameEdit, 2, 1, 1, 3)
self.label_14 = QtGui.QLabel(self.patientEdit_groupBox)
self.label_14.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.label_14.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_14.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_14.setObjectName(_fromUtf8("label_14"))
self.gridLayout_2.addWidget(self.label_14, 2, 4, 1, 1)
self.label_5 = QtGui.QLabel(self.patientEdit_groupBox)
- self.label_5.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_5.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_5.setObjectName(_fromUtf8("label_5"))
self.gridLayout_2.addWidget(self.label_5, 5, 0, 1, 1)
self.addr2Edit = QtGui.QLineEdit(self.patientEdit_groupBox)
@@ -361,10 +462,13 @@ class Ui_MainWindow(object):
self.addr2Edit.setObjectName(_fromUtf8("addr2Edit"))
self.gridLayout_2.addWidget(self.addr2Edit, 5, 1, 1, 3)
self.email2Edit = QtGui.QLineEdit(self.patientEdit_groupBox)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.email2Edit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.email2Edit.sizePolicy().hasHeightForWidth())
self.email2Edit.setSizePolicy(sizePolicy)
self.email2Edit.setMinimumSize(QtCore.QSize(150, 0))
self.email2Edit.setMaximumSize(QtCore.QSize(16777215, 100))
@@ -385,7 +489,8 @@ class Ui_MainWindow(object):
self.gridLayout_2.addWidget(self.titleEdit, 0, 1, 1, 1)
self.label_17 = QtGui.QLabel(self.patientEdit_groupBox)
self.label_17.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.label_17.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_17.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_17.setObjectName(_fromUtf8("label_17"))
self.gridLayout_2.addWidget(self.label_17, 0, 2, 1, 1)
self.sexEdit = QtGui.QComboBox(self.patientEdit_groupBox)
@@ -401,12 +506,14 @@ class Ui_MainWindow(object):
self.countyEdit.setObjectName(_fromUtf8("countyEdit"))
self.gridLayout_2.addWidget(self.countyEdit, 8, 1, 1, 3)
self.label_6 = QtGui.QLabel(self.patientEdit_groupBox)
- self.label_6.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_6.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_6.setObjectName(_fromUtf8("label_6"))
self.gridLayout_2.addWidget(self.label_6, 9, 0, 1, 1)
self.label_12 = QtGui.QLabel(self.patientEdit_groupBox)
self.label_12.setMaximumSize(QtCore.QSize(16777215, 25))
- self.label_12.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_12.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_12.setObjectName(_fromUtf8("label_12"))
self.gridLayout_2.addWidget(self.label_12, 0, 4, 1, 1)
self.pushButton = QtGui.QPushButton(self.patientEdit_groupBox)
@@ -417,7 +524,8 @@ class Ui_MainWindow(object):
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.gridLayout_2.addWidget(self.pushButton, 3, 7, 1, 1)
self.label_4 = QtGui.QLabel(self.patientEdit_groupBox)
- self.label_4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_4.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_4.setObjectName(_fromUtf8("label_4"))
self.gridLayout_2.addWidget(self.label_4, 4, 0, 1, 1)
self.addr1Edit = QtGui.QLineEdit(self.patientEdit_groupBox)
@@ -431,7 +539,8 @@ class Ui_MainWindow(object):
self.pcdeEdit.setObjectName(_fromUtf8("pcdeEdit"))
self.gridLayout_2.addWidget(self.pcdeEdit, 9, 1, 1, 3)
self.label_2 = QtGui.QLabel(self.patientEdit_groupBox)
- self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_2.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.gridLayout_2.addWidget(self.label_2, 1, 0, 1, 1)
self.fnameEdit = QtGui.QLineEdit(self.patientEdit_groupBox)
@@ -442,64 +551,152 @@ class Ui_MainWindow(object):
self.gridLayout_2.addWidget(self.fnameEdit, 1, 1, 1, 3)
self.label_13 = QtGui.QLabel(self.patientEdit_groupBox)
self.label_13.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.label_13.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_13.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_13.setObjectName(_fromUtf8("label_13"))
self.gridLayout_2.addWidget(self.label_13, 1, 4, 1, 1)
self.tel1Edit = QtGui.QLineEdit(self.patientEdit_groupBox)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.tel1Edit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.tel1Edit.sizePolicy().hasHeightForWidth())
self.tel1Edit.setSizePolicy(sizePolicy)
self.tel1Edit.setMaximumSize(QtCore.QSize(16777215, 100))
self.tel1Edit.setMaxLength(30)
self.tel1Edit.setObjectName(_fromUtf8("tel1Edit"))
self.gridLayout_2.addWidget(self.tel1Edit, 0, 5, 1, 2)
self.faxEdit = QtGui.QLineEdit(self.patientEdit_groupBox)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.faxEdit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.faxEdit.sizePolicy().hasHeightForWidth())
self.faxEdit.setSizePolicy(sizePolicy)
self.faxEdit.setMaximumSize(QtCore.QSize(16777215, 100))
self.faxEdit.setMaxLength(30)
self.faxEdit.setObjectName(_fromUtf8("faxEdit"))
self.gridLayout_2.addWidget(self.faxEdit, 3, 5, 1, 2)
self.mobileEdit = QtGui.QLineEdit(self.patientEdit_groupBox)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.mobileEdit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.mobileEdit.sizePolicy().hasHeightForWidth())
self.mobileEdit.setSizePolicy(sizePolicy)
self.mobileEdit.setMaximumSize(QtCore.QSize(16777215, 100))
self.mobileEdit.setMaxLength(30)
self.mobileEdit.setObjectName(_fromUtf8("mobileEdit"))
self.gridLayout_2.addWidget(self.mobileEdit, 2, 5, 1, 2)
self.tel2Edit = QtGui.QLineEdit(self.patientEdit_groupBox)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.tel2Edit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.tel2Edit.sizePolicy().hasHeightForWidth())
self.tel2Edit.setSizePolicy(sizePolicy)
self.tel2Edit.setMaximumSize(QtCore.QSize(16777215, 100))
self.tel2Edit.setMaxLength(30)
self.tel2Edit.setObjectName(_fromUtf8("tel2Edit"))
self.gridLayout_2.addWidget(self.tel2Edit, 1, 5, 1, 2)
- self.highlighted_fields_label = QtGui.QLabel(self.patientEdit_groupBox)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.highlighted_fields_label.sizePolicy().hasHeightForWidth())
+ self.verticalLayout_6.addWidget(self.patientEdit_groupBox)
+ self.new_patient_frame = QtGui.QFrame(self.scrollAreaWidgetContents_7)
+ self.new_patient_frame.setFrameShape(QtGui.QFrame.NoFrame)
+ self.new_patient_frame.setFrameShadow(QtGui.QFrame.Raised)
+ self.new_patient_frame.setObjectName(_fromUtf8("new_patient_frame"))
+ self.gridLayout_12 = QtGui.QGridLayout(self.new_patient_frame)
+ self.gridLayout_12.setObjectName(_fromUtf8("gridLayout_12"))
+ self.abort_new_patient_pushButton = QtGui.QPushButton(
+ self.new_patient_frame)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(
+ self.abort_new_patient_pushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
+ self.abort_new_patient_pushButton.setSizePolicy(sizePolicy)
+ self.abort_new_patient_pushButton.setMinimumSize(QtCore.QSize(0, 100))
+ icon = QtGui.QIcon.fromTheme(_fromUtf8("window-close"))
+ self.abort_new_patient_pushButton.setIcon(icon)
+ self.abort_new_patient_pushButton.setObjectName(
+ _fromUtf8("abort_new_patient_pushButton"))
+ self.gridLayout_12.addWidget(
+ self.abort_new_patient_pushButton,
+ 2,
+ 0,
+ 1,
+ 1)
+ self.highlighted_fields_label = QtGui.QLabel(self.new_patient_frame)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(
+ self.highlighted_fields_label.sizePolicy().hasHeightForWidth())
self.highlighted_fields_label.setSizePolicy(sizePolicy)
self.highlighted_fields_label.setAlignment(QtCore.Qt.AlignCenter)
- self.highlighted_fields_label.setObjectName(_fromUtf8("highlighted_fields_label"))
- self.gridLayout_2.addWidget(self.highlighted_fields_label, 10, 0, 1, 8)
- self.verticalLayout_6.addWidget(self.patientEdit_groupBox)
+ self.highlighted_fields_label.setObjectName(
+ _fromUtf8("highlighted_fields_label"))
+ self.gridLayout_12.addWidget(self.highlighted_fields_label, 0, 0, 1, 3)
+ self.save_new_patient_pushButton = QtGui.QPushButton(
+ self.new_patient_frame)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(
+ self.save_new_patient_pushButton.sizePolicy().hasHeightForWidth())
+ self.save_new_patient_pushButton.setSizePolicy(sizePolicy)
+ self.save_new_patient_pushButton.setMinimumSize(QtCore.QSize(0, 100))
+ self.save_new_patient_pushButton.setToolTip(_fromUtf8(""))
+ icon9 = QtGui.QIcon()
+ icon9.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/save_all.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
+ self.save_new_patient_pushButton.setIcon(icon9)
+ self.save_new_patient_pushButton.setObjectName(
+ _fromUtf8("save_new_patient_pushButton"))
+ self.gridLayout_12.addWidget(
+ self.save_new_patient_pushButton,
+ 2,
+ 2,
+ 1,
+ 1)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.gridLayout_12.addItem(spacerItem, 1, 0, 1, 1)
+ spacerItem1 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.gridLayout_12.addItem(spacerItem1, 3, 0, 1, 3)
+ self.verticalLayout_6.addWidget(self.new_patient_frame)
self.family_groupBox = QtGui.QGroupBox(self.scrollAreaWidgetContents_7)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.family_groupBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.family_groupBox.sizePolicy().hasHeightForWidth())
self.family_groupBox.setSizePolicy(sizePolicy)
self.family_groupBox.setObjectName(_fromUtf8("family_groupBox"))
self.gridLayout_11 = QtGui.QGridLayout(self.family_groupBox)
@@ -515,14 +712,22 @@ class Ui_MainWindow(object):
self.family_group_label.setObjectName(_fromUtf8("family_group_label"))
self.gridLayout_11.addWidget(self.family_group_label, 1, 0, 1, 1)
self.auto_address_button = QtGui.QPushButton(self.family_groupBox)
- self.auto_address_button.setObjectName(_fromUtf8("auto_address_button"))
+ self.auto_address_button.setObjectName(
+ _fromUtf8("auto_address_button"))
self.gridLayout_11.addWidget(self.auto_address_button, 2, 0, 1, 2)
+ spacerItem2 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.gridLayout_11.addItem(spacerItem2, 3, 0, 1, 1)
self.verticalLayout_6.addWidget(self.family_groupBox)
self.scrollArea_4.setWidget(self.scrollAreaWidgetContents_7)
self.horizontalLayout_2.addWidget(self.scrollArea_4)
self.tabWidget.addTab(self.tab_patient_details, _fromUtf8(""))
self.tab_patient_contract = QtGui.QWidget()
- self.tab_patient_contract.setObjectName(_fromUtf8("tab_patient_contract"))
+ self.tab_patient_contract.setObjectName(
+ _fromUtf8("tab_patient_contract"))
self.gridLayout_13 = QtGui.QGridLayout(self.tab_patient_contract)
self.gridLayout_13.setObjectName(_fromUtf8("gridLayout_13"))
self.label_21 = QtGui.QLabel(self.tab_patient_contract)
@@ -533,15 +738,20 @@ class Ui_MainWindow(object):
self.dnt1comboBox.setObjectName(_fromUtf8("dnt1comboBox"))
self.gridLayout_13.addWidget(self.dnt1comboBox, 0, 2, 1, 1)
self.contractType_label = QtGui.QLabel(self.tab_patient_contract)
- self.contractType_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.contractType_label.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.contractType_label.setObjectName(_fromUtf8("contractType_label"))
self.gridLayout_13.addWidget(self.contractType_label, 0, 3, 1, 1)
self.cseType_comboBox = QtGui.QComboBox(self.tab_patient_contract)
self.cseType_comboBox.setMaximumSize(QtCore.QSize(50, 16777215))
self.cseType_comboBox.setObjectName(_fromUtf8("cseType_comboBox"))
self.gridLayout_13.addWidget(self.cseType_comboBox, 0, 4, 1, 1)
- spacerItem = QtGui.QSpacerItem(368, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
- self.gridLayout_13.addItem(spacerItem, 0, 5, 1, 1)
+ spacerItem3 = QtGui.QSpacerItem(
+ 368,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
+ self.gridLayout_13.addItem(spacerItem3, 0, 5, 1, 1)
self.frame_19 = QtGui.QFrame(self.tab_patient_contract)
self.frame_19.setFrameShape(QtGui.QFrame.StyledPanel)
self.frame_19.setFrameShadow(QtGui.QFrame.Raised)
@@ -554,8 +764,12 @@ class Ui_MainWindow(object):
self.status_comboBox = QtGui.QComboBox(self.frame_19)
self.status_comboBox.setObjectName(_fromUtf8("status_comboBox"))
self.verticalLayout_17.addWidget(self.status_comboBox)
- spacerItem1 = QtGui.QSpacerItem(20, 242, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_17.addItem(spacerItem1)
+ spacerItem4 = QtGui.QSpacerItem(
+ 20,
+ 242,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_17.addItem(spacerItem4)
self.badDebt_pushButton = QtGui.QPushButton(self.frame_19)
self.badDebt_pushButton.setEnabled(False)
self.badDebt_pushButton.setObjectName(_fromUtf8("badDebt_pushButton"))
@@ -570,7 +784,8 @@ class Ui_MainWindow(object):
self.contractHDP_label_2 = QtGui.QLabel(self.tab_18)
self.contractHDP_label_2.setAlignment(QtCore.Qt.AlignCenter)
self.contractHDP_label_2.setWordWrap(True)
- self.contractHDP_label_2.setObjectName(_fromUtf8("contractHDP_label_2"))
+ self.contractHDP_label_2.setObjectName(
+ _fromUtf8("contractHDP_label_2"))
self.gridLayout_26.addWidget(self.contractHDP_label_2, 0, 0, 2, 1)
self.label_38 = QtGui.QLabel(self.tab_18)
self.label_38.setText(_fromUtf8(""))
@@ -578,11 +793,16 @@ class Ui_MainWindow(object):
self.label_38.setAlignment(QtCore.Qt.AlignCenter)
self.label_38.setObjectName(_fromUtf8("label_38"))
self.gridLayout_26.addWidget(self.label_38, 0, 1, 1, 1)
- spacerItem2 = QtGui.QSpacerItem(147, 281, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.gridLayout_26.addItem(spacerItem2, 1, 1, 1, 1)
+ spacerItem5 = QtGui.QSpacerItem(
+ 147,
+ 281,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.gridLayout_26.addItem(spacerItem5, 1, 1, 1, 1)
self.editPriv_pushButton = QtGui.QPushButton(self.tab_18)
self.editPriv_pushButton.setMaximumSize(QtCore.QSize(150, 16777215))
- self.editPriv_pushButton.setObjectName(_fromUtf8("editPriv_pushButton"))
+ self.editPriv_pushButton.setObjectName(
+ _fromUtf8("editPriv_pushButton"))
self.gridLayout_26.addWidget(self.editPriv_pushButton, 2, 1, 1, 1)
self.contract_tabWidget.addTab(self.tab_18, _fromUtf8(""))
self.tab_19 = QtGui.QWidget()
@@ -594,8 +814,12 @@ class Ui_MainWindow(object):
self.contractHDP_label.setWordWrap(True)
self.contractHDP_label.setObjectName(_fromUtf8("contractHDP_label"))
self.gridLayout_25.addWidget(self.contractHDP_label, 0, 0, 2, 1)
- spacerItem3 = QtGui.QSpacerItem(108, 162, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.gridLayout_25.addItem(spacerItem3, 1, 1, 1, 1)
+ spacerItem6 = QtGui.QSpacerItem(
+ 108,
+ 162,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.gridLayout_25.addItem(spacerItem6, 1, 1, 1, 1)
self.editHDP_pushButton = QtGui.QPushButton(self.tab_19)
self.editHDP_pushButton.setMaximumSize(QtCore.QSize(150, 16777215))
self.editHDP_pushButton.setObjectName(_fromUtf8("editHDP_pushButton"))
@@ -626,10 +850,15 @@ class Ui_MainWindow(object):
self.label_8.setObjectName(_fromUtf8("label_8"))
self.verticalLayout_26.addWidget(self.label_8)
self.nhsclaims_pushButton = QtGui.QPushButton(self.tab_20)
- self.nhsclaims_pushButton.setObjectName(_fromUtf8("nhsclaims_pushButton"))
+ self.nhsclaims_pushButton.setObjectName(
+ _fromUtf8("nhsclaims_pushButton"))
self.verticalLayout_26.addWidget(self.nhsclaims_pushButton)
- spacerItem4 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_26.addItem(spacerItem4)
+ spacerItem7 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_26.addItem(spacerItem7)
self.editNHS_pushButton = QtGui.QPushButton(self.tab_20)
self.editNHS_pushButton.setMaximumSize(QtCore.QSize(150, 16777215))
self.editNHS_pushButton.setObjectName(_fromUtf8("editNHS_pushButton"))
@@ -649,7 +878,8 @@ class Ui_MainWindow(object):
self.gridLayout_23.addWidget(self.label_48, 1, 0, 1, 1)
self.exempttext_lineEdit = QtGui.QLineEdit(self.tab_20)
self.exempttext_lineEdit.setMaxLength(50)
- self.exempttext_lineEdit.setObjectName(_fromUtf8("exempttext_lineEdit"))
+ self.exempttext_lineEdit.setObjectName(
+ _fromUtf8("exempttext_lineEdit"))
self.gridLayout_23.addWidget(self.exempttext_lineEdit, 1, 1, 1, 1)
self.gridLayout_24.addLayout(self.gridLayout_23, 1, 0, 1, 1)
self.contract_tabWidget.addTab(self.tab_20, _fromUtf8(""))
@@ -660,27 +890,38 @@ class Ui_MainWindow(object):
self.contractHDP_label_3 = QtGui.QLabel(self.tab_21)
self.contractHDP_label_3.setAlignment(QtCore.Qt.AlignCenter)
self.contractHDP_label_3.setWordWrap(True)
- self.contractHDP_label_3.setObjectName(_fromUtf8("contractHDP_label_3"))
+ self.contractHDP_label_3.setObjectName(
+ _fromUtf8("contractHDP_label_3"))
self.gridLayout_27.addWidget(self.contractHDP_label_3, 0, 0, 2, 1)
- spacerItem5 = QtGui.QSpacerItem(147, 281, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.gridLayout_27.addItem(spacerItem5, 1, 1, 1, 1)
+ spacerItem8 = QtGui.QSpacerItem(
+ 147,
+ 281,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.gridLayout_27.addItem(spacerItem8, 1, 1, 1, 1)
self.editRegDent_pushButton = QtGui.QPushButton(self.tab_21)
self.editRegDent_pushButton.setMaximumSize(QtCore.QSize(150, 16777215))
- self.editRegDent_pushButton.setObjectName(_fromUtf8("editRegDent_pushButton"))
+ self.editRegDent_pushButton.setObjectName(
+ _fromUtf8("editRegDent_pushButton"))
self.gridLayout_27.addWidget(self.editRegDent_pushButton, 2, 1, 1, 1)
self.contract_tabWidget.addTab(self.tab_21, _fromUtf8(""))
self.gridLayout_13.addWidget(self.contract_tabWidget, 1, 1, 1, 5)
self.tabWidget.addTab(self.tab_patient_contract, _fromUtf8(""))
self.tab_patient_correspondence = QtGui.QWidget()
- self.tab_patient_correspondence.setObjectName(_fromUtf8("tab_patient_correspondence"))
- self.horizontalLayout_11 = QtGui.QHBoxLayout(self.tab_patient_correspondence)
- self.horizontalLayout_11.setObjectName(_fromUtf8("horizontalLayout_11"))
+ self.tab_patient_correspondence.setObjectName(
+ _fromUtf8("tab_patient_correspondence"))
+ self.horizontalLayout_11 = QtGui.QHBoxLayout(
+ self.tab_patient_correspondence)
+ self.horizontalLayout_11.setObjectName(
+ _fromUtf8("horizontalLayout_11"))
self.scrollArea_5 = QtGui.QScrollArea(self.tab_patient_correspondence)
self.scrollArea_5.setWidgetResizable(True)
self.scrollArea_5.setObjectName(_fromUtf8("scrollArea_5"))
self.scrollAreaWidgetContents_8 = QtGui.QWidget()
- self.scrollAreaWidgetContents_8.setGeometry(QtCore.QRect(0, 0, 423, 421))
- self.scrollAreaWidgetContents_8.setObjectName(_fromUtf8("scrollAreaWidgetContents_8"))
+ self.scrollAreaWidgetContents_8.setGeometry(
+ QtCore.QRect(0, 0, 423, 421))
+ self.scrollAreaWidgetContents_8.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_8"))
self.gridLayout = QtGui.QGridLayout(self.scrollAreaWidgetContents_8)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.groupBox_6 = QtGui.QGroupBox(self.scrollAreaWidgetContents_8)
@@ -688,32 +929,44 @@ class Ui_MainWindow(object):
self.verticalLayout_3 = QtGui.QVBoxLayout(self.groupBox_6)
self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
self.standardLetterPushButton = QtGui.QPushButton(self.groupBox_6)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.standardLetterPushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.standardLetterPushButton.sizePolicy().hasHeightForWidth())
self.standardLetterPushButton.setSizePolicy(sizePolicy)
- self.standardLetterPushButton.setObjectName(_fromUtf8("standardLetterPushButton"))
+ self.standardLetterPushButton.setObjectName(
+ _fromUtf8("standardLetterPushButton"))
self.verticalLayout_3.addWidget(self.standardLetterPushButton)
self.printRecall_pushButton = QtGui.QPushButton(self.groupBox_6)
- self.printRecall_pushButton.setObjectName(_fromUtf8("printRecall_pushButton"))
+ self.printRecall_pushButton.setObjectName(
+ _fromUtf8("printRecall_pushButton"))
self.verticalLayout_3.addWidget(self.printRecall_pushButton)
self.receiptPrintButton = QtGui.QPushButton(self.groupBox_6)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.receiptPrintButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.receiptPrintButton.sizePolicy().hasHeightForWidth())
self.receiptPrintButton.setSizePolicy(sizePolicy)
self.receiptPrintButton.setMaximumSize(QtCore.QSize(16777215, 32))
self.receiptPrintButton.setObjectName(_fromUtf8("receiptPrintButton"))
self.verticalLayout_3.addWidget(self.receiptPrintButton)
self.account2_pushButton = QtGui.QPushButton(self.groupBox_6)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.account2_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.account2_pushButton.sizePolicy().hasHeightForWidth())
self.account2_pushButton.setSizePolicy(sizePolicy)
- self.account2_pushButton.setObjectName(_fromUtf8("account2_pushButton"))
+ self.account2_pushButton.setObjectName(
+ _fromUtf8("account2_pushButton"))
self.verticalLayout_3.addWidget(self.account2_pushButton)
self.gridLayout.addWidget(self.groupBox_6, 0, 0, 1, 2)
self.groupBox_7 = QtGui.QGroupBox(self.scrollAreaWidgetContents_8)
@@ -721,22 +974,31 @@ class Ui_MainWindow(object):
self.verticalLayout_4 = QtGui.QVBoxLayout(self.groupBox_7)
self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
self.referralLettersComboBox = QtGui.QComboBox(self.groupBox_7)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.referralLettersComboBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.referralLettersComboBox.sizePolicy().hasHeightForWidth())
self.referralLettersComboBox.setSizePolicy(sizePolicy)
self.referralLettersComboBox.setMinimumSize(QtCore.QSize(240, 0))
- self.referralLettersComboBox.setObjectName(_fromUtf8("referralLettersComboBox"))
+ self.referralLettersComboBox.setObjectName(
+ _fromUtf8("referralLettersComboBox"))
self.verticalLayout_4.addWidget(self.referralLettersComboBox)
self.referralLettersPrintButton = QtGui.QPushButton(self.groupBox_7)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.referralLettersPrintButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.referralLettersPrintButton.sizePolicy().hasHeightForWidth())
self.referralLettersPrintButton.setSizePolicy(sizePolicy)
- self.referralLettersPrintButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.referralLettersPrintButton.setObjectName(_fromUtf8("referralLettersPrintButton"))
+ self.referralLettersPrintButton.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
+ self.referralLettersPrintButton.setObjectName(
+ _fromUtf8("referralLettersPrintButton"))
self.verticalLayout_4.addWidget(self.referralLettersPrintButton)
self.gridLayout.addWidget(self.groupBox_7, 1, 0, 1, 2)
self.groupBox_8 = QtGui.QGroupBox(self.scrollAreaWidgetContents_8)
@@ -744,20 +1006,28 @@ class Ui_MainWindow(object):
self.verticalLayout_7 = QtGui.QVBoxLayout(self.groupBox_8)
self.verticalLayout_7.setObjectName(_fromUtf8("verticalLayout_7"))
self.notesPrintButton = QtGui.QPushButton(self.groupBox_8)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.notesPrintButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.notesPrintButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.notesPrintButton.setSizePolicy(sizePolicy)
self.notesPrintButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.notesPrintButton.setObjectName(_fromUtf8("notesPrintButton"))
self.verticalLayout_7.addWidget(self.notesPrintButton)
self.gridLayout.addWidget(self.groupBox_8, 5, 0, 1, 2)
self.groupBox_3 = QtGui.QGroupBox(self.scrollAreaWidgetContents_8)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox_3.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.groupBox_3.sizePolicy().hasHeightForWidth())
self.groupBox_3.setSizePolicy(sizePolicy)
self.groupBox_3.setObjectName(_fromUtf8("groupBox_3"))
self.verticalLayout_21 = QtGui.QVBoxLayout(self.groupBox_3)
@@ -766,44 +1036,63 @@ class Ui_MainWindow(object):
self.label_44.setObjectName(_fromUtf8("label_44"))
self.verticalLayout_21.addWidget(self.label_44)
self.prevCorres_treeWidget = QtGui.QTreeWidget(self.groupBox_3)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.prevCorres_treeWidget.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.prevCorres_treeWidget.sizePolicy().hasHeightForWidth())
self.prevCorres_treeWidget.setSizePolicy(sizePolicy)
self.prevCorres_treeWidget.setAlternatingRowColors(True)
self.prevCorres_treeWidget.setAnimated(True)
- self.prevCorres_treeWidget.setObjectName(_fromUtf8("prevCorres_treeWidget"))
+ self.prevCorres_treeWidget.setObjectName(
+ _fromUtf8("prevCorres_treeWidget"))
self.verticalLayout_21.addWidget(self.prevCorres_treeWidget)
self.label_45 = QtGui.QLabel(self.groupBox_3)
self.label_45.setObjectName(_fromUtf8("label_45"))
self.verticalLayout_21.addWidget(self.label_45)
self.importDoc_treeWidget = QtGui.QTreeWidget(self.groupBox_3)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.importDoc_treeWidget.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.importDoc_treeWidget.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.importDoc_treeWidget.setSizePolicy(sizePolicy)
- self.importDoc_treeWidget.setObjectName(_fromUtf8("importDoc_treeWidget"))
+ self.importDoc_treeWidget.setObjectName(
+ _fromUtf8("importDoc_treeWidget"))
self.importDoc_treeWidget.headerItem().setText(0, _fromUtf8("1"))
self.verticalLayout_21.addWidget(self.importDoc_treeWidget)
self.importDoc_pushButton = QtGui.QPushButton(self.groupBox_3)
- self.importDoc_pushButton.setObjectName(_fromUtf8("importDoc_pushButton"))
+ self.importDoc_pushButton.setObjectName(
+ _fromUtf8("importDoc_pushButton"))
self.verticalLayout_21.addWidget(self.importDoc_pushButton)
self.gridLayout.addWidget(self.groupBox_3, 0, 2, 6, 1)
- spacerItem6 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.gridLayout.addItem(spacerItem6, 3, 0, 2, 2)
+ spacerItem9 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.gridLayout.addItem(spacerItem9, 3, 0, 2, 2)
self.groupBox_9 = QtGui.QGroupBox(self.scrollAreaWidgetContents_8)
self.groupBox_9.setObjectName(_fromUtf8("groupBox_9"))
self.verticalLayout_19 = QtGui.QVBoxLayout(self.groupBox_9)
self.verticalLayout_19.setObjectName(_fromUtf8("verticalLayout_19"))
self.medicalPrintButton = QtGui.QPushButton(self.groupBox_9)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.medicalPrintButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.medicalPrintButton.sizePolicy().hasHeightForWidth())
self.medicalPrintButton.setSizePolicy(sizePolicy)
- self.medicalPrintButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
+ self.medicalPrintButton.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
self.medicalPrintButton.setObjectName(_fromUtf8("medicalPrintButton"))
self.verticalLayout_19.addWidget(self.medicalPrintButton)
self.gridLayout.addWidget(self.groupBox_9, 2, 0, 1, 2)
@@ -811,7 +1100,8 @@ class Ui_MainWindow(object):
self.horizontalLayout_11.addWidget(self.scrollArea_5)
self.tabWidget.addTab(self.tab_patient_correspondence, _fromUtf8(""))
self.tab_patient_reception = QtGui.QWidget()
- self.tab_patient_reception.setObjectName(_fromUtf8("tab_patient_reception"))
+ self.tab_patient_reception.setObjectName(
+ _fromUtf8("tab_patient_reception"))
self.verticalLayout_24 = QtGui.QVBoxLayout(self.tab_patient_reception)
self.verticalLayout_24.setSpacing(0)
self.verticalLayout_24.setMargin(0)
@@ -821,12 +1111,16 @@ class Ui_MainWindow(object):
self.scrollArea_2.setWidgetResizable(True)
self.scrollArea_2.setObjectName(_fromUtf8("scrollArea_2"))
self.scrollAreaWidgetContents_5 = QtGui.QWidget()
- self.scrollAreaWidgetContents_5.setGeometry(QtCore.QRect(0, 0, 283, 470))
- self.scrollAreaWidgetContents_5.setObjectName(_fromUtf8("scrollAreaWidgetContents_5"))
- self.horizontalLayout_26 = QtGui.QHBoxLayout(self.scrollAreaWidgetContents_5)
+ self.scrollAreaWidgetContents_5.setGeometry(
+ QtCore.QRect(0, 0, 283, 470))
+ self.scrollAreaWidgetContents_5.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_5"))
+ self.horizontalLayout_26 = QtGui.QHBoxLayout(
+ self.scrollAreaWidgetContents_5)
self.horizontalLayout_26.setSpacing(3)
self.horizontalLayout_26.setMargin(0)
- self.horizontalLayout_26.setObjectName(_fromUtf8("horizontalLayout_26"))
+ self.horizontalLayout_26.setObjectName(
+ _fromUtf8("horizontalLayout_26"))
self.verticalLayout_32 = QtGui.QVBoxLayout()
self.verticalLayout_32.setSpacing(3)
self.verticalLayout_32.setObjectName(_fromUtf8("verticalLayout_32"))
@@ -834,18 +1128,25 @@ class Ui_MainWindow(object):
self.splitter_2.setOrientation(QtCore.Qt.Horizontal)
self.splitter_2.setObjectName(_fromUtf8("splitter_2"))
self.reception_groupBox = QtGui.QGroupBox(self.splitter_2)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Maximum,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.reception_groupBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.reception_groupBox.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.reception_groupBox.setSizePolicy(sizePolicy)
self.reception_groupBox.setMinimumSize(QtCore.QSize(0, 0))
- self.reception_groupBox.setMaximumSize(QtCore.QSize(16777215, 16777215))
+ self.reception_groupBox.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
self.reception_groupBox.setObjectName(_fromUtf8("reception_groupBox"))
self.horizontalLayout_32 = QtGui.QHBoxLayout(self.reception_groupBox)
self.horizontalLayout_32.setSpacing(3)
self.horizontalLayout_32.setMargin(3)
- self.horizontalLayout_32.setObjectName(_fromUtf8("horizontalLayout_32"))
+ self.horizontalLayout_32.setObjectName(
+ _fromUtf8("horizontalLayout_32"))
self.gridLayout_3 = QtGui.QGridLayout()
self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
self.NHSadmin_groupBox = QtGui.QGroupBox(self.reception_groupBox)
@@ -855,75 +1156,115 @@ class Ui_MainWindow(object):
self.verticalLayout_27.setMargin(3)
self.verticalLayout_27.setObjectName(_fromUtf8("verticalLayout_27"))
self.printGP17_pushButton = QtGui.QPushButton(self.NHSadmin_groupBox)
- self.printGP17_pushButton.setObjectName(_fromUtf8("printGP17_pushButton"))
+ self.printGP17_pushButton.setObjectName(
+ _fromUtf8("printGP17_pushButton"))
self.verticalLayout_27.addWidget(self.printGP17_pushButton)
- self.rec_apply_exemption_pushButton = QtGui.QPushButton(self.NHSadmin_groupBox)
- self.rec_apply_exemption_pushButton.setObjectName(_fromUtf8("rec_apply_exemption_pushButton"))
+ self.rec_apply_exemption_pushButton = QtGui.QPushButton(
+ self.NHSadmin_groupBox)
+ self.rec_apply_exemption_pushButton.setObjectName(
+ _fromUtf8("rec_apply_exemption_pushButton"))
self.verticalLayout_27.addWidget(self.rec_apply_exemption_pushButton)
self.gridLayout_3.addWidget(self.NHSadmin_groupBox, 1, 1, 1, 1)
self.customEst_checkBox = QtGui.QCheckBox(self.reception_groupBox)
self.customEst_checkBox.setObjectName(_fromUtf8("customEst_checkBox"))
self.gridLayout_3.addWidget(self.customEst_checkBox, 3, 1, 1, 1)
- self.printAccount_pushButton = QtGui.QPushButton(self.reception_groupBox)
- self.printAccount_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
- icon9 = QtGui.QIcon()
- icon9.addPixmap(QtGui.QPixmap(_fromUtf8(":/ps.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
- self.printAccount_pushButton.setIcon(icon9)
- self.printAccount_pushButton.setObjectName(_fromUtf8("printAccount_pushButton"))
- self.gridLayout_3.addWidget(self.printAccount_pushButton, 5, 1, 1, 1)
- self.takePayment_pushButton = QtGui.QPushButton(self.reception_groupBox)
- self.takePayment_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
+ self.printAccount_pushButton = QtGui.QPushButton(
+ self.reception_groupBox)
+ self.printAccount_pushButton.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
icon10 = QtGui.QIcon()
- icon10.addPixmap(QtGui.QPixmap(_fromUtf8(":/vcard.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
- self.takePayment_pushButton.setIcon(icon10)
- self.takePayment_pushButton.setObjectName(_fromUtf8("takePayment_pushButton"))
+ icon10.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/ps.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
+ self.printAccount_pushButton.setIcon(icon10)
+ self.printAccount_pushButton.setObjectName(
+ _fromUtf8("printAccount_pushButton"))
+ self.gridLayout_3.addWidget(self.printAccount_pushButton, 5, 1, 1, 1)
+ self.takePayment_pushButton = QtGui.QPushButton(
+ self.reception_groupBox)
+ self.takePayment_pushButton.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
+ icon11 = QtGui.QIcon()
+ icon11.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/vcard.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
+ self.takePayment_pushButton.setIcon(icon11)
+ self.takePayment_pushButton.setObjectName(
+ _fromUtf8("takePayment_pushButton"))
self.gridLayout_3.addWidget(self.takePayment_pushButton, 6, 1, 1, 1)
- self.reception_textBrowser = QtGui.QTextBrowser(self.reception_groupBox)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ self.reception_textBrowser = QtGui.QTextBrowser(
+ self.reception_groupBox)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.reception_textBrowser.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.reception_textBrowser.sizePolicy().hasHeightForWidth())
self.reception_textBrowser.setSizePolicy(sizePolicy)
self.reception_textBrowser.setMinimumSize(QtCore.QSize(0, 0))
- self.reception_textBrowser.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.reception_textBrowser.setObjectName(_fromUtf8("reception_textBrowser"))
+ self.reception_textBrowser.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
+ self.reception_textBrowser.setObjectName(
+ _fromUtf8("reception_textBrowser"))
self.gridLayout_3.addWidget(self.reception_textBrowser, 0, 0, 7, 1)
self.printEst_pushButton = QtGui.QPushButton(self.reception_groupBox)
- self.printEst_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.printEst_pushButton.setIcon(icon9)
- self.printEst_pushButton.setObjectName(_fromUtf8("printEst_pushButton"))
+ self.printEst_pushButton.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
+ self.printEst_pushButton.setIcon(icon10)
+ self.printEst_pushButton.setObjectName(
+ _fromUtf8("printEst_pushButton"))
self.gridLayout_3.addWidget(self.printEst_pushButton, 4, 1, 1, 1)
- spacerItem7 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.gridLayout_3.addItem(spacerItem7, 2, 1, 1, 1)
+ spacerItem10 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.gridLayout_3.addItem(spacerItem10, 2, 1, 1, 1)
self.horizontalLayout_32.addLayout(self.gridLayout_3)
self.groupBox_recnotes = QtGui.QGroupBox(self.splitter_2)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Maximum,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox_recnotes.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.groupBox_recnotes.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.groupBox_recnotes.setSizePolicy(sizePolicy)
self.groupBox_recnotes.setMaximumSize(QtCore.QSize(300, 16777215))
self.groupBox_recnotes.setObjectName(_fromUtf8("groupBox_recnotes"))
self.horizontalLayout_30 = QtGui.QHBoxLayout(self.groupBox_recnotes)
self.horizontalLayout_30.setSpacing(3)
self.horizontalLayout_30.setMargin(3)
- self.horizontalLayout_30.setObjectName(_fromUtf8("horizontalLayout_30"))
+ self.horizontalLayout_30.setObjectName(
+ _fromUtf8("horizontalLayout_30"))
self.recNotes_webView = QtWebKit.QWebView(self.groupBox_recnotes)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Maximum,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.recNotes_webView.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.recNotes_webView.sizePolicy().hasHeightForWidth())
self.recNotes_webView.setSizePolicy(sizePolicy)
self.recNotes_webView.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.recNotes_webView.setUrl(QtCore.QUrl(_fromUtf8("about:blank")))
self.recNotes_webView.setObjectName(_fromUtf8("recNotes_webView"))
self.horizontalLayout_30.addWidget(self.recNotes_webView)
self.verticalLayout_32.addWidget(self.splitter_2)
- self.pt_diary_groupBox = QtGui.QGroupBox(self.scrollAreaWidgetContents_5)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ self.pt_diary_groupBox = QtGui.QGroupBox(
+ self.scrollAreaWidgetContents_5)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pt_diary_groupBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.pt_diary_groupBox.sizePolicy().hasHeightForWidth())
self.pt_diary_groupBox.setSizePolicy(sizePolicy)
self.pt_diary_groupBox.setMinimumSize(QtCore.QSize(0, 200))
self.pt_diary_groupBox.setMaximumSize(QtCore.QSize(16777215, 200))
@@ -931,25 +1272,30 @@ class Ui_MainWindow(object):
self.horizontalLayout_34 = QtGui.QHBoxLayout(self.pt_diary_groupBox)
self.horizontalLayout_34.setSpacing(0)
self.horizontalLayout_34.setMargin(0)
- self.horizontalLayout_34.setObjectName(_fromUtf8("horizontalLayout_34"))
+ self.horizontalLayout_34.setObjectName(
+ _fromUtf8("horizontalLayout_34"))
self.verticalLayout_32.addWidget(self.pt_diary_groupBox)
self.horizontalLayout_26.addLayout(self.verticalLayout_32)
self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_5)
self.verticalLayout_24.addWidget(self.scrollArea_2)
self.tabWidget.addTab(self.tab_patient_reception, _fromUtf8(""))
self.tab_patient_summary = QtGui.QWidget()
- self.tab_patient_summary.setObjectName(_fromUtf8("tab_patient_summary"))
+ self.tab_patient_summary.setObjectName(
+ _fromUtf8("tab_patient_summary"))
self.horizontalLayout_12 = QtGui.QHBoxLayout(self.tab_patient_summary)
self.horizontalLayout_12.setSpacing(3)
self.horizontalLayout_12.setMargin(3)
- self.horizontalLayout_12.setObjectName(_fromUtf8("horizontalLayout_12"))
+ self.horizontalLayout_12.setObjectName(
+ _fromUtf8("horizontalLayout_12"))
self.scrollArea_6 = QtGui.QScrollArea(self.tab_patient_summary)
self.scrollArea_6.setFrameShape(QtGui.QFrame.NoFrame)
self.scrollArea_6.setWidgetResizable(True)
self.scrollArea_6.setObjectName(_fromUtf8("scrollArea_6"))
self.scrollAreaWidgetContents_9 = QtGui.QWidget()
- self.scrollAreaWidgetContents_9.setGeometry(QtCore.QRect(0, 0, 739, 456))
- self.scrollAreaWidgetContents_9.setObjectName(_fromUtf8("scrollAreaWidgetContents_9"))
+ self.scrollAreaWidgetContents_9.setGeometry(
+ QtCore.QRect(0, 0, 739, 456))
+ self.scrollAreaWidgetContents_9.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_9"))
self.gridLayout_4 = QtGui.QGridLayout(self.scrollAreaWidgetContents_9)
self.gridLayout_4.setMargin(0)
self.gridLayout_4.setSpacing(6)
@@ -965,7 +1311,8 @@ class Ui_MainWindow(object):
self.staticSummaryPanel.setFrameShadow(QtGui.QFrame.Raised)
self.staticSummaryPanel.setObjectName(_fromUtf8("staticSummaryPanel"))
self.gridLayout_4.addWidget(self.staticSummaryPanel, 0, 0, 1, 2)
- self.synopsis_lineEdit = QtGui.QLineEdit(self.scrollAreaWidgetContents_9)
+ self.synopsis_lineEdit = QtGui.QLineEdit(
+ self.scrollAreaWidgetContents_9)
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(True)
@@ -977,15 +1324,20 @@ class Ui_MainWindow(object):
self.synopsis_lineEdit.setMaxLength(140)
self.synopsis_lineEdit.setObjectName(_fromUtf8("synopsis_lineEdit"))
self.gridLayout_4.addWidget(self.synopsis_lineEdit, 1, 0, 1, 2)
- self.notesSummary_webView = QtWebKit.QWebView(self.scrollAreaWidgetContents_9)
+ self.notesSummary_webView = QtWebKit.QWebView(
+ self.scrollAreaWidgetContents_9)
self.notesSummary_webView.setUrl(QtCore.QUrl(_fromUtf8("about:blank")))
- self.notesSummary_webView.setObjectName(_fromUtf8("notesSummary_webView"))
+ self.notesSummary_webView.setObjectName(
+ _fromUtf8("notesSummary_webView"))
self.gridLayout_4.addWidget(self.notesSummary_webView, 2, 0, 2, 1)
self.bpe_groupBox = QtGui.QGroupBox(self.scrollAreaWidgetContents_9)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Fixed,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.bpe_groupBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.bpe_groupBox.sizePolicy().hasHeightForWidth())
self.bpe_groupBox.setSizePolicy(sizePolicy)
self.bpe_groupBox.setMaximumSize(QtCore.QSize(145, 135))
self.bpe_groupBox.setObjectName(_fromUtf8("bpe_groupBox"))
@@ -995,58 +1347,89 @@ class Ui_MainWindow(object):
self.bpe_textBrowser = QtGui.QTextBrowser(self.bpe_groupBox)
self.bpe_textBrowser.setMinimumSize(QtCore.QSize(0, 0))
self.bpe_textBrowser.setMaximumSize(QtCore.QSize(16777215, 65))
- self.bpe_textBrowser.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
- self.bpe_textBrowser.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.bpe_textBrowser.setVerticalScrollBarPolicy(
+ QtCore.Qt.ScrollBarAlwaysOff)
+ self.bpe_textBrowser.setHorizontalScrollBarPolicy(
+ QtCore.Qt.ScrollBarAlwaysOff)
self.bpe_textBrowser.setObjectName(_fromUtf8("bpe_textBrowser"))
self.verticalLayout_8.addWidget(self.bpe_textBrowser)
self.newBPE_pushButton = QtGui.QPushButton(self.bpe_groupBox)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.newBPE_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.newBPE_pushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.newBPE_pushButton.setSizePolicy(sizePolicy)
self.newBPE_pushButton.setObjectName(_fromUtf8("newBPE_pushButton"))
self.verticalLayout_8.addWidget(self.newBPE_pushButton)
self.gridLayout_4.addWidget(self.bpe_groupBox, 2, 1, 1, 1)
- self.planSummary_textBrowser = QtGui.QTextBrowser(self.scrollAreaWidgetContents_9)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ self.planSummary_textBrowser = QtGui.QTextBrowser(
+ self.scrollAreaWidgetContents_9)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.planSummary_textBrowser.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.planSummary_textBrowser.sizePolicy().hasHeightForWidth())
self.planSummary_textBrowser.setSizePolicy(sizePolicy)
- self.planSummary_textBrowser.setMaximumSize(QtCore.QSize(150, 16777215))
- self.planSummary_textBrowser.setObjectName(_fromUtf8("planSummary_textBrowser"))
+ self.planSummary_textBrowser.setMaximumSize(
+ QtCore.QSize(150, 16777215))
+ self.planSummary_textBrowser.setObjectName(
+ _fromUtf8("planSummary_textBrowser"))
self.gridLayout_4.addWidget(self.planSummary_textBrowser, 3, 1, 1, 1)
self.horizontalLayout_13 = QtGui.QHBoxLayout()
- self.horizontalLayout_13.setObjectName(_fromUtf8("horizontalLayout_13"))
- self.exampushButton = QtGui.QPushButton(self.scrollAreaWidgetContents_9)
+ self.horizontalLayout_13.setObjectName(
+ _fromUtf8("horizontalLayout_13"))
+ self.exampushButton = QtGui.QPushButton(
+ self.scrollAreaWidgetContents_9)
self.exampushButton.setMaximumSize(QtCore.QSize(16777215, 28))
self.exampushButton.setObjectName(_fromUtf8("exampushButton"))
self.horizontalLayout_13.addWidget(self.exampushButton)
- self.xray_pushButton = QtGui.QPushButton(self.scrollAreaWidgetContents_9)
+ self.xray_pushButton = QtGui.QPushButton(
+ self.scrollAreaWidgetContents_9)
self.xray_pushButton.setObjectName(_fromUtf8("xray_pushButton"))
self.horizontalLayout_13.addWidget(self.xray_pushButton)
- self.hygWizard_pushButton = QtGui.QPushButton(self.scrollAreaWidgetContents_9)
- self.hygWizard_pushButton.setObjectName(_fromUtf8("hygWizard_pushButton"))
+ self.hygWizard_pushButton = QtGui.QPushButton(
+ self.scrollAreaWidgetContents_9)
+ self.hygWizard_pushButton.setObjectName(
+ _fromUtf8("hygWizard_pushButton"))
self.horizontalLayout_13.addWidget(self.hygWizard_pushButton)
self.line_4 = QtGui.QFrame(self.scrollAreaWidgetContents_9)
self.line_4.setFrameShape(QtGui.QFrame.VLine)
self.line_4.setFrameShadow(QtGui.QFrame.Sunken)
self.line_4.setObjectName(_fromUtf8("line_4"))
self.horizontalLayout_13.addWidget(self.line_4)
- self.closeCourse_pushButton = QtGui.QPushButton(self.scrollAreaWidgetContents_9)
- self.closeCourse_pushButton.setObjectName(_fromUtf8("closeCourse_pushButton"))
+ self.closeCourse_pushButton = QtGui.QPushButton(
+ self.scrollAreaWidgetContents_9)
+ self.closeCourse_pushButton.setObjectName(
+ _fromUtf8("closeCourse_pushButton"))
self.horizontalLayout_13.addWidget(self.closeCourse_pushButton)
- spacerItem8 = QtGui.QSpacerItem(28, 17, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
- self.horizontalLayout_13.addItem(spacerItem8)
- self.childsmile_button = QtGui.QPushButton(self.scrollAreaWidgetContents_9)
+ spacerItem11 = QtGui.QSpacerItem(
+ 28,
+ 17,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
+ self.horizontalLayout_13.addItem(spacerItem11)
+ self.childsmile_button = QtGui.QPushButton(
+ self.scrollAreaWidgetContents_9)
self.childsmile_button.setObjectName(_fromUtf8("childsmile_button"))
self.horizontalLayout_13.addWidget(self.childsmile_button)
- spacerItem9 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
- self.horizontalLayout_13.addItem(spacerItem9)
- self.medNotes_pushButton = QtGui.QPushButton(self.scrollAreaWidgetContents_9)
+ spacerItem12 = QtGui.QSpacerItem(
+ 40,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
+ self.horizontalLayout_13.addItem(spacerItem12)
+ self.medNotes_pushButton = QtGui.QPushButton(
+ self.scrollAreaWidgetContents_9)
self.medNotes_pushButton.setMinimumSize(QtCore.QSize(200, 0))
- self.medNotes_pushButton.setObjectName(_fromUtf8("medNotes_pushButton"))
+ self.medNotes_pushButton.setObjectName(
+ _fromUtf8("medNotes_pushButton"))
self.horizontalLayout_13.addWidget(self.medNotes_pushButton)
self.gridLayout_4.addLayout(self.horizontalLayout_13, 4, 0, 1, 2)
self.scrollArea_6.setWidget(self.scrollAreaWidgetContents_9)
@@ -1061,29 +1444,44 @@ class Ui_MainWindow(object):
self.notes_webView.setObjectName(_fromUtf8("notes_webView"))
self.gridLayout_6.addWidget(self.notes_webView, 0, 0, 1, 3)
self.horizontalLayout_35 = QtGui.QHBoxLayout()
- self.horizontalLayout_35.setObjectName(_fromUtf8("horizontalLayout_35"))
+ self.horizontalLayout_35.setObjectName(
+ _fromUtf8("horizontalLayout_35"))
self.label_35 = QtGui.QLabel(self.tab_patient_notes)
self.label_35.setObjectName(_fromUtf8("label_35"))
self.horizontalLayout_35.addWidget(self.label_35)
- self.notes_includePrinting_checkBox = QtGui.QCheckBox(self.tab_patient_notes)
+ self.notes_includePrinting_checkBox = QtGui.QCheckBox(
+ self.tab_patient_notes)
self.notes_includePrinting_checkBox.setChecked(True)
- self.notes_includePrinting_checkBox.setObjectName(_fromUtf8("notes_includePrinting_checkBox"))
+ self.notes_includePrinting_checkBox.setObjectName(
+ _fromUtf8("notes_includePrinting_checkBox"))
self.horizontalLayout_35.addWidget(self.notes_includePrinting_checkBox)
- self.notes_includePayments_checkBox = QtGui.QCheckBox(self.tab_patient_notes)
+ self.notes_includePayments_checkBox = QtGui.QCheckBox(
+ self.tab_patient_notes)
self.notes_includePayments_checkBox.setChecked(True)
- self.notes_includePayments_checkBox.setObjectName(_fromUtf8("notes_includePayments_checkBox"))
+ self.notes_includePayments_checkBox.setObjectName(
+ _fromUtf8("notes_includePayments_checkBox"))
self.horizontalLayout_35.addWidget(self.notes_includePayments_checkBox)
- self.notes_includeTimestamps_checkBox = QtGui.QCheckBox(self.tab_patient_notes)
- self.notes_includeTimestamps_checkBox.setObjectName(_fromUtf8("notes_includeTimestamps_checkBox"))
- self.horizontalLayout_35.addWidget(self.notes_includeTimestamps_checkBox)
- self.notes_includeMetadata_checkBox = QtGui.QCheckBox(self.tab_patient_notes)
- self.notes_includeMetadata_checkBox.setObjectName(_fromUtf8("notes_includeMetadata_checkBox"))
+ self.notes_includeTimestamps_checkBox = QtGui.QCheckBox(
+ self.tab_patient_notes)
+ self.notes_includeTimestamps_checkBox.setObjectName(
+ _fromUtf8("notes_includeTimestamps_checkBox"))
+ self.horizontalLayout_35.addWidget(
+ self.notes_includeTimestamps_checkBox)
+ self.notes_includeMetadata_checkBox = QtGui.QCheckBox(
+ self.tab_patient_notes)
+ self.notes_includeMetadata_checkBox.setObjectName(
+ _fromUtf8("notes_includeMetadata_checkBox"))
self.horizontalLayout_35.addWidget(self.notes_includeMetadata_checkBox)
self.gridLayout_6.addLayout(self.horizontalLayout_35, 3, 0, 1, 1)
- spacerItem10 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
- self.gridLayout_6.addItem(spacerItem10, 3, 1, 1, 1)
+ spacerItem13 = QtGui.QSpacerItem(
+ 40,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
+ self.gridLayout_6.addItem(spacerItem13, 3, 1, 1, 1)
self.summary_notes_checkBox = QtGui.QCheckBox(self.tab_patient_notes)
- self.summary_notes_checkBox.setObjectName(_fromUtf8("summary_notes_checkBox"))
+ self.summary_notes_checkBox.setObjectName(
+ _fromUtf8("summary_notes_checkBox"))
self.gridLayout_6.addWidget(self.summary_notes_checkBox, 3, 2, 1, 1)
self.tabWidget.addTab(self.tab_patient_notes, _fromUtf8(""))
self.tab_patient_charts = QtGui.QWidget()
@@ -1099,7 +1497,8 @@ class Ui_MainWindow(object):
self.chartsTableWidget = QtGui.QTableWidget(self.table)
self.chartsTableWidget.setMaximumSize(QtCore.QSize(16777215, 500))
self.chartsTableWidget.setAlternatingRowColors(True)
- self.chartsTableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectItems)
+ self.chartsTableWidget.setSelectionBehavior(
+ QtGui.QAbstractItemView.SelectItems)
self.chartsTableWidget.setObjectName(_fromUtf8("chartsTableWidget"))
self.chartsTableWidget.setColumnCount(0)
self.chartsTableWidget.setRowCount(0)
@@ -1149,10 +1548,13 @@ class Ui_MainWindow(object):
self.toothProps_frame.setObjectName(_fromUtf8("toothProps_frame"))
self.gridLayout_8.addWidget(self.toothProps_frame, 0, 1, 2, 1)
self.groupBox_4 = QtGui.QGroupBox(self.tab_patient_charts)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox_4.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.groupBox_4.sizePolicy().hasHeightForWidth())
self.groupBox_4.setSizePolicy(sizePolicy)
self.groupBox_4.setMinimumSize(QtCore.QSize(0, 0))
self.groupBox_4.setMaximumSize(QtCore.QSize(16777215, 50))
@@ -1161,48 +1563,67 @@ class Ui_MainWindow(object):
self.verticalLayout_2.setSpacing(0)
self.verticalLayout_2.setMargin(0)
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
- self.plan_buttons_stacked_widget = QtGui.QStackedWidget(self.groupBox_4)
- self.plan_buttons_stacked_widget.setObjectName(_fromUtf8("plan_buttons_stacked_widget"))
+ self.plan_buttons_stacked_widget = QtGui.QStackedWidget(
+ self.groupBox_4)
+ self.plan_buttons_stacked_widget.setObjectName(
+ _fromUtf8("plan_buttons_stacked_widget"))
self.plan_buttons_page1 = QtGui.QWidget()
self.plan_buttons_page1.setObjectName(_fromUtf8("plan_buttons_page1"))
self.horizontalLayout_9 = QtGui.QHBoxLayout(self.plan_buttons_page1)
self.horizontalLayout_9.setMargin(0)
self.horizontalLayout_9.setObjectName(_fromUtf8("horizontalLayout_9"))
self.xrayTxpushButton = QtGui.QPushButton(self.plan_buttons_page1)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.xrayTxpushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.xrayTxpushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.xrayTxpushButton.setSizePolicy(sizePolicy)
self.xrayTxpushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.xrayTxpushButton.setObjectName(_fromUtf8("xrayTxpushButton"))
self.horizontalLayout_9.addWidget(self.xrayTxpushButton)
self.perioTxpushButton = QtGui.QPushButton(self.plan_buttons_page1)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.perioTxpushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.perioTxpushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.perioTxpushButton.setSizePolicy(sizePolicy)
self.perioTxpushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.perioTxpushButton.setObjectName(_fromUtf8("perioTxpushButton"))
self.horizontalLayout_9.addWidget(self.perioTxpushButton)
self.dentureTxpushButton = QtGui.QPushButton(self.plan_buttons_page1)
- self.dentureTxpushButton.setObjectName(_fromUtf8("dentureTxpushButton"))
+ self.dentureTxpushButton.setObjectName(
+ _fromUtf8("dentureTxpushButton"))
self.horizontalLayout_9.addWidget(self.dentureTxpushButton)
self.otherTxpushButton = QtGui.QPushButton(self.plan_buttons_page1)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.otherTxpushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.otherTxpushButton.sizePolicy().hasHeightForWidth())
self.otherTxpushButton.setSizePolicy(sizePolicy)
self.otherTxpushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.otherTxpushButton.setObjectName(_fromUtf8("otherTxpushButton"))
self.horizontalLayout_9.addWidget(self.otherTxpushButton)
self.customTx_pushButton = QtGui.QPushButton(self.plan_buttons_page1)
- self.customTx_pushButton.setObjectName(_fromUtf8("customTx_pushButton"))
+ self.customTx_pushButton.setObjectName(
+ _fromUtf8("customTx_pushButton"))
self.horizontalLayout_9.addWidget(self.customTx_pushButton)
- self.advanced_tx_planning_button = QtGui.QPushButton(self.plan_buttons_page1)
- self.advanced_tx_planning_button.setObjectName(_fromUtf8("advanced_tx_planning_button"))
+ self.advanced_tx_planning_button = QtGui.QPushButton(
+ self.plan_buttons_page1)
+ self.advanced_tx_planning_button.setObjectName(
+ _fromUtf8("advanced_tx_planning_button"))
self.horizontalLayout_9.addWidget(self.advanced_tx_planning_button)
self.plan_buttons_stacked_widget.addWidget(self.plan_buttons_page1)
self.plan_buttons_page2 = QtGui.QWidget()
@@ -1210,60 +1631,85 @@ class Ui_MainWindow(object):
self.horizontalLayout_10 = QtGui.QHBoxLayout(self.plan_buttons_page2)
self.horizontalLayout_10.setSpacing(12)
self.horizontalLayout_10.setMargin(0)
- self.horizontalLayout_10.setObjectName(_fromUtf8("horizontalLayout_10"))
- self.plan_course_manage_button = QtGui.QPushButton(self.plan_buttons_page2)
- self.plan_course_manage_button.setObjectName(_fromUtf8("plan_course_manage_button"))
+ self.horizontalLayout_10.setObjectName(
+ _fromUtf8("horizontalLayout_10"))
+ self.plan_course_manage_button = QtGui.QPushButton(
+ self.plan_buttons_page2)
+ self.plan_course_manage_button.setObjectName(
+ _fromUtf8("plan_course_manage_button"))
self.horizontalLayout_10.addWidget(self.plan_course_manage_button)
self.plan_buttons_stacked_widget.addWidget(self.plan_buttons_page2)
self.verticalLayout_2.addWidget(self.plan_buttons_stacked_widget)
self.gridLayout_8.addWidget(self.groupBox_4, 1, 0, 1, 1)
self.tabWidget.addTab(self.tab_patient_charts, _fromUtf8(""))
self.tab_patient_estimate = QtGui.QWidget()
- self.tab_patient_estimate.setObjectName(_fromUtf8("tab_patient_estimate"))
+ self.tab_patient_estimate.setObjectName(
+ _fromUtf8("tab_patient_estimate"))
self.horizontalLayout_5 = QtGui.QHBoxLayout(self.tab_patient_estimate)
self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5"))
self.estimate_scrollArea = QtGui.QScrollArea(self.tab_patient_estimate)
self.estimate_scrollArea.setMinimumSize(QtCore.QSize(0, 202))
self.estimate_scrollArea.setWidgetResizable(True)
- self.estimate_scrollArea.setObjectName(_fromUtf8("estimate_scrollArea"))
+ self.estimate_scrollArea.setObjectName(
+ _fromUtf8("estimate_scrollArea"))
self.scrollAreaWidgetContents_11 = QtGui.QWidget()
- self.scrollAreaWidgetContents_11.setGeometry(QtCore.QRect(0, 0, 98, 200))
- self.scrollAreaWidgetContents_11.setObjectName(_fromUtf8("scrollAreaWidgetContents_11"))
- self.horizontalLayout_19 = QtGui.QHBoxLayout(self.scrollAreaWidgetContents_11)
- self.horizontalLayout_19.setObjectName(_fromUtf8("horizontalLayout_19"))
+ self.scrollAreaWidgetContents_11.setGeometry(
+ QtCore.QRect(0, 0, 98, 200))
+ self.scrollAreaWidgetContents_11.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_11"))
+ self.horizontalLayout_19 = QtGui.QHBoxLayout(
+ self.scrollAreaWidgetContents_11)
+ self.horizontalLayout_19.setObjectName(
+ _fromUtf8("horizontalLayout_19"))
self.estimate_scrollArea.setWidget(self.scrollAreaWidgetContents_11)
self.horizontalLayout_5.addWidget(self.estimate_scrollArea)
self.scrollArea = QtGui.QScrollArea(self.tab_patient_estimate)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.scrollArea.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.scrollArea.sizePolicy().hasHeightForWidth())
self.scrollArea.setSizePolicy(sizePolicy)
self.scrollArea.setMinimumSize(QtCore.QSize(200, 0))
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
self.scrollAreaWidgetContents_4 = QtGui.QWidget()
- self.scrollAreaWidgetContents_4.setGeometry(QtCore.QRect(0, 0, 139, 212))
- self.scrollAreaWidgetContents_4.setObjectName(_fromUtf8("scrollAreaWidgetContents_4"))
- self.verticalLayout_9 = QtGui.QVBoxLayout(self.scrollAreaWidgetContents_4)
+ self.scrollAreaWidgetContents_4.setGeometry(
+ QtCore.QRect(0, 0, 139, 212))
+ self.scrollAreaWidgetContents_4.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_4"))
+ self.verticalLayout_9 = QtGui.QVBoxLayout(
+ self.scrollAreaWidgetContents_4)
self.verticalLayout_9.setObjectName(_fromUtf8("verticalLayout_9"))
self.estimate_label = QtGui.QLabel(self.scrollAreaWidgetContents_4)
self.estimate_label.setObjectName(_fromUtf8("estimate_label"))
self.verticalLayout_9.addWidget(self.estimate_label)
- self.estLetter_pushButton = QtGui.QPushButton(self.scrollAreaWidgetContents_4)
+ self.estLetter_pushButton = QtGui.QPushButton(
+ self.scrollAreaWidgetContents_4)
self.estLetter_pushButton.setCheckable(False)
- self.estLetter_pushButton.setObjectName(_fromUtf8("estLetter_pushButton"))
+ self.estLetter_pushButton.setObjectName(
+ _fromUtf8("estLetter_pushButton"))
self.verticalLayout_9.addWidget(self.estLetter_pushButton)
- self.recalcEst_pushButton = QtGui.QPushButton(self.scrollAreaWidgetContents_4)
+ self.recalcEst_pushButton = QtGui.QPushButton(
+ self.scrollAreaWidgetContents_4)
self.recalcEst_pushButton.setCheckable(False)
self.recalcEst_pushButton.setChecked(False)
- self.recalcEst_pushButton.setObjectName(_fromUtf8("recalcEst_pushButton"))
+ self.recalcEst_pushButton.setObjectName(
+ _fromUtf8("recalcEst_pushButton"))
self.verticalLayout_9.addWidget(self.recalcEst_pushButton)
- self.apply_exemption_pushButton = QtGui.QPushButton(self.scrollAreaWidgetContents_4)
- self.apply_exemption_pushButton.setObjectName(_fromUtf8("apply_exemption_pushButton"))
+ self.apply_exemption_pushButton = QtGui.QPushButton(
+ self.scrollAreaWidgetContents_4)
+ self.apply_exemption_pushButton.setObjectName(
+ _fromUtf8("apply_exemption_pushButton"))
self.verticalLayout_9.addWidget(self.apply_exemption_pushButton)
- spacerItem11 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_9.addItem(spacerItem11)
+ spacerItem14 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_9.addItem(spacerItem14)
self.label_22 = QtGui.QLabel(self.scrollAreaWidgetContents_4)
self.label_22.setLayoutDirection(QtCore.Qt.LeftToRight)
self.label_22.setAlignment(QtCore.Qt.AlignCenter)
@@ -1273,7 +1719,8 @@ class Ui_MainWindow(object):
self.dnt2comboBox.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.dnt2comboBox.setObjectName(_fromUtf8("dnt2comboBox"))
self.verticalLayout_9.addWidget(self.dnt2comboBox)
- self.closeTx_pushButton = QtGui.QPushButton(self.scrollAreaWidgetContents_4)
+ self.closeTx_pushButton = QtGui.QPushButton(
+ self.scrollAreaWidgetContents_4)
self.closeTx_pushButton.setEnabled(True)
self.closeTx_pushButton.setObjectName(_fromUtf8("closeTx_pushButton"))
self.verticalLayout_9.addWidget(self.closeTx_pushButton)
@@ -1287,17 +1734,25 @@ class Ui_MainWindow(object):
self.perioCharts_scrollArea = QtGui.QScrollArea(self.tab_patient_perio)
self.perioCharts_scrollArea.setFrameShape(QtGui.QFrame.NoFrame)
self.perioCharts_scrollArea.setWidgetResizable(True)
- self.perioCharts_scrollArea.setObjectName(_fromUtf8("perioCharts_scrollArea"))
+ self.perioCharts_scrollArea.setObjectName(
+ _fromUtf8("perioCharts_scrollArea"))
self.scrollAreaWidgetContents_6 = QtGui.QWidget()
- self.scrollAreaWidgetContents_6.setGeometry(QtCore.QRect(0, 0, 252, 374))
- self.scrollAreaWidgetContents_6.setObjectName(_fromUtf8("scrollAreaWidgetContents_6"))
+ self.scrollAreaWidgetContents_6.setGeometry(
+ QtCore.QRect(0, 0, 252, 374))
+ self.scrollAreaWidgetContents_6.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_6"))
self.gridLayout_15 = QtGui.QGridLayout(self.scrollAreaWidgetContents_6)
self.gridLayout_15.setObjectName(_fromUtf8("gridLayout_15"))
self.perioChart_frame = QtGui.QFrame(self.scrollAreaWidgetContents_6)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.perioChart_frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.perioChart_frame.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.perioChart_frame.setSizePolicy(sizePolicy)
self.perioChart_frame.setMinimumSize(QtCore.QSize(0, 140))
self.perioChart_frame.setMaximumSize(QtCore.QSize(16777215, 140))
@@ -1305,23 +1760,37 @@ class Ui_MainWindow(object):
self.perioChart_frame.setFrameShadow(QtGui.QFrame.Raised)
self.perioChart_frame.setObjectName(_fromUtf8("perioChart_frame"))
self.gridLayout_15.addWidget(self.perioChart_frame, 0, 0, 1, 3)
- self.perioChartData_scrollArea = QtGui.QScrollArea(self.scrollAreaWidgetContents_6)
+ self.perioChartData_scrollArea = QtGui.QScrollArea(
+ self.scrollAreaWidgetContents_6)
self.perioChartData_scrollArea.setMinimumSize(QtCore.QSize(0, 0))
self.perioChartData_scrollArea.setWidgetResizable(True)
- self.perioChartData_scrollArea.setObjectName(_fromUtf8("perioChartData_scrollArea"))
+ self.perioChartData_scrollArea.setObjectName(
+ _fromUtf8("perioChartData_scrollArea"))
self.scrollAreaWidgetContents_10 = QtGui.QWidget()
- self.scrollAreaWidgetContents_10.setGeometry(QtCore.QRect(0, 0, 918, 1218))
- self.scrollAreaWidgetContents_10.setObjectName(_fromUtf8("scrollAreaWidgetContents_10"))
- self.horizontalLayout_15 = QtGui.QHBoxLayout(self.scrollAreaWidgetContents_10)
- self.horizontalLayout_15.setObjectName(_fromUtf8("horizontalLayout_15"))
- self.perioChartData_frame = QtGui.QFrame(self.scrollAreaWidgetContents_10)
+ self.scrollAreaWidgetContents_10.setGeometry(
+ QtCore.QRect(0, 0, 918, 1218))
+ self.scrollAreaWidgetContents_10.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_10"))
+ self.horizontalLayout_15 = QtGui.QHBoxLayout(
+ self.scrollAreaWidgetContents_10)
+ self.horizontalLayout_15.setObjectName(
+ _fromUtf8("horizontalLayout_15"))
+ self.perioChartData_frame = QtGui.QFrame(
+ self.scrollAreaWidgetContents_10)
self.perioChartData_frame.setMinimumSize(QtCore.QSize(900, 1200))
self.perioChartData_frame.setFrameShape(QtGui.QFrame.StyledPanel)
self.perioChartData_frame.setFrameShadow(QtGui.QFrame.Raised)
- self.perioChartData_frame.setObjectName(_fromUtf8("perioChartData_frame"))
+ self.perioChartData_frame.setObjectName(
+ _fromUtf8("perioChartData_frame"))
self.horizontalLayout_15.addWidget(self.perioChartData_frame)
- self.perioChartData_scrollArea.setWidget(self.scrollAreaWidgetContents_10)
- self.gridLayout_15.addWidget(self.perioChartData_scrollArea, 1, 0, 1, 3)
+ self.perioChartData_scrollArea.setWidget(
+ self.scrollAreaWidgetContents_10)
+ self.gridLayout_15.addWidget(
+ self.perioChartData_scrollArea,
+ 1,
+ 0,
+ 1,
+ 3)
self.groupBox_11 = QtGui.QGroupBox(self.scrollAreaWidgetContents_6)
self.groupBox_11.setObjectName(_fromUtf8("groupBox_11"))
self.verticalLayout_16 = QtGui.QVBoxLayout(self.groupBox_11)
@@ -1334,24 +1803,34 @@ class Ui_MainWindow(object):
self.label_41.setObjectName(_fromUtf8("label_41"))
self.verticalLayout_16.addWidget(self.label_41)
self.perioChartDateComboBox = QtGui.QComboBox(self.groupBox_11)
- self.perioChartDateComboBox.setObjectName(_fromUtf8("perioChartDateComboBox"))
+ self.perioChartDateComboBox.setObjectName(
+ _fromUtf8("perioChartDateComboBox"))
self.verticalLayout_16.addWidget(self.perioChartDateComboBox)
self.newPerioChartPushButton = QtGui.QPushButton(self.groupBox_11)
self.newPerioChartPushButton.setAutoDefault(False)
- self.newPerioChartPushButton.setObjectName(_fromUtf8("newPerioChartPushButton"))
+ self.newPerioChartPushButton.setObjectName(
+ _fromUtf8("newPerioChartPushButton"))
self.verticalLayout_16.addWidget(self.newPerioChartPushButton)
self.gridLayout_15.addWidget(self.groupBox_11, 2, 0, 1, 1)
- self.perioToothProps_frame = QtGui.QFrame(self.scrollAreaWidgetContents_6)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ self.perioToothProps_frame = QtGui.QFrame(
+ self.scrollAreaWidgetContents_6)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.perioToothProps_frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.perioToothProps_frame.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.perioToothProps_frame.setSizePolicy(sizePolicy)
self.perioToothProps_frame.setMinimumSize(QtCore.QSize(0, 0))
- self.perioToothProps_frame.setMaximumSize(QtCore.QSize(16777215, 16777215))
+ self.perioToothProps_frame.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
self.perioToothProps_frame.setFrameShape(QtGui.QFrame.StyledPanel)
self.perioToothProps_frame.setFrameShadow(QtGui.QFrame.Raised)
- self.perioToothProps_frame.setObjectName(_fromUtf8("perioToothProps_frame"))
+ self.perioToothProps_frame.setObjectName(
+ _fromUtf8("perioToothProps_frame"))
self.gridLayout_15.addWidget(self.perioToothProps_frame, 2, 1, 1, 1)
self.groupBox_12 = QtGui.QGroupBox(self.scrollAreaWidgetContents_6)
self.groupBox_12.setMaximumSize(QtCore.QSize(120, 16777215))
@@ -1361,18 +1840,24 @@ class Ui_MainWindow(object):
self.bpe_textBrowser_2 = QtGui.QTextBrowser(self.groupBox_12)
self.bpe_textBrowser_2.setMinimumSize(QtCore.QSize(0, 0))
self.bpe_textBrowser_2.setMaximumSize(QtCore.QSize(16777215, 65))
- self.bpe_textBrowser_2.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
- self.bpe_textBrowser_2.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.bpe_textBrowser_2.setVerticalScrollBarPolicy(
+ QtCore.Qt.ScrollBarAlwaysOff)
+ self.bpe_textBrowser_2.setHorizontalScrollBarPolicy(
+ QtCore.Qt.ScrollBarAlwaysOff)
self.bpe_textBrowser_2.setObjectName(_fromUtf8("bpe_textBrowser_2"))
self.verticalLayout_15.addWidget(self.bpe_textBrowser_2)
self.bpeDateComboBox = QtGui.QComboBox(self.groupBox_12)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.bpeDateComboBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.bpeDateComboBox.sizePolicy().hasHeightForWidth())
self.bpeDateComboBox.setSizePolicy(sizePolicy)
self.bpeDateComboBox.setMinimumSize(QtCore.QSize(0, 0))
- self.bpeDateComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContentsOnFirstShow)
+ self.bpeDateComboBox.setSizeAdjustPolicy(
+ QtGui.QComboBox.AdjustToContentsOnFirstShow)
self.bpeDateComboBox.setObjectName(_fromUtf8("bpeDateComboBox"))
self.verticalLayout_15.addWidget(self.bpeDateComboBox)
self.gridLayout_15.addWidget(self.groupBox_12, 2, 2, 1, 1)
@@ -1380,9 +1865,13 @@ class Ui_MainWindow(object):
self.horizontalLayout_8.addWidget(self.perioCharts_scrollArea)
self.tabWidget.addTab(self.tab_patient_perio, _fromUtf8(""))
self.tab_patient_history = QtGui.QWidget()
- self.tab_patient_history.setObjectName(_fromUtf8("tab_patient_history"))
+ self.tab_patient_history.setObjectName(
+ _fromUtf8("tab_patient_history"))
self.horizontalLayout_29 = QtGui.QHBoxLayout(self.tab_patient_history)
- self.horizontalLayout_29.setObjectName(_fromUtf8("horizontalLayout_29"))
+ self.horizontalLayout_29.setSpacing(3)
+ self.horizontalLayout_29.setMargin(3)
+ self.horizontalLayout_29.setObjectName(
+ _fromUtf8("horizontalLayout_29"))
self.debugBrowser = QtGui.QTextBrowser(self.tab_patient_history)
self.debugBrowser.setObjectName(_fromUtf8("debugBrowser"))
self.horizontalLayout_29.addWidget(self.debugBrowser)
@@ -1392,52 +1881,79 @@ class Ui_MainWindow(object):
self.frame_3.setFrameShadow(QtGui.QFrame.Raised)
self.frame_3.setObjectName(_fromUtf8("frame_3"))
self.verticalLayout_25 = QtGui.QVBoxLayout(self.frame_3)
+ self.verticalLayout_25.setSpacing(3)
+ self.verticalLayout_25.setMargin(3)
self.verticalLayout_25.setObjectName(_fromUtf8("verticalLayout_25"))
self.pastPayments_pushButton = QtGui.QPushButton(self.frame_3)
- self.pastPayments_pushButton.setObjectName(_fromUtf8("pastPayments_pushButton"))
+ self.pastPayments_pushButton.setObjectName(
+ _fromUtf8("pastPayments_pushButton"))
self.verticalLayout_25.addWidget(self.pastPayments_pushButton)
self.pastTreatment_pushButton = QtGui.QPushButton(self.frame_3)
- self.pastTreatment_pushButton.setObjectName(_fromUtf8("pastTreatment_pushButton"))
+ self.pastTreatment_pushButton.setObjectName(
+ _fromUtf8("pastTreatment_pushButton"))
self.verticalLayout_25.addWidget(self.pastTreatment_pushButton)
self.past_course_estimates_pushButton = QtGui.QPushButton(self.frame_3)
- self.past_course_estimates_pushButton.setObjectName(_fromUtf8("past_course_estimates_pushButton"))
+ self.past_course_estimates_pushButton.setObjectName(
+ _fromUtf8("past_course_estimates_pushButton"))
self.verticalLayout_25.addWidget(self.past_course_estimates_pushButton)
self.pastCourses_pushButton = QtGui.QPushButton(self.frame_3)
- self.pastCourses_pushButton.setObjectName(_fromUtf8("pastCourses_pushButton"))
+ self.pastCourses_pushButton.setObjectName(
+ _fromUtf8("pastCourses_pushButton"))
self.verticalLayout_25.addWidget(self.pastCourses_pushButton)
self.pastEstimates_pushButton = QtGui.QPushButton(self.frame_3)
- self.pastEstimates_pushButton.setObjectName(_fromUtf8("pastEstimates_pushButton"))
+ self.pastEstimates_pushButton.setObjectName(
+ _fromUtf8("pastEstimates_pushButton"))
self.verticalLayout_25.addWidget(self.pastEstimates_pushButton)
- self.current_est_versioning_pushButton = QtGui.QPushButton(self.frame_3)
- self.current_est_versioning_pushButton.setObjectName(_fromUtf8("current_est_versioning_pushButton"))
- self.verticalLayout_25.addWidget(self.current_est_versioning_pushButton)
+ self.current_est_versioning_pushButton = QtGui.QPushButton(
+ self.frame_3)
+ self.current_est_versioning_pushButton.setObjectName(
+ _fromUtf8("current_est_versioning_pushButton"))
+ self.verticalLayout_25.addWidget(
+ self.current_est_versioning_pushButton)
self.NHSClaims_pushButton = QtGui.QPushButton(self.frame_3)
- self.NHSClaims_pushButton.setObjectName(_fromUtf8("NHSClaims_pushButton"))
+ self.NHSClaims_pushButton.setObjectName(
+ _fromUtf8("NHSClaims_pushButton"))
self.verticalLayout_25.addWidget(self.NHSClaims_pushButton)
self.memo_history_pushButton = QtGui.QPushButton(self.frame_3)
- self.memo_history_pushButton.setObjectName(_fromUtf8("memo_history_pushButton"))
+ self.memo_history_pushButton.setObjectName(
+ _fromUtf8("memo_history_pushButton"))
self.verticalLayout_25.addWidget(self.memo_history_pushButton)
self.historyPrint_pushButton = QtGui.QPushButton(self.frame_3)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.historyPrint_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.historyPrint_pushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.historyPrint_pushButton.setSizePolicy(sizePolicy)
- self.historyPrint_pushButton.setIcon(icon9)
- self.historyPrint_pushButton.setObjectName(_fromUtf8("historyPrint_pushButton"))
+ self.historyPrint_pushButton.setIcon(icon10)
+ self.historyPrint_pushButton.setObjectName(
+ _fromUtf8("historyPrint_pushButton"))
self.verticalLayout_25.addWidget(self.historyPrint_pushButton)
- spacerItem12 = QtGui.QSpacerItem(20, 123, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_25.addItem(spacerItem12)
+ spacerItem15 = QtGui.QSpacerItem(
+ 20,
+ 123,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_25.addItem(spacerItem15)
self.line_3 = QtGui.QFrame(self.frame_3)
self.line_3.setFrameShape(QtGui.QFrame.HLine)
self.line_3.setFrameShadow(QtGui.QFrame.Sunken)
self.line_3.setObjectName(_fromUtf8("line_3"))
self.verticalLayout_25.addWidget(self.line_3)
self.debug_toolButton = QtGui.QToolButton(self.frame_3)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.debug_toolButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.debug_toolButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.debug_toolButton.setSizePolicy(sizePolicy)
self.debug_toolButton.setCheckable(False)
self.debug_toolButton.setChecked(False)
@@ -1449,130 +1965,187 @@ class Ui_MainWindow(object):
self.verticalLayout_25.addWidget(self.ptAtts_checkBox)
self.horizontalLayout_29.addWidget(self.frame_3)
self.tabWidget.addTab(self.tab_patient_history, _fromUtf8(""))
- self.frame = QtGui.QFrame(self.splitter_patient)
- self.frame.setMinimumSize(QtCore.QSize(0, 80))
- self.frame.setFrameShape(QtGui.QFrame.NoFrame)
- self.frame.setFrameShadow(QtGui.QFrame.Raised)
- self.frame.setObjectName(_fromUtf8("frame"))
- self.gridLayout_7 = QtGui.QGridLayout(self.frame)
+ self.new_notes_frame = QtGui.QFrame(self.splitter_patient)
+ self.new_notes_frame.setMinimumSize(QtCore.QSize(0, 80))
+ self.new_notes_frame.setFrameShape(QtGui.QFrame.NoFrame)
+ self.new_notes_frame.setFrameShadow(QtGui.QFrame.Raised)
+ self.new_notes_frame.setObjectName(_fromUtf8("new_notes_frame"))
+ self.gridLayout_7 = QtGui.QGridLayout(self.new_notes_frame)
self.gridLayout_7.setMargin(0)
self.gridLayout_7.setSpacing(3)
self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7"))
- self.line = QtGui.QFrame(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Preferred)
+ self.line = QtGui.QFrame(self.new_notes_frame)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Fixed,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.line.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.line.sizePolicy().hasHeightForWidth())
self.line.setSizePolicy(sizePolicy)
self.line.setFrameShape(QtGui.QFrame.VLine)
self.line.setFrameShadow(QtGui.QFrame.Sunken)
self.line.setObjectName(_fromUtf8("line"))
self.gridLayout_7.addWidget(self.line, 0, 1, 3, 1)
- self.scrollArea_8 = QtGui.QScrollArea(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ self.scrollArea_8 = QtGui.QScrollArea(self.new_notes_frame)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.scrollArea_8.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.scrollArea_8.sizePolicy().hasHeightForWidth())
self.scrollArea_8.setSizePolicy(sizePolicy)
self.scrollArea_8.setMaximumSize(QtCore.QSize(120, 1200))
- self.scrollArea_8.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.scrollArea_8.setHorizontalScrollBarPolicy(
+ QtCore.Qt.ScrollBarAlwaysOff)
self.scrollArea_8.setWidgetResizable(True)
self.scrollArea_8.setObjectName(_fromUtf8("scrollArea_8"))
self.scrollAreaWidgetContents_13 = QtGui.QWidget()
- self.scrollAreaWidgetContents_13.setGeometry(QtCore.QRect(0, 0, 118, 110))
- self.scrollAreaWidgetContents_13.setObjectName(_fromUtf8("scrollAreaWidgetContents_13"))
- self.verticalLayout_20 = QtGui.QVBoxLayout(self.scrollAreaWidgetContents_13)
+ self.scrollAreaWidgetContents_13.setGeometry(
+ QtCore.QRect(0, 0, 118, 118))
+ self.scrollAreaWidgetContents_13.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_13"))
+ self.verticalLayout_20 = QtGui.QVBoxLayout(
+ self.scrollAreaWidgetContents_13)
self.verticalLayout_20.setSpacing(0)
self.verticalLayout_20.setMargin(0)
self.verticalLayout_20.setObjectName(_fromUtf8("verticalLayout_20"))
self.hiddenNotes_label = QtGui.QLabel(self.scrollAreaWidgetContents_13)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.hiddenNotes_label.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.hiddenNotes_label.sizePolicy().hasHeightForWidth())
self.hiddenNotes_label.setSizePolicy(sizePolicy)
self.hiddenNotes_label.setMinimumSize(QtCore.QSize(70, 0))
self.hiddenNotes_label.setText(_fromUtf8(""))
- self.hiddenNotes_label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
+ self.hiddenNotes_label.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
self.hiddenNotes_label.setWordWrap(True)
self.hiddenNotes_label.setObjectName(_fromUtf8("hiddenNotes_label"))
self.verticalLayout_20.addWidget(self.hiddenNotes_label)
self.scrollArea_8.setWidget(self.scrollAreaWidgetContents_13)
self.gridLayout_7.addWidget(self.scrollArea_8, 0, 2, 3, 1)
- self.label_39 = QtGui.QLabel(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ self.label_39 = QtGui.QLabel(self.new_notes_frame)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label_39.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.label_39.sizePolicy().hasHeightForWidth())
self.label_39.setSizePolicy(sizePolicy)
self.label_39.setObjectName(_fromUtf8("label_39"))
self.gridLayout_7.addWidget(self.label_39, 0, 4, 1, 1)
- self.line_2 = QtGui.QFrame(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Preferred)
+ self.line_2 = QtGui.QFrame(self.new_notes_frame)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Fixed,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.line_2.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.line_2.sizePolicy().hasHeightForWidth())
self.line_2.setSizePolicy(sizePolicy)
self.line_2.setFrameShape(QtGui.QFrame.VLine)
self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
self.line_2.setObjectName(_fromUtf8("line_2"))
self.gridLayout_7.addWidget(self.line_2, 0, 5, 3, 1)
- self.phraseBook_pushButton = QtGui.QPushButton(self.frame)
- icon11 = QtGui.QIcon()
- icon11.addPixmap(QtGui.QPixmap(_fromUtf8(":/txt.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
- self.phraseBook_pushButton.setIcon(icon11)
- self.phraseBook_pushButton.setObjectName(_fromUtf8("phraseBook_pushButton"))
+ self.phraseBook_pushButton = QtGui.QPushButton(self.new_notes_frame)
+ icon12 = QtGui.QIcon()
+ icon12.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/txt.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
+ self.phraseBook_pushButton.setIcon(icon12)
+ self.phraseBook_pushButton.setObjectName(
+ _fromUtf8("phraseBook_pushButton"))
self.gridLayout_7.addWidget(self.phraseBook_pushButton, 2, 4, 1, 1)
- self.saveButton = QtGui.QPushButton(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred)
+ self.saveButton = QtGui.QPushButton(self.new_notes_frame)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.saveButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.saveButton.sizePolicy().hasHeightForWidth())
self.saveButton.setSizePolicy(sizePolicy)
self.saveButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
- icon12 = QtGui.QIcon()
- icon12.addPixmap(QtGui.QPixmap(_fromUtf8(":/save_all.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
- self.saveButton.setIcon(icon12)
+ self.saveButton.setIcon(icon9)
self.saveButton.setObjectName(_fromUtf8("saveButton"))
self.gridLayout_7.addWidget(self.saveButton, 0, 6, 3, 1)
- self.notesEnter_textEdit = QtGui.QTextEdit(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ self.notesEnter_textEdit = QtGui.QTextEdit(self.new_notes_frame)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.notesEnter_textEdit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.notesEnter_textEdit.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.notesEnter_textEdit.setSizePolicy(sizePolicy)
- self.notesEnter_textEdit.setMaximumSize(QtCore.QSize(16777215, 16777215))
+ self.notesEnter_textEdit.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
self.notesEnter_textEdit.setFrameShape(QtGui.QFrame.NoFrame)
- self.notesEnter_textEdit.setObjectName(_fromUtf8("notesEnter_textEdit"))
+ self.notesEnter_textEdit.setObjectName(
+ _fromUtf8("notesEnter_textEdit"))
self.gridLayout_7.addWidget(self.notesEnter_textEdit, 0, 3, 3, 1)
- self.memos_pushButton = QtGui.QPushButton(self.frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred)
+ self.memos_pushButton = QtGui.QPushButton(self.new_notes_frame)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.memos_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.memos_pushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.memos_pushButton.setSizePolicy(sizePolicy)
icon13 = QtGui.QIcon()
- icon13.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/memos.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon13.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/icons/memos.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.memos_pushButton.setIcon(icon13)
self.memos_pushButton.setObjectName(_fromUtf8("memos_pushButton"))
self.gridLayout_7.addWidget(self.memos_pushButton, 0, 0, 3, 1)
- self.clinician_phrasebook_pushButton = QtGui.QPushButton(self.frame)
- self.clinician_phrasebook_pushButton.setIcon(icon11)
- self.clinician_phrasebook_pushButton.setObjectName(_fromUtf8("clinician_phrasebook_pushButton"))
- self.gridLayout_7.addWidget(self.clinician_phrasebook_pushButton, 1, 4, 1, 1)
+ self.clinician_phrasebook_pushButton = QtGui.QPushButton(
+ self.new_notes_frame)
+ self.clinician_phrasebook_pushButton.setIcon(icon12)
+ self.clinician_phrasebook_pushButton.setObjectName(
+ _fromUtf8("clinician_phrasebook_pushButton"))
+ self.gridLayout_7.addWidget(
+ self.clinician_phrasebook_pushButton,
+ 1,
+ 4,
+ 1,
+ 1)
self.horizontalLayout_24.addWidget(self.splitter_patient)
icon14 = QtGui.QIcon()
- icon14.addPixmap(QtGui.QPixmap(_fromUtf8(":/kfm.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon14.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/kfm.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.main_tabWidget.addTab(self.tab_patient, icon14, _fromUtf8(""))
self.tab_appointments = QtGui.QWidget()
self.tab_appointments.setObjectName(_fromUtf8("tab_appointments"))
self.horizontalLayout_21 = QtGui.QHBoxLayout(self.tab_appointments)
self.horizontalLayout_21.setSpacing(0)
self.horizontalLayout_21.setMargin(0)
- self.horizontalLayout_21.setObjectName(_fromUtf8("horizontalLayout_21"))
+ self.horizontalLayout_21.setObjectName(
+ _fromUtf8("horizontalLayout_21"))
icon15 = QtGui.QIcon()
- icon15.addPixmap(QtGui.QPixmap(_fromUtf8(":/vcalendar.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
- self.main_tabWidget.addTab(self.tab_appointments, icon15, _fromUtf8(""))
+ icon15.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/vcalendar.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
+ self.main_tabWidget.addTab(
+ self.tab_appointments,
+ icon15,
+ _fromUtf8(""))
self.tab_cashbook = QtGui.QWidget()
self.tab_cashbook.setObjectName(_fromUtf8("tab_cashbook"))
self.gridLayout_5 = QtGui.QGridLayout(self.tab_cashbook)
@@ -1587,194 +2160,338 @@ class Ui_MainWindow(object):
self.label_32.setObjectName(_fromUtf8("label_32"))
self.gridLayout_5.addWidget(self.label_32, 0, 2, 1, 1)
self.cashbookGoPushButton = QtGui.QPushButton(self.tab_cashbook)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.cashbookGoPushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.cashbookGoPushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.cashbookGoPushButton.setSizePolicy(sizePolicy)
self.cashbookGoPushButton.setIcon(icon8)
self.cashbookGoPushButton.setIconSize(QtCore.QSize(24, 24))
- self.cashbookGoPushButton.setObjectName(_fromUtf8("cashbookGoPushButton"))
+ self.cashbookGoPushButton.setObjectName(
+ _fromUtf8("cashbookGoPushButton"))
self.gridLayout_5.addWidget(self.cashbookGoPushButton, 0, 3, 2, 1)
self.cashbookPrintButton = QtGui.QPushButton(self.tab_cashbook)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.cashbookPrintButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.cashbookPrintButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.cashbookPrintButton.setSizePolicy(sizePolicy)
- self.cashbookPrintButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.cashbookPrintButton.setIcon(icon9)
+ self.cashbookPrintButton.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
+ self.cashbookPrintButton.setIcon(icon10)
self.cashbookPrintButton.setIconSize(QtCore.QSize(32, 24))
- self.cashbookPrintButton.setObjectName(_fromUtf8("cashbookPrintButton"))
+ self.cashbookPrintButton.setObjectName(
+ _fromUtf8("cashbookPrintButton"))
self.gridLayout_5.addWidget(self.cashbookPrintButton, 0, 4, 2, 1)
self.cashbookStartDateEdit = QtGui.QDateEdit(self.tab_cashbook)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.cashbookStartDateEdit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.cashbookStartDateEdit.sizePolicy().hasHeightForWidth())
self.cashbookStartDateEdit.setSizePolicy(sizePolicy)
self.cashbookStartDateEdit.setMinimumSize(QtCore.QSize(100, 0))
self.cashbookStartDateEdit.setCalendarPopup(True)
- self.cashbookStartDateEdit.setObjectName(_fromUtf8("cashbookStartDateEdit"))
+ self.cashbookStartDateEdit.setObjectName(
+ _fromUtf8("cashbookStartDateEdit"))
self.gridLayout_5.addWidget(self.cashbookStartDateEdit, 1, 0, 1, 1)
self.cashbookEndDateEdit = QtGui.QDateEdit(self.tab_cashbook)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.cashbookEndDateEdit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.cashbookEndDateEdit.sizePolicy().hasHeightForWidth())
self.cashbookEndDateEdit.setSizePolicy(sizePolicy)
self.cashbookEndDateEdit.setMinimumSize(QtCore.QSize(100, 0))
self.cashbookEndDateEdit.setCalendarPopup(True)
- self.cashbookEndDateEdit.setObjectName(_fromUtf8("cashbookEndDateEdit"))
+ self.cashbookEndDateEdit.setObjectName(
+ _fromUtf8("cashbookEndDateEdit"))
self.gridLayout_5.addWidget(self.cashbookEndDateEdit, 1, 1, 1, 1)
self.cashbookDentComboBox = QtGui.QComboBox(self.tab_cashbook)
- self.cashbookDentComboBox.setObjectName(_fromUtf8("cashbookDentComboBox"))
+ self.cashbookDentComboBox.setObjectName(
+ _fromUtf8("cashbookDentComboBox"))
self.gridLayout_5.addWidget(self.cashbookDentComboBox, 1, 2, 1, 1)
- spacerItem13 = QtGui.QSpacerItem(389, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
- self.gridLayout_5.addItem(spacerItem13, 1, 5, 1, 1)
+ spacerItem16 = QtGui.QSpacerItem(
+ 389,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
+ self.gridLayout_5.addItem(spacerItem16, 1, 5, 1, 1)
self.all_payments_radioButton = QtGui.QRadioButton(self.tab_cashbook)
self.all_payments_radioButton.setChecked(True)
- self.all_payments_radioButton.setObjectName(_fromUtf8("all_payments_radioButton"))
+ self.all_payments_radioButton.setObjectName(
+ _fromUtf8("all_payments_radioButton"))
self.gridLayout_5.addWidget(self.all_payments_radioButton, 1, 6, 1, 1)
self.sundries_only_radioButton = QtGui.QRadioButton(self.tab_cashbook)
- self.sundries_only_radioButton.setObjectName(_fromUtf8("sundries_only_radioButton"))
+ self.sundries_only_radioButton.setObjectName(
+ _fromUtf8("sundries_only_radioButton"))
self.gridLayout_5.addWidget(self.sundries_only_radioButton, 1, 7, 1, 1)
self.treatment_only_radioButton = QtGui.QRadioButton(self.tab_cashbook)
- self.treatment_only_radioButton.setObjectName(_fromUtf8("treatment_only_radioButton"))
- self.gridLayout_5.addWidget(self.treatment_only_radioButton, 1, 8, 1, 1)
+ self.treatment_only_radioButton.setObjectName(
+ _fromUtf8("treatment_only_radioButton"))
+ self.gridLayout_5.addWidget(
+ self.treatment_only_radioButton,
+ 1,
+ 8,
+ 1,
+ 1)
self.cashbook_placeholder_widget = QtGui.QWidget(self.tab_cashbook)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.cashbook_placeholder_widget.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.cashbook_placeholder_widget.sizePolicy().hasHeightForWidth())
self.cashbook_placeholder_widget.setSizePolicy(sizePolicy)
- self.cashbook_placeholder_widget.setObjectName(_fromUtf8("cashbook_placeholder_widget"))
- self.gridLayout_5.addWidget(self.cashbook_placeholder_widget, 2, 0, 1, 9)
- self.main_tabWidget.addTab(self.tab_cashbook, icon10, _fromUtf8(""))
+ self.cashbook_placeholder_widget.setObjectName(
+ _fromUtf8("cashbook_placeholder_widget"))
+ self.gridLayout_5.addWidget(
+ self.cashbook_placeholder_widget,
+ 2,
+ 0,
+ 1,
+ 9)
+ self.main_tabWidget.addTab(self.tab_cashbook, icon11, _fromUtf8(""))
self.tab_daybook = QtGui.QWidget()
self.tab_daybook.setObjectName(_fromUtf8("tab_daybook"))
- self.gridlayout = QtGui.QGridLayout(self.tab_daybook)
- self.gridlayout.setObjectName(_fromUtf8("gridlayout"))
+ self.verticalLayout_5 = QtGui.QVBoxLayout(self.tab_daybook)
+ self.verticalLayout_5.setMargin(3)
+ self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5"))
+ self.gridLayout_17 = QtGui.QGridLayout()
+ self.gridLayout_17.setVerticalSpacing(0)
+ self.gridLayout_17.setObjectName(_fromUtf8("gridLayout_17"))
+ self.daybookEndDateEdit = QtGui.QDateEdit(self.tab_daybook)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(
+ self.daybookEndDateEdit.sizePolicy(
+ ).hasHeightForWidth(
+ ))
+ self.daybookEndDateEdit.setSizePolicy(sizePolicy)
+ self.daybookEndDateEdit.setMinimumSize(QtCore.QSize(0, 0))
+ self.daybookEndDateEdit.setCalendarPopup(True)
+ self.daybookEndDateEdit.setObjectName(_fromUtf8("daybookEndDateEdit"))
+ self.gridLayout_17.addWidget(self.daybookEndDateEdit, 1, 1, 1, 1)
self.label_29 = QtGui.QLabel(self.tab_daybook)
self.label_29.setObjectName(_fromUtf8("label_29"))
- self.gridlayout.addWidget(self.label_29, 0, 0, 1, 1)
- self.label_30 = QtGui.QLabel(self.tab_daybook)
- self.label_30.setObjectName(_fromUtf8("label_30"))
- self.gridlayout.addWidget(self.label_30, 0, 1, 1, 1)
- self.label_28 = QtGui.QLabel(self.tab_daybook)
- self.label_28.setObjectName(_fromUtf8("label_28"))
- self.gridlayout.addWidget(self.label_28, 0, 2, 1, 1)
- self.label_31 = QtGui.QLabel(self.tab_daybook)
- self.label_31.setObjectName(_fromUtf8("label_31"))
- self.gridlayout.addWidget(self.label_31, 0, 3, 1, 1)
+ self.gridLayout_17.addWidget(self.label_29, 0, 0, 1, 1)
+ self.daybookDent1ComboBox = QtGui.QComboBox(self.tab_daybook)
+ self.daybookDent1ComboBox.setMaximumSize(QtCore.QSize(100, 16777215))
+ self.daybookDent1ComboBox.setObjectName(
+ _fromUtf8("daybookDent1ComboBox"))
+ self.gridLayout_17.addWidget(self.daybookDent1ComboBox, 1, 2, 1, 1)
self.daybookGoPushButton = QtGui.QPushButton(self.tab_daybook)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.daybookGoPushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.daybookGoPushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.daybookGoPushButton.setSizePolicy(sizePolicy)
+ self.daybookGoPushButton.setMaximumSize(QtCore.QSize(100, 16777215))
self.daybookGoPushButton.setIcon(icon8)
self.daybookGoPushButton.setIconSize(QtCore.QSize(24, 24))
- self.daybookGoPushButton.setObjectName(_fromUtf8("daybookGoPushButton"))
- self.gridlayout.addWidget(self.daybookGoPushButton, 0, 4, 2, 1)
- self.daybookPrintButton = QtGui.QPushButton(self.tab_daybook)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.daybookPrintButton.sizePolicy().hasHeightForWidth())
- self.daybookPrintButton.setSizePolicy(sizePolicy)
- self.daybookPrintButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.daybookPrintButton.setIcon(icon9)
- self.daybookPrintButton.setIconSize(QtCore.QSize(32, 32))
- self.daybookPrintButton.setObjectName(_fromUtf8("daybookPrintButton"))
- self.gridlayout.addWidget(self.daybookPrintButton, 0, 5, 2, 1)
- spacerItem14 = QtGui.QSpacerItem(654, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
- self.gridlayout.addItem(spacerItem14, 0, 6, 2, 1)
+ self.daybookGoPushButton.setObjectName(
+ _fromUtf8("daybookGoPushButton"))
+ self.gridLayout_17.addWidget(self.daybookGoPushButton, 0, 5, 2, 1)
+ self.daybookDent2ComboBox = QtGui.QComboBox(self.tab_daybook)
+ self.daybookDent2ComboBox.setMaximumSize(QtCore.QSize(100, 16777215))
+ self.daybookDent2ComboBox.setObjectName(
+ _fromUtf8("daybookDent2ComboBox"))
+ self.gridLayout_17.addWidget(self.daybookDent2ComboBox, 1, 3, 1, 1)
+ self.label_31 = QtGui.QLabel(self.tab_daybook)
+ self.label_31.setObjectName(_fromUtf8("label_31"))
+ self.gridLayout_17.addWidget(self.label_31, 0, 3, 1, 1)
+ self.label_30 = QtGui.QLabel(self.tab_daybook)
+ self.label_30.setObjectName(_fromUtf8("label_30"))
+ self.gridLayout_17.addWidget(self.label_30, 0, 1, 1, 1)
self.daybookStartDateEdit = QtGui.QDateEdit(self.tab_daybook)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.daybookStartDateEdit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.daybookStartDateEdit.sizePolicy().hasHeightForWidth())
self.daybookStartDateEdit.setSizePolicy(sizePolicy)
- self.daybookStartDateEdit.setMinimumSize(QtCore.QSize(100, 0))
+ self.daybookStartDateEdit.setMinimumSize(QtCore.QSize(0, 0))
self.daybookStartDateEdit.setCalendarPopup(True)
- self.daybookStartDateEdit.setObjectName(_fromUtf8("daybookStartDateEdit"))
- self.gridlayout.addWidget(self.daybookStartDateEdit, 1, 0, 1, 1)
- self.daybookEndDateEdit = QtGui.QDateEdit(self.tab_daybook)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ self.daybookStartDateEdit.setObjectName(
+ _fromUtf8("daybookStartDateEdit"))
+ self.gridLayout_17.addWidget(self.daybookStartDateEdit, 1, 0, 1, 1)
+ self.daybookPrintButton = QtGui.QPushButton(self.tab_daybook)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.daybookEndDateEdit.sizePolicy().hasHeightForWidth())
- self.daybookEndDateEdit.setSizePolicy(sizePolicy)
- self.daybookEndDateEdit.setMinimumSize(QtCore.QSize(100, 0))
- self.daybookEndDateEdit.setCalendarPopup(True)
- self.daybookEndDateEdit.setObjectName(_fromUtf8("daybookEndDateEdit"))
- self.gridlayout.addWidget(self.daybookEndDateEdit, 1, 1, 1, 1)
- self.daybookDent1ComboBox = QtGui.QComboBox(self.tab_daybook)
- self.daybookDent1ComboBox.setObjectName(_fromUtf8("daybookDent1ComboBox"))
- self.gridlayout.addWidget(self.daybookDent1ComboBox, 1, 2, 1, 1)
- self.daybookDent2ComboBox = QtGui.QComboBox(self.tab_daybook)
- self.daybookDent2ComboBox.setObjectName(_fromUtf8("daybookDent2ComboBox"))
- self.gridlayout.addWidget(self.daybookDent2ComboBox, 1, 3, 1, 1)
+ sizePolicy.setHeightForWidth(
+ self.daybookPrintButton.sizePolicy().hasHeightForWidth())
+ self.daybookPrintButton.setSizePolicy(sizePolicy)
+ self.daybookPrintButton.setMaximumSize(QtCore.QSize(100, 16777215))
+ self.daybookPrintButton.setIcon(icon10)
+ self.daybookPrintButton.setIconSize(QtCore.QSize(32, 32))
+ self.daybookPrintButton.setObjectName(_fromUtf8("daybookPrintButton"))
+ self.gridLayout_17.addWidget(self.daybookPrintButton, 0, 6, 2, 1)
+ self.label_28 = QtGui.QLabel(self.tab_daybook)
+ self.label_28.setObjectName(_fromUtf8("label_28"))
+ self.gridLayout_17.addWidget(self.label_28, 0, 2, 1, 1)
+ self.daybook_filters_frame = QtGui.QFrame(self.tab_daybook)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(
+ self.daybook_filters_frame.sizePolicy(
+ ).hasHeightForWidth(
+ ))
+ self.daybook_filters_frame.setSizePolicy(sizePolicy)
+ self.daybook_filters_frame.setFrameShape(QtGui.QFrame.NoFrame)
+ self.daybook_filters_frame.setFrameShadow(QtGui.QFrame.Raised)
+ self.daybook_filters_frame.setObjectName(
+ _fromUtf8("daybook_filters_frame"))
+ self.gridLayout_18 = QtGui.QGridLayout(self.daybook_filters_frame)
+ self.gridLayout_18.setMargin(0)
+ self.gridLayout_18.setSpacing(0)
+ self.gridLayout_18.setObjectName(_fromUtf8("gridLayout_18"))
+ self.label_7 = QtGui.QLabel(self.daybook_filters_frame)
+ self.label_7.setObjectName(_fromUtf8("label_7"))
+ self.gridLayout_18.addWidget(self.label_7, 0, 0, 1, 1)
+ self.daybook_filters_pushButton = QtGui.QPushButton(
+ self.daybook_filters_frame)
+ self.daybook_filters_pushButton.setMaximumSize(
+ QtCore.QSize(40, 16777215))
+ self.daybook_filters_pushButton.setText(_fromUtf8(""))
+ icon = QtGui.QIcon.fromTheme(_fromUtf8("help"))
+ self.daybook_filters_pushButton.setIcon(icon)
+ self.daybook_filters_pushButton.setObjectName(
+ _fromUtf8("daybook_filters_pushButton"))
+ self.gridLayout_18.addWidget(
+ self.daybook_filters_pushButton,
+ 0,
+ 1,
+ 1,
+ 1)
+ self.daybook_filters_lineEdit = QtGui.QLineEdit(
+ self.daybook_filters_frame)
+ self.daybook_filters_lineEdit.setObjectName(
+ _fromUtf8("daybook_filters_lineEdit"))
+ self.gridLayout_18.addWidget(self.daybook_filters_lineEdit, 1, 0, 1, 2)
+ self.gridLayout_17.addWidget(self.daybook_filters_frame, 0, 4, 2, 1)
+ self.verticalLayout_5.addLayout(self.gridLayout_17)
self.daybookTextBrowser = QtGui.QTextBrowser(self.tab_daybook)
self.daybookTextBrowser.setObjectName(_fromUtf8("daybookTextBrowser"))
- self.gridlayout.addWidget(self.daybookTextBrowser, 2, 0, 1, 7)
- self.main_tabWidget.addTab(self.tab_daybook, icon11, _fromUtf8(""))
+ self.verticalLayout_5.addWidget(self.daybookTextBrowser)
+ self.main_tabWidget.addTab(self.tab_daybook, icon12, _fromUtf8(""))
self.tab_accounts = QtGui.QWidget()
self.tab_accounts.setObjectName(_fromUtf8("tab_accounts"))
self.gridLayout_9 = QtGui.QGridLayout(self.tab_accounts)
self.gridLayout_9.setObjectName(_fromUtf8("gridLayout_9"))
self.horizontalLayout_28 = QtGui.QHBoxLayout()
- self.horizontalLayout_28.setObjectName(_fromUtf8("horizontalLayout_28"))
+ self.horizontalLayout_28.setObjectName(
+ _fromUtf8("horizontalLayout_28"))
self.label_54 = QtGui.QLabel(self.tab_accounts)
self.label_54.setObjectName(_fromUtf8("label_54"))
self.horizontalLayout_28.addWidget(self.label_54)
self.accounts_debt_comboBox = QtGui.QComboBox(self.tab_accounts)
self.accounts_debt_comboBox.setMinimumSize(QtCore.QSize(100, 0))
- self.accounts_debt_comboBox.setObjectName(_fromUtf8("accounts_debt_comboBox"))
+ self.accounts_debt_comboBox.setObjectName(
+ _fromUtf8("accounts_debt_comboBox"))
self.accounts_debt_comboBox.addItem(_fromUtf8(""))
self.accounts_debt_comboBox.addItem(_fromUtf8(""))
self.horizontalLayout_28.addWidget(self.accounts_debt_comboBox)
self.label_24 = QtGui.QLabel(self.tab_accounts)
self.label_24.setObjectName(_fromUtf8("label_24"))
self.horizontalLayout_28.addWidget(self.label_24)
- self.accounts_min_doubleSpinBox = QtGui.QDoubleSpinBox(self.tab_accounts)
- self.accounts_min_doubleSpinBox.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.accounts_min_doubleSpinBox = QtGui.QDoubleSpinBox(
+ self.tab_accounts)
+ self.accounts_min_doubleSpinBox.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.accounts_min_doubleSpinBox.setPrefix(_fromUtf8(""))
self.accounts_min_doubleSpinBox.setMaximum(1000.0)
- self.accounts_min_doubleSpinBox.setObjectName(_fromUtf8("accounts_min_doubleSpinBox"))
+ self.accounts_min_doubleSpinBox.setObjectName(
+ _fromUtf8("accounts_min_doubleSpinBox"))
self.horizontalLayout_28.addWidget(self.accounts_min_doubleSpinBox)
- self.loadAccountsTable_pushButton = QtGui.QPushButton(self.tab_accounts)
+ self.loadAccountsTable_pushButton = QtGui.QPushButton(
+ self.tab_accounts)
self.loadAccountsTable_pushButton.setIcon(icon8)
- self.loadAccountsTable_pushButton.setObjectName(_fromUtf8("loadAccountsTable_pushButton"))
+ self.loadAccountsTable_pushButton.setObjectName(
+ _fromUtf8("loadAccountsTable_pushButton"))
self.horizontalLayout_28.addWidget(self.loadAccountsTable_pushButton)
self.gridLayout_9.addLayout(self.horizontalLayout_28, 0, 0, 1, 1)
- spacerItem15 = QtGui.QSpacerItem(206, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
- self.gridLayout_9.addItem(spacerItem15, 0, 1, 1, 1)
- self.printAccountsTable_pushButton = QtGui.QPushButton(self.tab_accounts)
- self.printAccountsTable_pushButton.setIcon(icon9)
- self.printAccountsTable_pushButton.setObjectName(_fromUtf8("printAccountsTable_pushButton"))
- self.gridLayout_9.addWidget(self.printAccountsTable_pushButton, 0, 2, 1, 2)
- self.printSelectedAccounts_pushButton = QtGui.QPushButton(self.tab_accounts)
- self.printSelectedAccounts_pushButton.setIcon(icon9)
- self.printSelectedAccounts_pushButton.setObjectName(_fromUtf8("printSelectedAccounts_pushButton"))
- self.gridLayout_9.addWidget(self.printSelectedAccounts_pushButton, 0, 4, 1, 1)
+ spacerItem17 = QtGui.QSpacerItem(
+ 206,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
+ self.gridLayout_9.addItem(spacerItem17, 0, 1, 1, 1)
+ self.printAccountsTable_pushButton = QtGui.QPushButton(
+ self.tab_accounts)
+ self.printAccountsTable_pushButton.setIcon(icon10)
+ self.printAccountsTable_pushButton.setObjectName(
+ _fromUtf8("printAccountsTable_pushButton"))
+ self.gridLayout_9.addWidget(
+ self.printAccountsTable_pushButton,
+ 0,
+ 2,
+ 1,
+ 2)
+ self.printSelectedAccounts_pushButton = QtGui.QPushButton(
+ self.tab_accounts)
+ self.printSelectedAccounts_pushButton.setIcon(icon10)
+ self.printSelectedAccounts_pushButton.setObjectName(
+ _fromUtf8("printSelectedAccounts_pushButton"))
+ self.gridLayout_9.addWidget(
+ self.printSelectedAccounts_pushButton,
+ 0,
+ 4,
+ 1,
+ 1)
self.accounts_tableWidget = QtGui.QTableWidget(self.tab_accounts)
font = QtGui.QFont()
font.setPointSize(9)
self.accounts_tableWidget.setFont(font)
self.accounts_tableWidget.setAlternatingRowColors(True)
- self.accounts_tableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
- self.accounts_tableWidget.setObjectName(_fromUtf8("accounts_tableWidget"))
+ self.accounts_tableWidget.setSelectionBehavior(
+ QtGui.QAbstractItemView.SelectRows)
+ self.accounts_tableWidget.setObjectName(
+ _fromUtf8("accounts_tableWidget"))
self.accounts_tableWidget.setColumnCount(0)
self.accounts_tableWidget.setRowCount(0)
self.gridLayout_9.addWidget(self.accounts_tableWidget, 1, 0, 1, 5)
- spacerItem16 = QtGui.QSpacerItem(746, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
- self.gridLayout_9.addItem(spacerItem16, 2, 0, 1, 2)
+ spacerItem18 = QtGui.QSpacerItem(
+ 746,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
+ self.gridLayout_9.addItem(spacerItem18, 2, 0, 1, 2)
self.label_43 = QtGui.QLabel(self.tab_accounts)
self.label_43.setObjectName(_fromUtf8("label_43"))
self.gridLayout_9.addWidget(self.label_43, 2, 2, 1, 1)
- self.accountsTotal_doubleSpinBox = QtGui.QDoubleSpinBox(self.tab_accounts)
+ self.accountsTotal_doubleSpinBox = QtGui.QDoubleSpinBox(
+ self.tab_accounts)
self.accountsTotal_doubleSpinBox.setEnabled(True)
self.accountsTotal_doubleSpinBox.setMinimumSize(QtCore.QSize(150, 0))
font = QtGui.QFont()
@@ -1782,45 +2499,75 @@ class Ui_MainWindow(object):
font.setBold(True)
font.setWeight(75)
self.accountsTotal_doubleSpinBox.setFont(font)
- self.accountsTotal_doubleSpinBox.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.accountsTotal_doubleSpinBox.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.accountsTotal_doubleSpinBox.setReadOnly(True)
self.accountsTotal_doubleSpinBox.setPrefix(_fromUtf8(""))
self.accountsTotal_doubleSpinBox.setMaximum(1000000.0)
- self.accountsTotal_doubleSpinBox.setObjectName(_fromUtf8("accountsTotal_doubleSpinBox"))
- self.gridLayout_9.addWidget(self.accountsTotal_doubleSpinBox, 2, 3, 1, 2)
+ self.accountsTotal_doubleSpinBox.setObjectName(
+ _fromUtf8("accountsTotal_doubleSpinBox"))
+ self.gridLayout_9.addWidget(
+ self.accountsTotal_doubleSpinBox,
+ 2,
+ 3,
+ 1,
+ 2)
self.main_tabWidget.addTab(self.tab_accounts, _fromUtf8(""))
self.tab_bulk_mail = QtGui.QWidget()
self.tab_bulk_mail.setObjectName(_fromUtf8("tab_bulk_mail"))
self.gridLayout_10 = QtGui.QGridLayout(self.tab_bulk_mail)
self.gridLayout_10.setObjectName(_fromUtf8("gridLayout_10"))
self.horizontalLayout_18 = QtGui.QHBoxLayout()
- self.horizontalLayout_18.setObjectName(_fromUtf8("horizontalLayout_18"))
+ self.horizontalLayout_18.setObjectName(
+ _fromUtf8("horizontalLayout_18"))
self.recallLoad_pushButton = QtGui.QPushButton(self.tab_bulk_mail)
- self.recallLoad_pushButton.setObjectName(_fromUtf8("recallLoad_pushButton"))
+ self.recallLoad_pushButton.setObjectName(
+ _fromUtf8("recallLoad_pushButton"))
self.horizontalLayout_18.addWidget(self.recallLoad_pushButton)
self.gridLayout_10.addLayout(self.horizontalLayout_18, 1, 0, 1, 1)
self.bulkMailPrint_pushButton = QtGui.QPushButton(self.tab_bulk_mail)
- self.bulkMailPrint_pushButton.setIcon(icon9)
+ self.bulkMailPrint_pushButton.setIcon(icon10)
self.bulkMailPrint_pushButton.setIconSize(QtCore.QSize(24, 24))
- self.bulkMailPrint_pushButton.setObjectName(_fromUtf8("bulkMailPrint_pushButton"))
+ self.bulkMailPrint_pushButton.setObjectName(
+ _fromUtf8("bulkMailPrint_pushButton"))
self.gridLayout_10.addWidget(self.bulkMailPrint_pushButton, 1, 5, 1, 1)
self.bulk_mailings_treeView = QtGui.QTreeView(self.tab_bulk_mail)
- self.bulk_mailings_treeView.setObjectName(_fromUtf8("bulk_mailings_treeView"))
+ self.bulk_mailings_treeView.setObjectName(
+ _fromUtf8("bulk_mailings_treeView"))
self.gridLayout_10.addWidget(self.bulk_mailings_treeView, 2, 0, 1, 6)
- self.bulk_mail_expand_pushButton = QtGui.QPushButton(self.tab_bulk_mail)
- self.bulk_mail_expand_pushButton.setObjectName(_fromUtf8("bulk_mail_expand_pushButton"))
- self.gridLayout_10.addWidget(self.bulk_mail_expand_pushButton, 1, 2, 1, 1)
- self.bulkMail_options_pushButton = QtGui.QPushButton(self.tab_bulk_mail)
- self.bulkMail_options_pushButton.setObjectName(_fromUtf8("bulkMail_options_pushButton"))
- self.gridLayout_10.addWidget(self.bulkMail_options_pushButton, 1, 4, 1, 1)
- spacerItem17 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
- self.gridLayout_10.addItem(spacerItem17, 1, 1, 1, 1)
+ self.bulk_mail_expand_pushButton = QtGui.QPushButton(
+ self.tab_bulk_mail)
+ self.bulk_mail_expand_pushButton.setObjectName(
+ _fromUtf8("bulk_mail_expand_pushButton"))
+ self.gridLayout_10.addWidget(
+ self.bulk_mail_expand_pushButton,
+ 1,
+ 2,
+ 1,
+ 1)
+ self.bulkMail_options_pushButton = QtGui.QPushButton(
+ self.tab_bulk_mail)
+ self.bulkMail_options_pushButton.setObjectName(
+ _fromUtf8("bulkMail_options_pushButton"))
+ self.gridLayout_10.addWidget(
+ self.bulkMail_options_pushButton,
+ 1,
+ 4,
+ 1,
+ 1)
+ spacerItem19 = QtGui.QSpacerItem(
+ 40,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
+ self.gridLayout_10.addItem(spacerItem19, 1, 1, 1, 1)
self.main_tabWidget.addTab(self.tab_bulk_mail, _fromUtf8(""))
self.tab_feescales = QtGui.QWidget()
self.tab_feescales.setObjectName(_fromUtf8("tab_feescales"))
self.horizontalLayout_16 = QtGui.QHBoxLayout(self.tab_feescales)
self.horizontalLayout_16.setMargin(3)
- self.horizontalLayout_16.setObjectName(_fromUtf8("horizontalLayout_16"))
+ self.horizontalLayout_16.setObjectName(
+ _fromUtf8("horizontalLayout_16"))
self.verticalLayout_29 = QtGui.QVBoxLayout()
self.verticalLayout_29.setObjectName(_fromUtf8("verticalLayout_29"))
self.feeScale_label = QtGui.QLabel(self.tab_feescales)
@@ -1842,14 +2589,20 @@ class Ui_MainWindow(object):
self.verticalLayout_10.setMargin(3)
self.verticalLayout_10.setObjectName(_fromUtf8("verticalLayout_10"))
self.feescales_available_label = QtGui.QLabel(self.frame_5)
- self.feescales_available_label.setObjectName(_fromUtf8("feescales_available_label"))
+ self.feescales_available_label.setObjectName(
+ _fromUtf8("feescales_available_label"))
self.verticalLayout_10.addWidget(self.feescales_available_label)
self.chooseFeescale_comboBox = QtGui.QComboBox(self.frame_5)
self.chooseFeescale_comboBox.setEnabled(True)
- self.chooseFeescale_comboBox.setObjectName(_fromUtf8("chooseFeescale_comboBox"))
+ self.chooseFeescale_comboBox.setObjectName(
+ _fromUtf8("chooseFeescale_comboBox"))
self.verticalLayout_10.addWidget(self.chooseFeescale_comboBox)
- spacerItem18 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_10.addItem(spacerItem18)
+ spacerItem20 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_10.addItem(spacerItem20)
self.frame_6 = QtGui.QFrame(self.frame_5)
self.frame_6.setEnabled(True)
self.frame_6.setFrameShape(QtGui.QFrame.StyledPanel)
@@ -1863,50 +2616,79 @@ class Ui_MainWindow(object):
self.gridLayout_16.addWidget(self.label_26, 0, 0, 1, 1)
self.search_descriptions_radioButton = QtGui.QRadioButton(self.frame_6)
self.search_descriptions_radioButton.setChecked(True)
- self.search_descriptions_radioButton.setObjectName(_fromUtf8("search_descriptions_radioButton"))
- self.gridLayout_16.addWidget(self.search_descriptions_radioButton, 2, 0, 1, 2)
+ self.search_descriptions_radioButton.setObjectName(
+ _fromUtf8("search_descriptions_radioButton"))
+ self.gridLayout_16.addWidget(
+ self.search_descriptions_radioButton,
+ 2,
+ 0,
+ 1,
+ 2)
self.feeSearch_pushButton = QtGui.QPushButton(self.frame_6)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.feeSearch_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.feeSearch_pushButton.sizePolicy().hasHeightForWidth())
self.feeSearch_pushButton.setSizePolicy(sizePolicy)
self.feeSearch_pushButton.setMinimumSize(QtCore.QSize(0, 0))
self.feeSearch_pushButton.setMaximumSize(QtCore.QSize(70, 28))
self.feeSearch_pushButton.setText(_fromUtf8(""))
self.feeSearch_pushButton.setIcon(icon3)
self.feeSearch_pushButton.setIconSize(QtCore.QSize(24, 24))
- self.feeSearch_pushButton.setObjectName(_fromUtf8("feeSearch_pushButton"))
+ self.feeSearch_pushButton.setObjectName(
+ _fromUtf8("feeSearch_pushButton"))
self.gridLayout_16.addWidget(self.feeSearch_pushButton, 0, 1, 1, 1)
self.feeSearch_lineEdit = QtGui.QLineEdit(self.frame_6)
self.feeSearch_lineEdit.setObjectName(_fromUtf8("feeSearch_lineEdit"))
self.gridLayout_16.addWidget(self.feeSearch_lineEdit, 1, 0, 1, 2)
self.search_itemcodes_radioButton = QtGui.QRadioButton(self.frame_6)
self.search_itemcodes_radioButton.setChecked(False)
- self.search_itemcodes_radioButton.setObjectName(_fromUtf8("search_itemcodes_radioButton"))
- self.gridLayout_16.addWidget(self.search_itemcodes_radioButton, 3, 0, 1, 2)
+ self.search_itemcodes_radioButton.setObjectName(
+ _fromUtf8("search_itemcodes_radioButton"))
+ self.gridLayout_16.addWidget(
+ self.search_itemcodes_radioButton,
+ 3,
+ 0,
+ 1,
+ 2)
self.feesearch_results_label = QtGui.QLabel(self.frame_6)
self.feesearch_results_label.setAlignment(QtCore.Qt.AlignCenter)
- self.feesearch_results_label.setObjectName(_fromUtf8("feesearch_results_label"))
+ self.feesearch_results_label.setObjectName(
+ _fromUtf8("feesearch_results_label"))
self.gridLayout_16.addWidget(self.feesearch_results_label, 4, 0, 1, 2)
self.verticalLayout_10.addWidget(self.frame_6)
- spacerItem19 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_10.addItem(spacerItem19)
+ spacerItem21 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_10.addItem(spacerItem21)
self.hide_rare_feescale_codes_checkBox = QtGui.QCheckBox(self.frame_5)
self.hide_rare_feescale_codes_checkBox.setChecked(True)
- self.hide_rare_feescale_codes_checkBox.setObjectName(_fromUtf8("hide_rare_feescale_codes_checkBox"))
- self.verticalLayout_10.addWidget(self.hide_rare_feescale_codes_checkBox)
+ self.hide_rare_feescale_codes_checkBox.setObjectName(
+ _fromUtf8("hide_rare_feescale_codes_checkBox"))
+ self.verticalLayout_10.addWidget(
+ self.hide_rare_feescale_codes_checkBox)
self.feeExpand_radioButton = QtGui.QRadioButton(self.frame_5)
self.feeExpand_radioButton.setEnabled(True)
- self.feeExpand_radioButton.setObjectName(_fromUtf8("feeExpand_radioButton"))
+ self.feeExpand_radioButton.setObjectName(
+ _fromUtf8("feeExpand_radioButton"))
self.verticalLayout_10.addWidget(self.feeExpand_radioButton)
self.feeCompress_radioButton = QtGui.QRadioButton(self.frame_5)
self.feeCompress_radioButton.setEnabled(True)
self.feeCompress_radioButton.setChecked(True)
- self.feeCompress_radioButton.setObjectName(_fromUtf8("feeCompress_radioButton"))
+ self.feeCompress_radioButton.setObjectName(
+ _fromUtf8("feeCompress_radioButton"))
self.verticalLayout_10.addWidget(self.feeCompress_radioButton)
- spacerItem20 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_10.addItem(spacerItem20)
+ spacerItem22 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_10.addItem(spacerItem22)
self.groupBox = QtGui.QGroupBox(self.frame_5)
self.groupBox.setObjectName(_fromUtf8("groupBox"))
self.verticalLayout_13 = QtGui.QVBoxLayout(self.groupBox)
@@ -1914,29 +2696,41 @@ class Ui_MainWindow(object):
self.verticalLayout_13.setMargin(3)
self.verticalLayout_13.setObjectName(_fromUtf8("verticalLayout_13"))
self.documents_pushButton = QtGui.QPushButton(self.groupBox)
- self.documents_pushButton.setIcon(icon11)
- self.documents_pushButton.setObjectName(_fromUtf8("documents_pushButton"))
+ self.documents_pushButton.setIcon(icon12)
+ self.documents_pushButton.setObjectName(
+ _fromUtf8("documents_pushButton"))
self.verticalLayout_13.addWidget(self.documents_pushButton)
self.verticalLayout_10.addWidget(self.groupBox)
- spacerItem21 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_10.addItem(spacerItem21)
+ spacerItem23 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_10.addItem(spacerItem23)
self.feeadjuster_groupBox = QtGui.QGroupBox(self.frame_5)
self.feeadjuster_groupBox.setEnabled(True)
self.feeadjuster_groupBox.setToolTip(_fromUtf8(""))
self.feeadjuster_groupBox.setCheckable(False)
self.feeadjuster_groupBox.setChecked(False)
- self.feeadjuster_groupBox.setObjectName(_fromUtf8("feeadjuster_groupBox"))
+ self.feeadjuster_groupBox.setObjectName(
+ _fromUtf8("feeadjuster_groupBox"))
self.verticalLayout_35 = QtGui.QVBoxLayout(self.feeadjuster_groupBox)
self.verticalLayout_35.setContentsMargins(2, 6, 2, 6)
self.verticalLayout_35.setObjectName(_fromUtf8("verticalLayout_35"))
- self.feetable_xml_pushButton = QtGui.QPushButton(self.feeadjuster_groupBox)
- self.feetable_xml_pushButton.setObjectName(_fromUtf8("feetable_xml_pushButton"))
+ self.feetable_xml_pushButton = QtGui.QPushButton(
+ self.feeadjuster_groupBox)
+ self.feetable_xml_pushButton.setObjectName(
+ _fromUtf8("feetable_xml_pushButton"))
self.verticalLayout_35.addWidget(self.feetable_xml_pushButton)
- self.feescale_tester_pushButton = QtGui.QPushButton(self.feeadjuster_groupBox)
- self.feescale_tester_pushButton.setObjectName(_fromUtf8("feescale_tester_pushButton"))
+ self.feescale_tester_pushButton = QtGui.QPushButton(
+ self.feeadjuster_groupBox)
+ self.feescale_tester_pushButton.setObjectName(
+ _fromUtf8("feescale_tester_pushButton"))
self.verticalLayout_35.addWidget(self.feescale_tester_pushButton)
- self.reload_feescales_pushButton = QtGui.QPushButton(self.feeadjuster_groupBox)
- self.reload_feescales_pushButton.setObjectName(_fromUtf8("reload_feescales_pushButton"))
+ self.reload_feescales_pushButton = QtGui.QPushButton(
+ self.feeadjuster_groupBox)
+ self.reload_feescales_pushButton.setObjectName(
+ _fromUtf8("reload_feescales_pushButton"))
self.verticalLayout_35.addWidget(self.reload_feescales_pushButton)
self.verticalLayout_10.addWidget(self.feeadjuster_groupBox)
self.horizontalLayout_16.addWidget(self.frame_5)
@@ -1945,7 +2739,8 @@ class Ui_MainWindow(object):
self.tab_forum.setObjectName(_fromUtf8("tab_forum"))
self.horizontalLayout_20 = QtGui.QHBoxLayout(self.tab_forum)
self.horizontalLayout_20.setMargin(3)
- self.horizontalLayout_20.setObjectName(_fromUtf8("horizontalLayout_20"))
+ self.horizontalLayout_20.setObjectName(
+ _fromUtf8("horizontalLayout_20"))
self.splitter_3 = QtGui.QSplitter(self.tab_forum)
self.splitter_3.setOrientation(QtCore.Qt.Horizontal)
self.splitter_3.setObjectName(_fromUtf8("splitter_3"))
@@ -1954,7 +2749,8 @@ class Ui_MainWindow(object):
self.splitter.setObjectName(_fromUtf8("splitter"))
self.forum_treeWidget = QtGui.QTreeWidget(self.splitter)
self.forum_treeWidget.setAlternatingRowColors(True)
- self.forum_treeWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
+ self.forum_treeWidget.setSelectionMode(
+ QtGui.QAbstractItemView.ExtendedSelection)
self.forum_treeWidget.setAnimated(True)
self.forum_treeWidget.setObjectName(_fromUtf8("forum_treeWidget"))
self.forum_treeWidget.headerItem().setText(0, _fromUtf8("1"))
@@ -1982,25 +2778,35 @@ class Ui_MainWindow(object):
self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6"))
self.forumReply_pushButton = QtGui.QPushButton(self.frame_20)
self.forumReply_pushButton.setEnabled(False)
- self.forumReply_pushButton.setObjectName(_fromUtf8("forumReply_pushButton"))
+ self.forumReply_pushButton.setObjectName(
+ _fromUtf8("forumReply_pushButton"))
self.horizontalLayout_6.addWidget(self.forumReply_pushButton)
self.forumDelete_pushButton = QtGui.QPushButton(self.frame_20)
self.forumDelete_pushButton.setEnabled(False)
icon16 = QtGui.QIcon()
- icon16.addPixmap(QtGui.QPixmap(_fromUtf8(":/eraser.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon16.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/eraser.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.forumDelete_pushButton.setIcon(icon16)
- self.forumDelete_pushButton.setObjectName(_fromUtf8("forumDelete_pushButton"))
+ self.forumDelete_pushButton.setObjectName(
+ _fromUtf8("forumDelete_pushButton"))
self.horizontalLayout_6.addWidget(self.forumDelete_pushButton)
self.forumParent_pushButton = QtGui.QPushButton(self.frame_20)
self.forumParent_pushButton.setEnabled(False)
- self.forumParent_pushButton.setObjectName(_fromUtf8("forumParent_pushButton"))
+ self.forumParent_pushButton.setObjectName(
+ _fromUtf8("forumParent_pushButton"))
self.horizontalLayout_6.addWidget(self.forumParent_pushButton)
self.verticalLayout_11.addLayout(self.horizontalLayout_6)
self.forumNewTopic_pushButton = QtGui.QPushButton(self.frame_20)
icon17 = QtGui.QIcon()
- icon17.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/mail_new.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon17.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/icons/mail_new.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.forumNewTopic_pushButton.setIcon(icon17)
- self.forumNewTopic_pushButton.setObjectName(_fromUtf8("forumNewTopic_pushButton"))
+ self.forumNewTopic_pushButton.setObjectName(
+ _fromUtf8("forumNewTopic_pushButton"))
self.verticalLayout_11.addWidget(self.forumNewTopic_pushButton)
self.frame_9 = QtGui.QFrame(self.frame_20)
self.frame_9.setEnabled(False)
@@ -2014,22 +2820,31 @@ class Ui_MainWindow(object):
self.label_36.setObjectName(_fromUtf8("label_36"))
self.gridLayout_30.addWidget(self.label_36, 0, 0, 1, 2)
self.feeSearch_lineEdit_2 = QtGui.QLineEdit(self.frame_9)
- self.feeSearch_lineEdit_2.setObjectName(_fromUtf8("feeSearch_lineEdit_2"))
+ self.feeSearch_lineEdit_2.setObjectName(
+ _fromUtf8("feeSearch_lineEdit_2"))
self.gridLayout_30.addWidget(self.feeSearch_lineEdit_2, 1, 0, 1, 2)
- spacerItem22 = QtGui.QSpacerItem(67, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
- self.gridLayout_30.addItem(spacerItem22, 2, 0, 1, 1)
+ spacerItem24 = QtGui.QSpacerItem(
+ 67,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
+ self.gridLayout_30.addItem(spacerItem24, 2, 0, 1, 1)
self.feeSearch_pushButton_2 = QtGui.QPushButton(self.frame_9)
self.feeSearch_pushButton_2.setEnabled(False)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.feeSearch_pushButton_2.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.feeSearch_pushButton_2.sizePolicy().hasHeightForWidth())
self.feeSearch_pushButton_2.setSizePolicy(sizePolicy)
self.feeSearch_pushButton_2.setMinimumSize(QtCore.QSize(80, 28))
self.feeSearch_pushButton_2.setMaximumSize(QtCore.QSize(70, 28))
self.feeSearch_pushButton_2.setIcon(icon3)
self.feeSearch_pushButton_2.setIconSize(QtCore.QSize(24, 24))
- self.feeSearch_pushButton_2.setObjectName(_fromUtf8("feeSearch_pushButton_2"))
+ self.feeSearch_pushButton_2.setObjectName(
+ _fromUtf8("feeSearch_pushButton_2"))
self.gridLayout_30.addWidget(self.feeSearch_pushButton_2, 2, 1, 1, 1)
self.verticalLayout_11.addWidget(self.frame_9)
self.frame_10 = QtGui.QFrame(self.frame_20)
@@ -2037,13 +2852,15 @@ class Ui_MainWindow(object):
self.frame_10.setFrameShadow(QtGui.QFrame.Raised)
self.frame_10.setObjectName(_fromUtf8("frame_10"))
self.horizontalLayout_25 = QtGui.QHBoxLayout(self.frame_10)
- self.horizontalLayout_25.setObjectName(_fromUtf8("horizontalLayout_25"))
+ self.horizontalLayout_25.setObjectName(
+ _fromUtf8("horizontalLayout_25"))
self.label_37 = QtGui.QLabel(self.frame_10)
self.label_37.setAlignment(QtCore.Qt.AlignCenter)
self.label_37.setObjectName(_fromUtf8("label_37"))
self.horizontalLayout_25.addWidget(self.label_37)
self.forumViewFilter_comboBox = QtGui.QComboBox(self.frame_10)
- self.forumViewFilter_comboBox.setObjectName(_fromUtf8("forumViewFilter_comboBox"))
+ self.forumViewFilter_comboBox.setObjectName(
+ _fromUtf8("forumViewFilter_comboBox"))
self.forumViewFilter_comboBox.addItem(_fromUtf8(""))
self.horizontalLayout_25.addWidget(self.forumViewFilter_comboBox)
self.verticalLayout_11.addWidget(self.frame_10)
@@ -2052,21 +2869,41 @@ class Ui_MainWindow(object):
self.gridLayout_32 = QtGui.QGridLayout(self.groupBox_10)
self.gridLayout_32.setObjectName(_fromUtf8("gridLayout_32"))
self.forum_deletedposts_checkBox = QtGui.QCheckBox(self.groupBox_10)
- self.forum_deletedposts_checkBox.setObjectName(_fromUtf8("forum_deletedposts_checkBox"))
- self.gridLayout_32.addWidget(self.forum_deletedposts_checkBox, 0, 0, 1, 2)
+ self.forum_deletedposts_checkBox.setObjectName(
+ _fromUtf8("forum_deletedposts_checkBox"))
+ self.gridLayout_32.addWidget(
+ self.forum_deletedposts_checkBox,
+ 0,
+ 0,
+ 1,
+ 2)
self.split_replies_radioButton = QtGui.QRadioButton(self.groupBox_10)
self.split_replies_radioButton.setChecked(False)
- self.split_replies_radioButton.setObjectName(_fromUtf8("split_replies_radioButton"))
- self.gridLayout_32.addWidget(self.split_replies_radioButton, 1, 0, 1, 1)
+ self.split_replies_radioButton.setObjectName(
+ _fromUtf8("split_replies_radioButton"))
+ self.gridLayout_32.addWidget(
+ self.split_replies_radioButton,
+ 1,
+ 0,
+ 1,
+ 1)
self.group_replies_radioButton = QtGui.QRadioButton(self.groupBox_10)
self.group_replies_radioButton.setChecked(True)
- self.group_replies_radioButton.setObjectName(_fromUtf8("group_replies_radioButton"))
- self.gridLayout_32.addWidget(self.group_replies_radioButton, 1, 1, 1, 1)
+ self.group_replies_radioButton.setObjectName(
+ _fromUtf8("group_replies_radioButton"))
+ self.gridLayout_32.addWidget(
+ self.group_replies_radioButton,
+ 1,
+ 1,
+ 1,
+ 1)
self.forumCollapse_pushButton = QtGui.QPushButton(self.groupBox_10)
- self.forumCollapse_pushButton.setObjectName(_fromUtf8("forumCollapse_pushButton"))
+ self.forumCollapse_pushButton.setObjectName(
+ _fromUtf8("forumCollapse_pushButton"))
self.gridLayout_32.addWidget(self.forumCollapse_pushButton, 2, 0, 1, 1)
self.forumExpand_pushButton = QtGui.QPushButton(self.groupBox_10)
- self.forumExpand_pushButton.setObjectName(_fromUtf8("forumExpand_pushButton"))
+ self.forumExpand_pushButton.setObjectName(
+ _fromUtf8("forumExpand_pushButton"))
self.gridLayout_32.addWidget(self.forumExpand_pushButton, 2, 1, 1, 1)
self.verticalLayout_11.addWidget(self.groupBox_10)
self.horizontalLayout_20.addWidget(self.splitter_3)
@@ -2075,13 +2912,17 @@ class Ui_MainWindow(object):
self.tab_wiki.setObjectName(_fromUtf8("tab_wiki"))
self.horizontalLayout_33 = QtGui.QHBoxLayout(self.tab_wiki)
self.horizontalLayout_33.setMargin(3)
- self.horizontalLayout_33.setObjectName(_fromUtf8("horizontalLayout_33"))
+ self.horizontalLayout_33.setObjectName(
+ _fromUtf8("horizontalLayout_33"))
self.wiki_webView = QtWebKit.QWebView(self.tab_wiki)
self.wiki_webView.setUrl(QtCore.QUrl(_fromUtf8("about:blank")))
self.wiki_webView.setObjectName(_fromUtf8("wiki_webView"))
self.horizontalLayout_33.addWidget(self.wiki_webView)
icon18 = QtGui.QIcon()
- icon18.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/wikipedia.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon18.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/icons/wikipedia.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.main_tabWidget.addTab(self.tab_wiki, icon18, _fromUtf8(""))
self.horizontalLayout_7.addWidget(self.main_tabWidget)
self.scrollArea_main.setWidget(self.scrollAreaWidgetContents_12)
@@ -2110,6 +2951,8 @@ class Ui_MainWindow(object):
self.menuMode.setObjectName(_fromUtf8("menuMode"))
self.menuCashbook = QtGui.QMenu(self.menu_Prefences)
self.menuCashbook.setObjectName(_fromUtf8("menuCashbook"))
+ self.menuDaybook = QtGui.QMenu(self.menu_Prefences)
+ self.menuDaybook.setObjectName(_fromUtf8("menuDaybook"))
self.menuTools = QtGui.QMenu(self.menubar)
self.menuTools.setObjectName(_fromUtf8("menuTools"))
MainWindow.setMenuBar(self.menubar)
@@ -2117,64 +2960,95 @@ class Ui_MainWindow(object):
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.action_save_patient = QtGui.QAction(MainWindow)
- self.action_save_patient.setObjectName(_fromUtf8("action_save_patient"))
+ self.action_save_patient.setObjectName(
+ _fromUtf8("action_save_patient"))
self.action_Open_Patient = QtGui.QAction(MainWindow)
- self.action_Open_Patient.setObjectName(_fromUtf8("action_Open_Patient"))
+ self.action_Open_Patient.setObjectName(
+ _fromUtf8("action_Open_Patient"))
self.action_About = QtGui.QAction(MainWindow)
self.action_About.setObjectName(_fromUtf8("action_About"))
self.action_About_QT = QtGui.QAction(MainWindow)
self.action_About_QT.setObjectName(_fromUtf8("action_About_QT"))
self.action_Quit = QtGui.QAction(MainWindow)
icon19 = QtGui.QIcon()
- icon19.addPixmap(QtGui.QPixmap(_fromUtf8(":/exit.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon19.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/exit.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.action_Quit.setIcon(icon19)
self.action_Quit.setObjectName(_fromUtf8("action_Quit"))
self.actionClear_Today_s_Emergency_Slots = QtGui.QAction(MainWindow)
- self.actionClear_Today_s_Emergency_Slots.setObjectName(_fromUtf8("actionClear_Today_s_Emergency_Slots"))
+ self.actionClear_Today_s_Emergency_Slots.setObjectName(
+ _fromUtf8("actionClear_Today_s_Emergency_Slots"))
self.actionAppointment_Tools = QtGui.QAction(MainWindow)
- self.actionAppointment_Tools.setObjectName(_fromUtf8("actionAppointment_Tools"))
+ self.actionAppointment_Tools.setObjectName(
+ _fromUtf8("actionAppointment_Tools"))
self.actionChange_Language = QtGui.QAction(MainWindow)
- self.actionChange_Language.setObjectName(_fromUtf8("actionChange_Language"))
+ self.actionChange_Language.setObjectName(
+ _fromUtf8("actionChange_Language"))
self.actionFull_Screen_Mode_Ctrl_Alt_F = QtGui.QAction(MainWindow)
self.actionFull_Screen_Mode_Ctrl_Alt_F.setCheckable(True)
- self.actionFull_Screen_Mode_Ctrl_Alt_F.setObjectName(_fromUtf8("actionFull_Screen_Mode_Ctrl_Alt_F"))
+ self.actionFull_Screen_Mode_Ctrl_Alt_F.setObjectName(
+ _fromUtf8("actionFull_Screen_Mode_Ctrl_Alt_F"))
self.actionSet_Font_Size = QtGui.QAction(MainWindow)
- self.actionSet_Font_Size.setObjectName(_fromUtf8("actionSet_Font_Size"))
+ self.actionSet_Font_Size.setObjectName(
+ _fromUtf8("actionSet_Font_Size"))
self.action_forum_show_advanced_options = QtGui.QAction(MainWindow)
self.action_forum_show_advanced_options.setCheckable(True)
- self.action_forum_show_advanced_options.setObjectName(_fromUtf8("action_forum_show_advanced_options"))
+ self.action_forum_show_advanced_options.setObjectName(
+ _fromUtf8("action_forum_show_advanced_options"))
self.actionTable_View_For_Charting = QtGui.QAction(MainWindow)
self.actionTable_View_For_Charting.setCheckable(True)
- self.actionTable_View_For_Charting.setObjectName(_fromUtf8("actionTable_View_For_Charting"))
+ self.actionTable_View_For_Charting.setObjectName(
+ _fromUtf8("actionTable_View_For_Charting"))
self.actionNHS_Form_Settings = QtGui.QAction(MainWindow)
- self.actionNHS_Form_Settings.setObjectName(_fromUtf8("actionNHS_Form_Settings"))
+ self.actionNHS_Form_Settings.setObjectName(
+ _fromUtf8("actionNHS_Form_Settings"))
self.actionTest_Print_a_GP17 = QtGui.QAction(MainWindow)
- self.actionTest_Print_a_GP17.setObjectName(_fromUtf8("actionTest_Print_a_GP17"))
+ self.actionTest_Print_a_GP17.setObjectName(
+ _fromUtf8("actionTest_Print_a_GP17"))
self.actionPrint_Daylists = QtGui.QAction(MainWindow)
- self.actionPrint_Daylists.setObjectName(_fromUtf8("actionPrint_Daylists"))
+ self.actionPrint_Daylists.setObjectName(
+ _fromUtf8("actionPrint_Daylists"))
self.actionSet_Clinician = QtGui.QAction(MainWindow)
- self.actionSet_Clinician.setObjectName(_fromUtf8("actionSet_Clinician"))
+ self.actionSet_Clinician.setObjectName(
+ _fromUtf8("actionSet_Clinician"))
self.actionSet_Assistant = QtGui.QAction(MainWindow)
- self.actionSet_Assistant.setObjectName(_fromUtf8("actionSet_Assistant"))
+ self.actionSet_Assistant.setObjectName(
+ _fromUtf8("actionSet_Assistant"))
self.actionSurgery_Mode = QtGui.QAction(MainWindow)
self.actionSurgery_Mode.setCheckable(True)
self.actionSurgery_Mode.setObjectName(_fromUtf8("actionSurgery_Mode"))
self.actionAdvanced_Record_Management = QtGui.QAction(MainWindow)
- self.actionAdvanced_Record_Management.setObjectName(_fromUtf8("actionAdvanced_Record_Management"))
- self.actionFix_Locked_New_Course_of_Treatment = QtGui.QAction(MainWindow)
- self.actionFix_Locked_New_Course_of_Treatment.setObjectName(_fromUtf8("actionFix_Locked_New_Course_of_Treatment"))
+ self.actionAdvanced_Record_Management.setObjectName(
+ _fromUtf8("actionAdvanced_Record_Management"))
+ self.actionFix_Locked_New_Course_of_Treatment = QtGui.QAction(
+ MainWindow)
+ self.actionFix_Locked_New_Course_of_Treatment.setObjectName(
+ _fromUtf8("actionFix_Locked_New_Course_of_Treatment"))
self.actionAllow_Full_Edit = QtGui.QAction(MainWindow)
self.actionAllow_Full_Edit.setCheckable(True)
- self.actionAllow_Full_Edit.setObjectName(_fromUtf8("actionAllow_Full_Edit"))
+ self.actionAllow_Full_Edit.setObjectName(
+ _fromUtf8("actionAllow_Full_Edit"))
self.actionSet_Surgery_Number = QtGui.QAction(MainWindow)
- self.actionSet_Surgery_Number.setObjectName(_fromUtf8("actionSet_Surgery_Number"))
+ self.actionSet_Surgery_Number.setObjectName(
+ _fromUtf8("actionSet_Surgery_Number"))
self.actionEdit_Phrasebooks = QtGui.QAction(MainWindow)
- self.actionEdit_Phrasebooks.setObjectName(_fromUtf8("actionEdit_Phrasebooks"))
+ self.actionEdit_Phrasebooks.setObjectName(
+ _fromUtf8("actionEdit_Phrasebooks"))
self.actionDocuments_Dialog = QtGui.QAction(MainWindow)
- self.actionDocuments_Dialog.setObjectName(_fromUtf8("actionDocuments_Dialog"))
- self.menuMenu.addAction(self.action_save_patient)
+ self.actionDocuments_Dialog.setObjectName(
+ _fromUtf8("actionDocuments_Dialog"))
+ self.actionAllow_Edit = QtGui.QAction(MainWindow)
+ self.actionAllow_Edit.setCheckable(True)
+ self.actionAllow_Edit.setObjectName(_fromUtf8("actionAllow_Edit"))
+ self.actionEnable_Filters = QtGui.QAction(MainWindow)
+ self.actionEnable_Filters.setCheckable(True)
+ self.actionEnable_Filters.setObjectName(
+ _fromUtf8("actionEnable_Filters"))
self.menuMenu.addAction(self.action_Open_Patient)
self.menuMenu.addSeparator()
+ self.menuMenu.addAction(self.action_save_patient)
self.menuMenu.addAction(self.actionPrint_Daylists)
self.menuMenu.addSeparator()
self.menuMenu.addAction(self.action_Quit)
@@ -2189,6 +3063,9 @@ class Ui_MainWindow(object):
self.menuCharts.addAction(self.actionTable_View_For_Charting)
self.menuMode.addAction(self.actionSurgery_Mode)
self.menuCashbook.addAction(self.actionAllow_Full_Edit)
+ self.menuDaybook.addSeparator()
+ self.menuDaybook.addAction(self.actionAllow_Edit)
+ self.menuDaybook.addAction(self.actionEnable_Filters)
self.menu_Prefences.addAction(self.actionChange_Language)
self.menu_Prefences.addSeparator()
self.menu_Prefences.addAction(self.menuView.menuAction())
@@ -2196,6 +3073,7 @@ class Ui_MainWindow(object):
self.menu_Prefences.addAction(self.menuAppointments.menuAction())
self.menu_Prefences.addAction(self.menuForum.menuAction())
self.menu_Prefences.addAction(self.menuCashbook.menuAction())
+ self.menu_Prefences.addAction(self.menuDaybook.menuAction())
self.menu_Prefences.addAction(self.menuPrinting.menuAction())
self.menu_Prefences.addSeparator()
self.menu_Prefences.addAction(self.menuMode.menuAction())
@@ -2244,26 +3122,57 @@ class Ui_MainWindow(object):
MainWindow.setTabOrder(self.debugBrowser, self.dayList_comboBox)
MainWindow.setTabOrder(self.dayList_comboBox, self.detailsBrowser)
MainWindow.setTabOrder(self.detailsBrowser, self.cashbookGoPushButton)
- MainWindow.setTabOrder(self.cashbookGoPushButton, self.cashbookPrintButton)
- MainWindow.setTabOrder(self.cashbookPrintButton, self.cashbookStartDateEdit)
- MainWindow.setTabOrder(self.cashbookStartDateEdit, self.cashbookEndDateEdit)
- MainWindow.setTabOrder(self.cashbookEndDateEdit, self.cashbookDentComboBox)
- MainWindow.setTabOrder(self.cashbookDentComboBox, self.daybookGoPushButton)
- MainWindow.setTabOrder(self.daybookGoPushButton, self.daybookPrintButton)
- MainWindow.setTabOrder(self.daybookPrintButton, self.daybookStartDateEdit)
- MainWindow.setTabOrder(self.daybookStartDateEdit, self.daybookEndDateEdit)
- MainWindow.setTabOrder(self.daybookEndDateEdit, self.daybookDent1ComboBox)
- MainWindow.setTabOrder(self.daybookDent1ComboBox, self.daybookDent2ComboBox)
- MainWindow.setTabOrder(self.daybookDent2ComboBox, self.daybookTextBrowser)
- MainWindow.setTabOrder(self.daybookTextBrowser, self.reception_textBrowser)
- MainWindow.setTabOrder(self.reception_textBrowser, self.printAccount_pushButton)
- MainWindow.setTabOrder(self.printAccount_pushButton, self.takePayment_pushButton)
- MainWindow.setTabOrder(self.takePayment_pushButton, self.perioChartDateComboBox)
+ MainWindow.setTabOrder(
+ self.cashbookGoPushButton,
+ self.cashbookPrintButton)
+ MainWindow.setTabOrder(
+ self.cashbookPrintButton,
+ self.cashbookStartDateEdit)
+ MainWindow.setTabOrder(
+ self.cashbookStartDateEdit,
+ self.cashbookEndDateEdit)
+ MainWindow.setTabOrder(
+ self.cashbookEndDateEdit,
+ self.cashbookDentComboBox)
+ MainWindow.setTabOrder(
+ self.cashbookDentComboBox,
+ self.daybookPrintButton)
+ MainWindow.setTabOrder(
+ self.daybookPrintButton,
+ self.daybookStartDateEdit)
+ MainWindow.setTabOrder(
+ self.daybookStartDateEdit,
+ self.daybookEndDateEdit)
+ MainWindow.setTabOrder(
+ self.daybookEndDateEdit,
+ self.daybookDent1ComboBox)
+ MainWindow.setTabOrder(
+ self.daybookDent1ComboBox,
+ self.daybookDent2ComboBox)
+ MainWindow.setTabOrder(
+ self.daybookDent2ComboBox,
+ self.daybookTextBrowser)
+ MainWindow.setTabOrder(
+ self.daybookTextBrowser,
+ self.reception_textBrowser)
+ MainWindow.setTabOrder(
+ self.reception_textBrowser,
+ self.printAccount_pushButton)
+ MainWindow.setTabOrder(
+ self.printAccount_pushButton,
+ self.takePayment_pushButton)
+ MainWindow.setTabOrder(
+ self.takePayment_pushButton,
+ self.perioChartDateComboBox)
MainWindow.setTabOrder(self.perioChartDateComboBox, self.dnt1comboBox)
MainWindow.setTabOrder(self.dnt1comboBox, self.scrollArea)
MainWindow.setTabOrder(self.scrollArea, self.accounts_tableWidget)
- MainWindow.setTabOrder(self.accounts_tableWidget, self.printSelectedAccounts_pushButton)
- MainWindow.setTabOrder(self.printSelectedAccounts_pushButton, self.titleEdit)
+ MainWindow.setTabOrder(
+ self.accounts_tableWidget,
+ self.printSelectedAccounts_pushButton)
+ MainWindow.setTabOrder(
+ self.printSelectedAccounts_pushButton,
+ self.titleEdit)
MainWindow.setTabOrder(self.titleEdit, self.fnameEdit)
MainWindow.setTabOrder(self.fnameEdit, self.snameEdit)
MainWindow.setTabOrder(self.snameEdit, self.dobEdit)
@@ -2289,33 +3198,56 @@ class Ui_MainWindow(object):
MainWindow.setTabOrder(self.pushButton_6, self.printEst_pushButton)
MainWindow.setTabOrder(self.printEst_pushButton, self.bpe_textBrowser)
MainWindow.setTabOrder(self.bpe_textBrowser, self.newBPE_pushButton)
- MainWindow.setTabOrder(self.newBPE_pushButton, self.planSummary_textBrowser)
- MainWindow.setTabOrder(self.planSummary_textBrowser, self.exampushButton)
+ MainWindow.setTabOrder(
+ self.newBPE_pushButton,
+ self.planSummary_textBrowser)
+ MainWindow.setTabOrder(
+ self.planSummary_textBrowser,
+ self.exampushButton)
MainWindow.setTabOrder(self.exampushButton, self.medNotes_pushButton)
- MainWindow.setTabOrder(self.medNotes_pushButton, self.perioCharts_scrollArea)
- MainWindow.setTabOrder(self.perioCharts_scrollArea, self.newPerioChartPushButton)
- MainWindow.setTabOrder(self.newPerioChartPushButton, self.bpeDateComboBox)
- MainWindow.setTabOrder(self.bpeDateComboBox, self.perioChartData_scrollArea)
- MainWindow.setTabOrder(self.perioChartData_scrollArea, self.contract_tabWidget)
+ MainWindow.setTabOrder(
+ self.medNotes_pushButton,
+ self.perioCharts_scrollArea)
+ MainWindow.setTabOrder(
+ self.perioCharts_scrollArea,
+ self.newPerioChartPushButton)
+ MainWindow.setTabOrder(
+ self.newPerioChartPushButton,
+ self.bpeDateComboBox)
+ MainWindow.setTabOrder(
+ self.bpeDateComboBox,
+ self.perioChartData_scrollArea)
+ MainWindow.setTabOrder(
+ self.perioChartData_scrollArea,
+ self.contract_tabWidget)
MainWindow.setTabOrder(self.contract_tabWidget, self.notesPrintButton)
- MainWindow.setTabOrder(self.notesPrintButton, self.loadAccountsTable_pushButton)
+ MainWindow.setTabOrder(
+ self.notesPrintButton,
+ self.loadAccountsTable_pushButton)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_("Open Molar"))
self.home_pushButton.setToolTip(_("Exit the Current Patient Record."))
self.home_pushButton.setShortcut(_("Esc"))
- self.newPatientPushButton.setToolTip(_("Add a New Patient to the database."))
- self.findButton.setToolTip(_("Click on this Button to search for in patient in your database."))
+ self.newPatientPushButton.setToolTip(
+ _("Add a New Patient to the database."))
+ self.findButton.setToolTip(
+ _("Click on this Button to search for in patient in your database."))
self.findButton.setText(_("Find"))
self.findButton.setShortcut(_("Ctrl+F"))
- self.backButton.setToolTip(_("This cycles back through the history of records loaded today."))
- self.reloadButton.setToolTip(_("Reload the patient from the database."))
+ self.backButton.setToolTip(
+ _("This cycles back through the history of records loaded today."))
+ self.reloadButton.setToolTip(
+ _("Reload the patient from the database."))
self.reloadButton.setShortcut(_("Ctrl+R"))
- self.nextButton.setToolTip(_("This cycles forwards through the history of records loaded today."))
- self.relatedpts_pushButton.setToolTip(_("Show patients who live at the same address, or who have a similar name."))
+ self.nextButton.setToolTip(
+ _("This cycles forwards through the history of records loaded today."))
+ self.relatedpts_pushButton.setToolTip(
+ _("Show patients who live at the same address, or who have a similar name."))
self.relatedpts_pushButton.setText(_("&Relatives"))
self.relatedpts_pushButton.setShortcut(_("Ctrl+G"))
- self.dayList_comboBox.setToolTip(_("A drop down box of all patients who have an appointment today."))
+ self.dayList_comboBox.setToolTip(
+ _("A drop down box of all patients who have an appointment today."))
self.patientEdit_groupBox.setTitle(_("Details"))
self.label_18.setText(_("Date of Birth"))
self.label_9.setText(_("Address3"))
@@ -2346,45 +3278,70 @@ class Ui_MainWindow(object):
self.label_4.setText(_("Address1"))
self.label_2.setText(_("First Name"))
self.label_13.setText(_("Tel (work)"))
- self.highlighted_fields_label.setText(_("Higlighted Fields are Mandatory for New Patients"))
+ self.abort_new_patient_pushButton.setText(_("Abort New Patient Entry"))
+ self.highlighted_fields_label.setText(
+ _("Higlighted Fields are Mandatory for New Patients"))
+ self.save_new_patient_pushButton.setText(_("Save New Patient"))
self.family_groupBox.setTitle(_("Family Groups"))
- self.family_button.setToolTip(_("Raise a dialog to edit the patients family grouping"))
+ self.family_button.setToolTip(
+ _("Raise a dialog to edit the patients family grouping"))
self.family_button.setText(_("Edit family group"))
self.family_group_label.setText(_("Not a member of a known family"))
- self.auto_address_button.setToolTip(_("Use the Sname and Address details from the previous patient."))
+ self.auto_address_button.setToolTip(
+ _("Use the Sname and Address details from the previous patient."))
self.auto_address_button.setText(_("Apply Address of previous record"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_patient_details), _("Patient Details"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_patient_details),
+ _("Patient Details"))
self.label_21.setText(_("Pt is registered with Dentist"))
self.contractType_label.setText(_("Course Type"))
self.label_40.setText(_("Status"))
self.badDebt_pushButton.setText(_("Write Off Bad Debt"))
- self.contractHDP_label_2.setText(_("This label is for displaying Private contractual stuff"))
+ self.contractHDP_label_2.setText(
+ _("This label is for displaying Private contractual stuff"))
self.editPriv_pushButton.setText(_("Edit"))
- self.contract_tabWidget.setTabText(self.contract_tabWidget.indexOf(self.tab_18), _("Private"))
- self.contractHDP_label.setText(_("This label is for displaying HDP contractual stuff"))
+ self.contract_tabWidget.setTabText(
+ self.contract_tabWidget.indexOf(self.tab_18),
+ _("Private"))
+ self.contractHDP_label.setText(
+ _("This label is for displaying HDP contractual stuff"))
self.editHDP_pushButton.setText(_("Edit"))
- self.contract_tabWidget.setTabText(self.contract_tabWidget.indexOf(self.tab_19), _("Highland Dental Plan"))
- self.contractNHS_label.setText(_("This label is for displaying NHS contractual stuff"))
+ self.contract_tabWidget.setTabText(
+ self.contract_tabWidget.indexOf(self.tab_19),
+ _("Highland Dental Plan"))
+ self.contractNHS_label.setText(
+ _("This label is for displaying NHS contractual stuff"))
self.nhsclaims_pushButton.setText(_("View Claims History"))
self.editNHS_pushButton.setText(_("Edit"))
self.label_46.setText(_("Exemption"))
self.label_48.setText(_("Exemption Text"))
- self.contract_tabWidget.setTabText(self.contract_tabWidget.indexOf(self.tab_20), _("NHS"))
- self.contractHDP_label_3.setText(_("No Details of Pt\'s Registered Dentist Found"))
+ self.contract_tabWidget.setTabText(
+ self.contract_tabWidget.indexOf(self.tab_20),
+ _("NHS"))
+ self.contractHDP_label_3.setText(
+ _("No Details of Pt\'s Registered Dentist Found"))
self.editRegDent_pushButton.setText(_("Edit"))
- self.contract_tabWidget.setTabText(self.contract_tabWidget.indexOf(self.tab_21), _("Registered Elsewhere"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_patient_contract), _("Contract"))
+ self.contract_tabWidget.setTabText(
+ self.contract_tabWidget.indexOf(self.tab_21),
+ _("Registered Elsewhere"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_patient_contract),
+ _("Contract"))
self.groupBox_6.setTitle(_("Letters TO the patient"))
- self.standardLetterPushButton.setText(_(" Custom Letter to the patient"))
- self.printRecall_pushButton.setToolTip(_("Print a recall saying the patient is due now."))
+ self.standardLetterPushButton.setText(
+ _(" Custom Letter to the patient"))
+ self.printRecall_pushButton.setToolTip(
+ _("Print a recall saying the patient is due now."))
self.printRecall_pushButton.setText(_("Recall for An Examination"))
- self.receiptPrintButton.setToolTip(_("Print a receipt - useful for duplicates."))
+ self.receiptPrintButton.setToolTip(
+ _("Print a receipt - useful for duplicates."))
self.receiptPrintButton.setText(_("Duplicate Receipt"))
self.account2_pushButton.setText(_("Print An Account Letter"))
self.groupBox_7.setTitle(_("Referrals (Letters about the patient)"))
self.referralLettersPrintButton.setText(_("Print"))
self.groupBox_8.setTitle(_("Patient \"Notes\""))
- self.notesPrintButton.setToolTip(_("Print a summary of the patient\'s notes (for them to take on). Includes No fee details."))
+ self.notesPrintButton.setToolTip(
+ _("Print a summary of the patient\'s notes (for them to take on). Includes No fee details."))
self.notesPrintButton.setText(_("Print the patient\'s notes"))
self.groupBox_3.setTitle(_("Previous Correspondence"))
self.label_44.setText(_("Generated By OpenMolar"))
@@ -2392,9 +3349,12 @@ class Ui_MainWindow(object):
self.label_45.setText(_("Imported into database"))
self.importDoc_pushButton.setText(_("Import A Document"))
self.groupBox_9.setTitle(_("Medical History"))
- self.medicalPrintButton.setToolTip(_("Print a summary of the patient\'s notes (for them to take on). Includes No fee details."))
+ self.medicalPrintButton.setToolTip(
+ _("Print a summary of the patient\'s notes (for them to take on). Includes No fee details."))
self.medicalPrintButton.setText(_("Print a medical history form"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_patient_correspondence), _("Correspondence"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_patient_correspondence),
+ _("Correspondence"))
self.reception_groupBox.setTitle(_("Reception"))
self.NHSadmin_groupBox.setTitle(_("NHS"))
self.printGP17_pushButton.setText(_("Print A GP17"))
@@ -2405,29 +3365,40 @@ class Ui_MainWindow(object):
self.printEst_pushButton.setText(_("Print &Estimate"))
self.groupBox_recnotes.setTitle(_("Notes"))
self.pt_diary_groupBox.setTitle(_("Patient\'s Diary"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_patient_reception), _("Reception"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_patient_reception),
+ _("Reception"))
self.bpe_groupBox.setTitle(_("BPE"))
- self.newBPE_pushButton.setToolTip(_("Update the Basic Perio Exam (CPITN) score"))
+ self.newBPE_pushButton.setToolTip(
+ _("Update the Basic Perio Exam (CPITN) score"))
self.newBPE_pushButton.setText(_("New"))
self.exampushButton.setToolTip(_("perform a clinical exam"))
self.exampushButton.setText(_("Exam"))
- self.xray_pushButton.setToolTip(_("add x-rays to the patient\'s current course."))
+ self.xray_pushButton.setToolTip(
+ _("add x-rays to the patient\'s current course."))
self.xray_pushButton.setText(_("X-ray"))
- self.hygWizard_pushButton.setToolTip(_("perform common perio treatments"))
+ self.hygWizard_pushButton.setToolTip(
+ _("perform common perio treatments"))
self.hygWizard_pushButton.setText(_("Hyg"))
self.closeCourse_pushButton.setText(_("Close This Course"))
self.childsmile_button.setText(_("ChildSmile"))
- self.medNotes_pushButton.setToolTip(_("check / update the patients medical history"))
+ self.medNotes_pushButton.setToolTip(
+ _("check / update the patients medical history"))
self.medNotes_pushButton.setText(_("Med Notes"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_patient_summary), _("Clinical Summary"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_patient_summary),
+ _("Clinical Summary"))
self.label_35.setText(_("Include"))
self.notes_includePrinting_checkBox.setText(_("Printing Notes"))
self.notes_includePayments_checkBox.setText(_("Payments"))
self.notes_includeTimestamps_checkBox.setText(_("Timestamps"))
self.notes_includeMetadata_checkBox.setText(_("Metadata"))
- self.summary_notes_checkBox.setToolTip(_("<html><head/><body><p>Use these settings for the clinical summary notes also.</p></body></html>"))
+ self.summary_notes_checkBox.setToolTip(
+ _("<html><head/><body><p>Use these settings for the clinical summary notes also.</p></body></html>"))
self.summary_notes_checkBox.setText(_("clinical summary"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_patient_notes), _("Notes"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_patient_notes),
+ _("Notes"))
self.static_groupBox.setTitle(_("Static"))
self.plan_groupBox.setTitle(_("Plan"))
self.completed_groupBox.setTitle(_("Completed"))
@@ -2438,44 +3409,59 @@ class Ui_MainWindow(object):
self.otherTxpushButton.setText(_("Other"))
self.customTx_pushButton.setText(_("Custom"))
self.advanced_tx_planning_button.setText(_("Advanced Tx Planning"))
- self.plan_course_manage_button.setText(_("Patient is not currently under treatment - click here to begin"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_patient_charts), _("Charts / Planning"))
+ self.plan_course_manage_button.setText(
+ _("Patient is not currently under treatment - click here to begin"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_patient_charts),
+ _("Charts / Planning"))
self.estimate_label.setText(_("Estimate"))
self.estLetter_pushButton.setText(_("Custom Estimate Letter"))
self.recalcEst_pushButton.setToolTip(_("Use this feature to re-price all items in the \"tooth\" category of treatments. i.e all those which appear on the charts.\n"
-"\n"
-"Note - this will not remove items which are currently there. "))
+ "\n"
+ "Note - this will not remove items which are currently there. "))
self.recalcEst_pushButton.setText(_("ReCalculate Estimate"))
self.apply_exemption_pushButton.setText(_("Apply Exemption"))
self.label_22.setText(_("Course Dentist"))
self.closeTx_pushButton.setText(_("Close Course"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_patient_estimate), _("Estimate"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_patient_estimate),
+ _("Estimate"))
self.groupBox_11.setTitle(_("Choose Data"))
self.label_41.setText(_("Chart Date"))
self.newPerioChartPushButton.setText(_("New"))
self.groupBox_12.setTitle(_("BPE"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_patient_perio), _("Perio Charts"))
- self.pastPayments_pushButton.setToolTip(_("See all payments in the database made by this patient"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_patient_perio),
+ _("Perio Charts"))
+ self.pastPayments_pushButton.setToolTip(
+ _("See all payments in the database made by this patient"))
self.pastPayments_pushButton.setText(_("Past Payments"))
- self.pastTreatment_pushButton.setToolTip(_("View treatments completed, by date order"))
+ self.pastTreatment_pushButton.setToolTip(
+ _("View treatments completed, by date order"))
self.pastTreatment_pushButton.setText(_("Past Treatment"))
- self.past_course_estimates_pushButton.setToolTip(_("display a combination of courses and estimates."))
+ self.past_course_estimates_pushButton.setToolTip(
+ _("display a combination of courses and estimates."))
self.past_course_estimates_pushButton.setText(_("Courses / Estimates"))
- self.pastCourses_pushButton.setToolTip(_("View all Courses of treatment. This includes treatment that was planned but not completed."))
+ self.pastCourses_pushButton.setToolTip(
+ _("View all Courses of treatment. This includes treatment that was planned but not completed."))
self.pastCourses_pushButton.setText(_("Courses"))
- self.pastEstimates_pushButton.setToolTip(_("Estimate history for this patient."))
+ self.pastEstimates_pushButton.setToolTip(
+ _("Estimate history for this patient."))
self.pastEstimates_pushButton.setText(_("Estimates"))
self.current_est_versioning_pushButton.setText(_("Current Estimate"))
self.NHSClaims_pushButton.setText(_("NHS Claims"))
self.memo_history_pushButton.setText(_("Memos"))
- self.historyPrint_pushButton.setToolTip(_("Print the text displayed on this page."))
+ self.historyPrint_pushButton.setToolTip(
+ _("Print the text displayed on this page."))
self.historyPrint_pushButton.setText(_("Print"))
self.debug_toolButton.setToolTip(_("Advanced options for developer use. Don\'t expect this to make much sense!\n"
-"\n"
-"If the \"changes only\" checkbox is checked, only data which has been changed will be displayed."))
+ "\n"
+ "If the \"changes only\" checkbox is checked, only data which has been changed will be displayed."))
self.debug_toolButton.setText(_("debug tools"))
self.ptAtts_checkBox.setText(_("changes only"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_patient_history), _("History"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_patient_history),
+ _("History"))
self.label_39.setText(_("Today\'s Notes"))
self.phraseBook_pushButton.setText(_("PhraseBook"))
self.phraseBook_pushButton.setShortcut(_("Ins"))
@@ -2485,8 +3471,12 @@ class Ui_MainWindow(object):
self.notesEnter_textEdit.setToolTip(_("Enter Notes."))
self.memos_pushButton.setText(_("Memos"))
self.clinician_phrasebook_pushButton.setText(_("Phrases"))
- self.main_tabWidget.setTabText(self.main_tabWidget.indexOf(self.tab_patient), _("Patient Database"))
- self.main_tabWidget.setTabText(self.main_tabWidget.indexOf(self.tab_appointments), _("Appointments / Diary"))
+ self.main_tabWidget.setTabText(
+ self.main_tabWidget.indexOf(self.tab_patient),
+ _("Patient Database"))
+ self.main_tabWidget.setTabText(
+ self.main_tabWidget.indexOf(self.tab_appointments),
+ _("Appointments / Diary"))
self.label_34.setText(_("Start Date"))
self.label_33.setText(_("End Date"))
self.label_32.setText(_("Registered Dentist"))
@@ -2496,54 +3486,74 @@ class Ui_MainWindow(object):
self.all_payments_radioButton.setText(_("All payments"))
self.sundries_only_radioButton.setText(_("Sundries_only"))
self.treatment_only_radioButton.setText(_("Treatment_only"))
- self.main_tabWidget.setTabText(self.main_tabWidget.indexOf(self.tab_cashbook), _("Cashbook"))
+ self.main_tabWidget.setTabText(
+ self.main_tabWidget.indexOf(self.tab_cashbook),
+ _("Cashbook"))
self.label_29.setText(_("Start Date"))
- self.label_30.setText(_("End Date"))
- self.label_28.setText(_("Registered Dentist"))
- self.label_31.setText(_("Treating Dentist / Hygenist"))
self.daybookGoPushButton.setText(_("Go"))
+ self.label_31.setText(_("Treating Clinician"))
+ self.label_30.setText(_("End Date"))
self.daybookPrintButton.setToolTip(_("Print the Data"))
self.daybookPrintButton.setText(_("Print"))
- self.main_tabWidget.setTabText(self.main_tabWidget.indexOf(self.tab_daybook), _("Daybook"))
- self.label_54.setText(_("Find Patient Records where the patient is in"))
+ self.label_28.setText(_("Dentist"))
+ self.label_7.setText(_("Extra Filters"))
+ self.main_tabWidget.setTabText(
+ self.main_tabWidget.indexOf(self.tab_daybook),
+ _("Daybook"))
+ self.label_54.setText(
+ _("Find Patient Records where the patient is in"))
self.accounts_debt_comboBox.setItemText(0, _("Debt"))
self.accounts_debt_comboBox.setItemText(1, _("Credit"))
self.label_24.setText(_("By More than"))
self.loadAccountsTable_pushButton.setText(_("Load Table"))
self.printAccountsTable_pushButton.setText(_("Print Table"))
- self.printSelectedAccounts_pushButton.setText(_("Print Selected Letters"))
+ self.printSelectedAccounts_pushButton.setText(
+ _("Print Selected Letters"))
self.accounts_tableWidget.setSortingEnabled(False)
self.label_43.setText(_("TOTAL OUTSTANDING"))
- self.main_tabWidget.setTabText(self.main_tabWidget.indexOf(self.tab_accounts), _("Accounts"))
+ self.main_tabWidget.setTabText(
+ self.main_tabWidget.indexOf(self.tab_accounts),
+ _("Accounts"))
self.recallLoad_pushButton.setText(_("Load Table"))
self.bulkMailPrint_pushButton.setText(_("Print Letters"))
self.bulk_mail_expand_pushButton.setText(_("Expand All"))
self.bulkMail_options_pushButton.setText(_("Letter Options"))
- self.main_tabWidget.setTabText(self.main_tabWidget.indexOf(self.tab_bulk_mail), _("Bulk Mailings"))
+ self.main_tabWidget.setTabText(
+ self.main_tabWidget.indexOf(self.tab_bulk_mail),
+ _("Bulk Mailings"))
self.feeScale_label.setText(_("TextLabel"))
self.feescales_available_label.setText(_("Fee Scales Available"))
- self.chooseFeescale_comboBox.setToolTip(_("Use this control to select a feescale"))
+ self.chooseFeescale_comboBox.setToolTip(
+ _("Use this control to select a feescale"))
self.label_26.setText(_("Search For an Item"))
- self.search_descriptions_radioButton.setToolTip(_("search for the given phrase in description columns"))
+ self.search_descriptions_radioButton.setToolTip(
+ _("search for the given phrase in description columns"))
self.search_descriptions_radioButton.setText(_("Search Descriptions"))
- self.feeSearch_pushButton.setToolTip(_("Click on this Button to search for in patient in your database."))
+ self.feeSearch_pushButton.setToolTip(
+ _("Click on this Button to search for in patient in your database."))
self.feeSearch_pushButton.setShortcut(_("Ctrl+F"))
- self.search_itemcodes_radioButton.setToolTip(_("only search for the given phrase in the usercode column"))
+ self.search_itemcodes_radioButton.setToolTip(
+ _("only search for the given phrase in the usercode column"))
self.search_itemcodes_radioButton.setText(_("Search Itemcodes"))
self.feesearch_results_label.setText(_("TextLabel"))
- self.hide_rare_feescale_codes_checkBox.setText(_("Hide Rarely Used Codes"))
+ self.hide_rare_feescale_codes_checkBox.setText(
+ _("Hide Rarely Used Codes"))
self.feeExpand_radioButton.setToolTip(_("Quickly expand all items"))
self.feeExpand_radioButton.setText(_("Expand All Sections"))
- self.feeCompress_radioButton.setToolTip(_("Quickly compress all items"))
+ self.feeCompress_radioButton.setToolTip(
+ _("Quickly compress all items"))
self.feeCompress_radioButton.setText(_("Compress All Sections"))
self.groupBox.setTitle(_("Resources"))
- self.documents_pushButton.setToolTip(_("Open A PDF of the latest NHS Regulations"))
+ self.documents_pushButton.setToolTip(
+ _("Open A PDF of the latest NHS Regulations"))
self.documents_pushButton.setText(_("Documents"))
self.feeadjuster_groupBox.setTitle(_("Advanced Options"))
self.feetable_xml_pushButton.setText(_("FeeScale Editor"))
self.feescale_tester_pushButton.setText(_("FeeScale Tester"))
self.reload_feescales_pushButton.setText(_("Reload Fee Scales"))
- self.main_tabWidget.setTabText(self.main_tabWidget.indexOf(self.tab_feescales), _("Feescales"))
+ self.main_tabWidget.setTabText(
+ self.main_tabWidget.indexOf(self.tab_feescales),
+ _("Feescales"))
self.forum_treeWidget.setSortingEnabled(True)
self.forumReply_pushButton.setText(_("Reply"))
self.forumReply_pushButton.setShortcut(_("Alt+R"))
@@ -2553,7 +3563,8 @@ class Ui_MainWindow(object):
self.forumParent_pushButton.setShortcut(_("Alt+S"))
self.forumNewTopic_pushButton.setText(_("New Topic"))
self.label_36.setText(_("Search by keyword"))
- self.feeSearch_pushButton_2.setToolTip(_("Click on this Button to search for in patient in your database."))
+ self.feeSearch_pushButton_2.setToolTip(
+ _("Click on this Button to search for in patient in your database."))
self.feeSearch_pushButton_2.setText(_("Find"))
self.feeSearch_pushButton_2.setShortcut(_("Ctrl+F"))
self.label_37.setText(_("Show Topics for"))
@@ -2564,45 +3575,59 @@ class Ui_MainWindow(object):
self.group_replies_radioButton.setText(_("Group replies"))
self.forumCollapse_pushButton.setText(_("&Collapse Replies"))
self.forumExpand_pushButton.setText(_("&Expand Replies"))
- self.main_tabWidget.setTabText(self.main_tabWidget.indexOf(self.tab_forum), _("FORUM"))
- self.main_tabWidget.setTabText(self.main_tabWidget.indexOf(self.tab_wiki), _("Wiki"))
+ self.main_tabWidget.setTabText(
+ self.main_tabWidget.indexOf(self.tab_forum),
+ _("FORUM"))
+ self.main_tabWidget.setTabText(
+ self.main_tabWidget.indexOf(self.tab_wiki),
+ _("Wiki"))
self.menuMenu.setTitle(_("&File"))
self.menu_Help.setTitle(_("&Help"))
self.menu_Prefences.setTitle(_("&Preferences"))
- self.menuView.setTitle(_("View"))
- self.menuAppointments.setTitle(_("Appointments"))
- self.menuPrinting.setTitle(_("Printing"))
- self.menuForum.setTitle(_("Forum"))
- self.menuCharts.setTitle(_("Charts"))
- self.menuMode.setTitle(_("Mode (reception or surgery)"))
- self.menuCashbook.setTitle(_("Cashbook"))
- self.menuTools.setTitle(_("Tools"))
+ self.menuView.setTitle(_("&View"))
+ self.menuAppointments.setTitle(_("&Appointments"))
+ self.menuPrinting.setTitle(_("&Printing"))
+ self.menuForum.setTitle(_("&Forum"))
+ self.menuCharts.setTitle(_("&Charts"))
+ self.menuMode.setTitle(_("&Mode (reception or surgery)"))
+ self.menuCashbook.setTitle(_("&Cashbook"))
+ self.menuDaybook.setTitle(_("&Daybook"))
+ self.menuTools.setTitle(_("&Tools"))
self.action_save_patient.setText(_("&Export Patient to disk"))
self.action_Open_Patient.setText(_("&Import Patient from disk"))
self.action_About.setText(_("About &OpenMolar"))
self.action_About_QT.setText(_("&About QT"))
self.action_Quit.setText(_("&Quit"))
- self.actionClear_Today_s_Emergency_Slots.setText(_("Clear Today\'s Emergency Slots"))
+ self.actionClear_Today_s_Emergency_Slots.setText(
+ _("Clear Today\'s Emergency Slots"))
self.actionAppointment_Tools.setText(_("Appointment Tools"))
self.actionChange_Language.setText(_("Select Interface Language"))
- self.actionFull_Screen_Mode_Ctrl_Alt_F.setText(_("Full Screen Mode (Ctrl-Alt-F)"))
+ self.actionFull_Screen_Mode_Ctrl_Alt_F.setText(
+ _("Full Screen Mode (Ctrl-Alt-F)"))
self.actionFull_Screen_Mode_Ctrl_Alt_F.setShortcut(_("Ctrl+Alt+F"))
self.actionSet_Font_Size.setText(_("Font Size"))
- self.action_forum_show_advanced_options.setText(_("Show Advanced Options"))
- self.actionTable_View_For_Charting.setText(_("Table View For Charting"))
+ self.action_forum_show_advanced_options.setText(
+ _("Show Advanced Options"))
+ self.actionTable_View_For_Charting.setText(
+ _("Table View For Charting"))
self.actionNHS_Form_Settings.setText(_("NHS Form Settings"))
self.actionTest_Print_a_GP17.setText(_("Test Print a GP17"))
self.actionPrint_Daylists.setText(_("Print Daylists"))
self.actionSet_Clinician.setText(_("Set Clinician"))
self.actionSet_Assistant.setText(_("Set Assistant"))
self.actionSurgery_Mode.setText(_("Surgery Mode"))
- self.actionAdvanced_Record_Management.setText(_("Advanced Record Management"))
- self.actionFix_Locked_New_Course_of_Treatment.setText(_("Fix Locked New Course of Treatment"))
+ self.actionAdvanced_Record_Management.setText(
+ _("Advanced Record Management"))
+ self.actionFix_Locked_New_Course_of_Treatment.setText(
+ _("Fix Locked New Course of Treatment"))
self.actionAllow_Full_Edit.setText(_("Allow Full Edit"))
self.actionSet_Surgery_Number.setText(_("Set Surgery Number"))
- self.actionSet_Surgery_Number.setToolTip(_("Set Surgery Number (used so other applications can see which record is loaded)"))
+ self.actionSet_Surgery_Number.setToolTip(
+ _("Set Surgery Number (used so other applications can see which record is loaded)"))
self.actionEdit_Phrasebooks.setText(_("Edit Phrasebooks"))
self.actionDocuments_Dialog.setText(_("Documents Dialog"))
+ self.actionAllow_Edit.setText(_("Allow &Edit"))
+ self.actionEnable_Filters.setText(_("Enable &Filters"))
from PyQt4 import QtWebKit
from openmolar.qt4gui import resources_rc
@@ -2617,4 +3642,3 @@ if __name__ == "__main__":
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py b/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py
index 4b0a54a..fd3f44c 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/medhist.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(790, 559)
@@ -28,7 +30,8 @@ class Ui_Dialog(object):
self.gridLayout_3 = QtGui.QGridLayout(self.groupBox_2)
self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
self.label = QtGui.QLabel(self.groupBox_2)
- self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout_3.addWidget(self.label, 0, 0, 1, 1)
self.doctor_lineEdit = QtGui.QLineEdit(self.groupBox_2)
@@ -36,12 +39,14 @@ class Ui_Dialog(object):
self.doctor_lineEdit.setObjectName(_fromUtf8("doctor_lineEdit"))
self.gridLayout_3.addWidget(self.doctor_lineEdit, 0, 1, 1, 1)
self.label_2 = QtGui.QLabel(self.groupBox_2)
- self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_2.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.gridLayout_3.addWidget(self.label_2, 1, 0, 1, 1)
self.doctorAddy_lineEdit = QtGui.QLineEdit(self.groupBox_2)
self.doctorAddy_lineEdit.setMaxLength(60)
- self.doctorAddy_lineEdit.setObjectName(_fromUtf8("doctorAddy_lineEdit"))
+ self.doctorAddy_lineEdit.setObjectName(
+ _fromUtf8("doctorAddy_lineEdit"))
self.gridLayout_3.addWidget(self.doctorAddy_lineEdit, 1, 1, 1, 1)
self.gridLayout_2.addWidget(self.groupBox_2, 0, 0, 1, 7)
self.groupBox = QtGui.QGroupBox(Dialog)
@@ -49,7 +54,8 @@ class Ui_Dialog(object):
self.gridLayout = QtGui.QGridLayout(self.groupBox)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.label_3 = QtGui.QLabel(self.groupBox)
- self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_3.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.gridLayout.addWidget(self.label_3, 0, 1, 1, 1)
self.curMeds_lineEdit = QtGui.QLineEdit(self.groupBox)
@@ -57,7 +63,8 @@ class Ui_Dialog(object):
self.curMeds_lineEdit.setObjectName(_fromUtf8("curMeds_lineEdit"))
self.gridLayout.addWidget(self.curMeds_lineEdit, 0, 2, 1, 1)
self.label_4 = QtGui.QLabel(self.groupBox)
- self.label_4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_4.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_4.setObjectName(_fromUtf8("label_4"))
self.gridLayout.addWidget(self.label_4, 1, 1, 1, 1)
self.pastMeds_lineEdit = QtGui.QLineEdit(self.groupBox)
@@ -65,7 +72,8 @@ class Ui_Dialog(object):
self.pastMeds_lineEdit.setObjectName(_fromUtf8("pastMeds_lineEdit"))
self.gridLayout.addWidget(self.pastMeds_lineEdit, 1, 2, 1, 1)
self.label_5 = QtGui.QLabel(self.groupBox)
- self.label_5.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_5.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_5.setObjectName(_fromUtf8("label_5"))
self.gridLayout.addWidget(self.label_5, 2, 1, 1, 1)
self.allergies_lineEdit = QtGui.QLineEdit(self.groupBox)
@@ -73,7 +81,8 @@ class Ui_Dialog(object):
self.allergies_lineEdit.setObjectName(_fromUtf8("allergies_lineEdit"))
self.gridLayout.addWidget(self.allergies_lineEdit, 2, 2, 1, 1)
self.label_6 = QtGui.QLabel(self.groupBox)
- self.label_6.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_6.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_6.setObjectName(_fromUtf8("label_6"))
self.gridLayout.addWidget(self.label_6, 3, 1, 1, 1)
self.heart_lineEdit = QtGui.QLineEdit(self.groupBox)
@@ -81,7 +90,8 @@ class Ui_Dialog(object):
self.heart_lineEdit.setObjectName(_fromUtf8("heart_lineEdit"))
self.gridLayout.addWidget(self.heart_lineEdit, 3, 2, 1, 1)
self.label_7 = QtGui.QLabel(self.groupBox)
- self.label_7.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_7.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_7.setObjectName(_fromUtf8("label_7"))
self.gridLayout.addWidget(self.label_7, 4, 0, 1, 2)
self.lungs_lineEdit = QtGui.QLineEdit(self.groupBox)
@@ -89,7 +99,8 @@ class Ui_Dialog(object):
self.lungs_lineEdit.setObjectName(_fromUtf8("lungs_lineEdit"))
self.gridLayout.addWidget(self.lungs_lineEdit, 4, 2, 1, 1)
self.label_8 = QtGui.QLabel(self.groupBox)
- self.label_8.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_8.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_8.setObjectName(_fromUtf8("label_8"))
self.gridLayout.addWidget(self.label_8, 5, 1, 1, 1)
self.liver_lineEdit = QtGui.QLineEdit(self.groupBox)
@@ -97,7 +108,8 @@ class Ui_Dialog(object):
self.liver_lineEdit.setObjectName(_fromUtf8("liver_lineEdit"))
self.gridLayout.addWidget(self.liver_lineEdit, 5, 2, 1, 1)
self.label_11 = QtGui.QLabel(self.groupBox)
- self.label_11.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_11.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_11.setObjectName(_fromUtf8("label_11"))
self.gridLayout.addWidget(self.label_11, 6, 0, 1, 2)
self.bleeding_lineEdit = QtGui.QLineEdit(self.groupBox)
@@ -105,7 +117,8 @@ class Ui_Dialog(object):
self.bleeding_lineEdit.setObjectName(_fromUtf8("bleeding_lineEdit"))
self.gridLayout.addWidget(self.bleeding_lineEdit, 6, 2, 1, 1)
self.label_9 = QtGui.QLabel(self.groupBox)
- self.label_9.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_9.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_9.setObjectName(_fromUtf8("label_9"))
self.gridLayout.addWidget(self.label_9, 7, 0, 1, 2)
self.kidneys_lineEdit = QtGui.QLineEdit(self.groupBox)
@@ -113,15 +126,18 @@ class Ui_Dialog(object):
self.kidneys_lineEdit.setObjectName(_fromUtf8("kidneys_lineEdit"))
self.gridLayout.addWidget(self.kidneys_lineEdit, 7, 2, 1, 1)
self.label_10 = QtGui.QLabel(self.groupBox)
- self.label_10.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_10.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_10.setObjectName(_fromUtf8("label_10"))
self.gridLayout.addWidget(self.label_10, 8, 0, 1, 2)
self.anaesthetic_lineEdit = QtGui.QLineEdit(self.groupBox)
self.anaesthetic_lineEdit.setMaxLength(60)
- self.anaesthetic_lineEdit.setObjectName(_fromUtf8("anaesthetic_lineEdit"))
+ self.anaesthetic_lineEdit.setObjectName(
+ _fromUtf8("anaesthetic_lineEdit"))
self.gridLayout.addWidget(self.anaesthetic_lineEdit, 8, 2, 1, 1)
self.label_12 = QtGui.QLabel(self.groupBox)
- self.label_12.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_12.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_12.setObjectName(_fromUtf8("label_12"))
self.gridLayout.addWidget(self.label_12, 9, 0, 1, 2)
self.other_lineEdit = QtGui.QLineEdit(self.groupBox)
@@ -132,19 +148,29 @@ class Ui_Dialog(object):
self.checked_pushButton = QtGui.QPushButton(Dialog)
self.checked_pushButton.setObjectName(_fromUtf8("checked_pushButton"))
self.gridLayout_2.addWidget(self.checked_pushButton, 2, 0, 1, 1)
- spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem = QtGui.QSpacerItem(
+ 40,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem, 2, 1, 1, 1)
self.date_label = QtGui.QLabel(Dialog)
- self.date_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.date_label.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.date_label.setObjectName(_fromUtf8("date_label"))
self.gridLayout_2.addWidget(self.date_label, 2, 2, 1, 1)
self.dateEdit = QtGui.QDateEdit(Dialog)
self.dateEdit.setReadOnly(True)
self.dateEdit.setButtonSymbols(QtGui.QAbstractSpinBox.NoButtons)
- self.dateEdit.setDateTime(QtCore.QDateTime(QtCore.QDate(1900, 1, 1), QtCore.QTime(0, 0, 0)))
+ self.dateEdit.setDateTime(
+ QtCore.QDateTime(QtCore.QDate(1900, 1, 1), QtCore.QTime(0, 0, 0)))
self.dateEdit.setObjectName(_fromUtf8("dateEdit"))
self.gridLayout_2.addWidget(self.dateEdit, 2, 3, 1, 1)
- spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem1 = QtGui.QSpacerItem(
+ 40,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem1, 2, 4, 1, 1)
self.checkBox = QtGui.QCheckBox(Dialog)
self.checkBox.setObjectName(_fromUtf8("checkBox"))
@@ -156,8 +182,14 @@ class Ui_Dialog(object):
self.gridLayout_2.addWidget(self.buttonBox, 2, 6, 1, 1)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -191,4 +223,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py b/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py
index 77bb5a0..5dd0c5f 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/memo_item.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Form(object):
+
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(400, 28)
@@ -24,10 +26,13 @@ class Ui_Form(object):
self.horizontalLayout.setContentsMargins(-1, 2, -1, 2)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.label = QtGui.QLabel(Form)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Fixed,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.label.sizePolicy().hasHeightForWidth())
self.label.setSizePolicy(sizePolicy)
self.label.setMinimumSize(QtCore.QSize(60, 0))
self.label.setMaximumSize(QtCore.QSize(60, 16777215))
@@ -57,4 +62,3 @@ if __name__ == "__main__":
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py b/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py
index 7c69616..c0eff4e 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/newBPE.ui'
@@ -17,16 +18,20 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(261, 161)
self.verticalLayout = QtGui.QVBoxLayout(Dialog)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.frame = QtGui.QFrame(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(120)
sizePolicy.setVerticalStretch(90)
- sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.frame.sizePolicy().hasHeightForWidth())
self.frame.setSizePolicy(sizePolicy)
self.frame.setMinimumSize(QtCore.QSize(200, 90))
self.frame.setMaximumSize(QtCore.QSize(300, 90))
@@ -92,14 +97,21 @@ class Ui_Dialog(object):
self.verticalLayout.addWidget(self.frame)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Save)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
Dialog.setTabOrder(self.buttonBox, self.bpe_comboBox)
Dialog.setTabOrder(self.bpe_comboBox, self.bpe2_comboBox)
@@ -158,4 +170,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py b/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py
index 977be03..a07944b 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/newCourse.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(272, 310)
@@ -39,11 +41,16 @@ class Ui_Dialog(object):
self.label_4 = QtGui.QLabel(Dialog)
self.label_4.setObjectName(_fromUtf8("label_4"))
self.gridLayout.addWidget(self.label_4, 4, 0, 1, 1)
- spacerItem = QtGui.QSpacerItem(188, 89, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 188,
+ 89,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem, 5, 0, 1, 3)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout.addWidget(self.buttonBox, 6, 0, 1, 3)
@@ -62,13 +69,20 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.dateEdit, 4, 1, 1, 2)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_("New Course"))
- self.label.setText(_("Start a new Course of Treatment with the following Criteria?"))
+ self.label.setText(
+ _("Start a new Course of Treatment with the following Criteria?"))
self.label_2.setText(_("Contracted Dentist"))
self.label_3.setText(_("Course Dentist"))
self.label_5.setText(_("Course Type"))
@@ -85,4 +99,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py b/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py
index 1abe223..f9f3889 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py
@@ -1,8 +1,9 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/newSetup.ui'
#
-# Created: Wed Nov 6 23:05:24 2013
+# Created: Sun Apr 6 21:20:55 2014
# by: PyQt4 UI code generator 4.10.3
#
# WARNING! All changes made in this file will be lost!
@@ -16,13 +17,16 @@ except AttributeError:
return s
-class Ui_Dialog(object):
- def setupUi(self, Dialog):
- Dialog.setObjectName(_fromUtf8("Dialog"))
- Dialog.resize(429, 405)
- self.verticalLayout = QtGui.QVBoxLayout(Dialog)
+class Ui_MainWindow(object):
+
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName(_fromUtf8("MainWindow"))
+ MainWindow.resize(589, 413)
+ self.centralwidget = QtGui.QWidget(MainWindow)
+ self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
+ self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
- self.title_label = QtGui.QLabel(Dialog)
+ self.title_label = QtGui.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
@@ -30,30 +34,36 @@ class Ui_Dialog(object):
self.title_label.setAlignment(QtCore.Qt.AlignCenter)
self.title_label.setObjectName(_fromUtf8("title_label"))
self.verticalLayout.addWidget(self.title_label)
- self.stackedWidget = QtGui.QStackedWidget(Dialog)
+ self.stackedWidget = QtGui.QStackedWidget(self.centralwidget)
self.stackedWidget.setObjectName(_fromUtf8("stackedWidget"))
- self.page = QtGui.QWidget()
- self.page.setObjectName(_fromUtf8("page"))
- self.verticalLayout_3 = QtGui.QVBoxLayout(self.page)
+ self.start_page = QtGui.QWidget()
+ self.start_page.setObjectName(_fromUtf8("start_page"))
+ self.verticalLayout_3 = QtGui.QVBoxLayout(self.start_page)
self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
- self.label_7 = QtGui.QLabel(self.page)
+ self.label_7 = QtGui.QLabel(self.start_page)
self.label_7.setMinimumSize(QtCore.QSize(0, 100))
- self.label_7.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+ self.label_7.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.label_7.setWordWrap(True)
self.label_7.setObjectName(_fromUtf8("label_7"))
self.verticalLayout_3.addWidget(self.label_7)
- self.sysAdvice_label = QtGui.QLabel(self.page)
+ self.sysAdvice_label = QtGui.QLabel(self.start_page)
self.sysAdvice_label.setWordWrap(True)
self.sysAdvice_label.setObjectName(_fromUtf8("sysAdvice_label"))
self.verticalLayout_3.addWidget(self.sysAdvice_label)
- spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.verticalLayout_3.addItem(spacerItem)
- self.stackedWidget.addWidget(self.page)
- self.page_2 = QtGui.QWidget()
- self.page_2.setObjectName(_fromUtf8("page_2"))
- self.gridLayout = QtGui.QGridLayout(self.page_2)
+ self.stackedWidget.addWidget(self.start_page)
+ self.application_password_page = QtGui.QWidget()
+ self.application_password_page.setObjectName(
+ _fromUtf8("application_password_page"))
+ self.gridLayout = QtGui.QGridLayout(self.application_password_page)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
- self.mainPassword_label = QtGui.QLabel(self.page_2)
+ self.mainPassword_label = QtGui.QLabel(self.application_password_page)
self.mainPassword_label.setMinimumSize(QtCore.QSize(0, 80))
font = QtGui.QFont()
font.setBold(False)
@@ -63,80 +73,98 @@ class Ui_Dialog(object):
self.mainPassword_label.setWordWrap(True)
self.mainPassword_label.setObjectName(_fromUtf8("mainPassword_label"))
self.gridLayout.addWidget(self.mainPassword_label, 0, 0, 1, 3)
- self.label_5 = QtGui.QLabel(self.page_2)
+ self.label_5 = QtGui.QLabel(self.application_password_page)
self.label_5.setObjectName(_fromUtf8("label_5"))
self.gridLayout.addWidget(self.label_5, 1, 0, 1, 1)
- self.main_password_lineEdit = QtGui.QLineEdit(self.page_2)
+ self.main_password_lineEdit = QtGui.QLineEdit(
+ self.application_password_page)
self.main_password_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
self.main_password_lineEdit.setText(_fromUtf8(""))
self.main_password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
- self.main_password_lineEdit.setObjectName(_fromUtf8("main_password_lineEdit"))
+ self.main_password_lineEdit.setObjectName(
+ _fromUtf8("main_password_lineEdit"))
self.gridLayout.addWidget(self.main_password_lineEdit, 1, 1, 1, 1)
- self.mainpassword_checkBox = QtGui.QCheckBox(self.page_2)
+ self.mainpassword_checkBox = QtGui.QCheckBox(
+ self.application_password_page)
self.mainpassword_checkBox.setFocusPolicy(QtCore.Qt.NoFocus)
- self.mainpassword_checkBox.setObjectName(_fromUtf8("mainpassword_checkBox"))
+ self.mainpassword_checkBox.setObjectName(
+ _fromUtf8("mainpassword_checkBox"))
self.gridLayout.addWidget(self.mainpassword_checkBox, 1, 2, 1, 1)
- self.label_8 = QtGui.QLabel(self.page_2)
+ self.label_8 = QtGui.QLabel(self.application_password_page)
self.label_8.setObjectName(_fromUtf8("label_8"))
self.gridLayout.addWidget(self.label_8, 2, 0, 1, 1)
- self.repeat_password_lineEdit = QtGui.QLineEdit(self.page_2)
+ self.repeat_password_lineEdit = QtGui.QLineEdit(
+ self.application_password_page)
self.repeat_password_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
self.repeat_password_lineEdit.setText(_fromUtf8(""))
self.repeat_password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
- self.repeat_password_lineEdit.setObjectName(_fromUtf8("repeat_password_lineEdit"))
+ self.repeat_password_lineEdit.setObjectName(
+ _fromUtf8("repeat_password_lineEdit"))
self.gridLayout.addWidget(self.repeat_password_lineEdit, 2, 1, 1, 1)
- spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem1 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem1, 3, 1, 1, 1)
- self.stackedWidget.addWidget(self.page_2)
- self.page_3 = QtGui.QWidget()
- self.page_3.setObjectName(_fromUtf8("page_3"))
- self.gridLayout_2 = QtGui.QGridLayout(self.page_3)
+ self.stackedWidget.addWidget(self.application_password_page)
+ self.mysql_server_location = QtGui.QWidget()
+ self.mysql_server_location.setObjectName(
+ _fromUtf8("mysql_server_location"))
+ self.gridLayout_2 = QtGui.QGridLayout(self.mysql_server_location)
self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
- self.label_13 = QtGui.QLabel(self.page_3)
+ self.label_13 = QtGui.QLabel(self.mysql_server_location)
self.label_13.setEnabled(True)
self.label_13.setMinimumSize(QtCore.QSize(0, 40))
font = QtGui.QFont()
font.setBold(False)
font.setWeight(50)
self.label_13.setFont(font)
- self.label_13.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+ self.label_13.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.label_13.setWordWrap(True)
self.label_13.setObjectName(_fromUtf8("label_13"))
self.gridLayout_2.addWidget(self.label_13, 0, 0, 1, 3)
- self.label_12 = QtGui.QLabel(self.page_3)
+ self.label_12 = QtGui.QLabel(self.mysql_server_location)
self.label_12.setEnabled(True)
- self.label_12.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_12.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_12.setObjectName(_fromUtf8("label_12"))
self.gridLayout_2.addWidget(self.label_12, 1, 0, 1, 1)
- self.host_lineEdit = QtGui.QLineEdit(self.page_3)
+ self.host_lineEdit = QtGui.QLineEdit(self.mysql_server_location)
self.host_lineEdit.setEnabled(True)
self.host_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
self.host_lineEdit.setText(_fromUtf8("localhost"))
self.host_lineEdit.setObjectName(_fromUtf8("host_lineEdit"))
self.gridLayout_2.addWidget(self.host_lineEdit, 1, 2, 1, 1)
- self.label_14 = QtGui.QLabel(self.page_3)
+ self.label_14 = QtGui.QLabel(self.mysql_server_location)
self.label_14.setEnabled(True)
- self.label_14.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_14.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_14.setObjectName(_fromUtf8("label_14"))
self.gridLayout_2.addWidget(self.label_14, 2, 0, 1, 1)
- self.port_lineEdit = QtGui.QLineEdit(self.page_3)
+ self.port_lineEdit = QtGui.QLineEdit(self.mysql_server_location)
self.port_lineEdit.setEnabled(True)
self.port_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
self.port_lineEdit.setText(_fromUtf8("3306"))
self.port_lineEdit.setObjectName(_fromUtf8("port_lineEdit"))
self.gridLayout_2.addWidget(self.port_lineEdit, 2, 2, 1, 1)
- self.label_9 = QtGui.QLabel(self.page_3)
+ self.label_9 = QtGui.QLabel(self.mysql_server_location)
self.label_9.setWordWrap(True)
self.label_9.setObjectName(_fromUtf8("label_9"))
self.gridLayout_2.addWidget(self.label_9, 4, 0, 1, 3)
- spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem2 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem2, 3, 2, 1, 1)
- self.stackedWidget.addWidget(self.page_3)
- self.page_4 = QtGui.QWidget()
- self.page_4.setObjectName(_fromUtf8("page_4"))
- self.gridLayout_3 = QtGui.QGridLayout(self.page_4)
+ self.stackedWidget.addWidget(self.mysql_server_location)
+ self.database_choice = QtGui.QWidget()
+ self.database_choice.setObjectName(_fromUtf8("database_choice"))
+ self.gridLayout_3 = QtGui.QGridLayout(self.database_choice)
self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
- self.groupBox = QtGui.QGroupBox(self.page_4)
+ self.groupBox = QtGui.QGroupBox(self.database_choice)
self.groupBox.setEnabled(True)
self.groupBox.setFlat(False)
self.groupBox.setObjectName(_fromUtf8("groupBox"))
@@ -144,7 +172,8 @@ class Ui_Dialog(object):
self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
self.label_2 = QtGui.QLabel(self.groupBox)
self.label_2.setEnabled(True)
- self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_2.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.gridLayout_5.addWidget(self.label_2, 2, 0, 1, 1)
self.user_lineEdit = QtGui.QLineEdit(self.groupBox)
@@ -155,7 +184,8 @@ class Ui_Dialog(object):
self.gridLayout_5.addWidget(self.user_lineEdit, 2, 2, 1, 1)
self.label_3 = QtGui.QLabel(self.groupBox)
self.label_3.setEnabled(True)
- self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_3.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.gridLayout_5.addWidget(self.label_3, 3, 0, 1, 1)
self.password_lineEdit = QtGui.QLineEdit(self.groupBox)
@@ -168,7 +198,8 @@ class Ui_Dialog(object):
self.dbpassword_checkBox = QtGui.QCheckBox(self.groupBox)
self.dbpassword_checkBox.setEnabled(True)
self.dbpassword_checkBox.setFocusPolicy(QtCore.Qt.NoFocus)
- self.dbpassword_checkBox.setObjectName(_fromUtf8("dbpassword_checkBox"))
+ self.dbpassword_checkBox.setObjectName(
+ _fromUtf8("dbpassword_checkBox"))
self.gridLayout_5.addWidget(self.dbpassword_checkBox, 3, 3, 1, 1)
self.database_lineEdit = QtGui.QLineEdit(self.groupBox)
self.database_lineEdit.setEnabled(True)
@@ -184,88 +215,120 @@ class Ui_Dialog(object):
self.testDB_pushButton.setFocusPolicy(QtCore.Qt.NoFocus)
self.testDB_pushButton.setObjectName(_fromUtf8("testDB_pushButton"))
self.gridLayout_5.addWidget(self.testDB_pushButton, 4, 2, 1, 1)
- spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem3 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_5.addItem(spacerItem3, 5, 2, 1, 1)
self.gridLayout_3.addWidget(self.groupBox, 4, 0, 2, 2)
- self.createDemo_radioButton = QtGui.QRadioButton(self.page_4)
+ self.createDemo_radioButton = QtGui.QRadioButton(self.database_choice)
self.createDemo_radioButton.setChecked(True)
- self.createDemo_radioButton.setObjectName(_fromUtf8("createDemo_radioButton"))
+ self.createDemo_radioButton.setObjectName(
+ _fromUtf8("createDemo_radioButton"))
self.gridLayout_3.addWidget(self.createDemo_radioButton, 0, 0, 1, 1)
- self.existingDB_radioButton = QtGui.QRadioButton(self.page_4)
- self.existingDB_radioButton.setObjectName(_fromUtf8("existingDB_radioButton"))
+ self.existingDB_radioButton = QtGui.QRadioButton(self.database_choice)
+ self.existingDB_radioButton.setObjectName(
+ _fromUtf8("existingDB_radioButton"))
self.gridLayout_3.addWidget(self.existingDB_radioButton, 1, 0, 1, 1)
- self.stackedWidget.addWidget(self.page_4)
- self.page_5 = QtGui.QWidget()
- self.page_5.setObjectName(_fromUtf8("page_5"))
- self.verticalLayout_2 = QtGui.QVBoxLayout(self.page_5)
- self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
- self.label = QtGui.QLabel(self.page_5)
- self.label.setTextFormat(QtCore.Qt.PlainText)
- self.label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
- self.label.setObjectName(_fromUtf8("label"))
- self.verticalLayout_2.addWidget(self.label)
- spacerItem4 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_2.addItem(spacerItem4)
- self.checkBox = QtGui.QCheckBox(self.page_5)
- self.checkBox.setLayoutDirection(QtCore.Qt.LeftToRight)
- self.checkBox.setChecked(True)
- self.checkBox.setObjectName(_fromUtf8("checkBox"))
- self.verticalLayout_2.addWidget(self.checkBox)
- spacerItem5 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_2.addItem(spacerItem5)
- self.stackedWidget.addWidget(self.page_5)
- self.page_6 = QtGui.QWidget()
- self.page_6.setObjectName(_fromUtf8("page_6"))
- self.gridLayout_4 = QtGui.QGridLayout(self.page_6)
+ self.stackedWidget.addWidget(self.database_choice)
+ self.create_database_page = QtGui.QWidget()
+ self.create_database_page.setObjectName(
+ _fromUtf8("create_database_page"))
+ self.gridLayout_4 = QtGui.QGridLayout(self.create_database_page)
self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
- self.mainPassword_label_2 = QtGui.QLabel(self.page_6)
+ self.label_6 = QtGui.QLabel(self.create_database_page)
+ self.label_6.setObjectName(_fromUtf8("label_6"))
+ self.gridLayout_4.addWidget(self.label_6, 2, 0, 1, 1)
+ self.mainPassword_label_2 = QtGui.QLabel(self.create_database_page)
self.mainPassword_label_2.setMinimumSize(QtCore.QSize(0, 100))
font = QtGui.QFont()
font.setBold(False)
font.setWeight(50)
self.mainPassword_label_2.setFont(font)
- self.mainPassword_label_2.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+ self.mainPassword_label_2.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.mainPassword_label_2.setWordWrap(True)
- self.mainPassword_label_2.setObjectName(_fromUtf8("mainPassword_label_2"))
+ self.mainPassword_label_2.setObjectName(
+ _fromUtf8("mainPassword_label_2"))
self.gridLayout_4.addWidget(self.mainPassword_label_2, 0, 0, 1, 3)
- self.label_6 = QtGui.QLabel(self.page_6)
- self.label_6.setObjectName(_fromUtf8("label_6"))
- self.gridLayout_4.addWidget(self.label_6, 2, 0, 1, 1)
- spacerItem6 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.gridLayout_4.addItem(spacerItem6, 4, 1, 1, 1)
- self.rootPassword_lineEdit = QtGui.QLineEdit(self.page_6)
+ self.rootPassword_lineEdit = QtGui.QLineEdit(self.create_database_page)
self.rootPassword_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
self.rootPassword_lineEdit.setText(_fromUtf8(""))
self.rootPassword_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
- self.rootPassword_lineEdit.setObjectName(_fromUtf8("rootPassword_lineEdit"))
+ self.rootPassword_lineEdit.setObjectName(
+ _fromUtf8("rootPassword_lineEdit"))
self.gridLayout_4.addWidget(self.rootPassword_lineEdit, 3, 0, 1, 1)
- self.rootPassword_checkBox = QtGui.QCheckBox(self.page_6)
+ self.rootPassword_checkBox = QtGui.QCheckBox(self.create_database_page)
self.rootPassword_checkBox.setFocusPolicy(QtCore.Qt.NoFocus)
- self.rootPassword_checkBox.setObjectName(_fromUtf8("rootPassword_checkBox"))
+ self.rootPassword_checkBox.setObjectName(
+ _fromUtf8("rootPassword_checkBox"))
self.gridLayout_4.addWidget(self.rootPassword_checkBox, 3, 1, 1, 1)
- spacerItem7 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.gridLayout_4.addItem(spacerItem7, 1, 0, 1, 1)
- self.stackedWidget.addWidget(self.page_6)
- self.page_7 = QtGui.QWidget()
- self.page_7.setObjectName(_fromUtf8("page_7"))
- self.verticalLayout_4 = QtGui.QVBoxLayout(self.page_7)
+ spacerItem4 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.gridLayout_4.addItem(spacerItem4, 1, 0, 1, 2)
+ self.stackedWidget.addWidget(self.create_database_page)
+ self.database_creation_progress_page = QtGui.QWidget()
+ self.database_creation_progress_page.setObjectName(
+ _fromUtf8("database_creation_progress_page"))
+ self.verticalLayout_4 = QtGui.QVBoxLayout(
+ self.database_creation_progress_page)
self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
- spacerItem8 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_4.addItem(spacerItem8)
- self.label_10 = QtGui.QLabel(self.page_7)
+ spacerItem5 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_4.addItem(spacerItem5)
+ self.label_10 = QtGui.QLabel(self.database_creation_progress_page)
self.label_10.setObjectName(_fromUtf8("label_10"))
self.verticalLayout_4.addWidget(self.label_10)
- spacerItem9 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_4.addItem(spacerItem9)
- self.progressBar = QtGui.QProgressBar(self.page_7)
+ spacerItem6 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_4.addItem(spacerItem6)
+ self.progressBar = QtGui.QProgressBar(
+ self.database_creation_progress_page)
self.progressBar.setProperty("value", 0)
self.progressBar.setObjectName(_fromUtf8("progressBar"))
self.verticalLayout_4.addWidget(self.progressBar)
- spacerItem10 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- self.verticalLayout_4.addItem(spacerItem10)
- self.stackedWidget.addWidget(self.page_7)
+ spacerItem7 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_4.addItem(spacerItem7)
+ self.stackedWidget.addWidget(self.database_creation_progress_page)
+ self.finish_page = QtGui.QWidget()
+ self.finish_page.setObjectName(_fromUtf8("finish_page"))
+ self.verticalLayout_2 = QtGui.QVBoxLayout(self.finish_page)
+ self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
+ spacerItem8 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_2.addItem(spacerItem8)
+ self.label = QtGui.QLabel(self.finish_page)
+ self.label.setTextFormat(QtCore.Qt.PlainText)
+ self.label.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
+ self.label.setObjectName(_fromUtf8("label"))
+ self.verticalLayout_2.addWidget(self.label)
+ spacerItem9 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_2.addItem(spacerItem9)
+ self.stackedWidget.addWidget(self.finish_page)
self.verticalLayout.addWidget(self.stackedWidget)
- self.frame = QtGui.QFrame(Dialog)
+ self.frame = QtGui.QFrame(self.centralwidget)
self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
self.frame.setFrameShadow(QtGui.QFrame.Raised)
self.frame.setObjectName(_fromUtf8("frame"))
@@ -279,20 +342,30 @@ class Ui_Dialog(object):
self.go_pushButton.setObjectName(_fromUtf8("go_pushButton"))
self.horizontalLayout_3.addWidget(self.go_pushButton)
self.verticalLayout.addWidget(self.frame)
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtGui.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 589, 17))
+ self.menubar.setObjectName(_fromUtf8("menubar"))
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtGui.QStatusBar(MainWindow)
+ self.statusbar.setObjectName(_fromUtf8("statusbar"))
+ MainWindow.setStatusBar(self.statusbar)
- self.retranslateUi(Dialog)
+ self.retranslateUi(MainWindow)
self.stackedWidget.setCurrentIndex(0)
- QtCore.QMetaObject.connectSlotsByName(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
- def retranslateUi(self, Dialog):
- Dialog.setWindowTitle(_("OpenMolar - First Run"))
- self.title_label.setText(_("Welcome to the openMolar settings wizard."))
+ def retranslateUi(self, MainWindow):
+ MainWindow.setWindowTitle(_("OpenMolar - New Setup"))
+ self.title_label.setText(
+ _("Welcome to the OpenMolar settings wizard."))
self.label_7.setText(_("This first run application will \n"
-" - set your system password\n"
-" - make this client aware of your mysql server settings\n"
-" - install a small (4 patient) demo database if required."))
+ " - set your system password\n"
+ " - make this client aware of your mysql server settings\n"
+ " - install a small (3 patient) demo database if required."))
self.sysAdvice_label.setText(_("TextLabel"))
- self.mainPassword_label.setText(_("Please enter a password to prevent unauthorised running of this application."))
+ self.mainPassword_label.setText(
+ _("Please enter a password to prevent unauthorised running of this application."))
self.label_5.setText(_("Password"))
self.mainpassword_checkBox.setText(_("show"))
self.label_8.setText(_("Repeat Password"))
@@ -300,33 +373,25 @@ class Ui_Dialog(object):
self.label_12.setText(_("Host"))
self.label_14.setText(_("Port"))
self.label_9.setText(_("** If you do not have a mysql server on your network, please quit this setup, and install mysql server now.\n"
-"\n"
-"If you are a debian or ubuntu user, \"sudo apt-get install mysql-server\"\n"
-"and make a note of the root password you create during set up. "))
+ "\n"
+ "If you are a debian or ubuntu user, \"sudo apt-get install mysql-server\"\n"
+ "and make a note of the root password you create during set up. "))
self.groupBox.setTitle(_("Database Details"))
- self.label_2.setText(_("User"))
- self.label_3.setText(_("(mysql)Password"))
+ self.label_2.setText(_("(mysql) User"))
+ self.label_3.setText(_("(mysql) Password"))
self.dbpassword_checkBox.setText(_("show"))
self.label_4.setText(_("Database Name"))
self.testDB_pushButton.setText(_("Test this Connection"))
self.createDemo_radioButton.setText(_("Create A Demo Database"))
self.existingDB_radioButton.setText(_("Use with an existing database"))
- self.label.setText(_("OK.... you are all set to go.\n"
-"\n"
-"When running openMolar, you are presented a login screen.\n"
-"\n"
-"Password = the one you specified earlier\n"
-"User1 = any registered user (demo database has one user \"user\")\n"
-"User2 = any registered user (can be left blank)\n"
-""))
- self.checkBox.setText(_("Launch OpenMolar Now"))
- self.mainPassword_label_2.setText(_("To create a database, and set the privileges for user, requires logging into mysql as the root mysql user.\n"
-"OpenMolar does NOT store this password.\n"
-"Please enter the password of the ROOT mysql user.\n"
-"(note - on most mysql setups, root access is disabled unless the server is on localhost)"))
self.label_6.setText(_("Root mysql password"))
+ self.mainPassword_label_2.setText(_("To create a database, and set the privileges for user, requires logging into mysql as the root mysql user.\n"
+ "OpenMolar does NOT store this password.\n"
+ "Please enter the password of the ROOT mysql user.\n"
+ "(note - on most mysql setups, root access is disabled unless the server is on localhost)"))
self.rootPassword_checkBox.setText(_("show"))
self.label_10.setText(_("Creating Database.... please wait"))
+ self.label.setText(_("OK.... you are all set to go!"))
self.back_pushButton.setText(_("Back"))
self.go_pushButton.setText(_("Proceed"))
@@ -336,9 +401,8 @@ if __name__ == "__main__":
gettext.install("openmolar")
import sys
app = QtGui.QApplication(sys.argv)
- Dialog = QtGui.QDialog()
- ui = Ui_Dialog()
- ui.setupUi(Dialog)
- Dialog.show()
+ MainWindow = QtGui.QMainWindow()
+ ui = Ui_MainWindow()
+ ui.setupUi(MainWindow)
+ MainWindow.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py b/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py
index a1b47bd..135bffc 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/ortho_ref_wizard.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(910, 594)
@@ -32,10 +34,13 @@ class Ui_Dialog(object):
self.gridLayout_4.setMargin(2)
self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
self.dh_plainTextEdit = QtGui.QPlainTextEdit(self.groupBox_5)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.dh_plainTextEdit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.dh_plainTextEdit.sizePolicy().hasHeightForWidth())
self.dh_plainTextEdit.setSizePolicy(sizePolicy)
self.dh_plainTextEdit.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.dh_plainTextEdit.setObjectName(_fromUtf8("dh_plainTextEdit"))
@@ -54,7 +59,11 @@ class Ui_Dialog(object):
self.ref1_radioButton.setChecked(True)
self.ref1_radioButton.setObjectName(_fromUtf8("ref1_radioButton"))
self.gridLayout.addWidget(self.ref1_radioButton, 0, 0, 1, 1)
- spacerItem = QtGui.QSpacerItem(68, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem = QtGui.QSpacerItem(
+ 68,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem, 0, 1, 1, 2)
self.ref2_radioButton = QtGui.QRadioButton(self.frame)
self.ref2_radioButton.setObjectName(_fromUtf8("ref2_radioButton"))
@@ -73,7 +82,8 @@ class Ui_Dialog(object):
self.gridLayout_5.addWidget(self.chart_groupBox, 0, 1, 1, 1)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout_5.addWidget(self.buttonBox, 4, 0, 1, 3)
self.groupBox_4 = QtGui.QGroupBox(Dialog)
@@ -83,20 +93,28 @@ class Ui_Dialog(object):
self.gridLayout_3.setMargin(2)
self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
self.mh__plainTextEdit = QtGui.QPlainTextEdit(self.groupBox_4)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.mh__plainTextEdit.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.mh__plainTextEdit.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.mh__plainTextEdit.setSizePolicy(sizePolicy)
self.mh__plainTextEdit.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.mh__plainTextEdit.setObjectName(_fromUtf8("mh__plainTextEdit"))
self.gridLayout_3.addWidget(self.mh__plainTextEdit, 0, 0, 1, 1)
self.gridLayout_5.addWidget(self.groupBox_4, 3, 1, 1, 1)
self.groupBox = QtGui.QGroupBox(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.MinimumExpanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.MinimumExpanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.groupBox.sizePolicy().hasHeightForWidth())
self.groupBox.setSizePolicy(sizePolicy)
self.groupBox.setObjectName(_fromUtf8("groupBox"))
self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBox)
@@ -109,19 +127,24 @@ class Ui_Dialog(object):
self.verticalLayout_3.setMargin(2)
self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
self.crowding5_radioButton = QtGui.QRadioButton(self.groupBox_2)
- self.crowding5_radioButton.setObjectName(_fromUtf8("crowding5_radioButton"))
+ self.crowding5_radioButton.setObjectName(
+ _fromUtf8("crowding5_radioButton"))
self.verticalLayout_3.addWidget(self.crowding5_radioButton)
self.crowding4_radioButton = QtGui.QRadioButton(self.groupBox_2)
- self.crowding4_radioButton.setObjectName(_fromUtf8("crowding4_radioButton"))
+ self.crowding4_radioButton.setObjectName(
+ _fromUtf8("crowding4_radioButton"))
self.verticalLayout_3.addWidget(self.crowding4_radioButton)
self.crowding3_radioButton = QtGui.QRadioButton(self.groupBox_2)
- self.crowding3_radioButton.setObjectName(_fromUtf8("crowding3_radioButton"))
+ self.crowding3_radioButton.setObjectName(
+ _fromUtf8("crowding3_radioButton"))
self.verticalLayout_3.addWidget(self.crowding3_radioButton)
self.crowding2_radioButton = QtGui.QRadioButton(self.groupBox_2)
- self.crowding2_radioButton.setObjectName(_fromUtf8("crowding2_radioButton"))
+ self.crowding2_radioButton.setObjectName(
+ _fromUtf8("crowding2_radioButton"))
self.verticalLayout_3.addWidget(self.crowding2_radioButton)
self.crowding1_radioButton = QtGui.QRadioButton(self.groupBox_2)
- self.crowding1_radioButton.setObjectName(_fromUtf8("crowding1_radioButton"))
+ self.crowding1_radioButton.setObjectName(
+ _fromUtf8("crowding1_radioButton"))
self.verticalLayout_3.addWidget(self.crowding1_radioButton)
self.verticalLayout_2.addWidget(self.groupBox_2)
self.groupBox_3 = QtGui.QGroupBox(self.groupBox)
@@ -137,7 +160,11 @@ class Ui_Dialog(object):
self.oj_spinBox.setMaximum(20)
self.oj_spinBox.setObjectName(_fromUtf8("oj_spinBox"))
self.gridLayout_2.addWidget(self.oj_spinBox, 0, 1, 1, 1)
- spacerItem1 = QtGui.QSpacerItem(248, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem1 = QtGui.QSpacerItem(
+ 248,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem1, 0, 2, 1, 3)
self.label_3 = QtGui.QLabel(self.groupBox_3)
self.label_3.setObjectName(_fromUtf8("label_3"))
@@ -172,8 +199,14 @@ class Ui_Dialog(object):
self.gridLayout_5.addWidget(self.groupBox, 2, 0, 2, 1)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -182,7 +215,8 @@ class Ui_Dialog(object):
self.label_2.setText(_("Previous Referral Date"))
self.ref1_radioButton.setText(_("1st referral"))
self.ref2_radioButton.setText(_("re - referral"))
- self.tx_checkBox.setText(_("I am Willing to carry out simple treatment"))
+ self.tx_checkBox.setText(
+ _("I am Willing to carry out simple treatment"))
self.chart_groupBox.setTitle(_("Teeth With Poor Prognosis"))
self.groupBox_4.setTitle(_("Relevant Medical History"))
self.groupBox.setTitle(_("Reason for Referral"))
@@ -215,4 +249,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py b/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py
index e857a19..50f0246 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/patient_diary.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Form(object):
+
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(829, 205)
@@ -25,11 +27,13 @@ class Ui_Form(object):
self.gridLayout.setSpacing(6)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.appt_memo_lineEdit = QtGui.QLineEdit(Form)
- self.appt_memo_lineEdit.setStyleSheet(_fromUtf8("color:rgb(255, 0, 0)"))
+ self.appt_memo_lineEdit.setStyleSheet(
+ _fromUtf8("color:rgb(255, 0, 0)"))
self.appt_memo_lineEdit.setObjectName(_fromUtf8("appt_memo_lineEdit"))
self.gridLayout.addWidget(self.appt_memo_lineEdit, 0, 0, 1, 2)
self.recall_settings_pushButton = QtGui.QPushButton(Form)
- self.recall_settings_pushButton.setObjectName(_fromUtf8("recall_settings_pushButton"))
+ self.recall_settings_pushButton.setObjectName(
+ _fromUtf8("recall_settings_pushButton"))
self.gridLayout.addWidget(self.recall_settings_pushButton, 0, 2, 1, 1)
self.pt_diary_treeView = QtGui.QTreeView(Form)
self.pt_diary_treeView.setObjectName(_fromUtf8("pt_diary_treeView"))
@@ -46,91 +50,142 @@ class Ui_Form(object):
self.verticalLayout_33.setObjectName(_fromUtf8("verticalLayout_33"))
self.apptWizard_pushButton = QtGui.QPushButton(self.appt_buttons_frame)
self.apptWizard_pushButton.setEnabled(True)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.apptWizard_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.apptWizard_pushButton.sizePolicy().hasHeightForWidth())
self.apptWizard_pushButton.setSizePolicy(sizePolicy)
- self.apptWizard_pushButton.setObjectName(_fromUtf8("apptWizard_pushButton"))
+ self.apptWizard_pushButton.setObjectName(
+ _fromUtf8("apptWizard_pushButton"))
self.verticalLayout_33.addWidget(self.apptWizard_pushButton)
self.gridLayout_16 = QtGui.QGridLayout()
self.gridLayout_16.setObjectName(_fromUtf8("gridLayout_16"))
self.newAppt_pushButton = QtGui.QPushButton(self.appt_buttons_frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.newAppt_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.newAppt_pushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.newAppt_pushButton.setSizePolicy(sizePolicy)
- self.newAppt_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
+ self.newAppt_pushButton.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
icon = QtGui.QIcon()
- icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/add_user.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/add_user.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.newAppt_pushButton.setIcon(icon)
self.newAppt_pushButton.setObjectName(_fromUtf8("newAppt_pushButton"))
self.gridLayout_16.addWidget(self.newAppt_pushButton, 0, 0, 1, 1)
self.clearAppt_pushButton = QtGui.QPushButton(self.appt_buttons_frame)
self.clearAppt_pushButton.setEnabled(True)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.clearAppt_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.clearAppt_pushButton.sizePolicy().hasHeightForWidth())
self.clearAppt_pushButton.setSizePolicy(sizePolicy)
- self.clearAppt_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
+ self.clearAppt_pushButton.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
icon1 = QtGui.QIcon()
- icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/eraser.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon1.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/eraser.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.clearAppt_pushButton.setIcon(icon1)
- self.clearAppt_pushButton.setObjectName(_fromUtf8("clearAppt_pushButton"))
+ self.clearAppt_pushButton.setObjectName(
+ _fromUtf8("clearAppt_pushButton"))
self.gridLayout_16.addWidget(self.clearAppt_pushButton, 0, 1, 1, 1)
self.verticalLayout_31 = QtGui.QVBoxLayout()
self.verticalLayout_31.setObjectName(_fromUtf8("verticalLayout_31"))
- self.scheduleAppt_pushButton = QtGui.QPushButton(self.appt_buttons_frame)
+ self.scheduleAppt_pushButton = QtGui.QPushButton(
+ self.appt_buttons_frame)
self.scheduleAppt_pushButton.setEnabled(True)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.scheduleAppt_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.scheduleAppt_pushButton.sizePolicy().hasHeightForWidth())
self.scheduleAppt_pushButton.setSizePolicy(sizePolicy)
- self.scheduleAppt_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
+ self.scheduleAppt_pushButton.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
icon2 = QtGui.QIcon()
- icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/month.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon2.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/month.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.scheduleAppt_pushButton.setIcon(icon2)
- self.scheduleAppt_pushButton.setObjectName(_fromUtf8("scheduleAppt_pushButton"))
+ self.scheduleAppt_pushButton.setObjectName(
+ _fromUtf8("scheduleAppt_pushButton"))
self.verticalLayout_31.addWidget(self.scheduleAppt_pushButton)
self.findAppt_pushButton = QtGui.QPushButton(self.appt_buttons_frame)
self.findAppt_pushButton.setEnabled(True)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.findAppt_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.findAppt_pushButton.sizePolicy().hasHeightForWidth())
self.findAppt_pushButton.setSizePolicy(sizePolicy)
- self.findAppt_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
+ self.findAppt_pushButton.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
icon3 = QtGui.QIcon()
- icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/schedule.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon3.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/schedule.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.findAppt_pushButton.setIcon(icon3)
- self.findAppt_pushButton.setObjectName(_fromUtf8("findAppt_pushButton"))
+ self.findAppt_pushButton.setObjectName(
+ _fromUtf8("findAppt_pushButton"))
self.verticalLayout_31.addWidget(self.findAppt_pushButton)
self.gridLayout_16.addLayout(self.verticalLayout_31, 0, 2, 2, 1)
self.printAppt_pushButton = QtGui.QPushButton(self.appt_buttons_frame)
self.printAppt_pushButton.setEnabled(True)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.printAppt_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.printAppt_pushButton.sizePolicy().hasHeightForWidth())
self.printAppt_pushButton.setSizePolicy(sizePolicy)
- self.printAppt_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
+ self.printAppt_pushButton.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
icon4 = QtGui.QIcon()
- icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/ps.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon4.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/ps.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.printAppt_pushButton.setIcon(icon4)
- self.printAppt_pushButton.setObjectName(_fromUtf8("printAppt_pushButton"))
+ self.printAppt_pushButton.setObjectName(
+ _fromUtf8("printAppt_pushButton"))
self.gridLayout_16.addWidget(self.printAppt_pushButton, 1, 0, 1, 1)
self.modifyAppt_pushButton = QtGui.QPushButton(self.appt_buttons_frame)
self.modifyAppt_pushButton.setEnabled(True)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.modifyAppt_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.modifyAppt_pushButton.sizePolicy().hasHeightForWidth())
self.modifyAppt_pushButton.setSizePolicy(sizePolicy)
- self.modifyAppt_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.modifyAppt_pushButton.setObjectName(_fromUtf8("modifyAppt_pushButton"))
+ self.modifyAppt_pushButton.setMaximumSize(
+ QtCore.QSize(16777215, 16777215))
+ self.modifyAppt_pushButton.setObjectName(
+ _fromUtf8("modifyAppt_pushButton"))
self.gridLayout_16.addWidget(self.modifyAppt_pushButton, 1, 1, 1, 1)
self.verticalLayout_33.addLayout(self.gridLayout_16)
self.gridLayout.addWidget(self.appt_buttons_frame, 1, 1, 1, 2)
@@ -140,21 +195,29 @@ class Ui_Form(object):
def retranslateUi(self, Form):
Form.setWindowTitle(_("Form"))
- self.appt_memo_lineEdit.setToolTip(_("<html><head/><body><p>A place to keep a reminder of the patients appointment preferences.</p><p>Eg. "30 minute appointments for examinations" etc. </p></body></html>"))
+ self.appt_memo_lineEdit.setToolTip(
+ _("<html><head/><body><p>A place to keep a reminder of the patients appointment preferences.</p><p>Eg. "30 minute appointments for examinations" etc. </p></body></html>"))
self.recall_settings_pushButton.setText(_("Recall Settings"))
- self.apptWizard_pushButton.setToolTip(_("A Wizard to select some common appointment combinations"))
+ self.apptWizard_pushButton.setToolTip(
+ _("A Wizard to select some common appointment combinations"))
self.apptWizard_pushButton.setText(_("Appointment Shortcuts"))
- self.newAppt_pushButton.setToolTip(_("A New Appointment for this patient"))
+ self.newAppt_pushButton.setToolTip(
+ _("A New Appointment for this patient"))
self.newAppt_pushButton.setText(_("&New"))
- self.clearAppt_pushButton.setToolTip(_("delete or cancel the appointment"))
+ self.clearAppt_pushButton.setToolTip(
+ _("delete or cancel the appointment"))
self.clearAppt_pushButton.setText(_("Clear/Cancel"))
- self.scheduleAppt_pushButton.setToolTip(_("Make the selected appointment"))
+ self.scheduleAppt_pushButton.setToolTip(
+ _("Make the selected appointment"))
self.scheduleAppt_pushButton.setText(_("Schedule"))
- self.findAppt_pushButton.setToolTip(_("Find the appointment in the the practice appointment list"))
+ self.findAppt_pushButton.setToolTip(
+ _("Find the appointment in the the practice appointment list"))
self.findAppt_pushButton.setText(_("Find in Book"))
- self.printAppt_pushButton.setToolTip(_("Print out the next 5 appointments for this patient"))
+ self.printAppt_pushButton.setToolTip(
+ _("Print out the next 5 appointments for this patient"))
self.printAppt_pushButton.setText(_("Print Card"))
- self.modifyAppt_pushButton.setToolTip(_("Allows modifcation of certain criteria for this appointment"))
+ self.modifyAppt_pushButton.setToolTip(
+ _("Allows modifcation of certain criteria for this appointment"))
self.modifyAppt_pushButton.setText(_("Modify"))
from openmolar.qt4gui import resources_rc
@@ -169,4 +232,3 @@ if __name__ == "__main__":
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py b/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py
index 77efdd2..83a18e9 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/patient_finder.ui'
@@ -17,11 +18,15 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(306, 367)
icon = QtGui.QIcon()
- icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/logo.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/logo.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
Dialog.setWindowIcon(icon)
self.gridLayout = QtGui.QGridLayout(Dialog)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
@@ -32,7 +37,10 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.label_3, 0, 0, 1, 3)
self.repeat_pushButton = QtGui.QPushButton(Dialog)
icon1 = QtGui.QIcon()
- icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/agt_reload.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon1.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/agt_reload.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.repeat_pushButton.setIcon(icon1)
self.repeat_pushButton.setObjectName(_fromUtf8("repeat_pushButton"))
self.gridLayout.addWidget(self.repeat_pushButton, 1, 0, 1, 3)
@@ -53,9 +61,13 @@ class Ui_Dialog(object):
self.snameSoundex_checkBox.setMaximumSize(QtCore.QSize(60, 24))
self.snameSoundex_checkBox.setText(_fromUtf8(""))
icon2 = QtGui.QIcon()
- icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/speaker.svg")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon2.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/speaker.svg")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.snameSoundex_checkBox.setIcon(icon2)
- self.snameSoundex_checkBox.setObjectName(_fromUtf8("snameSoundex_checkBox"))
+ self.snameSoundex_checkBox.setObjectName(
+ _fromUtf8("snameSoundex_checkBox"))
self.gridLayout.addWidget(self.snameSoundex_checkBox, 3, 2, 1, 1)
self.label_6 = QtGui.QLabel(Dialog)
self.label_6.setLayoutDirection(QtCore.Qt.RightToLeft)
@@ -69,7 +81,8 @@ class Ui_Dialog(object):
self.fnameSoundex_checkBox.setMaximumSize(QtCore.QSize(60, 24))
self.fnameSoundex_checkBox.setText(_fromUtf8(""))
self.fnameSoundex_checkBox.setIcon(icon2)
- self.fnameSoundex_checkBox.setObjectName(_fromUtf8("fnameSoundex_checkBox"))
+ self.fnameSoundex_checkBox.setObjectName(
+ _fromUtf8("fnameSoundex_checkBox"))
self.gridLayout.addWidget(self.fnameSoundex_checkBox, 4, 2, 1, 1)
self.label_2 = QtGui.QLabel(Dialog)
self.label_2.setLayoutDirection(QtCore.Qt.RightToLeft)
@@ -99,16 +112,22 @@ class Ui_Dialog(object):
self.pcde.setFocusPolicy(QtCore.Qt.StrongFocus)
self.pcde.setObjectName(_fromUtf8("pcde"))
self.gridLayout.addWidget(self.pcde, 8, 1, 1, 1)
- spacerItem = QtGui.QSpacerItem(20, 21, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 21,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem, 9, 1, 1, 1)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout.addWidget(self.buttonBox, 10, 0, 1, 3)
self.dateEdit = QtGui.QDateEdit(Dialog)
- self.dateEdit.setDateTime(QtCore.QDateTime(QtCore.QDate(1900, 1, 1), QtCore.QTime(0, 0, 0)))
+ self.dateEdit.setDateTime(
+ QtCore.QDateTime(QtCore.QDate(1900, 1, 1), QtCore.QTime(0, 0, 0)))
self.dateEdit.setCalendarPopup(True)
self.dateEdit.setObjectName(_fromUtf8("dateEdit"))
self.gridLayout.addWidget(self.dateEdit, 5, 1, 1, 1)
@@ -119,8 +138,14 @@ class Ui_Dialog(object):
self.label_9.setBuddy(self.pcde)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
Dialog.setTabOrder(self.sname, self.fname)
Dialog.setTabOrder(self.fname, self.dateEdit)
@@ -130,31 +155,38 @@ class Ui_Dialog(object):
Dialog.setTabOrder(self.pcde, self.buttonBox)
Dialog.setTabOrder(self.buttonBox, self.repeat_pushButton)
Dialog.setTabOrder(self.repeat_pushButton, self.snameSoundex_checkBox)
- Dialog.setTabOrder(self.snameSoundex_checkBox, self.fnameSoundex_checkBox)
+ Dialog.setTabOrder(
+ self.snameSoundex_checkBox,
+ self.fnameSoundex_checkBox)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_("Patient Finder"))
- self.label_3.setText(_("Fill in a few of the following fields to get a list of possible patients"))
+ self.label_3.setText(
+ _("Fill in a few of the following fields to get a list of possible patients"))
self.repeat_pushButton.setText(_("Repeat Last Search"))
self.label_5.setText(_("SNO or Surname"))
self.sname.setToolTip(_("Enter either the full name or the first few letters of the name.\n"
-"\n"
-"If you are unsure of the spelling, type in the COMPLETE name,\n"
-"and check the adjacent \"sounds like\" box."))
- self.snameSoundex_checkBox.setToolTip(_("check to search for a similar sounding name"))
+ "\n"
+ "If you are unsure of the spelling, type in the COMPLETE name,\n"
+ "and check the adjacent \"sounds like\" box."))
+ self.snameSoundex_checkBox.setToolTip(
+ _("check to search for a similar sounding name"))
self.label_6.setText(_("First Name"))
self.fname.setToolTip(_("Enter either the full name or the first few letters of the name.\n"
-"\n"
-"If you are unsure of the spelling, type in the COMPLETE name,\n"
-"and check the adjacent \"sounds like\" box.\n"
-"Be wary of middle names. \n"
-"eg. \"Neil\" does NOT sound like \"Neil Alexander\"!"))
- self.fnameSoundex_checkBox.setToolTip(_("check to search for a similar sounding name"))
+ "\n"
+ "If you are unsure of the spelling, type in the COMPLETE name,\n"
+ "and check the adjacent \"sounds like\" box.\n"
+ "Be wary of middle names. \n"
+ "eg. \"Neil\" does NOT sound like \"Neil Alexander\"!"))
+ self.fnameSoundex_checkBox.setToolTip(
+ _("check to search for a similar sounding name"))
self.label_2.setText(_("Date of Birth"))
self.label_7.setText(_("Address includes"))
- self.addr1.setToolTip(_("openMolar will search line1 and line2 of the address for this text"))
+ self.addr1.setToolTip(
+ _("openMolar will search line1 and line2 of the address for this text"))
self.label_8.setText(_("Telephone"))
- self.tel.setToolTip(_("open molar will search tel1, tel2 and mobile for numbers present here."))
+ self.tel.setToolTip(
+ _("open molar will search tel1, tel2 and mobile for numbers present here."))
self.label_9.setText(_("Postcode"))
self.pcde.setToolTip(_("search for a postcode"))
@@ -170,4 +202,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_payments.py b/src/openmolar/qt4gui/compiled_uis/Ui_payments.py
index 4a03ad1..88bdb11 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_payments.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_payments.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/payments.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.setWindowModality(QtCore.Qt.ApplicationModal)
@@ -28,7 +30,8 @@ class Ui_Dialog(object):
self.gridLayout_2 = QtGui.QGridLayout(self.groupBox_2)
self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
self.label = QtGui.QLabel(self.groupBox_2)
- self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
self.cash_pushButton = QtGui.QPushButton(self.groupBox_2)
@@ -36,7 +39,8 @@ class Ui_Dialog(object):
self.cash_pushButton.setObjectName(_fromUtf8("cash_pushButton"))
self.gridLayout_2.addWidget(self.cash_pushButton, 0, 2, 1, 1)
self.label_2 = QtGui.QLabel(self.groupBox_2)
- self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_2.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.gridLayout_2.addWidget(self.label_2, 1, 0, 1, 1)
self.cheque_pushButton = QtGui.QPushButton(self.groupBox_2)
@@ -44,7 +48,8 @@ class Ui_Dialog(object):
self.cheque_pushButton.setObjectName(_fromUtf8("cheque_pushButton"))
self.gridLayout_2.addWidget(self.cheque_pushButton, 1, 2, 1, 1)
self.label_3 = QtGui.QLabel(self.groupBox_2)
- self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_3.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1)
self.debit_pushButton = QtGui.QPushButton(self.groupBox_2)
@@ -52,7 +57,8 @@ class Ui_Dialog(object):
self.debit_pushButton.setObjectName(_fromUtf8("debit_pushButton"))
self.gridLayout_2.addWidget(self.debit_pushButton, 2, 2, 1, 1)
self.label_4 = QtGui.QLabel(self.groupBox_2)
- self.label_4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_4.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_4.setObjectName(_fromUtf8("label_4"))
self.gridLayout_2.addWidget(self.label_4, 3, 0, 1, 1)
self.credit_pushButton = QtGui.QPushButton(self.groupBox_2)
@@ -63,29 +69,34 @@ class Ui_Dialog(object):
self.cash_lineEdit.setMinimumSize(QtCore.QSize(70, 0))
self.cash_lineEdit.setMaximumSize(QtCore.QSize(70, 16777215))
self.cash_lineEdit.setMaxLength(10)
- self.cash_lineEdit.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.cash_lineEdit.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.cash_lineEdit.setObjectName(_fromUtf8("cash_lineEdit"))
self.gridLayout_2.addWidget(self.cash_lineEdit, 0, 1, 1, 1)
self.cheque_lineEdit = QtGui.QLineEdit(self.groupBox_2)
self.cheque_lineEdit.setMinimumSize(QtCore.QSize(70, 0))
self.cheque_lineEdit.setMaximumSize(QtCore.QSize(70, 16777215))
self.cheque_lineEdit.setMaxLength(10)
- self.cheque_lineEdit.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.cheque_lineEdit.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.cheque_lineEdit.setObjectName(_fromUtf8("cheque_lineEdit"))
self.gridLayout_2.addWidget(self.cheque_lineEdit, 1, 1, 1, 1)
self.debitCard_lineEdit = QtGui.QLineEdit(self.groupBox_2)
self.debitCard_lineEdit.setMinimumSize(QtCore.QSize(70, 0))
self.debitCard_lineEdit.setMaximumSize(QtCore.QSize(70, 16777215))
self.debitCard_lineEdit.setMaxLength(10)
- self.debitCard_lineEdit.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.debitCard_lineEdit.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.debitCard_lineEdit.setObjectName(_fromUtf8("debitCard_lineEdit"))
self.gridLayout_2.addWidget(self.debitCard_lineEdit, 2, 1, 1, 1)
self.creditCard_lineEdit = QtGui.QLineEdit(self.groupBox_2)
self.creditCard_lineEdit.setMinimumSize(QtCore.QSize(70, 0))
self.creditCard_lineEdit.setMaximumSize(QtCore.QSize(70, 16777215))
self.creditCard_lineEdit.setMaxLength(10)
- self.creditCard_lineEdit.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
- self.creditCard_lineEdit.setObjectName(_fromUtf8("creditCard_lineEdit"))
+ self.creditCard_lineEdit.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
+ self.creditCard_lineEdit.setObjectName(
+ _fromUtf8("creditCard_lineEdit"))
self.gridLayout_2.addWidget(self.creditCard_lineEdit, 3, 1, 1, 1)
self.verticalLayout.addWidget(self.groupBox_2)
self.groupBox = QtGui.QGroupBox(Dialog)
@@ -94,36 +105,42 @@ class Ui_Dialog(object):
self.gridLayout = QtGui.QGridLayout(self.groupBox)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.label_8 = QtGui.QLabel(self.groupBox)
- self.label_8.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_8.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_8.setObjectName(_fromUtf8("label_8"))
self.gridLayout.addWidget(self.label_8, 0, 0, 1, 1)
self.sundries_lineEdit = QtGui.QLineEdit(self.groupBox)
self.sundries_lineEdit.setMinimumSize(QtCore.QSize(70, 0))
self.sundries_lineEdit.setMaximumSize(QtCore.QSize(70, 16777215))
self.sundries_lineEdit.setMaxLength(10)
- self.sundries_lineEdit.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.sundries_lineEdit.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.sundries_lineEdit.setObjectName(_fromUtf8("sundries_lineEdit"))
self.gridLayout.addWidget(self.sundries_lineEdit, 0, 1, 1, 1)
self.label_7 = QtGui.QLabel(self.groupBox)
- self.label_7.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_7.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_7.setObjectName(_fromUtf8("label_7"))
self.gridLayout.addWidget(self.label_7, 1, 0, 1, 1)
self.annualHDP_lineEdit = QtGui.QLineEdit(self.groupBox)
self.annualHDP_lineEdit.setMinimumSize(QtCore.QSize(70, 0))
self.annualHDP_lineEdit.setMaximumSize(QtCore.QSize(70, 16777215))
self.annualHDP_lineEdit.setMaxLength(10)
- self.annualHDP_lineEdit.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.annualHDP_lineEdit.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.annualHDP_lineEdit.setObjectName(_fromUtf8("annualHDP_lineEdit"))
self.gridLayout.addWidget(self.annualHDP_lineEdit, 1, 1, 1, 1)
self.label_9 = QtGui.QLabel(self.groupBox)
- self.label_9.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_9.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_9.setObjectName(_fromUtf8("label_9"))
self.gridLayout.addWidget(self.label_9, 2, 0, 1, 1)
self.misc_lineEdit = QtGui.QLineEdit(self.groupBox)
self.misc_lineEdit.setMinimumSize(QtCore.QSize(70, 0))
self.misc_lineEdit.setMaximumSize(QtCore.QSize(70, 16777215))
self.misc_lineEdit.setMaxLength(10)
- self.misc_lineEdit.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.misc_lineEdit.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.misc_lineEdit.setObjectName(_fromUtf8("misc_lineEdit"))
self.gridLayout.addWidget(self.misc_lineEdit, 2, 1, 1, 1)
self.verticalLayout.addWidget(self.groupBox)
@@ -134,19 +151,24 @@ class Ui_Dialog(object):
self.label_6.setObjectName(_fromUtf8("label_6"))
self.horizontalLayout.addWidget(self.label_6)
self.total_doubleSpinBox = QtGui.QDoubleSpinBox(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.total_doubleSpinBox.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.total_doubleSpinBox.sizePolicy().hasHeightForWidth())
self.total_doubleSpinBox.setSizePolicy(sizePolicy)
self.total_doubleSpinBox.setMinimumSize(QtCore.QSize(80, 0))
self.total_doubleSpinBox.setReadOnly(True)
self.total_doubleSpinBox.setMaximum(20000.0)
- self.total_doubleSpinBox.setObjectName(_fromUtf8("total_doubleSpinBox"))
+ self.total_doubleSpinBox.setObjectName(
+ _fromUtf8("total_doubleSpinBox"))
self.horizontalLayout.addWidget(self.total_doubleSpinBox)
self.verticalLayout.addLayout(self.horizontalLayout)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Apply|QtGui.QDialogButtonBox.Cancel)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Apply | QtGui.QDialogButtonBox.Cancel)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout.addWidget(self.buttonBox)
self.label.setBuddy(self.cash_lineEdit)
@@ -159,7 +181,10 @@ class Ui_Dialog(object):
self.label_6.setBuddy(self.total_doubleSpinBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
Dialog.setTabOrder(self.cash_lineEdit, self.cheque_lineEdit)
Dialog.setTabOrder(self.cheque_lineEdit, self.debitCard_lineEdit)
@@ -189,7 +214,8 @@ class Ui_Dialog(object):
self.label_8.setText(_("Sundries"))
self.label_7.setText(_("Annual HDP"))
self.label_9.setText(_("Miscellaneous"))
- self.label_6.setText(_("Amount which will appear on receipt (read only)"))
+ self.label_6.setText(
+ _("Amount which will appear on receipt (read only)"))
if __name__ == "__main__":
@@ -202,4 +228,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py b/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py
index 1c3b160..f80431a 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/permissions.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(308, 177)
@@ -33,20 +35,27 @@ class Ui_Dialog(object):
self.verticalLayout.addWidget(self.lineEdit)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_("Raise Permissions"))
self.label.setText(_("Supervisor Rights required to Perform This Action.\n"
-"Please enter password."))
+ "Please enter password."))
if __name__ == "__main__":
@@ -59,4 +68,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py b/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py
index 7baea31..a11ad98 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/quick_daylist_print.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(178, 140)
@@ -44,13 +46,20 @@ class Ui_Dialog(object):
self.verticalLayout.addWidget(self.radioButton_2)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -70,4 +79,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py b/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py
index bf2cfb9..fdf558f 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/record_tools.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(628, 521)
@@ -32,95 +34,114 @@ class Ui_Dialog(object):
self.money_scrollArea.setWidgetResizable(True)
self.money_scrollArea.setObjectName(_fromUtf8("money_scrollArea"))
self.money_scrollAreaWidgetContents = QtGui.QWidget()
- self.money_scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 443, 424))
- self.money_scrollAreaWidgetContents.setObjectName(_fromUtf8("money_scrollAreaWidgetContents"))
- self.gridLayout = QtGui.QGridLayout(self.money_scrollAreaWidgetContents)
+ self.money_scrollAreaWidgetContents.setGeometry(
+ QtCore.QRect(0, 0, 443, 424))
+ self.money_scrollAreaWidgetContents.setObjectName(
+ _fromUtf8("money_scrollAreaWidgetContents"))
+ self.gridLayout = QtGui.QGridLayout(
+ self.money_scrollAreaWidgetContents)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.label = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
- self.money0_spinBox = QtGui.QSpinBox(self.money_scrollAreaWidgetContents)
+ self.money0_spinBox = QtGui.QSpinBox(
+ self.money_scrollAreaWidgetContents)
self.money0_spinBox.setMaximum(1000000)
self.money0_spinBox.setObjectName(_fromUtf8("money0_spinBox"))
self.gridLayout.addWidget(self.money0_spinBox, 1, 1, 1, 1)
self.label_2 = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
- self.money2_spinBox = QtGui.QSpinBox(self.money_scrollAreaWidgetContents)
+ self.money2_spinBox = QtGui.QSpinBox(
+ self.money_scrollAreaWidgetContents)
self.money2_spinBox.setMaximum(1000000)
self.money2_spinBox.setObjectName(_fromUtf8("money2_spinBox"))
self.gridLayout.addWidget(self.money2_spinBox, 2, 1, 1, 1)
self.label_5 = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label_5.setObjectName(_fromUtf8("label_5"))
self.gridLayout.addWidget(self.label_5, 7, 0, 1, 1)
- self.money4_spinBox = QtGui.QSpinBox(self.money_scrollAreaWidgetContents)
+ self.money4_spinBox = QtGui.QSpinBox(
+ self.money_scrollAreaWidgetContents)
self.money4_spinBox.setMaximum(1000000)
self.money4_spinBox.setObjectName(_fromUtf8("money4_spinBox"))
self.gridLayout.addWidget(self.money4_spinBox, 7, 1, 1, 1)
self.label_6 = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label_6.setObjectName(_fromUtf8("label_6"))
self.gridLayout.addWidget(self.label_6, 8, 0, 1, 1)
- self.money5_spinBox = QtGui.QSpinBox(self.money_scrollAreaWidgetContents)
+ self.money5_spinBox = QtGui.QSpinBox(
+ self.money_scrollAreaWidgetContents)
self.money5_spinBox.setMaximum(1000000)
self.money5_spinBox.setObjectName(_fromUtf8("money5_spinBox"))
self.gridLayout.addWidget(self.money5_spinBox, 8, 1, 1, 1)
self.label_7 = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label_7.setObjectName(_fromUtf8("label_7"))
self.gridLayout.addWidget(self.label_7, 9, 0, 1, 1)
- self.money6_spinBox = QtGui.QSpinBox(self.money_scrollAreaWidgetContents)
+ self.money6_spinBox = QtGui.QSpinBox(
+ self.money_scrollAreaWidgetContents)
self.money6_spinBox.setMaximum(1000000)
self.money6_spinBox.setObjectName(_fromUtf8("money6_spinBox"))
self.gridLayout.addWidget(self.money6_spinBox, 9, 1, 1, 1)
self.label_8 = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label_8.setObjectName(_fromUtf8("label_8"))
self.gridLayout.addWidget(self.label_8, 10, 0, 1, 1)
- self.money7_spinBox = QtGui.QSpinBox(self.money_scrollAreaWidgetContents)
+ self.money7_spinBox = QtGui.QSpinBox(
+ self.money_scrollAreaWidgetContents)
self.money7_spinBox.setMaximum(1000000)
self.money7_spinBox.setObjectName(_fromUtf8("money7_spinBox"))
self.gridLayout.addWidget(self.money7_spinBox, 10, 1, 1, 1)
self.label_9 = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label_9.setObjectName(_fromUtf8("label_9"))
self.gridLayout.addWidget(self.label_9, 11, 0, 1, 1)
- self.money8_spinBox = QtGui.QSpinBox(self.money_scrollAreaWidgetContents)
+ self.money8_spinBox = QtGui.QSpinBox(
+ self.money_scrollAreaWidgetContents)
self.money8_spinBox.setMaximum(1000000)
self.money8_spinBox.setObjectName(_fromUtf8("money8_spinBox"))
self.gridLayout.addWidget(self.money8_spinBox, 11, 1, 1, 1)
self.label_10 = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label_10.setObjectName(_fromUtf8("label_10"))
self.gridLayout.addWidget(self.label_10, 12, 0, 1, 1)
- self.money9_spinBox = QtGui.QSpinBox(self.money_scrollAreaWidgetContents)
+ self.money9_spinBox = QtGui.QSpinBox(
+ self.money_scrollAreaWidgetContents)
self.money9_spinBox.setMaximum(1000000)
self.money9_spinBox.setObjectName(_fromUtf8("money9_spinBox"))
self.gridLayout.addWidget(self.money9_spinBox, 12, 1, 1, 1)
self.label_11 = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label_11.setObjectName(_fromUtf8("label_11"))
self.gridLayout.addWidget(self.label_11, 13, 0, 1, 1)
- self.money10_spinBox = QtGui.QSpinBox(self.money_scrollAreaWidgetContents)
+ self.money10_spinBox = QtGui.QSpinBox(
+ self.money_scrollAreaWidgetContents)
self.money10_spinBox.setMaximum(1000000)
self.money10_spinBox.setObjectName(_fromUtf8("money10_spinBox"))
self.gridLayout.addWidget(self.money10_spinBox, 13, 1, 1, 1)
self.label_12 = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label_12.setObjectName(_fromUtf8("label_12"))
self.gridLayout.addWidget(self.label_12, 14, 0, 1, 1)
- self.money11_spinBox = QtGui.QSpinBox(self.money_scrollAreaWidgetContents)
+ self.money11_spinBox = QtGui.QSpinBox(
+ self.money_scrollAreaWidgetContents)
self.money11_spinBox.setMaximum(1000000)
self.money11_spinBox.setObjectName(_fromUtf8("money11_spinBox"))
self.gridLayout.addWidget(self.money11_spinBox, 14, 1, 1, 1)
self.label_3 = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.gridLayout.addWidget(self.label_3, 3, 0, 1, 1)
- self.money1_spinBox = QtGui.QSpinBox(self.money_scrollAreaWidgetContents)
+ self.money1_spinBox = QtGui.QSpinBox(
+ self.money_scrollAreaWidgetContents)
self.money1_spinBox.setMaximum(1000000)
self.money1_spinBox.setObjectName(_fromUtf8("money1_spinBox"))
self.gridLayout.addWidget(self.money1_spinBox, 3, 1, 1, 1)
- self.money3_spinBox = QtGui.QSpinBox(self.money_scrollAreaWidgetContents)
+ self.money3_spinBox = QtGui.QSpinBox(
+ self.money_scrollAreaWidgetContents)
self.money3_spinBox.setMaximum(1000000)
self.money3_spinBox.setObjectName(_fromUtf8("money3_spinBox"))
self.gridLayout.addWidget(self.money3_spinBox, 4, 1, 1, 1)
self.label_4 = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label_4.setObjectName(_fromUtf8("label_4"))
self.gridLayout.addWidget(self.label_4, 4, 0, 1, 1)
- spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem, 15, 0, 1, 2)
self.label_14 = QtGui.QLabel(self.money_scrollAreaWidgetContents)
self.label_14.setObjectName(_fromUtf8("label_14"))
@@ -142,11 +163,18 @@ class Ui_Dialog(object):
self.gridLayout_2.addWidget(self.total_label, 1, 1, 1, 1)
self.money_pushButton = QtGui.QPushButton(self.tab)
icon = QtGui.QIcon()
- icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/button_ok.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/button_ok.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.money_pushButton.setIcon(icon)
self.money_pushButton.setObjectName(_fromUtf8("money_pushButton"))
self.gridLayout_2.addWidget(self.money_pushButton, 2, 1, 1, 1)
- spacerItem1 = QtGui.QSpacerItem(20, 337, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem1 = QtGui.QSpacerItem(
+ 20,
+ 337,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem1, 3, 1, 1, 1)
self.tabWidget.addTab(self.tab, _fromUtf8(""))
self.tab_2 = QtGui.QWidget()
@@ -157,14 +185,19 @@ class Ui_Dialog(object):
self.dates_pushButton.setIcon(icon)
self.dates_pushButton.setObjectName(_fromUtf8("dates_pushButton"))
self.gridLayout_4.addWidget(self.dates_pushButton, 0, 1, 1, 1)
- spacerItem2 = QtGui.QSpacerItem(82, 388, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem2 = QtGui.QSpacerItem(
+ 82,
+ 388,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_4.addItem(spacerItem2, 1, 1, 1, 1)
self.scrollArea = QtGui.QScrollArea(self.tab_2)
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
self.scrollAreaWidgetContents = QtGui.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 345, 263))
- self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
+ self.scrollAreaWidgetContents.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents"))
self.gridLayout_3 = QtGui.QGridLayout(self.scrollAreaWidgetContents)
self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
self.label_15 = QtGui.QLabel(self.scrollAreaWidgetContents)
@@ -254,11 +287,17 @@ class Ui_Dialog(object):
self.billdate_dateEdit.setCalendarPopup(True)
self.billdate_dateEdit.setObjectName(_fromUtf8("billdate_dateEdit"))
self.horizontalLayout_7.addWidget(self.billdate_dateEdit)
- self.billdate_pushButton = QtGui.QPushButton(self.scrollAreaWidgetContents)
- self.billdate_pushButton.setObjectName(_fromUtf8("billdate_pushButton"))
+ self.billdate_pushButton = QtGui.QPushButton(
+ self.scrollAreaWidgetContents)
+ self.billdate_pushButton.setObjectName(
+ _fromUtf8("billdate_pushButton"))
self.horizontalLayout_7.addWidget(self.billdate_pushButton)
self.gridLayout_3.addLayout(self.horizontalLayout_7, 6, 1, 1, 1)
- spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem3 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_3.addItem(spacerItem3, 7, 0, 1, 1)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.gridLayout_4.addWidget(self.scrollArea, 0, 0, 2, 1)
@@ -272,8 +311,10 @@ class Ui_Dialog(object):
self.scrollArea_2.setObjectName(_fromUtf8("scrollArea_2"))
self.scrollAreaWidgetContents_2 = QtGui.QWidget()
self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 36, 28))
- self.scrollAreaWidgetContents_2.setObjectName(_fromUtf8("scrollAreaWidgetContents_2"))
- self.verticalLayout_2 = QtGui.QVBoxLayout(self.scrollAreaWidgetContents_2)
+ self.scrollAreaWidgetContents_2.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_2"))
+ self.verticalLayout_2 = QtGui.QVBoxLayout(
+ self.scrollAreaWidgetContents_2)
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
self.chartplan_frame = QtGui.QFrame(self.scrollAreaWidgetContents_2)
self.chartplan_frame.setFrameShape(QtGui.QFrame.StyledPanel)
@@ -286,7 +327,11 @@ class Ui_Dialog(object):
self.plan_pushButton.setIcon(icon)
self.plan_pushButton.setObjectName(_fromUtf8("plan_pushButton"))
self.gridLayout_11.addWidget(self.plan_pushButton, 0, 3, 1, 1)
- spacerItem4 = QtGui.QSpacerItem(82, 388, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem4 = QtGui.QSpacerItem(
+ 82,
+ 388,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_11.addItem(spacerItem4, 1, 3, 2, 1)
self.gridLayout_9 = QtGui.QGridLayout()
self.gridLayout_9.setObjectName(_fromUtf8("gridLayout_9"))
@@ -379,22 +424,32 @@ class Ui_Dialog(object):
self.scrollArea_3.setWidgetResizable(True)
self.scrollArea_3.setObjectName(_fromUtf8("scrollArea_3"))
self.scrollAreaWidgetContents_3 = QtGui.QWidget()
- self.scrollAreaWidgetContents_3.setGeometry(QtCore.QRect(0, 0, 461, 225))
- self.scrollAreaWidgetContents_3.setObjectName(_fromUtf8("scrollAreaWidgetContents_3"))
- self.verticalLayout_3 = QtGui.QVBoxLayout(self.scrollAreaWidgetContents_3)
+ self.scrollAreaWidgetContents_3.setGeometry(
+ QtCore.QRect(0, 0, 461, 225))
+ self.scrollAreaWidgetContents_3.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents_3"))
+ self.verticalLayout_3 = QtGui.QVBoxLayout(
+ self.scrollAreaWidgetContents_3)
self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
- self.chartcompleted_frame = QtGui.QFrame(self.scrollAreaWidgetContents_3)
+ self.chartcompleted_frame = QtGui.QFrame(
+ self.scrollAreaWidgetContents_3)
self.chartcompleted_frame.setFrameShape(QtGui.QFrame.StyledPanel)
self.chartcompleted_frame.setFrameShadow(QtGui.QFrame.Raised)
- self.chartcompleted_frame.setObjectName(_fromUtf8("chartcompleted_frame"))
+ self.chartcompleted_frame.setObjectName(
+ _fromUtf8("chartcompleted_frame"))
self.verticalLayout_3.addWidget(self.chartcompleted_frame)
self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3)
self.gridLayout_5.addWidget(self.scrollArea_3, 0, 0, 2, 3)
self.completed_pushButton = QtGui.QPushButton(self.tab_4)
self.completed_pushButton.setIcon(icon)
- self.completed_pushButton.setObjectName(_fromUtf8("completed_pushButton"))
+ self.completed_pushButton.setObjectName(
+ _fromUtf8("completed_pushButton"))
self.gridLayout_5.addWidget(self.completed_pushButton, 0, 3, 1, 1)
- spacerItem5 = QtGui.QSpacerItem(82, 388, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem5 = QtGui.QSpacerItem(
+ 82,
+ 388,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_5.addItem(spacerItem5, 1, 3, 2, 1)
self.gridLayout_12 = QtGui.QGridLayout()
self.gridLayout_12.setObjectName(_fromUtf8("gridLayout_12"))
@@ -489,16 +544,22 @@ class Ui_Dialog(object):
self.label_26.setObjectName(_fromUtf8("label_26"))
self.verticalLayout_4.addWidget(self.label_26)
self.hidden_notes_tableWidget = QtGui.QTableWidget(self.tab_5)
- self.hidden_notes_tableWidget.setObjectName(_fromUtf8("hidden_notes_tableWidget"))
+ self.hidden_notes_tableWidget.setObjectName(
+ _fromUtf8("hidden_notes_tableWidget"))
self.hidden_notes_tableWidget.setColumnCount(0)
self.hidden_notes_tableWidget.setRowCount(0)
self.verticalLayout_4.addWidget(self.hidden_notes_tableWidget)
self.gridLayout_6.addLayout(self.verticalLayout_4, 0, 0, 2, 1)
self.hidden_notes_pushButton = QtGui.QPushButton(self.tab_5)
self.hidden_notes_pushButton.setIcon(icon)
- self.hidden_notes_pushButton.setObjectName(_fromUtf8("hidden_notes_pushButton"))
+ self.hidden_notes_pushButton.setObjectName(
+ _fromUtf8("hidden_notes_pushButton"))
self.gridLayout_6.addWidget(self.hidden_notes_pushButton, 0, 1, 1, 1)
- spacerItem6 = QtGui.QSpacerItem(20, 377, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem6 = QtGui.QSpacerItem(
+ 20,
+ 377,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_6.addItem(spacerItem6, 1, 1, 1, 1)
self.tabWidget.addTab(self.tab_5, _fromUtf8(""))
self.verticalLayout.addWidget(self.tabWidget)
@@ -510,8 +571,14 @@ class Ui_Dialog(object):
self.retranslateUi(Dialog)
self.tabWidget.setCurrentIndex(0)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -520,8 +587,10 @@ class Ui_Dialog(object):
self.label_2.setText(_("NHS payments (money2)"))
self.label_5.setText(_("NHS estimated (money4)"))
self.label_6.setText(_("private estimate (money5)"))
- self.label_7.setText(_("Exempt - nhs gross - completed treatment (money6)"))
- self.label_8.setText(_("Exempt - NHS gross - estimated current (money7)"))
+ self.label_7.setText(
+ _("Exempt - nhs gross - completed treatment (money6)"))
+ self.label_8.setText(
+ _("Exempt - NHS gross - estimated current (money7)"))
self.label_9.setText(_("credit (money8)"))
self.label_10.setText(_("debt (money9)"))
self.label_11.setText(_("debt2 (money10)"))
@@ -548,7 +617,9 @@ class Ui_Dialog(object):
self.pd10_pushButton.setText(_("Add Date"))
self.label_21.setText(_("Last Account sent (billdate)"))
self.billdate_pushButton.setText(_("Add Date"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _("Dates"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_2),
+ _("Dates"))
self.plan_pushButton.setText(_("Apply Changes"))
self.label_22.setText(_("Xray"))
self.label_23.setText(_("Perio"))
@@ -560,7 +631,9 @@ class Ui_Dialog(object):
self.label_53.setText(_("new lower"))
self.label_54.setText(_("repair upper"))
self.label_55.setText(_("repair lower"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _("Treatment Plan"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_3),
+ _("Treatment Plan"))
self.completed_pushButton.setText(_("Apply Changes"))
self.label_24.setText(_("Xray"))
self.label_25.setText(_("Perio"))
@@ -572,10 +645,14 @@ class Ui_Dialog(object):
self.label_60.setText(_("new lower"))
self.label_61.setText(_("repair upper"))
self.label_62.setText(_("repair lower"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _("Completed Treatment"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_4),
+ _("Completed Treatment"))
self.label_26.setText(_("Hidden Notes"))
self.hidden_notes_pushButton.setText(_("Apply Changes"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_5), _("Miscellaneous"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_5),
+ _("Miscellaneous"))
from openmolar.qt4gui import resources_rc
@@ -589,4 +666,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_saveDiscardCancel.py b/src/openmolar/qt4gui/compiled_uis/Ui_saveDiscardCancel.py
deleted file mode 100644
index ecc6d5c..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_saveDiscardCancel.py
+++ /dev/null
@@ -1,82 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/saveDiscardCancel.ui'
-#
-# Created: Wed Nov 6 23:05:24 2013
-# by: PyQt4 UI code generator 4.10.3
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
- _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
- def _fromUtf8(s):
- return s
-
-
-class Ui_Dialog(object):
- def setupUi(self, Dialog):
- Dialog.setObjectName(_fromUtf8("Dialog"))
- Dialog.resize(552, 283)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
- Dialog.setSizePolicy(sizePolicy)
- Dialog.setMinimumSize(QtCore.QSize(0, 0))
- self.listWidget = QtGui.QListWidget(Dialog)
- self.listWidget.setGeometry(QtCore.QRect(9, 161, 534, 113))
- self.listWidget.setObjectName(_fromUtf8("listWidget"))
- self.buttonBox = QtGui.QDialogButtonBox(Dialog)
- self.buttonBox.setGeometry(QtCore.QRect(9, 95, 531, 27))
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.buttonBox.sizePolicy().hasHeightForWidth())
- self.buttonBox.setSizePolicy(sizePolicy)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Discard|QtGui.QDialogButtonBox.Save)
- self.buttonBox.setCenterButtons(True)
- self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
- self.pushButton = QtGui.QPushButton(Dialog)
- self.pushButton.setGeometry(QtCore.QRect(322, 128, 221, 27))
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())
- self.pushButton.setSizePolicy(sizePolicy)
- icon = QtGui.QIcon()
- icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/down.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
- self.pushButton.setIcon(icon)
- self.pushButton.setFlat(True)
- self.pushButton.setObjectName(_fromUtf8("pushButton"))
- self.label = QtGui.QLabel(Dialog)
- self.label.setGeometry(QtCore.QRect(9, 9, 531, 80))
- self.label.setMinimumSize(QtCore.QSize(0, 80))
- self.label.setMaximumSize(QtCore.QSize(16777215, 80))
- self.label.setText(_fromUtf8(""))
- self.label.setAlignment(QtCore.Qt.AlignCenter)
- self.label.setWordWrap(True)
- self.label.setObjectName(_fromUtf8("label"))
-
- self.retranslateUi(Dialog)
- QtCore.QMetaObject.connectSlotsByName(Dialog)
-
- def retranslateUi(self, Dialog):
- Dialog.setWindowTitle(_("Confirmation Required"))
- self.pushButton.setText(_("What\'s Changed?"))
-
-from openmolar.qt4gui import resources_rc
-
-if __name__ == "__main__":
- import gettext
- gettext.install("openmolar")
- import sys
- app = QtGui.QApplication(sys.argv)
- Dialog = QtGui.QDialog()
- ui = Ui_Dialog()
- ui.setupUi(Dialog)
- Dialog.show()
- sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py b/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py
index 6f9138d..30167b1 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/saveMemo.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(584, 236)
@@ -32,10 +34,12 @@ class Ui_Dialog(object):
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.noExpire_radioButton = QtGui.QRadioButton(self.groupBox_2)
self.noExpire_radioButton.setChecked(True)
- self.noExpire_radioButton.setObjectName(_fromUtf8("noExpire_radioButton"))
+ self.noExpire_radioButton.setObjectName(
+ _fromUtf8("noExpire_radioButton"))
self.gridLayout.addWidget(self.noExpire_radioButton, 0, 0, 1, 1)
self.dateExpire_radioButton = QtGui.QRadioButton(self.groupBox_2)
- self.dateExpire_radioButton.setObjectName(_fromUtf8("dateExpire_radioButton"))
+ self.dateExpire_radioButton.setObjectName(
+ _fromUtf8("dateExpire_radioButton"))
self.gridLayout.addWidget(self.dateExpire_radioButton, 1, 0, 1, 1)
self.dateEdit = QtGui.QDateEdit(self.groupBox_2)
self.dateEdit.setObjectName(_fromUtf8("dateEdit"))
@@ -47,13 +51,16 @@ class Ui_Dialog(object):
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.viewAll_radioButton = QtGui.QRadioButton(self.groupBox_3)
self.viewAll_radioButton.setChecked(True)
- self.viewAll_radioButton.setObjectName(_fromUtf8("viewAll_radioButton"))
+ self.viewAll_radioButton.setObjectName(
+ _fromUtf8("viewAll_radioButton"))
self.verticalLayout.addWidget(self.viewAll_radioButton)
self.viewSurgery_radioButton = QtGui.QRadioButton(self.groupBox_3)
- self.viewSurgery_radioButton.setObjectName(_fromUtf8("viewSurgery_radioButton"))
+ self.viewSurgery_radioButton.setObjectName(
+ _fromUtf8("viewSurgery_radioButton"))
self.verticalLayout.addWidget(self.viewSurgery_radioButton)
self.viewReception_radioButton = QtGui.QRadioButton(self.groupBox_3)
- self.viewReception_radioButton.setObjectName(_fromUtf8("viewReception_radioButton"))
+ self.viewReception_radioButton.setObjectName(
+ _fromUtf8("viewReception_radioButton"))
self.verticalLayout.addWidget(self.viewReception_radioButton)
self.gridLayout_2.addWidget(self.groupBox_3, 1, 1, 2, 1)
self.groupBox = QtGui.QGroupBox(Dialog)
@@ -65,17 +72,25 @@ class Ui_Dialog(object):
self.verticalLayout_2.addWidget(self.author_comboBox)
self.gridLayout_2.addWidget(self.groupBox, 1, 2, 1, 1)
self.phraseBook_pushButton = QtGui.QPushButton(Dialog)
- self.phraseBook_pushButton.setObjectName(_fromUtf8("phraseBook_pushButton"))
+ self.phraseBook_pushButton.setObjectName(
+ _fromUtf8("phraseBook_pushButton"))
self.gridLayout_2.addWidget(self.phraseBook_pushButton, 1, 3, 1, 1)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Save)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout_2.addWidget(self.buttonBox, 2, 2, 1, 2)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -101,4 +116,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_select_patient.py b/src/openmolar/qt4gui/compiled_uis/Ui_select_patient.py
index e341e39..d21d7ed 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_select_patient.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_select_patient.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/select_patient.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(1014, 398)
@@ -24,20 +26,28 @@ class Ui_Dialog(object):
self.vboxlayout.setObjectName(_fromUtf8("vboxlayout"))
self.tableWidget = QtGui.QTableWidget(Dialog)
self.tableWidget.setAlternatingRowColors(True)
- self.tableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+ self.tableWidget.setSelectionBehavior(
+ QtGui.QAbstractItemView.SelectRows)
self.tableWidget.setObjectName(_fromUtf8("tableWidget"))
self.tableWidget.setColumnCount(0)
self.tableWidget.setRowCount(0)
self.vboxlayout.addWidget(self.tableWidget)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.vboxlayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -54,4 +64,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py b/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py
index e92c231..da454d9 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/showMemo.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(611, 262)
@@ -24,7 +26,8 @@ class Ui_Dialog(object):
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.label = QtGui.QLabel(Dialog)
self.label.setText(_fromUtf8(""))
- self.label.setPixmap(QtGui.QPixmap(_fromUtf8(":/newlogo_launchpadSize.png")))
+ self.label.setPixmap(
+ QtGui.QPixmap(_fromUtf8(":/newlogo_launchpadSize.png")))
self.label.setScaledContents(True)
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout.addWidget(self.label, 0, 0, 2, 1)
@@ -47,8 +50,14 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.buttonBox, 1, 2, 1, 1)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -68,4 +77,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py b/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py
index 60a09b2..6c15513 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/specify_appointment.ui'
@@ -17,29 +18,37 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(593, 404)
self.gridLayout_2 = QtGui.QGridLayout(Dialog)
self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
- spacerItem = QtGui.QSpacerItem(81, 56, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem = QtGui.QSpacerItem(
+ 81,
+ 56,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem, 0, 0, 1, 1)
self.gridLayout_3 = QtGui.QGridLayout()
self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
self.label = QtGui.QLabel(Dialog)
- self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout_3.addWidget(self.label, 0, 0, 1, 1)
self.practix_comboBox = QtGui.QComboBox(Dialog)
self.practix_comboBox.setObjectName(_fromUtf8("practix_comboBox"))
self.gridLayout_3.addWidget(self.practix_comboBox, 0, 1, 1, 1)
self.label_2 = QtGui.QLabel(Dialog)
- self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_2.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.gridLayout_3.addWidget(self.label_2, 1, 0, 1, 1)
self.apptlength_comboBox = QtGui.QComboBox(Dialog)
self.apptlength_comboBox.setMaxVisibleItems(20)
- self.apptlength_comboBox.setObjectName(_fromUtf8("apptlength_comboBox"))
+ self.apptlength_comboBox.setObjectName(
+ _fromUtf8("apptlength_comboBox"))
self.apptlength_comboBox.addItem(_fromUtf8(""))
self.apptlength_comboBox.addItem(_fromUtf8(""))
self.apptlength_comboBox.addItem(_fromUtf8(""))
@@ -60,10 +69,15 @@ class Ui_Dialog(object):
self.combinedApptcheckBox = QtGui.QCheckBox(Dialog)
self.combinedApptcheckBox.setEnabled(False)
self.combinedApptcheckBox.setLayoutDirection(QtCore.Qt.LeftToRight)
- self.combinedApptcheckBox.setObjectName(_fromUtf8("combinedApptcheckBox"))
+ self.combinedApptcheckBox.setObjectName(
+ _fromUtf8("combinedApptcheckBox"))
self.gridLayout_3.addWidget(self.combinedApptcheckBox, 2, 0, 1, 2)
self.gridLayout_2.addLayout(self.gridLayout_3, 0, 1, 1, 1)
- spacerItem1 = QtGui.QSpacerItem(152, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem1 = QtGui.QSpacerItem(
+ 152,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem1, 0, 2, 1, 1)
self.line = QtGui.QFrame(Dialog)
self.line.setFrameShape(QtGui.QFrame.HLine)
@@ -116,7 +130,8 @@ class Ui_Dialog(object):
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.label_6 = QtGui.QLabel(Dialog)
self.label_6.setMaximumSize(QtCore.QSize(16777215, 30))
- self.label_6.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_6.setAlignment(
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_6.setObjectName(_fromUtf8("label_6"))
self.horizontalLayout.addWidget(self.label_6)
self.lineEdit = QtGui.QLineEdit(Dialog)
@@ -134,22 +149,37 @@ class Ui_Dialog(object):
self.horizontalLayout_2 = QtGui.QHBoxLayout()
self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
self.scheduleNow_pushButton = QtGui.QPushButton(Dialog)
- self.scheduleNow_pushButton.setObjectName(_fromUtf8("scheduleNow_pushButton"))
+ self.scheduleNow_pushButton.setObjectName(
+ _fromUtf8("scheduleNow_pushButton"))
self.horizontalLayout_2.addWidget(self.scheduleNow_pushButton)
- spacerItem2 = QtGui.QSpacerItem(128, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+ spacerItem2 = QtGui.QSpacerItem(
+ 128,
+ 20,
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Minimum)
self.horizontalLayout_2.addItem(spacerItem2)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Save)
self.buttonBox.setCenterButtons(False)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.horizontalLayout_2.addWidget(self.buttonBox)
self.gridLayout_2.addLayout(self.horizontalLayout_2, 6, 0, 1, 3)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
- QtCore.QObject.connect(self.scheduleNow_pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
+ QtCore.QObject.connect(
+ self.scheduleNow_pushButton,
+ QtCore.SIGNAL(_fromUtf8("clicked()")),
+ Dialog.accept)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -172,7 +202,8 @@ class Ui_Dialog(object):
self.apptlength_comboBox.setItemText(13, _("2 hours 30 minutes"))
self.apptlength_comboBox.setItemText(14, _("3 hours"))
self.apptlength_comboBox.setItemText(15, _("other"))
- self.combinedApptcheckBox.setText(_("Combined Appointment With Hygenist?"))
+ self.combinedApptcheckBox.setText(
+ _("Combined Appointment With Hygenist?"))
self.label_3.setText(_("Reason 1"))
self.label_5.setText(_("Reason 3"))
self.label_4.setText(_("Reason 2"))
@@ -190,4 +221,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py b/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py
index 964bc8a..945e6ae 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/staff_diary.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Form(object):
+
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(786, 546)
@@ -46,10 +48,13 @@ class Ui_Form(object):
self.verticalLayout_3.setMargin(0)
self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
self.label_3 = QtGui.QLabel(self.widget)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.label_3.sizePolicy().hasHeightForWidth())
self.label_3.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setBold(True)
@@ -61,7 +66,8 @@ class Ui_Form(object):
self.verticalLayout_3.addWidget(self.label_3)
self.summary_label = QtGui.QLabel(self.widget)
self.summary_label.setMinimumSize(QtCore.QSize(300, 0))
- self.summary_label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
+ self.summary_label.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
self.summary_label.setWordWrap(True)
self.summary_label.setObjectName(_fromUtf8("summary_label"))
self.verticalLayout_3.addWidget(self.summary_label)
@@ -71,10 +77,13 @@ class Ui_Form(object):
self.verticalLayout_4.setMargin(0)
self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
self.label_2 = QtGui.QLabel(self.widget1)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.label_2.sizePolicy().hasHeightForWidth())
self.label_2.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setBold(True)
@@ -86,7 +95,8 @@ class Ui_Form(object):
self.verticalLayout_4.addWidget(self.label_2)
self.agenda_label = QtGui.QLabel(self.widget1)
self.agenda_label.setMinimumSize(QtCore.QSize(300, 0))
- self.agenda_label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
+ self.agenda_label.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
self.agenda_label.setWordWrap(True)
self.agenda_label.setObjectName(_fromUtf8("agenda_label"))
self.verticalLayout_4.addWidget(self.agenda_label)
@@ -97,12 +107,16 @@ class Ui_Form(object):
self.verticalLayout_2 = QtGui.QVBoxLayout(self.tab)
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
self.messages_listWidget = QtGui.QListWidget(self.tab)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.messages_listWidget.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.messages_listWidget.sizePolicy().hasHeightForWidth())
self.messages_listWidget.setSizePolicy(sizePolicy)
- self.messages_listWidget.setObjectName(_fromUtf8("messages_listWidget"))
+ self.messages_listWidget.setObjectName(
+ _fromUtf8("messages_listWidget"))
self.verticalLayout_2.addWidget(self.messages_listWidget)
self.task_frame = QtGui.QFrame(self.tab)
self.task_frame.setFrameShape(QtGui.QFrame.StyledPanel)
@@ -143,10 +157,18 @@ class Ui_Form(object):
self.summary_label.setText(_("TextLabel"))
self.label_2.setText(_("Agenda"))
self.agenda_label.setText(_("TextLabel"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _("Summary"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _("Messages and Tasks"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _("My Calendar"))
- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _("Holiday Planner"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_4),
+ _("Summary"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab),
+ _("Messages and Tasks"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_2),
+ _("My Calendar"))
+ self.tabWidget.setTabText(
+ self.tabWidget.indexOf(self.tab_3),
+ _("Holiday Planner"))
if __name__ == "__main__":
@@ -159,4 +181,3 @@ if __name__ == "__main__":
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py b/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py
index 990d5f8..b3f2aaa 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/startscreen.ui'
@@ -17,18 +18,24 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.setWindowModality(QtCore.Qt.WindowModal)
Dialog.resize(276, 343)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
Dialog.setSizePolicy(sizePolicy)
Dialog.setMinimumSize(QtCore.QSize(200, 200))
icon = QtGui.QIcon()
- icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/openmolar.svg")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/openmolar.svg")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
Dialog.setWindowIcon(icon)
self.gridLayout_2 = QtGui.QGridLayout(Dialog)
self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
@@ -49,10 +56,13 @@ class Ui_Dialog(object):
self.horizontalLayout.addWidget(self.password_lineEdit)
self.gridLayout_2.addLayout(self.horizontalLayout, 0, 0, 1, 2)
self.line = QtGui.QFrame(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.line.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.line.sizePolicy().hasHeightForWidth())
self.line.setSizePolicy(sizePolicy)
self.line.setMinimumSize(QtCore.QSize(0, 16))
self.line.setFrameShape(QtGui.QFrame.HLine)
@@ -85,16 +95,19 @@ class Ui_Dialog(object):
self.surgery_radioButton = QtGui.QRadioButton(Dialog)
self.surgery_radioButton.setLayoutDirection(QtCore.Qt.RightToLeft)
self.surgery_radioButton.setChecked(True)
- self.surgery_radioButton.setObjectName(_fromUtf8("surgery_radioButton"))
+ self.surgery_radioButton.setObjectName(
+ _fromUtf8("surgery_radioButton"))
self.gridLayout.addWidget(self.surgery_radioButton, 2, 0, 1, 2)
self.reception_radioButton = QtGui.QRadioButton(Dialog)
self.reception_radioButton.setLayoutDirection(QtCore.Qt.RightToLeft)
- self.reception_radioButton.setObjectName(_fromUtf8("reception_radioButton"))
+ self.reception_radioButton.setObjectName(
+ _fromUtf8("reception_radioButton"))
self.gridLayout.addWidget(self.reception_radioButton, 3, 0, 1, 2)
self.gridLayout_2.addLayout(self.gridLayout, 2, 0, 1, 2)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout_2.addWidget(self.buttonBox, 4, 0, 1, 2)
@@ -115,23 +128,38 @@ class Ui_Dialog(object):
self.chosenServer_label.setObjectName(_fromUtf8("chosenServer_label"))
self.gridLayout_3.addWidget(self.chosenServer_label, 1, 0, 2, 1)
self.advanced_toolButton = QtGui.QToolButton(self.advanced_frame)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.advanced_toolButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.advanced_toolButton.sizePolicy().hasHeightForWidth())
self.advanced_toolButton.setSizePolicy(sizePolicy)
self.advanced_toolButton.setPopupMode(QtGui.QToolButton.InstantPopup)
- self.advanced_toolButton.setToolButtonStyle(QtCore.Qt.ToolButtonTextOnly)
+ self.advanced_toolButton.setToolButtonStyle(
+ QtCore.Qt.ToolButtonTextOnly)
self.advanced_toolButton.setArrowType(QtCore.Qt.DownArrow)
- self.advanced_toolButton.setObjectName(_fromUtf8("advanced_toolButton"))
+ self.advanced_toolButton.setObjectName(
+ _fromUtf8("advanced_toolButton"))
self.gridLayout_3.addWidget(self.advanced_toolButton, 2, 1, 1, 1)
self.gridLayout_2.addWidget(self.advanced_frame, 6, 0, 1, 2)
- spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem, 3, 0, 1, 2)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -156,4 +184,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py b/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py
index a4f2505..7bddbd2 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/surgeryNumber.ui'
@@ -17,17 +18,22 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(301, 167)
icon = QtGui.QIcon()
- icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/logo.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/logo.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
Dialog.setWindowIcon(icon)
self.gridLayout = QtGui.QGridLayout(Dialog)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.gridLayout.addWidget(self.buttonBox, 3, 0, 1, 3)
@@ -35,7 +41,11 @@ class Ui_Dialog(object):
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout.addWidget(self.label, 0, 0, 1, 3)
- spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ spacerItem = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem, 2, 1, 1, 1)
self.comboBox = QtGui.QComboBox(Dialog)
self.comboBox.setObjectName(_fromUtf8("comboBox"))
@@ -49,8 +59,14 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.comboBox, 1, 0, 1, 3)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -76,4 +92,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py b/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py
index 246aa71..3ff2dae 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/toothPerioProps.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Form(object):
+
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(499, 148)
@@ -62,26 +64,37 @@ class Ui_Form(object):
self.copy_pushButton.setObjectName(_fromUtf8("copy_pushButton"))
self.gridLayout.addWidget(self.copy_pushButton, 1, 2, 1, 1)
self.cp_pushButton = QtGui.QPushButton(Form)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.cp_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.cp_pushButton.sizePolicy().hasHeightForWidth())
self.cp_pushButton.setSizePolicy(sizePolicy)
self.cp_pushButton.setMinimumSize(QtCore.QSize(0, 20))
self.cp_pushButton.setMaximumSize(QtCore.QSize(40, 28))
self.cp_pushButton.setObjectName(_fromUtf8("cp_pushButton"))
self.gridLayout.addWidget(self.cp_pushButton, 1, 3, 1, 1)
self.clear_pushButton = QtGui.QPushButton(Form)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.clear_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.clear_pushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.clear_pushButton.setSizePolicy(sizePolicy)
self.clear_pushButton.setMinimumSize(QtCore.QSize(0, 20))
self.clear_pushButton.setMaximumSize(QtCore.QSize(40, 28))
self.clear_pushButton.setText(_fromUtf8(""))
icon = QtGui.QIcon()
- icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/eraser.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/eraser.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.clear_pushButton.setIcon(icon)
self.clear_pushButton.setObjectName(_fromUtf8("clear_pushButton"))
self.gridLayout.addWidget(self.clear_pushButton, 1, 4, 1, 1)
@@ -92,10 +105,14 @@ class Ui_Form(object):
self.leftTooth_pushButton.setMaximumSize(QtCore.QSize(24, 24))
self.leftTooth_pushButton.setText(_fromUtf8(""))
icon1 = QtGui.QIcon()
- icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/back.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon1.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/back.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.leftTooth_pushButton.setIcon(icon1)
self.leftTooth_pushButton.setIconSize(QtCore.QSize(24, 18))
- self.leftTooth_pushButton.setObjectName(_fromUtf8("leftTooth_pushButton"))
+ self.leftTooth_pushButton.setObjectName(
+ _fromUtf8("leftTooth_pushButton"))
self.horizontalLayout.addWidget(self.leftTooth_pushButton)
self.le_frame = QtGui.QFrame(Form)
self.le_frame.setMaximumSize(QtCore.QSize(16777215, 16777215))
@@ -108,10 +125,14 @@ class Ui_Form(object):
self.rightTooth_pushButton.setMaximumSize(QtCore.QSize(24, 24))
self.rightTooth_pushButton.setText(_fromUtf8(""))
icon2 = QtGui.QIcon()
- icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/forward.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon2.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/forward.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.rightTooth_pushButton.setIcon(icon2)
self.rightTooth_pushButton.setIconSize(QtCore.QSize(24, 18))
- self.rightTooth_pushButton.setObjectName(_fromUtf8("rightTooth_pushButton"))
+ self.rightTooth_pushButton.setObjectName(
+ _fromUtf8("rightTooth_pushButton"))
self.horizontalLayout.addWidget(self.rightTooth_pushButton)
self.gridLayout.addLayout(self.horizontalLayout, 2, 2, 1, 2)
self.mobilitycomboBox = QtGui.QComboBox(Form)
@@ -160,4 +181,3 @@ if __name__ == "__main__":
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py b/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py
index ca6a6e4..377e7e6 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/toothProps.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Form(object):
+
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(150, 479)
@@ -32,7 +34,10 @@ class Ui_Form(object):
self.edit_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.edit_pushButton.setText(_fromUtf8(""))
icon = QtGui.QIcon()
- icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/pencil.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/icons/pencil.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.edit_pushButton.setIcon(icon)
self.edit_pushButton.setFlat(True)
self.edit_pushButton.setObjectName(_fromUtf8("edit_pushButton"))
@@ -47,26 +52,37 @@ class Ui_Form(object):
self.tooth_label.setObjectName(_fromUtf8("tooth_label"))
self.horizontalLayout.addWidget(self.tooth_label)
self.clear_pushButton = QtGui.QPushButton(Form)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.clear_pushButton.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.clear_pushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
self.clear_pushButton.setSizePolicy(sizePolicy)
self.clear_pushButton.setMinimumSize(QtCore.QSize(0, 20))
self.clear_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.clear_pushButton.setText(_fromUtf8(""))
icon1 = QtGui.QIcon()
- icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/eraser.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon1.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/eraser.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.clear_pushButton.setIcon(icon1)
self.clear_pushButton.setFlat(True)
self.clear_pushButton.setObjectName(_fromUtf8("clear_pushButton"))
self.horizontalLayout.addWidget(self.clear_pushButton)
self.verticalLayout.addLayout(self.horizontalLayout)
self.editframe = QtGui.QFrame(Form)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.editframe.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.editframe.sizePolicy().hasHeightForWidth())
self.editframe.setSizePolicy(sizePolicy)
self.editframe.setMinimumSize(QtCore.QSize(131, 24))
self.editframe.setMaximumSize(QtCore.QSize(16777215, 24))
@@ -146,16 +162,21 @@ class Ui_Form(object):
self.leftTooth_pushButton.setMaximumSize(QtCore.QSize(80, 16777215))
self.leftTooth_pushButton.setText(_fromUtf8(""))
icon2 = QtGui.QIcon()
- icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/back.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon2.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/back.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.leftTooth_pushButton.setIcon(icon2)
self.leftTooth_pushButton.setIconSize(QtCore.QSize(24, 18))
self.leftTooth_pushButton.setFlat(True)
- self.leftTooth_pushButton.setObjectName(_fromUtf8("leftTooth_pushButton"))
+ self.leftTooth_pushButton.setObjectName(
+ _fromUtf8("leftTooth_pushButton"))
self.gridLayout_2.addWidget(self.leftTooth_pushButton, 0, 0, 1, 1)
self.dressing_pushButton = QtGui.QPushButton(Form)
self.dressing_pushButton.setMinimumSize(QtCore.QSize(32, 24))
self.dressing_pushButton.setMaximumSize(QtCore.QSize(80, 40))
- self.dressing_pushButton.setObjectName(_fromUtf8("dressing_pushButton"))
+ self.dressing_pushButton.setObjectName(
+ _fromUtf8("dressing_pushButton"))
self.gridLayout_2.addWidget(self.dressing_pushButton, 1, 2, 1, 1)
self.pushButton = QtGui.QPushButton(Form)
self.pushButton.setMinimumSize(QtCore.QSize(32, 24))
@@ -169,11 +190,15 @@ class Ui_Form(object):
self.rightTooth_pushButton.setMaximumSize(QtCore.QSize(80, 16777215))
self.rightTooth_pushButton.setText(_fromUtf8(""))
icon3 = QtGui.QIcon()
- icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/forward.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon3.addPixmap(
+ QtGui.QPixmap(_fromUtf8(":/forward.png")),
+ QtGui.QIcon.Normal,
+ QtGui.QIcon.Off)
self.rightTooth_pushButton.setIcon(icon3)
self.rightTooth_pushButton.setIconSize(QtCore.QSize(24, 18))
self.rightTooth_pushButton.setFlat(True)
- self.rightTooth_pushButton.setObjectName(_fromUtf8("rightTooth_pushButton"))
+ self.rightTooth_pushButton.setObjectName(
+ _fromUtf8("rightTooth_pushButton"))
self.gridLayout_2.addWidget(self.rightTooth_pushButton, 0, 2, 1, 1)
self.verticalLayout.addLayout(self.gridLayout_2)
self.line = QtGui.QFrame(Form)
@@ -188,7 +213,8 @@ class Ui_Form(object):
self.cb_scrollArea.setObjectName(_fromUtf8("cb_scrollArea"))
self.scrollAreaWidgetContents = QtGui.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 144, 147))
- self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
+ self.scrollAreaWidgetContents.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents"))
self.cb_scrollArea.setWidget(self.scrollAreaWidgetContents)
self.verticalLayout.addWidget(self.cb_scrollArea)
@@ -237,4 +263,3 @@ if __name__ == "__main__":
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py b/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py
index ef465e6..53caf61 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/toothprops_full_edit.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Dialog(object):
+
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(360, 420)
@@ -57,14 +59,21 @@ class Ui_Dialog(object):
self.verticalLayout.addWidget(self.frame)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ self.buttonBox.setStandardButtons(
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(Dialog)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("accepted()")),
+ Dialog.accept)
+ QtCore.QObject.connect(
+ self.buttonBox,
+ QtCore.SIGNAL(_fromUtf8("rejected()")),
+ Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
@@ -84,4 +93,3 @@ if __name__ == "__main__":
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py b/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py
index ea1a5be..89adc5f 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py
@@ -1,3 +1,4 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/treatmentItemWidget.ui'
@@ -17,6 +18,7 @@ except AttributeError:
class Ui_Form(object):
+
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(415, 31)
@@ -29,12 +31,16 @@ class Ui_Form(object):
self.spinBox.setObjectName(_fromUtf8("spinBox"))
self.horizontalLayout.addWidget(self.spinBox)
self.label = QtGui.QLabel(Form)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
+ sizePolicy.setHeightForWidth(
+ self.label.sizePolicy().hasHeightForWidth())
self.label.setSizePolicy(sizePolicy)
- self.label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+ self.label.setAlignment(
+ QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.label.setObjectName(_fromUtf8("label"))
self.horizontalLayout.addWidget(self.label)
@@ -56,4 +62,3 @@ if __name__ == "__main__":
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/compiled_uis/__init__.py b/src/openmolar/qt4gui/compiled_uis/__init__.py
index e69de29..e1f7e6e 100755
--- a/src/openmolar/qt4gui/compiled_uis/__init__.py
+++ b/src/openmolar/qt4gui/compiled_uis/__init__.py
@@ -0,0 +1,2 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
diff --git a/src/openmolar/qt4gui/contract_gui_module.py b/src/openmolar/qt4gui/contract_gui_module.py
index 8cedd8a..a3ac981 100644
--- a/src/openmolar/qt4gui/contract_gui_module.py
+++ b/src/openmolar/qt4gui/contract_gui_module.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
provides functions which act on the contract of the patient
@@ -13,6 +29,7 @@ at gui level
from openmolar.settings import localsettings
from openmolar.ptModules import planDetails, nhsDetails
+
def handle_ContractTab(om_gui):
'''
function to adjust gui depending on the tab viewable
@@ -20,20 +37,21 @@ def handle_ContractTab(om_gui):
i = om_gui.ui.contract_tabWidget.currentIndex()
if i == 0:
pass
- #om_gui.advise("Private contract tab selected")
+ # om_gui.advise("Private contract tab selected")
if i == 1:
om_gui.ui.contractHDP_label.setText(
- planDetails.toHtml(om_gui.pt.plandata))
+ planDetails.toHtml(om_gui.pt.plandata))
if i == 2:
om_gui.ui.contractNHS_label.setText(
- nhsDetails.toHtml(om_gui.pt))
+ nhsDetails.toHtml(om_gui.pt))
om_gui.ui.exemption_lineEdit.setText(om_gui.pt.exemption)
om_gui.ui.exempttext_lineEdit.setText(om_gui.pt.exempttext)
if i == 3:
pass
- #om_gui.advise("Other Dentist tab selected")
+ # om_gui.advise("Other Dentist tab selected")
+
def changeContractedDentist(om_gui, inits):
'''
@@ -46,32 +64,34 @@ def changeContractedDentist(om_gui, inits):
om_gui.advise("Let Highland Dental Plan know of this change", 1)
elif om_gui.pt.cset == "N":
om_gui.advise(
- "Get an NHS form signed to change the patients contract", 1)
+ "Get an NHS form signed to change the patients contract", 1)
else:
- om_gui.advise("changed dentist to %s"% inits, 1)
+ om_gui.advise("changed dentist to %s" % inits, 1)
print "changing contracted dentist to ", inits
om_gui.pt.dnt1 = newdentist
om_gui.updateDetails()
+
def changeCourseDentist(om_gui, inits):
'''
changes dnt2
'''
newdentist = localsettings.ops_reverse[str(inits)]
if newdentist == om_gui.pt.dnt2:
- return
+ return
if om_gui.pt.dnt2 == 0 and newdentist == om_gui.pt.dnt1:
return
if om_gui.pt.cset == "N" and om_gui.pt.underTreatment:
om_gui.advise(
- "think about getting some nhs forms signed for both dentists", 1)
- else:
- om_gui.advise("changed course dentist to %s"% inits, 1)
+ "think about getting some nhs forms signed for both dentists", 1)
+ else:
+ om_gui.advise("changed course dentist to %s" % inits, 1)
print "changing course dentist to ", inits
om_gui.pt.dnt2 = newdentist
om_gui.updateDetails()
+
def changeCourseType(om_gui, cset):
'''
change cset
@@ -80,33 +100,38 @@ def changeCourseType(om_gui, cset):
om_gui.updateDetails()
i = ["P", "I", "N"].index(om_gui.pt.cset[:1])
om_gui.ui.contract_tabWidget.setCurrentIndex(i)
- #do this so that the table is reset at any lookup
+ # do this so that the table is reset at any lookup
om_gui.pt.forget_fee_table()
+
def editNHScontract(om_gui):
'''blank function which needs work'''
om_gui.advise("edit NHS", 1)
+
def exemption_edited(om_gui):
'''
user has edited the exemption text fields
'''
om_gui.pt.exemption = str(om_gui.ui.exemption_lineEdit.text().toAscii())
om_gui.pt.exempttext = str(
- om_gui.ui.exempttext_lineEdit.text().toAscii())
+ om_gui.ui.exempttext_lineEdit.text().toAscii())
if not om_gui.pt.checkExemption():
- om_gui.advise(_("erroneous exemption category entered"),1)
+ om_gui.advise(_("erroneous exemption category entered"), 1)
om_gui.ui.exemption_lineEdit.setText(om_gui.pt.dbstate.exemption)
om_gui.updateDetails()
-
+
+
def editPrivateContract(om_gui):
'''blank function which needs work'''
om_gui.advise("edit Private", 1)
+
def editHDPcontract(om_gui):
'''blank function which needs work'''
om_gui.advise("edit HDP", 1)
+
def editOtherContract(om_gui):
'''blank function which needs work'''
om_gui.advise("edit other Practitioner", 1)
diff --git a/src/openmolar/qt4gui/customwidgets/__init__.py b/src/openmolar/qt4gui/customwidgets/__init__.py
index e69de29..c701215 100755
--- a/src/openmolar/qt4gui/customwidgets/__init__.py
+++ b/src/openmolar/qt4gui/customwidgets/__init__.py
@@ -0,0 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/openmolar/qt4gui/customwidgets/appointment_overviewwidget.py b/src/openmolar/qt4gui/customwidgets/appointment_overviewwidget.py
index 469236e..5285a8b 100755
--- a/src/openmolar/qt4gui/customwidgets/appointment_overviewwidget.py
+++ b/src/openmolar/qt4gui/customwidgets/appointment_overviewwidget.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
@@ -12,7 +28,7 @@ import datetime
import logging
import pickle
-from PyQt4 import QtGui,QtCore
+from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings
from openmolar.dbtools import appointments
from openmolar.qt4gui import colours
@@ -21,18 +37,19 @@ LOGGER = logging.getLogger("openmolar")
LINECOLOR = QtGui.QColor("#dddddd")
TRANSPARENT = QtCore.Qt.transparent
-#APPTCOLORS = colours.APPT_OV_COLORS
+# APPTCOLORS = colours.APPT_OV_COLORS
APPTCOLORS = colours.APPTCOLORS
BGCOLOR = APPTCOLORS["BACKGROUND"]
-RED_PEN = QtGui.QPen(QtCore.Qt.red,2)
-GREY_PEN = QtGui.QPen(QtCore.Qt.gray,1)
-GREYLINE_PEN = QtGui.QPen(colours.APPT_LINECOLOUR,1)
-#GREYLINE_PEN.setStyle(QtCore.Qt.DashLine)
+RED_PEN = QtGui.QPen(QtCore.Qt.red, 2)
+GREY_PEN = QtGui.QPen(QtCore.Qt.gray, 1)
+GREYLINE_PEN = QtGui.QPen(colours.APPT_LINECOLOUR, 1)
+# GREYLINE_PEN.setStyle(QtCore.Qt.DashLine)
BLACK_PEN = QtGui.QPen(QtCore.Qt.black, 1)
class AppointmentOverviewWidget(QtGui.QWidget):
+
'''
a custom widget to provide a week view for a dental appointment book
'''
@@ -61,27 +78,27 @@ class AppointmentOverviewWidget(QtGui.QWidget):
self.setMinimumSize(self.minimumSizeHint())
self.setSizePolicy(QtGui.QSizePolicy(
- QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding))
+ QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding))
self.font = QtGui.QFont()
self.font.setPointSize(10)
fm = QtGui.QFontMetrics(self.font)
self.timeOffset = fm.width(" 88:88 ")
self.headingHeight = fm.height()
- #convert times to "minutes past midnight"
+ # convert times to "minutes past midnight"
self.startTime = localsettings.minutesPastMidnight(sTime)
self.endTime = localsettings.minutesPastMidnight(fTime)
self.slotLength = slotLength
- self.slotCount = (self.endTime-self.startTime) // slotLength
+ self.slotCount = (self.endTime - self.startTime) // slotLength
self.slotHeight = ((self.height() - self.headingHeight) /
- self.slotCount)
+ self.slotCount)
self.textDetail = textDetail
self.date = None
self.dents = []
self.daystart = {}
self.dayend = {}
- self.memoDict={}
+ self.memoDict = {}
self.flagDict = {}
self.highlightedRect = None
self.setMouseTracking(True)
@@ -91,15 +108,14 @@ class AppointmentOverviewWidget(QtGui.QWidget):
self.drag_appt = None
self.dropPos = None
self.enabled_clinicians = ()
- self._mouse_drag_rects = None
- self.mouse_drag_rect = None
+ self._mouse_drag_rects = None
+ self.mouse_drag_rect = None
- self.blink_on = True #for flashing effect
+ self.blink_on = True # for flashing effect
self.blink_timer = QtCore.QTimer()
self.blink_timer.timeout.connect(self.toggle_blink)
self.blink_timer.start(1000)
-
def clear(self):
self.appts = {}
self.eTimes = {}
@@ -143,7 +159,7 @@ class AppointmentOverviewWidget(QtGui.QWidget):
self.freeslots[slot.dent].append(slot)
except KeyError:
LOGGER.warning(
- "unable to show a slot for clinician %s"% slot.dent)
+ "unable to show a slot for clinician %s" % slot.dent)
pass
def setFlags(self, dent):
@@ -159,13 +175,13 @@ class AppointmentOverviewWidget(QtGui.QWidget):
col = 0
columnCount = len(self.dents)
if columnCount == 0:
- return #nothing to do... and division by zero errors!
+ return # nothing to do... and division by zero errors!
columnWidth = (self.width() - self.timeOffset) / columnCount
for dent in self.dents:
leftx = self.timeOffset + (col) * columnWidth
rightx = self.timeOffset + (col + 1) * columnWidth
- ###headings
+ # headings
rect = QtCore.QRect(leftx, 0, columnWidth, self.headingHeight)
if rect.contains(event.pos()):
self.highlightedRect = rect
@@ -175,37 +191,38 @@ class AppointmentOverviewWidget(QtGui.QWidget):
slotstart = localsettings.pyTimeToMinutesPastMidnight(
slot.date_time.time())
startcell = (
- slotstart - self.startTime)/self.slotLength
+ slotstart - self.startTime) / self.slotLength
rect = QtCore.QRect(leftx, startcell * self.slotHeight
- + self.headingHeight, columnWidth,
- (slot.length / self.slotLength) * self.slotHeight)
+ + self.headingHeight, columnWidth,
+ (slot.length / self.slotLength) * self.slotHeight)
if rect.contains(event.pos()):
self.highlightedRect = rect
- feedback = '%d mins starting at %s with %s'% (slot.length,
- slot.date_time.strftime ("%H:%M"), dent.initials)
+ feedback = '%d mins starting at %s with %s' % (slot.length,
+ slot.date_time.strftime("%H:%M"), dent.initials)
QtGui.QToolTip.showText(event.globalPos(),
- QtCore.QString(feedback))
+ QtCore.QString(feedback))
break
for appt in (self.appts[dent.ix] + self.eTimes[dent.ix] +
- self.lunches[dent.ix]):
+ self.lunches[dent.ix]):
if (self.daystart[dent.ix] <= appt.mpm <
- self.dayend[dent.ix]):
+ self.dayend[dent.ix]):
startcell = (appt.mpm - self.startTime) / self.slotLength
rect = QtCore.QRect(leftx,
- startcell * self.slotHeight + self.headingHeight,
- columnWidth,
- (appt.length/self.slotLength) * self.slotHeight)
+ startcell * self.slotHeight +
+ self.headingHeight,
+ columnWidth,
+ (appt.length / self.slotLength) * self.slotHeight)
if rect.contains(event.pos()):
self.highlightedRect = rect
break
- col+=1
+ col += 1
self.update()
def mousePressEvent(self, event):
@@ -218,119 +235,124 @@ class AppointmentOverviewWidget(QtGui.QWidget):
columnCount = len(self.dents)
if columnCount == 0:
- return #nothing to do... and division by zero errors!
+ return # nothing to do... and division by zero errors!
columnWidth = (self.width() - self.timeOffset) / columnCount
col = 0
- for dent in self.dents: #did user click a heading?
+ for dent in self.dents: # did user click a heading?
leftx = self.timeOffset + col * columnWidth
rightx = self.timeOffset + (col + 1) * columnWidth
rect = QtCore.QRect(leftx, 0, columnWidth, self.headingHeight)
if rect.contains(event.pos()):
self.highlightedRect = rect
- self.emit(QtCore.SIGNAL("DentistHeading"),(dent.ix, self.date))
+ self.emit(
+ QtCore.SIGNAL("DentistHeading"), (dent.ix, self.date))
return
- if event.button() == 1: #left click
+ if event.button() == 1: # left click
for slot in self.freeslots[dent.ix]:
slotstart = localsettings.pyTimeToMinutesPastMidnight(
slot.date_time.time())
startcell = (
- slotstart - self.startTime)/self.slotLength
+ slotstart - self.startTime) / self.slotLength
- rect=QtCore.QRect(leftx,
- startcell * self.slotHeight + self.headingHeight,
- columnWidth,
- (slot.length / self.slotLength) * self.slotHeight)
+ rect = QtCore.QRect(leftx,
+ startcell * self.slotHeight +
+ self.headingHeight,
+ columnWidth,
+ (slot.length / self.slotLength) * self.slotHeight)
if rect.contains(event.pos()):
self.emit(QtCore.SIGNAL("SlotClicked"), slot)
break
- else: #right click
+ else: # right click
leftx = self.timeOffset + col * columnWidth
- rightx = self.timeOffset + (col+1) * columnWidth
+ rightx = self.timeOffset + (col + 1) * columnWidth
for slot in self.freeslots[dent.ix]:
slotstart = localsettings.pyTimeToMinutesPastMidnight(
slot.date_time.time())
startcell = (
- slotstart - self.startTime)/self.slotLength
+ slotstart - self.startTime) / self.slotLength
rect = QtCore.QRect(leftx,
- startcell * self.slotHeight + self.headingHeight,
- columnWidth,
- (slot.length / self.slotLength) * self.slotHeight)
+ startcell * self.slotHeight +
+ self.headingHeight,
+ columnWidth,
+ (slot.length / self.slotLength) * self.slotHeight)
if rect.contains(event.pos()):
self.highlightedRect = rect
- feedback = '%d mins starting at %s with %s'% (
- slot.length,
- localsettings.humanTime(slotstart),
- dent.initials)
+ feedback = '%d mins starting at %s with %s' % (
+ slot.length,
+ localsettings.humanTime(slotstart),
+ dent.initials)
QtGui.QMessageBox.information(self, "Info",
- "You've right clicked on a slot<br />%s"% feedback)
+ "You've right clicked on a slot<br />%s" % feedback)
return
-
for appt in self.appts[dent.ix]:
startcell = (appt.mpm - self.startTime) / self.slotLength
rect = QtCore.QRect(leftx,
- startcell * self.slotHeight + self.headingHeight,
- columnWidth,
- (appt.length/self.slotLength) * self.slotHeight)
+ startcell * self.slotHeight +
+ self.headingHeight,
+ columnWidth,
+ (appt.length / self.slotLength) * self.slotHeight)
if rect.contains(event.pos()):
self.highlightedRect = rect
- feedback = '%d mins starting at %s with %s'% (
- appt.length,
- localsettings.humanTime(appt.mpm),
- dent.initials)
+ feedback = '%d mins starting at %s with %s' % (
+ appt.length,
+ localsettings.humanTime(appt.mpm),
+ dent.initials)
- QtGui.QMessageBox.information(self,"Info",
- "You've right clicked on an appt<br />%s"% feedback)
+ QtGui.QMessageBox.information(self, "Info",
+ "You've right clicked on an appt<br />%s" % feedback)
return
for appt in self.lunches[dent.ix]:
startcell = (appt.mpm - self.startTime) / self.slotLength
rect = QtCore.QRect(leftx,
- startcell * self.slotHeight + self.headingHeight,
- columnWidth,
- (appt.length/self.slotLength) * self.slotHeight)
+ startcell * self.slotHeight +
+ self.headingHeight,
+ columnWidth,
+ (appt.length / self.slotLength) * self.slotHeight)
if rect.contains(event.pos()):
self.highlightedRect = rect
- feedback = '%d mins starting at %s with %s'% (
- appt.length,
- localsettings.humanTime(appt.mpm),
- dent.initials)
+ feedback = '%d mins starting at %s with %s' % (
+ appt.length,
+ localsettings.humanTime(appt.mpm),
+ dent.initials)
QtGui.QMessageBox.information(self, "Info",
- "You've right clicked Lunch<br />%s"% feedback)
+ "You've right clicked Lunch<br />%s" % feedback)
return
for appt in self.eTimes[dent.ix]:
startcell = (appt.mpm - self.startTime) / self.slotLength
rect = QtCore.QRect(leftx,
- startcell * self.slotHeight + self.headingHeight,
- columnWidth,
- (appt.length/self.slotLength) * self.slotHeight)
+ startcell * self.slotHeight +
+ self.headingHeight,
+ columnWidth,
+ (appt.length / self.slotLength) * self.slotHeight)
if rect.contains(event.pos()):
self.highlightedRect = rect
- feedback = '%d mins starting at %s with %s'% (
- appt.length,
- localsettings.humanTime(appt.mpm),
- dent.initials)
+ feedback = '%d mins starting at %s with %s' % (
+ appt.length,
+ localsettings.humanTime(appt.mpm),
+ dent.initials)
QtGui.QMessageBox.information(self, "Info",
- "You've right clicked on an emergency slot<br />%s"% \
- feedback)
+ "You've right clicked on an emergency slot<br />%s" %
+ feedback)
return
col += 1
@@ -345,7 +367,7 @@ class AppointmentOverviewWidget(QtGui.QWidget):
if event.mimeData().hasFormat("application/x-appointment"):
data = event.mimeData()
bstream = data.retrieveData("application/x-appointment",
- QtCore.QVariant.ByteArray)
+ QtCore.QVariant.ByteArray)
appt = pickle.loads(bstream.toByteArray())
if self.date >= localsettings.currentDay():
self.drag_appt = appt
@@ -383,14 +405,15 @@ class AppointmentOverviewWidget(QtGui.QWidget):
busy_times.append((dent.end_mpm, 1440))
for pos, (start, finish) in enumerate((busy_times)[:-1]):
- next_start = busy_times[pos+1][0]
+ next_start = busy_times[pos + 1][0]
if next_start - finish >= self.drag_appt.length:
startcell = (finish - self.startTime) / self.slotLength
- top_y = startcell * self.slotHeight + self.headingHeight
+ top_y = startcell * \
+ self.slotHeight + self.headingHeight
- height = ((next_start-finish)
- /self.slotLength) * self.slotHeight
+ height = ((next_start - finish)
+ / self.slotLength) * self.slotHeight
rect = QtCore.QRectF(
left_x,
@@ -398,7 +421,6 @@ class AppointmentOverviewWidget(QtGui.QWidget):
columnWidth,
height)
-
self._mouse_drag_rects.append((dent.ix, rect))
return self._mouse_drag_rects
@@ -406,18 +428,17 @@ class AppointmentOverviewWidget(QtGui.QWidget):
def dragMoveEvent(self, event):
self.mouse_drag_rect = None
if (self.date >= localsettings.currentDay() and
- event.mimeData().hasFormat("application/x-appointment")):
+ event.mimeData().hasFormat("application/x-appointment")):
self.dropPos = QtCore.QPointF(event.pos())
for dent_ix, rect_f in self.mouse_drag_rects:
if rect_f.contains(self.dropPos):
self.mouse_drag_rect = (dent_ix, rect_f)
-
# now handle the situation where the drag lower border
# is outwith the slot
- height = (self.drag_appt.length/self.slotLength) \
- *self.slotHeight
+ height = (self.drag_appt.length / self.slotLength) \
+ * self.slotHeight
if self.dropPos.y() + height >= rect_f.bottom():
self.dropPos = QtCore.QPointF(
self.dropPos.x(), rect_f.bottom() - height)
@@ -441,12 +462,12 @@ class AppointmentOverviewWidget(QtGui.QWidget):
if not self.is_dragging:
event.ignore()
- #print "TODO - dropEvent"
- #print "%s was dropped at %s"% (self.drag_appt, self.dropPos)
+ # print "TODO - dropEvent"
+ # print "%s was dropped at %s"% (self.drag_appt, self.dropPos)
date_time = datetime.datetime.combine(self.date.toPyDate(),
- localsettings.minutesPastMidnightToPyTime(self.drop_time()))
- dent = self.mouse_drag_rect[0]
+ localsettings.minutesPastMidnightToPyTime(self.drop_time()))
+ dent = self.mouse_drag_rect[0]
slot = appointments.FreeSlot(date_time, dent, self.drag_appt.length)
self.emit(QtCore.SIGNAL("ApptDropped"), self.drag_appt, slot)
@@ -458,9 +479,9 @@ class AppointmentOverviewWidget(QtGui.QWidget):
'''
returns minutes past midnight of the drop.
'''
- current_row = (self.dropPos.y()-self.headingHeight)/self.slotHeight
+ current_row = (self.dropPos.y() - self.headingHeight) / self.slotHeight
mpm = self.startTime + (current_row * self.slotLength)
- mpm = int(5 * round(float(mpm)/5))
+ mpm = int(5 * round(float(mpm) / 5))
return mpm
def paintEvent(self, event=None):
@@ -469,7 +490,7 @@ class AppointmentOverviewWidget(QtGui.QWidget):
'''
if len(self.dents) == 0:
- return #blank widget if no dents working
+ return # blank widget if no dents working
self.dragLine = None
painter = QtGui.QPainter(self)
@@ -490,91 +511,92 @@ class AppointmentOverviewWidget(QtGui.QWidget):
columnCount = len(self.dents)
if columnCount == 0:
- columnCount = 1 #avoid division by zero!!
+ columnCount = 1 # avoid division by zero!!
columnWidth = (self.width() - self.timeOffset) / columnCount
dragWidth = columnWidth
- ## put the times down the side
+ # put the times down the side
while currentSlot < self.slotCount:
- #offset the first time.
- if (currentSlot+2) % self.textDetail == 0:
+ # offset the first time.
+ if (currentSlot + 2) % self.textDetail == 0:
y = 0.8 * self.headingHeight + currentSlot * self.slotHeight
trect = QtCore.QRect(
- 0,
- y,
- self.timeOffset,
- self.textDetail * self.slotHeight
- )
+ 0,
+ y,
+ self.timeOffset,
+ self.textDetail * self.slotHeight
+ )
painter.setPen(BLACK_PEN)
painter.drawText(trect, QtCore.Qt.AlignHCenter,
- localsettings.humanTime(
- self.startTime + (currentSlot * self.slotLength)))
+ localsettings.humanTime(
+ self.startTime + (currentSlot * self.slotLength)))
currentSlot += 1
col = 0
for dent in self.dents:
leftx = self.timeOffset + col * columnWidth
- rightx = self.timeOffset + (col+1) * columnWidth
- ##headings
+ rightx = self.timeOffset + (col + 1) * columnWidth
+ # headings
painter.setPen(BLACK_PEN)
painter.setBrush(APPTCOLORS["HEADER"])
rect = QtCore.QRect(leftx, 0, columnWidth, self.headingHeight)
painter.drawRect(rect)
initials = localsettings.apptix_reverse.get(dent.ix)
if dent.memo != "":
- initials = "*%s*"% initials
- painter.drawText(rect,QtCore.Qt.AlignHCenter, initials)
+ initials = "*%s*" % initials
+ painter.drawText(rect, QtCore.Qt.AlignHCenter, initials)
- ##dentist start/finish
+ # dentist start/finish
painter.setBrush(BGCOLOR)
- startcell = ((self.daystart[dent.ix]-self.startTime) /
- self.slotLength)
+ startcell = ((self.daystart[dent.ix] - self.startTime) /
+ self.slotLength)
length = self.dayend[dent.ix] - self.daystart[dent.ix]
startY = startcell * self.slotHeight + self.headingHeight
- endY = (length/self.slotLength) * self.slotHeight
+ endY = (length / self.slotLength) * self.slotHeight
rect = QtCore.QRectF(leftx, startY, columnWidth, endY)
if self.flagDict[dent.ix]:
- #don't draw a white canvas if dentist is out of office
- #a white canvas
+ # don't draw a white canvas if dentist is out of office
+ # a white canvas
painter.save()
painter.drawRect(rect)
- ## grey lines
+ # grey lines
painter.setPen(GREYLINE_PEN)
y = startY
- while y < startY+endY:
+ while y < startY + endY:
painter.drawLine(leftx, y, rightx, y)
- y += self.slotHeight/2
+ y += self.slotHeight / 2
painter.restore()
painter.setPen(BLACK_PEN)
- ###emergencies
+ # emergencies
for appt in self.eTimes[dent.ix]:
painter.save()
if (self.daystart[dent.ix] <= appt.mpm <
- self.dayend[dent.ix]):
+ self.dayend[dent.ix]):
startcell = (appt.mpm - self.startTime
- ) / self.slotLength
+ ) / self.slotLength
rect = QtCore.QRectF(leftx,
- startcell * self.slotHeight + self.headingHeight,
- columnWidth,
- (appt.length/self.slotLength) * self.slotHeight)
+ startcell * self.slotHeight +
+ self.headingHeight,
+ columnWidth,
+ (appt.length / self.slotLength) * self.slotHeight)
if self.mode == self.SCHEDULING_MODE:
painter.setBrush(APPTCOLORS["BUSY"])
painter.setPen(GREY_PEN)
elif appt.isEmergency:
painter.setBrush(APPTCOLORS["EMERGENCY"])
- elif APPTCOLORS.has_key(appt.name.upper()):
+ elif appt.name.upper() in APPTCOLORS:
painter.setBrush(APPTCOLORS[appt.name.upper()])
- elif APPTCOLORS.has_key(appt.cset):
+ elif appt.cset in APPTCOLORS:
painter.setBrush(APPTCOLORS[appt.cset])
else:
painter.setBrush(APPTCOLORS["default"])
@@ -583,7 +605,7 @@ class AppointmentOverviewWidget(QtGui.QWidget):
text = appt.name[:5]
if len(text) < len(appt.name):
text += ".."
- painter.drawText(rect,QtCore.Qt.AlignLeft, text)
+ painter.drawText(rect, QtCore.Qt.AlignLeft, text)
painter.restore()
@@ -591,14 +613,15 @@ class AppointmentOverviewWidget(QtGui.QWidget):
painter.setBrush(APPTCOLORS["LUNCH"])
for appt in self.lunches[dent.ix]:
if (self.daystart[dent.ix] <= appt.mpm <
- self.dayend[dent.ix]):
+ self.dayend[dent.ix]):
startcell = (appt.mpm - self.startTime
- ) / self.slotLength
+ ) / self.slotLength
rect = QtCore.QRectF(leftx,
- startcell * self.slotHeight + self.headingHeight,
- columnWidth,
- (appt.length/self.slotLength) * self.slotHeight)
+ startcell * self.slotHeight +
+ self.headingHeight,
+ columnWidth,
+ (appt.length / self.slotLength) * self.slotHeight)
if self.mode == self.SCHEDULING_MODE:
painter.setPen(GREY_PEN)
@@ -606,21 +629,21 @@ class AppointmentOverviewWidget(QtGui.QWidget):
painter.setPen(BLACK_PEN)
painter.drawRect(rect)
- painter.drawText(rect,QtCore.Qt.AlignCenter,
- "Lunch")
+ painter.drawText(rect, QtCore.Qt.AlignCenter,
+ "Lunch")
painter.restore()
- ###appts
+ # appts
for appt in self.appts[dent.ix]:
if (self.om_gui.pt and
- appt.serialno == self.om_gui.pt.serialno):
+ appt.serialno == self.om_gui.pt.serialno):
painter.setBrush(APPTCOLORS["current_patient"])
elif self.mode == self.SCHEDULING_MODE:
painter.setPen(GREY_PEN)
painter.setBrush(APPTCOLORS["BUSY"])
- elif APPTCOLORS.has_key(appt.name.upper()):
+ elif appt.name.upper() in APPTCOLORS:
painter.setBrush(APPTCOLORS[appt.name.upper()])
- elif APPTCOLORS.has_key(appt.cset):
+ elif appt.cset in APPTCOLORS:
painter.setBrush(APPTCOLORS[appt.cset])
else:
painter.setBrush(APPTCOLORS["BUSY"])
@@ -629,19 +652,19 @@ class AppointmentOverviewWidget(QtGui.QWidget):
rect = QtCore.QRectF(
leftx,
- startcell*self.slotHeight+self.headingHeight,
+ startcell * self.slotHeight + self.headingHeight,
columnWidth,
- (appt.length/self.slotLength)*self.slotHeight
- )
+ (appt.length / self.slotLength) * self.slotHeight
+ )
painter.drawRect(rect)
text = appt.trt[:5]
if len(text) < len(appt.trt):
text += ".."
- painter.drawText(rect,QtCore.Qt.AlignLeft, text)
+ painter.drawText(rect, QtCore.Qt.AlignLeft, text)
- ###slots
+ # slots
painter.save()
painter.setPen(GREY_PEN)
@@ -649,12 +672,13 @@ class AppointmentOverviewWidget(QtGui.QWidget):
slotstart = localsettings.pyTimeToMinutesPastMidnight(
slot.date_time.time())
startcell = (
- slotstart - self.startTime)/self.slotLength
+ slotstart - self.startTime) / self.slotLength
rect = QtCore.QRectF(leftx,
- startcell*self.slotHeight+self.headingHeight,
- columnWidth,
- (slot.length/self.slotLength)*self.slotHeight)
+ startcell * self.slotHeight +
+ self.headingHeight,
+ columnWidth,
+ (slot.length / self.slotLength) * self.slotHeight)
painter.save()
if slot in self.active_slots:
@@ -673,15 +697,15 @@ class AppointmentOverviewWidget(QtGui.QWidget):
painter.drawRect(rect)
painter.setPen(RED_PEN)
- painter.drawText(rect,QtCore.Qt.AlignCenter,
- "%s"% slot.length)
+ painter.drawText(rect, QtCore.Qt.AlignCenter,
+ "%s" % slot.length)
painter.restore()
painter.restore()
- ## drag drop
+ # drag drop
if (self.is_dragging and
- self.mouse_drag_rect[0] == dent.ix):
+ self.mouse_drag_rect[0] == dent.ix):
painter.save()
rect = self.mouse_drag_rect[1]
@@ -690,33 +714,33 @@ class AppointmentOverviewWidget(QtGui.QWidget):
painter.drawRect(rect)
painter.setPen(RED_PEN)
- height = (self.drag_appt.length/self.slotLength) \
- *self.slotHeight
+ height = (self.drag_appt.length / self.slotLength) \
+ * self.slotHeight
rect = QtCore.QRectF(leftx,
- self.dropPos.y(), columnWidth-1, height)
+ self.dropPos.y(), columnWidth - 1, height)
painter.drawRect(rect)
self.dragLine = QtCore.QLine(0, self.dropPos.y(),
- self.width(), self.dropPos.y())
+ self.width(), self.dropPos.y())
trect = QtCore.QRectF(0,
- self.dropPos.y(), self.timeOffset, height)
+ self.dropPos.y(), self.timeOffset, height)
painter.drawRect(trect)
painter.drawText(trect, QtCore.Qt.AlignHCenter,
- localsettings.humanTime(self.drop_time()))
+ localsettings.humanTime(self.drop_time()))
painter.restore()
- if col>0:
+ if col > 0:
painter.save()
painter.setPen(BLACK_PEN)
- painter.drawLine(leftx,0,leftx,self.height())
+ painter.drawLine(leftx, 0, leftx, self.height())
painter.restore()
- col+=1
+ col += 1
- if self.highlightedRect!=None:
+ if self.highlightedRect is not None:
painter.setPen(RED_PEN)
painter.setBrush(TRANSPARENT)
painter.drawRect(self.highlightedRect)
@@ -734,7 +758,7 @@ class AppointmentOverviewWidget(QtGui.QWidget):
if __name__ == "__main__":
app = QtGui.QApplication([])
- form = AppointmentOverviewWidget("0800","1900",15, 2, None)
+ form = AppointmentOverviewWidget("0800", "1900", 15, 2, None)
form.show()
app.exec_()
diff --git a/src/openmolar/qt4gui/customwidgets/appointmentwidget.py b/src/openmolar/qt4gui/customwidgets/appointmentwidget.py
index f6e4c21..c0f5f46 100644
--- a/src/openmolar/qt4gui/customwidgets/appointmentwidget.py
+++ b/src/openmolar/qt4gui/customwidgets/appointmentwidget.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
provides one class - the appointment widget
@@ -14,7 +30,7 @@ the canvas is a subclass of this
from __future__ import division
import datetime
-import functools #for partial
+import functools # for partial
import logging
import pickle
@@ -29,10 +45,11 @@ LINECOLOR = colours.APPT_LINECOLOUR
APPTCOLORS = colours.APPTCOLORS
TRANSPARENT = colours.TRANSPARENT
-GREY_PEN = QtGui.QPen(QtCore.Qt.gray,1)
+GREY_PEN = QtGui.QPen(QtCore.Qt.gray, 1)
class AppointmentWidget(QtGui.QFrame):
+
'''
a custom widget to for a dental appointment book
useage is (startTime,finishTime, parentWidget - optional)
@@ -46,10 +63,10 @@ class AppointmentWidget(QtGui.QFrame):
SCHEDULING_MODE = 1
mode = None
- #signal has dent, time, length
+ # signal has dent, time, length
slotClicked = QtCore.pyqtSignal(object, object, object)
print_mh_signal = QtCore.pyqtSignal(object)
-
+
def __init__(self, sTime, fTime, om_gui):
QtGui.QFrame.__init__(self, om_gui)
@@ -59,36 +76,36 @@ class AppointmentWidget(QtGui.QFrame):
self.printButton.setMaximumWidth(50)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/ps.png"),
- QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.printButton.setIcon(icon)
self.connect(self.printButton, QtCore.SIGNAL("clicked()"),
- self.printme)
+ self.printme)
self.header_label = QtGui.QLabel("dent", self.header_frame)
self.header_label.setAlignment(QtCore.Qt.AlignCenter)
- font = QtGui.QFont("Sans",14,75)
+ font = QtGui.QFont("Sans", 14, 75)
self.header_label.setFont(font)
self.memo_lineEdit = QtGui.QLineEdit(self)
self.memo_lineEdit.setText("hello")
self.memo_lineEdit.setAlignment(QtCore.Qt.AlignCenter)
- self.memo_lineEdit.setMaxLength(30) # due to schema restrictions :(
+ self.memo_lineEdit.setMaxLength(30) # due to schema restrictions :(
- font = QtGui.QFont("Sans",12,75,True)
+ font = QtGui.QFont("Sans", 12, 75, True)
self.memo_lineEdit.setFont(font)
- #self.memo_lineEdit.setStyleSheet("background:white")
+ # self.memo_lineEdit.setStyleSheet("background:white")
self.dentist = "DENTIST"
self.apptix = 0
glay = QtGui.QGridLayout(self.header_frame)
glay.setSpacing(2)
glay.setMargin(2)
- glay.addWidget(self.printButton,0,1)
- glay.addWidget(self.header_label,0,0)
- glay.addWidget(self.memo_lineEdit,1,0,1,2)
+ glay.addWidget(self.printButton, 0, 1)
+ glay.addWidget(self.header_label, 0, 0)
+ glay.addWidget(self.memo_lineEdit, 1, 0, 1, 2)
self.scrollArea = QtGui.QScrollArea()
self.scrollArea.setWidgetResizable(True)
@@ -207,14 +224,14 @@ class AppointmentWidget(QtGui.QFrame):
'''
if not self.memo_lineEdit.hasFocus():
self.emit(QtCore.SIGNAL("new_memo"),
- (self.dentist, str(self.memo_lineEdit.text().toAscii())))
+ (self.dentist, str(self.memo_lineEdit.text().toAscii())))
def signals(self):
'''
set up the widget's signals and slots
'''
self.connect(self.memo_lineEdit,
- QtCore.SIGNAL("editingFinished()"), self.newMemo)
+ QtCore.SIGNAL("editingFinished()"), self.newMemo)
def showEvent(self, event=None):
if self.om_gui.pt:
@@ -242,24 +259,24 @@ class AppointmentWidget(QtGui.QFrame):
timestamp)
'''
(start, finish, name, sno, trt1, trt2, trt3, memo, flag, cset,
- modtime) = (str(app[1]), str(app[2]), app[3], app[4],
- app[5], app[6], app[7], app[8], app[9], chr(app[10]), app[13])
+ modtime) = (str(app[1]), str(app[2]), app[3], app[4],
+ app[5], app[6], app[7], app[8], app[9], chr(app[10]), app[13])
startcell = self.canvas.getCell_from_time(start)
endcell = self.canvas.getCell_from_time(finish)
- if endcell == startcell: #double and family appointments!!
+ if endcell == startcell: # double and family appointments!!
endcell += 1
self.canvas.doubleAppts.append((startcell, endcell, start, finish,
- name, sno, trt1, trt2, trt3, memo, flag, cset, modtime))
+ name, sno, trt1, trt2, trt3, memo, flag, cset, modtime))
else:
self.canvas.appts.append((startcell, endcell, start, finish,
- name, sno, trt1, trt2, trt3, memo, flag, cset, modtime))
+ name, sno, trt1, trt2, trt3, memo, flag, cset, modtime))
if sno == 0:
sno = self.canvas.duplicateNo
self.canvas.duplicateNo -= 1
for row in range(startcell, endcell):
- if self.canvas.rows.has_key(row):
+ if row in self.canvas.rows:
self.canvas.rows[row].append(sno)
else:
self.canvas.rows[row] = [sno]
@@ -294,7 +311,7 @@ class AppointmentWidget(QtGui.QFrame):
def enable_slots(self, bool_):
self.canvas.enabled_slots = (
- bool_ or self.canvas.active_slot != None)
+ bool_ or self.canvas.active_slot is not None)
def set_scroll_bar(self, scroll_bar):
self.scrollArea.setVerticalScrollBar(scroll_bar)
@@ -303,11 +320,13 @@ class AppointmentWidget(QtGui.QFrame):
policy = QtCore.Qt.ScrollBarAlwaysOff
self.scrollArea.setVerticalScrollBarPolicy(policy)
+
class appointmentCanvas(QtGui.QWidget):
+
'''
the canvas for me to draw on
'''
- blink_on = True # a boolean which toggles value
+ blink_on = True # a boolean which toggles value
enabled_slots = True
ensure_slot_visible = True
@@ -315,25 +334,25 @@ class appointmentCanvas(QtGui.QWidget):
def __init__(self, om_gui, pWidget):
QtGui.QWidget.__init__(self, pWidget)
self.setSizePolicy(QtGui.QSizePolicy(
- QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding))
+ QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding))
self.setMinimumSize(self.minimumSizeHint())
self.pWidget = pWidget
- self.slotDuration = 5 # 5 minute slots
+ self.slotDuration = 5 # 5 minute slots
self.textDetail = 3 # time printed every 3 slots
self.slotNo = 12
- self.dayEndTime=60
- self.dayStartTime=0
- self.startTime=0
- self.endTime=60
+ self.dayEndTime = 60
+ self.dayStartTime = 0
+ self.startTime = 0
+ self.endTime = 60
self.appts = []
self.freeslots = []
self.doubleAppts = []
self.rows = {}
self.setTime = None
- self.selected_rows = (0,0)
+ self.selected_rows = (0, 0)
self.setMouseTracking(True)
- self.duplicateNo = -1 #use this for serialnos =0
+ self.duplicateNo = -1 # use this for serialnos =0
self.om_gui = om_gui
self.dragging = False
self.drag_appt = None
@@ -344,17 +363,16 @@ class appointmentCanvas(QtGui.QWidget):
self.active_slot = None
self.font = QtGui.QFont(self.fontInfo().family(),
- localsettings.appointmentFontSize)
+ localsettings.appointmentFontSize)
self.fm = QtGui.QFontMetrics(self.font)
self.timeWidth = self.fm.width(" 88:88 ")
- self.slotHeight = self.fm.height()/self.textDetail
+ self.slotHeight = self.fm.height() / self.textDetail
self.blink_timer = QtCore.QTimer()
self.blink_timer.timeout.connect(self.toggle_blink)
self.blink_timer.start(1000)
-
def setDayStartTime(self, sTime):
'''
a public method to set the Practice Day Start
@@ -373,7 +391,7 @@ class appointmentCanvas(QtGui.QWidget):
a public method to set the earliest appointment available
'''
self.startTime = self.minutesPastMidnight(sTime)
- self.firstSlot = self.getCell_from_time(sTime)+1
+ self.firstSlot = self.getCell_from_time(sTime) + 1
def setEndTime(self, fTime):
'''
@@ -388,13 +406,13 @@ class appointmentCanvas(QtGui.QWidget):
and length of slots
'''
self.slotNo = (
- self.dayEndTime - self.dayStartTime) // self.slotDuration
- self.slotHeight = self.fm.height()/self.textDetail
+ self.dayEndTime - self.dayStartTime) // self.slotDuration
+ self.slotHeight = self.fm.height() / self.textDetail
- min_height_required = self.slotHeight *self.slotNo
+ min_height_required = self.slotHeight * self.slotNo
- if min_height_required < self.pWidget.scrollArea.height()*.98:
- self.setMinimumHeight(self.pWidget.scrollArea.height()*.98)
+ if min_height_required < self.pWidget.scrollArea.height() * .98:
+ self.setMinimumHeight(self.pWidget.scrollArea.height() * .98)
self.slotHeight = self.height() / self.slotNo
else:
self.setMinimumHeight(min_height_required)
@@ -416,7 +434,7 @@ class appointmentCanvas(QtGui.QWidget):
converts minutes past midnight(int) to format "HH:MM"
'''
hour, minute = t // 60, int(t) % 60
- return "%s:%02d"% (hour, minute)
+ return "%s:%02d" % (hour, minute)
def setslotDuration(self, arg):
'''
@@ -482,7 +500,7 @@ class appointmentCanvas(QtGui.QWidget):
'''
lower = arg
while lower >= self.firstSlot:
- if self.rows.has_key(lower):
+ if lower in self.rows:
lower += 1
break
lower -= 1
@@ -494,7 +512,7 @@ class appointmentCanvas(QtGui.QWidget):
'''
upper = arg
while upper < self.lastSlot:
- if self.rows.has_key(upper):
+ if upper in self.rows:
break
upper += 1
return upper
@@ -505,16 +523,16 @@ class appointmentCanvas(QtGui.QWidget):
this is complicated because the same patient may have 2 appointments
on one day
'''
- bounds = {1: row,-1:row}
+ bounds = {1: row, -1: row}
row_list = sorted(self.rows)[:]
for direction in (1, -1):
pos = row_list.index(row)
pts = patients
- while pts==patients:
- if row_list[pos]<bounds[direction]:
- bounds[direction]=row_list[pos]
+ while pts == patients:
+ if row_list[pos] < bounds[direction]:
+ bounds[direction] = row_list[pos]
pos += direction
try:
pts = self.rows[row_list[pos]]
@@ -523,13 +541,13 @@ class appointmentCanvas(QtGui.QWidget):
except IndexError:
break
- return (bounds[-1],bounds[1]+1)
+ return (bounds[-1], bounds[1] + 1)
def dragEnterEvent(self, event):
if event.mimeData().hasFormat("application/x-appointment"):
data = event.mimeData()
bstream = data.retrieveData("application/x-appointment",
- QtCore.QVariant.ByteArray)
+ QtCore.QVariant.ByteArray)
self.drag_appt = pickle.loads(bstream.toByteArray())
event.accept()
@@ -541,20 +559,20 @@ class appointmentCanvas(QtGui.QWidget):
y = event.pos().y()
yOffset = self.height() / self.slotNo
- self.drag_startrow = int(y//yOffset)
+ self.drag_startrow = int(y // yOffset)
- if (self.drag_startrow < self.firstSlot-1 or
- self.drag_startrow >= self.lastSlot or
- self.rows.has_key(self.drag_startrow)):
+ if (self.drag_startrow < self.firstSlot - 1 or
+ self.drag_startrow >= self.lastSlot or
+ self.drag_startrow in self.rows):
allowDrop = False
else:
n_rows = self.drag_appt.length // self.slotDuration
self.drag_endrow = self.drag_startrow + n_rows
- #see if there's a long enough slot either side of the selected
- #row
+ # see if there's a long enough slot either side of the selected
+ # row
allowDrop = True
for row in range(self.drag_startrow, self.drag_endrow):
- if self.rows.has_key(row) or row >= self.lastSlot:
+ if row in self.rows or row >= self.lastSlot:
allowDrop = False
break
if not allowDrop:
@@ -562,7 +580,7 @@ class appointmentCanvas(QtGui.QWidget):
self.drag_startrow = row - n_rows
self.drag_endrow = row
for row in range(self.drag_startrow, row):
- if self.rows.has_key(row) or row < self.firstSlot-1:
+ if row in self.rows or row < self.firstSlot - 1:
allowDrop = False
break
@@ -587,7 +605,7 @@ class appointmentCanvas(QtGui.QWidget):
def dropEvent(self, event):
self.dragging = False
self.emit(QtCore.SIGNAL("ApptDropped"), self.drag_appt,
- self.drop_time, self.pWidget.apptix)
+ self.drop_time, self.pWidget.apptix)
self.drag_appt = None
self.dropOffset = 0
event.accept()
@@ -597,22 +615,21 @@ class appointmentCanvas(QtGui.QWidget):
for slot in self.freeslots:
startcell, endcell = slot
rect = QtCore.QRectF(
- self.timeWidth,
- startcell * self.slotHeight,
- self.width() - self.timeWidth,
- (endcell-startcell) * self.slotHeight)
+ self.timeWidth,
+ startcell * self.slotHeight,
+ self.width() - self.timeWidth,
+ (endcell - startcell) * self.slotHeight)
if rect.contains(QtCore.QPointF(pos)):
self.mouse_freeslot = slot
return True
-
def mouseMoveEvent(self, event):
y = event.y()
yOffset = self.height() / self.slotNo
- row = int(y//yOffset)
+ row = int(y // yOffset)
- if not (self.firstSlot-1) < row < self.lastSlot:
+ if not (self.firstSlot - 1) < row < self.lastSlot:
self.selected_rows = (0, 0)
self.update()
QtGui.QToolTip.showText(event.globalPos(), "")
@@ -626,16 +643,16 @@ class appointmentCanvas(QtGui.QWidget):
<b>%s</b><br />
(%d mins)
</div></html>
- '''% (
- self.pWidget.dentist,
- self.getTime_from_Cell(startcell).strftime("%H:%M"),
- (endcell-startcell) * self.slotDuration,
- )
+ ''' % (
+ self.pWidget.dentist,
+ self.getTime_from_Cell(startcell).strftime("%H:%M"),
+ (endcell - startcell) * self.slotDuration,
+ )
x_pos = self.mapToGlobal(self.pos()).x()
pos = QtCore.QPoint(x_pos, event.globalPos().y())
QtGui.QToolTip.showText(pos, feedback)
- elif self.rows.has_key(row):
+ elif row in self.rows:
selectedPatients = self.rows[row]
self.selected_rows = self.getApptBounds(row, selectedPatients)
self.update()
@@ -645,28 +662,28 @@ class appointmentCanvas(QtGui.QWidget):
for appt in self.appts + self.doubleAppts:
if appt[5] == patient:
- feedback += '''%s<br /><b>%s - %s</b>'''%(
+ feedback += '''%s<br /><b>%s - %s</b>''' % (
appt[4], appt[2], appt[3])
for val in (appt[6], appt[7], appt[8]):
if val != "":
feedback += '''
- <br /><font color="red">%s</font>'''% val
+ <br /><font color="red">%s</font>''' % val
if appt[9] != "":
- feedback += "<br /><i>%s</i>"% appt[9]
+ feedback += "<br /><i>%s</i>" % appt[9]
try:
timestamp = appt[12]
datestamp = timestamp.date()
moddate = localsettings.readableDate(datestamp)
if datestamp == localsettings.currentDay():
- feedback += "<br /><i>%s %s %s %s</i><hr />"% (
- _("Made"), moddate, _("at"),
- localsettings.pyTimeToHumantime(timestamp))
+ feedback += "<br /><i>%s %s %s %s</i><hr />" % (
+ _("Made"), moddate, _("at"),
+ localsettings.pyTimeToHumantime(timestamp))
else:
- feedback += "<br /><i>%s<br />%s</i><hr />"% (
- _("Made on"), moddate)
+ feedback += "<br /><i>%s<br />%s</i><hr />" % (
+ _("Made on"), moddate)
except AttributeError:
- feedback +="<hr />"
+ feedback += "<hr />"
pass
if feedback != "<html>":
@@ -684,15 +701,23 @@ class appointmentCanvas(QtGui.QWidget):
self.selected_rows = newSelection
self.update()
- start = int(self.dayStartTime + self.selected_rows[0] * self.slotDuration)
- finish = int(self.dayStartTime + self.selected_rows[1] * self.slotDuration)
+ start = int(
+ self.dayStartTime +
+ self.selected_rows[
+ 0] *
+ self.slotDuration)
+ finish = int(
+ self.dayStartTime +
+ self.selected_rows[
+ 1] *
+ self.slotDuration)
x_pos = self.mapToGlobal(self.pos()).x()
pos = QtCore.QPoint(x_pos, event.globalPos().y())
QtGui.QToolTip.showText(pos,
- "SLOT %s minutes"% (finish - start))
+ "SLOT %s minutes" % (finish - start))
- def mouseDoubleClickEvent(self,event):
+ def mouseDoubleClickEvent(self, event):
self.mousePressEvent(event)
def mousePressEvent(self, event):
@@ -708,17 +733,17 @@ class appointmentCanvas(QtGui.QWidget):
dent = localsettings.apptix.get(self.pWidget.dentist)
if result.text() == _("Load Patient"):
self.pWidget.emit(QtCore.SIGNAL("AppointmentClicked"),
- tuple(selectedPatients))
+ tuple(selectedPatients))
elif result.text() == _("Add/Edit Memo"):
self.pWidget.emit(QtCore.SIGNAL("EditAppointmentMemo"),
- tuple(selectedPatients), start, dent)
+ tuple(selectedPatients), start, dent)
elif result.text() == _("Cancel Appointment"):
self.pWidget.emit(QtCore.SIGNAL("AppointmentCancel"),
- tuple(selectedPatients), start, dent)
+ tuple(selectedPatients), start, dent)
elif result.text() == _("Clear Block"):
self.pWidget.emit(QtCore.SIGNAL("ClearEmergencySlot"),
- (start, finish, dent))
+ (start, finish, dent))
elif result.text() == _("Block or use this space"):
self.block_use_space(qstart, qfinish)
@@ -727,46 +752,46 @@ class appointmentCanvas(QtGui.QWidget):
self.pWidget.print_mh_signal.emit(tuple(selectedPatients))
yOffset = self.height() / self.slotNo
- row=event.y()//yOffset
+ row = event.y() // yOffset
actions = []
if self.mouse_over_freeslot(event.pos()):
self.send_slotclicked_signal()
- elif self.rows.has_key(row):
- start=self.humanTime(
- int(self.dayStartTime+self.selected_rows[0]*self.slotDuration))
+ elif row in self.rows:
+ start = self.humanTime(
+ int(self.dayStartTime + self.selected_rows[0] * self.slotDuration))
- finish=self.humanTime(
- int(self.dayStartTime+self.selected_rows[1]*self.slotDuration))
+ finish = self.humanTime(
+ int(self.dayStartTime + self.selected_rows[1] * self.slotDuration))
- selectedPatients=self.rows[row]
- #ignore lunch and emergencies - serialno number is positive
+ selectedPatients = self.rows[row]
+ # ignore lunch and emergencies - serialno number is positive
- if selectedPatients[0]>0:
+ if selectedPatients[0] > 0:
actions.append(_("Load Patient"))
-
+
actions.append(None)
actions.append(_("Add/Edit Memo"))
actions.append(_("Cancel Appointment"))
actions.append(None)
actions.append(_("Print A Medical Form"))
-
+
self.pWidget.emit(QtCore.SIGNAL("PatientClicked"),
- tuple(selectedPatients))
+ tuple(selectedPatients))
else:
actions.append(_("Clear Block"))
else:
#-- no-one in the book...
- qstart=self.qTime(
- int(self.dayStartTime+self.selected_rows[0]*self.slotDuration))
+ qstart = self.qTime(
+ int(self.dayStartTime + self.selected_rows[0] * self.slotDuration))
- qfinish=self.qTime(
- int(self.dayStartTime+self.selected_rows[1]*self.slotDuration))
+ qfinish = self.qTime(
+ int(self.dayStartTime + self.selected_rows[1] * self.slotDuration))
- if (self.firstSlot-1) < row < self.lastSlot:
+ if (self.firstSlot - 1) < row < self.lastSlot:
actions.append(_("Block or use this space"))
if self.qmenu and event.type() == QtCore.QEvent.MouseButtonDblClick:
@@ -786,7 +811,7 @@ class appointmentCanvas(QtGui.QWidget):
rightClickMenuResult(self.qmenu.exec_(event.globalPos()))
def block_use_space(self, start, finish):
- Dialog=QtGui.QDialog(self)
+ Dialog = QtGui.QDialog(self)
dl = blockslot.blockDialog(Dialog, self.om_gui)
dl.setTimes(start, finish)
@@ -795,29 +820,30 @@ class appointmentCanvas(QtGui.QWidget):
if dl.exec_():
adjstart = dl.start_timeEdit.time()
adjfinish = dl.finish_timeEdit.time()
- if finish < start :
+ if finish < start:
QtGui.QMessageBox.information(self,
- _("Whoops!"), _("Bad Time Sequence!"))
+ _("Whoops!"), _("Bad Time Sequence!"))
- if dl.block == True:
+ if dl.block:
reason = str(
- dl.comboBox.currentText().toAscii())[:30]
+ dl.comboBox.currentText().toAscii())[:30]
self.pWidget.emit(QtCore.SIGNAL("BlockEmptySlot"),
- (start, finish, adjstart, adjfinish ,
- localsettings.apptix.get(self.pWidget.dentist),
- reason))
+ (start, finish, adjstart, adjfinish,
+ localsettings.apptix.get(
+ self.pWidget.dentist),
+ reason))
else:
reason = dl.reason_comboBox.currentText().toAscii()
self.pWidget.emit(
- QtCore.SIGNAL("Appointment_into_EmptySlot"),
- (start, finish, adjstart, adjfinish ,
- localsettings.apptix.get(self.pWidget.dentist),
- reason, dl.patient))
+ QtCore.SIGNAL("Appointment_into_EmptySlot"),
+ (start, finish, adjstart, adjfinish,
+ localsettings.apptix.get(self.pWidget.dentist),
+ reason, dl.patient))
- def leaveEvent(self,event):
+ def leaveEvent(self, event):
self.mouse_down = False
- self.selected_rows=[-1,-1]
+ self.selected_rows = [-1, -1]
self.update()
def paintEvent(self, event=None):
@@ -832,15 +858,15 @@ class appointmentCanvas(QtGui.QWidget):
painter.setFont(self.font)
- #define and draw the white boundary
+ # define and draw the white boundary
painter.setBrush(colours.APPT_Background)
- painter.setPen(QtGui.QPen(colours.APPT_Background,1))
+ painter.setPen(QtGui.QPen(colours.APPT_Background, 1))
- top = (self.firstSlot-1) * self.slotHeight
+ top = (self.firstSlot - 1) * self.slotHeight
bottom = (self.lastSlot + 1 - self.firstSlot) * self.slotHeight
- colwidth = self.width()-self.timeWidth
+ colwidth = self.width() - self.timeWidth
rect = QtCore.QRectF(self.timeWidth, top, colwidth, bottom)
@@ -851,29 +877,29 @@ class appointmentCanvas(QtGui.QWidget):
while currentSlot < self.slotNo:
textneeded = False
- if currentSlot%self.textDetail == 0:
- textneeded=True
+ if currentSlot % self.textDetail == 0:
+ textneeded = True
- y = currentSlot*self.slotHeight
+ y = currentSlot * self.slotHeight
#- code to check if within the appointment hours
if self.firstSlot <= currentSlot <= self.lastSlot:
painter.setPen(QtGui.QPen(LINECOLOR, 1))
- painter.drawLine(self.timeWidth+1, y, self.width()-1, y)
+ painter.drawLine(self.timeWidth + 1, y, self.width() - 1, y)
if textneeded:
- trect=QtCore.QRectF(0, y,
- self.timeWidth,y + self.textDetail * self.slotHeight)
+ trect = QtCore.QRectF(0, y,
+ self.timeWidth, y + self.textDetail * self.slotHeight)
- painter.setPen(QtGui.QPen(QtCore.Qt.black,1))
+ painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
painter.drawLine(0, y, self.timeWidth, y)
- painter.drawText(trect,QtCore.Qt.AlignLeft,
- (QtCore.QString(self.humanTime(
- self.dayStartTime+(currentSlot*self.slotDuration)))))
+ painter.drawText(trect, QtCore.Qt.AlignLeft,
+ (QtCore.QString(self.humanTime(
+ self.dayStartTime + (currentSlot * self.slotDuration)))))
currentSlot += 1
- #####layout appts
+ # layout appts
painter.save()
painter.setPen(QtCore.Qt.black)
option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
@@ -882,44 +908,44 @@ class appointmentCanvas(QtGui.QWidget):
for appt in self.appts:
painter.save()
(startcell, endcell, start, fin, name, sno, trt1, trt2,
- trt3, memo, flag, cset, modtime) = appt
+ trt3, memo, flag, cset, modtime) = appt
- rect = QtCore.QRectF(self.timeWidth,startcell*self.slotHeight,
- self.width()-self.timeWidth, (endcell-startcell)*self.slotHeight)
+ rect = QtCore.QRectF(self.timeWidth, startcell * self.slotHeight,
+ self.width() - self.timeWidth, (endcell - startcell) * self.slotHeight)
- if sno !=0 and sno == self.pWidget.selected_serialno:
+ if sno != 0 and sno == self.pWidget.selected_serialno:
painter.setBrush(QtGui.QColor("orange"))
elif self.pWidget.mode == self.pWidget.SCHEDULING_MODE:
painter.setBrush(APPTCOLORS["BUSY"])
painter.setPen(GREY_PEN)
elif self.selected_rows == (startcell, endcell):
painter.setBrush(QtGui.QColor("#AAAAAA"))
- elif APPTCOLORS.has_key(cset):
+ elif cset in APPTCOLORS:
painter.setBrush(APPTCOLORS[cset])
- elif APPTCOLORS.has_key(name.upper()):
+ elif name.upper() in APPTCOLORS:
painter.setBrush(APPTCOLORS[name.upper()])
- elif flag==-128:
+ elif flag == -128:
painter.setBrush(APPTCOLORS["BUSY"])
else:
painter.setBrush(APPTCOLORS["default"])
if not (sno == 0 and (
- endcell < self.firstSlot or startcell > self.lastSlot)):
+ endcell < self.firstSlot or startcell > self.lastSlot)):
painter.drawRect(rect)
- mytext = "%s %s %s %s %s"% (name.title(), trt1,
- trt2, trt3 ,memo)
+ mytext = "%s %s %s %s %s" % (name.title(), trt1,
+ trt2, trt3, memo)
painter.drawText(rect, mytext, option)
- ##highlight any appointments booked today
- if (sno !=0 and
- modtime and modtime.date() == localsettings.currentDay()):
+ # highlight any appointments booked today
+ if (sno != 0 and
+ modtime and modtime.date() == localsettings.currentDay()):
rect = QtCore.QRectF(
- self.width()-self.timeWidth/2,
- startcell*self.slotHeight,
- self.timeWidth/2,
+ self.width() - self.timeWidth / 2,
+ startcell * self.slotHeight,
+ self.timeWidth / 2,
rect.height()
- ).adjusted(2,2,-2,-2)
+ ).adjusted(2, 2, -2, -2)
painter.setPen(colours.BOOKED_TODAY)
painter.setBrush(colours.BOOKED_TODAY)
@@ -927,15 +953,14 @@ class appointmentCanvas(QtGui.QWidget):
painter.restore()
-
for appt in self.doubleAppts:
- (startcell,endcell,start,fin,name,sno, trt1,trt2,
- trt3,memo,flag,cset, modtime)=appt
+ (startcell, endcell, start, fin, name, sno, trt1, trt2,
+ trt3, memo, flag, cset, modtime) = appt
rect = QtCore.QRectF(
- self.width()-self.timeWidth,
- startcell*self.slotHeight,
- self.width()-self.timeWidth,
+ self.width() - self.timeWidth,
+ startcell * self.slotHeight,
+ self.width() - self.timeWidth,
self.slotHeight)
painter.setBrush(APPTCOLORS["DOUBLE"])
@@ -946,9 +971,9 @@ class appointmentCanvas(QtGui.QWidget):
startcell, endcell = slot
rect = QtCore.QRectF(
self.timeWidth,
- startcell*self.slotHeight,
- self.width()-self.timeWidth,
- (endcell-startcell)*self.slotHeight)
+ startcell * self.slotHeight,
+ self.width() - self.timeWidth,
+ (endcell - startcell) * self.slotHeight)
if slot == self.active_slot:
if self.blink_on:
@@ -956,53 +981,59 @@ class appointmentCanvas(QtGui.QWidget):
else:
painter.setBrush(APPTCOLORS["ACTIVE_SLOT"])
if self.ensure_slot_visible:
- self.ensure_visible(0, startcell*self.slotHeight)
+ self.ensure_visible(0, startcell * self.slotHeight)
else:
brush = APPTCOLORS["SLOT"]
if self.enabled_slots:
painter.setOpacity(1)
else:
painter.setOpacity(0.4)
- #brush.setAlpha(40)
+ # brush.setAlpha(40)
painter.setBrush(brush)
painter.drawRect(rect)
slot_duration = (endcell - startcell) * self.slotDuration
- painter.drawText(rect, "%s mins"% slot_duration, option)
+ painter.drawText(rect, "%s mins" % slot_duration, option)
painter.restore()
- ##highlight current time
+ # highlight current time
if self.setTime:
cellno = self.getCell_from_time(self.setTime)
painter.setPen(blue_pen)
painter.setBrush(QtCore.Qt.blue)
- corner1 = [self.timeWidth*1.4, cellno*self.slotHeight]
- corner2 = [self.timeWidth, (cellno-0.5)*self.slotHeight]
- corner3 = [self.timeWidth, (cellno+0.5)*self.slotHeight]
- triangle = corner1+corner2+corner3
+ corner1 = [self.timeWidth * 1.4, cellno * self.slotHeight]
+ corner2 = [self.timeWidth, (cellno - 0.5) * self.slotHeight]
+ corner3 = [self.timeWidth, (cellno + 0.5) * self.slotHeight]
+ triangle = corner1 + corner2 + corner3
painter.drawPolygon(QtGui.QPolygon(triangle))
- corner1 = [self.width()-self.timeWidth*0.4, cellno*self.slotHeight]
- corner2 = [self.width(), (cellno-0.5)*self.slotHeight]
- corner3 = [self.width(), (cellno+0.5)*self.slotHeight]
- triangle = corner1+corner2+corner3
+ corner1 = [
+ self.width(
+ ) -
+ self.timeWidth *
+ 0.4,
+ cellno *
+ self.slotHeight]
+ corner2 = [self.width(), (cellno - 0.5) * self.slotHeight]
+ corner3 = [self.width(), (cellno + 0.5) * self.slotHeight]
+ triangle = corner1 + corner2 + corner3
painter.drawPolygon(QtGui.QPolygon(triangle))
if self.dragging:
painter.setPen(red_pen)
- y = self.drag_startrow *self.slotHeight
+ y = self.drag_startrow * self.slotHeight
y2 = self.drag_endrow * self.slotHeight
painter.drawLine(0, y, self.width(), y)
painter.setBrush(QtGui.QColor("yellow"))
trect = QtCore.QRectF(
self.timeWidth, y,
- self.width()-self.timeWidth,
- y2-y)
+ self.width() - self.timeWidth,
+ y2 - y)
painter.drawRect(trect)
droptime = self.drop_time.strftime("%H:%M")
- trect = QtCore.QRectF(0, y, self.timeWidth, y2-y)
+ trect = QtCore.QRectF(0, y, self.timeWidth, y2 - y)
painter.drawRect(trect)
painter.drawText(trect, QtCore.Qt.AlignHCenter, droptime)
@@ -1014,12 +1045,12 @@ class appointmentCanvas(QtGui.QWidget):
def ensure_visible(self, x, y):
QtCore.QTimer.singleShot(5,
- functools.partial(self.pWidget.scrollArea.ensureVisible,x, y))
+ functools.partial(self.pWidget.scrollArea.ensureVisible, x, y))
def send_slotclicked_signal(self):
startcell, endcell = self.mouse_freeslot
time = self.getTime_from_Cell(startcell)
- length = (endcell-startcell) * self.slotDuration
+ length = (endcell - startcell) * self.slotDuration
dent = self.pWidget.apptix
self.pWidget.slotClicked.emit(dent, time, length)
@@ -1039,12 +1070,12 @@ if __name__ == "__main__":
#--initiate a book starttime 08:00 endtime 10:00
#--five minute slots, text every 3 slots
- #from openmolar.qt4gui import maingui
- #parent = maingui.OpenmolarGui()
+ # from openmolar.qt4gui import maingui
+ # parent = maingui.OpenmolarGui()
parent = QtGui.QFrame()
parent.pt = BriefPatient(1)
- form = AppointmentWidget("0800","1500", parent)
+ form = AppointmentWidget("0800", "1500", parent)
form.setStartTime("0830")
form.setEndTime("1430")
form.apptix = 5
@@ -1054,29 +1085,31 @@ if __name__ == "__main__":
1st appointment %d minutes past midnight
appointments finish %d minutes past midnight
day end %d minutes past midnight
- - %d %d minutes slots'''%(
- form.canvas.dayStartTime,
- form.canvas.startTime,
- form.canvas.endTime,
- form.canvas.dayEndTime,
- form.canvas.slotNo,
- form.canvas.slotDuration)
+ - %d %d minutes slots''' % (
+ form.canvas.dayStartTime,
+ form.canvas.startTime,
+ form.canvas.endTime,
+ form.canvas.dayEndTime,
+ form.canvas.slotNo,
+ form.canvas.slotDuration)
form.setCurrentTime("945")
form.clearAppts()
dt = datetime.datetime.now()
for appoint in (
- (5, 915, 930, 'MCDONALD I', 6155, 'EXAM', '', '', '', 1, 73, 0, 0, dt )
- ,(5, 1100, 1130, 'EMERGENCY', 0, '', '', '', '', -128, 0, 0, 0, dt),
- (5, 1300, 1400, 'LUNCH', 0, '', '', '', '', -128, 0, 0, 0, dt),
- (5, 1400, 1410, 'STAFF MEETING', 0, '', '', '', '', -128, 0, 0, 0, dt),
- (5, 930, 1005, 'TAYLOR JANE', 19373, 'FILL', '', '', '', 1, 80, 0, 0, dt),
- (5, 1210, 1230, 'TAYLOR JANE', 19373, 'FILL', '', '', '', 1, 80, 0, 0, dt),
+ (5, 915, 930, 'MCDONALD I', 6155, 'EXAM', '', '', '', 1, 73, 0, 0, dt), (
+ 5, 1100, 1130, 'EMERGENCY', 0, '', '', '', '', -128, 0, 0, 0, dt),
+ (5, 1300, 1400, 'LUNCH', 0, '', '', '', '', -128, 0, 0, 0, dt),
+ (5, 1400, 1410, 'STAFF MEETING', 0, '', '', '', '', -128, 0, 0, 0, dt),
+ (5, 930, 1005, 'TAYLOR JANE', 19373,
+ 'FILL', '', '', '', 1, 80, 0, 0, dt),
+ (5, 1210, 1230, 'TAYLOR JANE', 19373,
+ 'FILL', '', '', '', 1, 80, 0, 0, dt),
):
form.setAppointment(appoint)
- slot_date = datetime.datetime.combine(dt.date(), datetime.time(11,30))
+ slot_date = datetime.datetime.combine(dt.date(), datetime.time(11, 30))
slot = appointments.FreeSlot(slot_date, 5, 40)
form.addSlot(slot)
@@ -1086,7 +1119,6 @@ if __name__ == "__main__":
form.set_active_slot(slot)
-
form.connect(form, QtCore.SIGNAL("AppointmentClicked"), clicktest)
form.connect(form, QtCore.SIGNAL("ClearEmergencySlot"), clicktest)
form.connect(form, QtCore.SIGNAL("BlockEmptySlot"), clicktest)
@@ -1094,7 +1126,7 @@ if __name__ == "__main__":
form.connect(form, QtCore.SIGNAL("Appointment_into_EmptySlot"), clicktest)
form.mode = form.SCHEDULING_MODE
- #form.mode = form.BROWSING_MODE
+ # form.mode = form.BROWSING_MODE
v = QtGui.QVBoxLayout()
v.setSpacing(0)
diff --git a/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py b/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py
index d591472..6d60cbc 100755
--- a/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py
+++ b/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py
@@ -1,26 +1,45 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
-
-from PyQt4 import QtGui,QtCore
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings
+
class control(QtGui.QLabel):
+
'''
a custom label for the top of the appointment overview widgets
'''
+
def __init__(self, parent=None):
- super(control,self).__init__(parent)
- self.setMinimumSize(80,40)
- self.memo=""
+ super(control, self).__init__(parent)
+ self.setMinimumSize(80, 40)
+ self.memo = ""
self.setWordWrap(True)
- self.date = QtCore.QDate(1900,1,1)
+ self.date = QtCore.QDate(1900, 1, 1)
- def setDate(self,arg):
+ def setDate(self, arg):
'''
takes a QDate
'''
@@ -37,46 +56,45 @@ class control(QtGui.QLabel):
def updateLabels(self):
day = localsettings.readableDate(self.date.toPyDate()).replace(
- ",","<br />")
+ ",", "<br />")
if self.memo != "":
- str="<center><b>%s</b><br />%s</center>"%(day, self.memo)
+ str = "<center><b>%s</b><br />%s</center>" % (day, self.memo)
else:
- str="<center><b>%s</b></center>"% day
+ str = "<center><b>%s</b></center>" % day
self.setText(str)
self.setToolTip('''<center>Left click to go to<br />%s<br />
- <br />Right click for admin options</center>'''% day)
+ <br />Right click for admin options</center>''' % day)
- def mouseMoveEvent(self,e):
+ def mouseMoveEvent(self, e):
self.setStyleSheet("background:white")
- def leaveEvent(self,e):
+ def leaveEvent(self, e):
self.setStyleSheet("")
-
- def mousePressEvent(self,e):
- but=e.button()
- if but==1:
- self.emit(QtCore.SIGNAL("clicked"),self.date)
- elif but==2:
- self.emit(QtCore.SIGNAL("right-clicked"),self.date)
+ def mousePressEvent(self, e):
+ but = e.button()
+ if but == 1:
+ self.emit(QtCore.SIGNAL("clicked"), self.date)
+ elif but == 2:
+ self.emit(QtCore.SIGNAL("right-clicked"), self.date)
else:
- print "unknown mousePressEvent",but
+ print "unknown mousePressEvent", but
if __name__ == "__main__":
def test(a):
- print "left click",a.toString()
+ print "left click", a.toString()
+
def test2(a):
- print "right click",a.toString()
+ print "right click", a.toString()
import sys
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = control(Form)
ui.setDate(QtCore.QDate.currentDate())
- QtCore.QObject.connect(ui,QtCore.SIGNAL("clicked"), test)
- QtCore.QObject.connect(ui,QtCore.SIGNAL("right-clicked"), test2)
+ QtCore.QObject.connect(ui, QtCore.SIGNAL("clicked"), test)
+ QtCore.QObject.connect(ui, QtCore.SIGNAL("right-clicked"), test2)
Form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/customwidgets/calendars.py b/src/openmolar/qt4gui/customwidgets/calendars.py
index c0a7ae2..d3cc857 100644
--- a/src/openmolar/qt4gui/customwidgets/calendars.py
+++ b/src/openmolar/qt4gui/customwidgets/calendars.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
import calendar
@@ -17,34 +33,40 @@ from openmolar.settings import localsettings
from openmolar.qt4gui.compiled_uis import Ui_memo_item
from openmolar.qt4gui.compiled_uis import Ui_editmemos
-CENTRE = QtGui.QTextOption(QtCore.Qt.AlignCenter|QtCore.Qt.AlignVCenter)
-RIGHT = QtGui.QTextOption(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)
-LEFT = QtGui.QTextOption(QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+CENTRE = QtGui.QTextOption(QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)
+RIGHT = QtGui.QTextOption(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
+LEFT = QtGui.QTextOption(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
class dayData(object):
+
'''
a custom data object to hold information about the selected day
'''
- def __init__(self, dayDate):
+
+ def __init__(self, dayDate):
self.dayName = localsettings.longDate(dayDate)
self.publicHoliday = ""
self.dents = {}
+
class controlCalendar(QtGui.QCalendarWidget):
+
'''
- a customised QCalendarWidget, overriding the defeault behaviour of the
+ a customised QCalendarWidget, overriding the defeault behaviour of the
month foreward and back buttons
'''
+
def __init__(self, *args):
QtGui.QCalendarWidget.__init__(self, *args)
self.setFirstDayOfWeek(QtCore.Qt.Monday)
self.setGridVisible(True)
- self.setHorizontalHeaderFormat(QtGui.QCalendarWidget.SingleLetterDayNames)
+ self.setHorizontalHeaderFormat(
+ QtGui.QCalendarWidget.SingleLetterDayNames)
self.setVerticalHeaderFormat(QtGui.QCalendarWidget.NoVerticalHeader)
self.setDateEditEnabled(True)
self.setSelectedDate(QtCore.QDate.currentDate())
- #self.connect(self, QtCore.SIGNAL("currentPageChanged (int,int)"),
+ # self.connect(self, QtCore.SIGNAL("currentPageChanged (int,int)"),
# self.jumpMonth)
def jumpMonth(self, year, month):
@@ -52,78 +74,84 @@ class controlCalendar(QtGui.QCalendarWidget):
a customisation so that the arrow buttons actually change the date
jump through hoops to ensure that a null date isn't chosen
eg february 30th
-
+
'''
cur_date = self.selectedDate()
d = QtCore.QDate()
day = cur_date.day()
while day and not d.setDate(year, month, day):
day -= 1
-
+
if d != cur_date:
self.setSelectedDate(d)
-
+
def changeDate(self, d):
'''
- and alternative to setSelectedDate in that it will return False if no
+ and alternative to setSelectedDate in that it will return False if no
change has been made
- this is necessary as the ui relies on a signal from this widget
+ this is necessary as the ui relies on a signal from this widget
'''
if self.selectedDate() == d:
return False
else:
- self.setSelectedDate(d)
+ self.setSelectedDate(d)
return True
-
+
+
class weekCalendar(controlCalendar):
+
def __init__(self, *args):
controlCalendar.__init__(self, *args)
self.color = QtGui.QColor(
self.palette().color(QtGui.QPalette.Highlight))
self.color.setAlpha(64)
-
+
self.weekNo = self.selectedDate().weekNumber()
- self.connect(self, QtCore.SIGNAL("selectionChanged ()"),
- self.update_)
+ self.connect(self, QtCore.SIGNAL("selectionChanged ()"),
+ self.update_)
def update_(self):
'''
- emit a signal indicating the chosen week has changed
+ emit a signal indicating the chosen week has changed
'''
- weekNo = self.selectedDate().weekNumber()
+ weekNo = self.selectedDate().weekNumber()
if weekNo != self.weekNo:
self.emit(QtCore.SIGNAL("weekChanged"), self.selectedDate())
self.weekNo = weekNo
-
+
self.updateCells()
-
- def paintCell(self, painter, rect, date):
+
+ def paintCell(self, painter, rect, date):
QtGui.QCalendarWidget.paintCell(self, painter, rect, date)
-
+
if date.weekNumber()[0] == self.selectedDate().weekNumber()[0]:
painter.fillRect(rect, self.color)
+
class calDialogs():
+
'''
a sub class for month and year calendars
'''
+
def __init__(self):
pass
-
+
def publicHolidayEnter(parent):
'''
enter/modify the stored public holiday field
'''
d = parent.selectedDate
print "edit pub hol for", d
- datekey = "%d%02d"%(d.month, d.day)
+ datekey = "%d%02d" % (d.month, d.day)
current = parent.headingdata.get(datekey, "")
- new, result = QtGui.QInputDialog.getText(parent, _("Public Holidays"),
- _("Enter the information for ")+localsettings.longDate(d),
- QtGui.QLineEdit.Normal, current)
+ new, result = QtGui.QInputDialog.getText(parent, _("Public Holidays"),
+ _("Enter the information for ") + localsettings.longDate(
+ d),
+ QtGui.QLineEdit.Normal, current)
if result and current != str(new.toAscii()):
parent.emit(QtCore.SIGNAL("add_pub_hol"), str(new.toAscii()))
-
+
def raisememoDialog(parent):
'''
allow user to input a memo
@@ -132,27 +160,27 @@ class calDialogs():
dl = Ui_editmemos.Ui_Dialog()
dl.setupUi(Dialog)
d = parent.selectedDate
- header_text = "%s"% localsettings.longDate(d)
- datekey = "%d%02d"% (d.month, d.day)
- if parent.headingdata.has_key(datekey):
- header_text += "<br>%s"% parent.headingdata[datekey]
-
+ header_text = "%s" % localsettings.longDate(d)
+ datekey = "%d%02d" % (d.month, d.day)
+ if datekey in parent.headingdata:
+ header_text += "<br>%s" % parent.headingdata[datekey]
+
dl.label.setText(header_text)
dl.layout = QtGui.QVBoxLayout(dl.scrollArea)
dl.layout.setSpacing(0)
- key = "%d%02d"% (parent.selectedDate.month, parent.selectedDate.day)
-
+ key = "%d%02d" % (parent.selectedDate.month, parent.selectedDate.day)
+
memoDict = {}
- if parent.data.has_key(key):
+ if key in parent.data:
memoDict = parent.data[key]
-
+
memowidget_dict = {}
for dentix in parent.dents:
- if memoDict.has_key(dentix):
+ if dentix in memoDict:
memo = memoDict[dentix].memo
else:
memo = ""
-
+
if dentix == 0:
dl.lineEdit.setText(memo)
memowidget_dict[0] = dl.lineEdit
@@ -161,38 +189,38 @@ class calDialogs():
memoitem = Ui_memo_item.Ui_Form()
memoitem.setupUi(widg)
memoitem.label.setText(
- localsettings.apptix_reverse.get(dentix,"??"))
-
+ localsettings.apptix_reverse.get(dentix, "??"))
+
memoitem.lineEdit.setText(memo)
-
+
dl.layout.addWidget(widg)
-
+
memowidget_dict[dentix] = memoitem.lineEdit
-
- spacerItem = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Minimum,
- QtGui.QSizePolicy.Expanding)
+
+ spacerItem = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
dl.layout.addItem(spacerItem)
-
- if Dialog.exec_():
+
+ if Dialog.exec_():
retarg = []
- memo = str(dl.lineEdit.text().toAscii())
+ memo = str(dl.lineEdit.text().toAscii())
for dent in parent.dents:
memo = str(memowidget_dict[dent].text().toAscii())
if memo != memoDict.get(dent, ""):
retarg.append((dent, memo),)
- #print retarg
+ # print retarg
parent.emit(QtCore.SIGNAL("add_memo"), tuple(retarg))
-
class monthCalendar(QtGui.QWidget, calDialogs):
+
def __init__(self, parent=None):
'''
initiate the widget
'''
super(monthCalendar, self).__init__(parent)
self.setSizePolicy(QtGui.QSizePolicy(
- QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding))
+ QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding))
self.parent = parent
self.rowNo = 1
self.colNo = 1
@@ -207,11 +235,11 @@ class monthCalendar(QtGui.QWidget, calDialogs):
self.setSelectedDate(datetime.date.today())
self.setMouseTracking(True)
self.mouseBrush = QtGui.QColor(self.palette().color(
- QtGui.QPalette.Highlight))
+ QtGui.QPalette.Highlight))
self.mouseBrush.setAlpha(64)
self.highlightedDate = None
self.setMinimumSize(self.minimumSizeHint())
-
+
def sizeHint(self):
'''
set an (arbitrary) size for the widget
@@ -223,32 +251,32 @@ class monthCalendar(QtGui.QWidget, calDialogs):
set an (arbitrary) minimum size for the widget
'''
return QtCore.QSize(200, 400)
-
+
def minimumWidth(self):
'''
calculate how much space we need to display the data
'''
- self.defaultColWidth = (self.width() - self.bankHolColwidth -
- self.vheaderwidth) / self.colNo
-
+ self.defaultColWidth = (self.width() - self.bankHolColwidth -
+ self.vheaderwidth) / self.colNo
+
vheaders_total = self.bankHolColwidth + self.vheaderwidth
dentwidth = 0
-
+
for dent in self.dents:
width = self.dentColWidths.get(dent, self.defaultColWidth)
dentwidth += width
-
- minrequiredWidth = vheaders_total + dentwidth
-
+
+ minrequiredWidth = vheaders_total + dentwidth
+
# if there is space, fill it up....
if self.width() > minrequiredWidth:
factor = (self.width() - vheaders_total) / (dentwidth)
-
+
for dent in self.dents:
self.dentColWidths[dent] = self.dentColWidths[dent] * factor
-
+
return minrequiredWidth
-
+
def setDents(self, dents):
'''
make the widget aware who's data it's showing
@@ -256,25 +284,25 @@ class monthCalendar(QtGui.QWidget, calDialogs):
'''
self.dents = (0,) + tuple(dents)
self.colNo = len(self.dents)
-
+
def setHeadingData(self, data):
'''
sets attributes for any given day useful for Bank Hols etc...
data is a dictionary {"mdd":"New Year's Day" , ...}
'''
- self.headingdata = data
+ self.headingdata = data
self.setBankHolColWidth
-
+
def setBankHolColWidth(self):
'''
determine the width needed to display the public hols
'''
self.bankHolColwidth = 20
for value in self.headingdata.values():
- width = self.fm.width("%s "% value)
+ width = self.fm.width("%s " % value)
if width > self.bankHolColwidth:
self.bankHolColwidth = width
-
+
def setData(self, data):
'''
pass a dictionary like {"1209":[d1,d2]}
@@ -282,11 +310,11 @@ class monthCalendar(QtGui.QWidget, calDialogs):
'''
self.data = {}
for key in data:
- self.data[key]= {}
+ self.data[key] = {}
for dent in data[key]:
- self.data[key][dent.ix]= dent
+ self.data[key][dent.ix] = dent
self.setColWidths()
-
+
def setColWidths(self):
'''
update the widget's size (because data or font have changed)
@@ -294,12 +322,12 @@ class monthCalendar(QtGui.QWidget, calDialogs):
self.dentColWidths = {}
for ix in self.dents:
self.dentColWidths[ix] = self.fm.width(
- localsettings.apptix_reverse.get(ix,"------"))
+ localsettings.apptix_reverse.get(ix, "------"))
for ix in self.dents:
memo = ""
for dentDict in self.data.values():
- if dentDict.has_key(ix):
+ if ix in dentDict:
dent = dentDict.get(ix)
if dent:
memo = dentDict[ix].memo
@@ -310,17 +338,17 @@ class monthCalendar(QtGui.QWidget, calDialogs):
width = self.fm.width(memo)
if width > self.dentColWidths[ix]:
self.dentColWidths[ix] = width
-
+
def setRowNo(self):
'''
work out how many rows are required
- somewhere between (28-31) + one for a header
+ somewhere between (28-31) + one for a header
'''
- self.rowNo = calendar.monthrange(self.year, self.month)[1]+2
-
- def getDateFromPosition(self, xpos, ypos):
+ self.rowNo = calendar.monthrange(self.year, self.month)[1] + 2
+
+ def getDateFromPosition(self, xpos, ypos):
rowheight = self.height() / self.rowNo
- day = int(ypos//rowheight)-1
+ day = int(ypos // rowheight) - 1
try:
d = datetime.date(self.year, self.month, day)
return d
@@ -337,17 +365,16 @@ class monthCalendar(QtGui.QWidget, calDialogs):
if d != self.highlightedDate:
self.highlightedDate = d
self.update()
-
-
+
def mousePressEvent(self, event):
'''
- catch the mouse press event -
+ catch the mouse press event -
'''
d = self.getDateFromPosition(event.x(), event.y())
if d and d != self.selectedDate:
self.setSelectedDate(d)
self.emit(QtCore.SIGNAL("selectedDate"), d)
-
+
def mouseDoubleClickEvent(self, event):
'''
catch the double click
@@ -358,7 +385,7 @@ class monthCalendar(QtGui.QWidget, calDialogs):
self.emit(QtCore.SIGNAL("selectedDate"), d)
if d:
self.raisememoDialog()
-
+
def leaveEvent(self, event):
'''
clear any false stuff from the mouse
@@ -375,21 +402,21 @@ class monthCalendar(QtGui.QWidget, calDialogs):
self.month = d.month
self.setRowNo()
self.update()
-
+
def setFont(self):
'''
set the Font, and adjust the header column widths
'''
- font = QtGui.QFont(self.fontInfo().family(),
- localsettings.appointmentFontSize)
+ font = QtGui.QFont(self.fontInfo().family(),
+ localsettings.appointmentFontSize)
if self.font != font:
self.font = font
self.fm = QtGui.QFontMetrics(font)
- self.vheaderwidth = self.fm.width(_("Wednesday")+" 28 ")
-
+ self.vheaderwidth = self.fm.width(_("Wednesday") + " 28 ")
+
self.setBankHolColWidth()
self.setColWidths()
-
+
def paintEvent(self, event=None):
'''
draws the widget - recalled at any point by instance.update()
@@ -398,147 +425,157 @@ class monthCalendar(QtGui.QWidget, calDialogs):
self.setMinimumWidth(self.minimumWidth())
painter = QtGui.QPainter(self)
painter.setFont(self.font)
-
+
rowHeight = self.height() / (self.rowNo)
-
- #HEADER ROW - the month and year, highlighted
- painter.setBrush(self.palette().highlight())
- rect = QtCore.QRectF(0, 0, self.width(), rowHeight)
+
+ # HEADER ROW - the month and year, highlighted
+ painter.setBrush(self.palette().highlight())
+ rect = QtCore.QRectF(0, 0, self.width(), rowHeight)
painter.drawRect(rect)
painter.setPen(self.palette().color(self.palette().HighlightedText))
self.font.setBold(True)
painter.setFont(self.font)
-
+
c_date = datetime.date(self.year, self.month, 1)
- my_text = "%s %s"% (localsettings.monthName(c_date), self.year)
+ my_text = "%s %s" % (localsettings.monthName(c_date), self.year)
painter.drawText(rect, my_text, CENTRE)
-
+
self.font.setBold(False)
painter.setFont(self.font)
-
- for day in range(0, self.rowNo-1):
- rect = QtCore.QRectF(0, (day+1) *rowHeight, self.vheaderwidth,
- rowHeight)
+
+ for day in range(0, self.rowNo - 1):
+ rect = QtCore.QRectF(0, (day + 1) * rowHeight, self.vheaderwidth,
+ rowHeight)
painter.setPen(self.palette().color(self.palette().WindowText))
brush = self.palette().base()
-
- if day ==0:
+
+ if day == 0:
option = CENTRE
my_text = _("DATE")
- c_date = datetime.date(1900,1,1)
+ c_date = datetime.date(1900, 1, 1)
brush = self.palette().button()
-
+
else:
option = RIGHT
c_date = datetime.date(self.year, self.month, day)
- my_text = "%s %2s "% (localsettings.dayName(c_date), day)
-
+ my_text = "%s %2s " % (localsettings.dayName(c_date), day)
+
brush = self.palette().base()
if c_date.isoweekday() > 5:
- brush = self.palette().alternateBase()
+ brush = self.palette().alternateBase()
if c_date == self.selectedDate:
- brush = self.palette().highlight()
+ brush = self.palette().highlight()
elif c_date == self.highlightedDate:
brush = self.mouseBrush
-
- painter.setBrush(brush)
-
+
+ painter.setBrush(brush)
+
painter.save()
painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
painter.drawRect(rect)
painter.restore()
if c_date in (self.selectedDate, self.highlightedDate):
painter.setPen(self.palette().color(
- self.palette().HighlightedText))
+ self.palette().HighlightedText))
painter.drawText(rect, my_text, option)
-
+
elif c_date.isoweekday() < 6:
painter.setPen(self.palette().color(
- self.palette().WindowText))
+ self.palette().WindowText))
painter.drawText(rect, my_text, option)
-
+
else:
painter.save()
painter.setPen(QtCore.Qt.red)
painter.drawText(rect, my_text, option)
painter.restore()
-
+
rect = rect.adjusted(self.vheaderwidth, 0, self.bankHolColwidth,
- 0)
+ 0)
painter.save()
- painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
+ painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
painter.drawRect(rect)
painter.restore()
-
- key = "%d%02d"%(self.month, day)
- if self.headingdata.has_key(key):
+
+ key = "%d%02d" % (self.month, day)
+ if key in self.headingdata:
my_text = str(self.headingdata.get(key))
self.font.setItalic(True)
painter.setFont(self.font)
painter.drawText(rect, my_text, CENTRE)
self.font.setItalic(False)
painter.setFont(self.font)
-
+
#- text column
x = self.bankHolColwidth + self.vheaderwidth
- rect = rect.adjusted(self.bankHolColwidth, 0, 0, 0)
-
+ rect = rect.adjusted(self.bankHolColwidth, 0, 0, 0)
+
for col in range(self.colNo):
dentix = self.dents[col]
my_text = ""
-
+
colWidth = self.dentColWidths[dentix]
- rect = rect.adjusted(0, 0, colWidth, 0)
-
- painter.save()
- painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
+ rect = rect.adjusted(0, 0, colWidth, 0)
+
+ painter.save()
+ painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
painter.drawRect(rect)
painter.restore()
option = LEFT
- if day ==0:
- my_text = "%s"% localsettings.apptix_reverse.get(dentix,
- "all")
+ if day == 0:
+ my_text = "%s" % localsettings.apptix_reverse.get(dentix,
+ "all")
option = CENTRE
- elif self.data.has_key(key):
+ elif key in self.data:
dent = self.data[key].get(dentix)
if dent:
if dentix == 0:
my_text = dent.memo.upper()
else:
if not dent.flag:
- times = ""
+ times = ""
else:
- times = "%s - %s "%(
- localsettings.wystimeToHumanTime(dent.start),
- localsettings.wystimeToHumanTime(dent.end))
- my_text = "%s%s"% (times, dent.memo)
-
+ times = "%s - %s " % (
+ localsettings.wystimeToHumanTime(
+ dent.start),
+ localsettings.wystimeToHumanTime(dent.end))
+ my_text = "%s%s" % (times, dent.memo)
+
if my_text:
- painter.drawText(rect.adjusted(2,0,0,0), my_text, option)
-
- rect = rect.adjusted(colWidth, 0, 0, 0)
+ painter.drawText(
+ rect.adjusted(2,
+ 0,
+ 0,
+ 0),
+ my_text,
+ option)
+
+ rect = rect.adjusted(colWidth, 0, 0, 0)
painter.setPen(QtGui.QColor("black"))
- painter.drawLine(self.bankHolColwidth+self.vheaderwidth, rowHeight,
- self.bankHolColwidth+self.vheaderwidth, self.height())
-
+ painter.drawLine(self.bankHolColwidth + self.vheaderwidth, rowHeight,
+ self.bankHolColwidth + self.vheaderwidth, self.height())
+
+
class yearCalendar(QtGui.QWidget, calDialogs):
+
'''
a pyqt4 custom widget to show a year calendar
- '''
+ '''
+
def __init__(self, parent=None):
'''
initiate the widget
'''
super(yearCalendar, self).__init__(parent)
self.setSizePolicy(QtGui.QSizePolicy(
- QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding))
-
+ QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding))
+
self.setMinimumSize(self.minimumSizeHint())
self.monthStarts = {}
- self.headingdata={}
+ self.headingdata = {}
self.data = {}
self.flags = {}
self.dents = (0,)
@@ -547,10 +584,10 @@ class yearCalendar(QtGui.QWidget, calDialogs):
self.setSelectedDate(datetime.date.today())
self.setMouseTracking(True)
self.mouseBrush = QtGui.QColor(self.palette().color(
- QtGui.QPalette.Highlight))
+ QtGui.QPalette.Highlight))
self.mouseBrush.setAlpha(64)
self.highlightedDate = None
-
+
def sizeHint(self):
'''
set an (arbitrary) size for the widget
@@ -567,8 +604,8 @@ class yearCalendar(QtGui.QWidget, calDialogs):
'''
set the font (and by association, the width of the month column
'''
- font = QtGui.QFont(self.fontInfo().family(),
- localsettings.appointmentFontSize)
+ font = QtGui.QFont(self.fontInfo().family(),
+ localsettings.appointmentFontSize)
if self.font != font:
self.font = font
fm = QtGui.QFontMetrics(font)
@@ -587,15 +624,15 @@ class yearCalendar(QtGui.QWidget, calDialogs):
and any given book owner
data is a dictionary {"mdd":((4,"Memo"),(2,"note"),) , ...}
'''
- self.data={}
- self.flags={}
+ self.data = {}
+ self.flags = {}
for key in data:
- self.data[key]= {}
+ self.data[key] = {}
for dent in data[key]:
- self.data[key][dent.ix]= dent
+ self.data[key][dent.ix] = dent
if dent.memo:
self.flags[key] = True
-
+
def setDents(self, dents):
'''
make the widget aware who's data it's showing
@@ -608,7 +645,7 @@ class yearCalendar(QtGui.QWidget, calDialogs):
work out how many columns are required
the minimum is 31 (when all months start on the same day)
'''
- startday = 6 #assume sunnday
+ startday = 6 # assume sunnday
self.columnNo = 31
for month in range(1, 13):
c_date = datetime.date(self.year, month, 1)
@@ -617,26 +654,26 @@ class yearCalendar(QtGui.QWidget, calDialogs):
if c_date.weekday() < startday:
startday = firstDayOfMonth
colsRequired = firstDayOfMonth + \
- calendar.monthrange(self.year, month)[1]
+ calendar.monthrange(self.year, month)[1]
if colsRequired > self.columnNo:
self.columnNo = colsRequired
-
+
self.startDOW = startday
-
- def getDateFromPosition(self, xpos, ypos):
+
+ def getDateFromPosition(self, xpos, ypos):
rowheight = self.height() / 13
- month = int(ypos//rowheight)
- if 0 < month <13:
+ month = int(ypos // rowheight)
+ if 0 < month < 13:
day = (xpos - self.vheaderwidth) // self.columnWidth
- day = day - self.monthStarts[month] +1
+ day = day - self.monthStarts[month] + 1
try:
d = datetime.date(self.year, month, int(day))
return d
except ValueError:
# date threw an error.
pass
-
+
def mouseMoveEvent(self, event):
'''
note this function works because I set self.setMouseTracking(True)
@@ -648,29 +685,29 @@ class yearCalendar(QtGui.QWidget, calDialogs):
self.update()
advisory = ""
if d:
- datekey = "%d%02d"% (d.month, d.day)
- if self.headingdata.has_key(datekey):
- advisory += "<h3>%s</h3><hr />"% self.headingdata[datekey]
- if self.data.has_key(datekey):
+ datekey = "%d%02d" % (d.month, d.day)
+ if datekey in self.headingdata:
+ advisory += "<h3>%s</h3><hr />" % self.headingdata[datekey]
+ if datekey in self.data:
for ix in self.data[datekey].keys():
dent = self.data[datekey].get(ix)
if dent:
if ix == 0:
- advisory += "<h3>%s</h3>"% dent.memo
+ advisory += "<h3>%s</h3>" % dent.memo
else:
if not dent.flag:
if dent.memo:
- advisory += "%s\t\t%s <br />"% (
- dent.initials, dent.memo)
+ advisory += "%s\t\t%s <br />" % (
+ dent.initials, dent.memo)
else:
- times = "%s - %s"%(dent.start, dent.end)
- advisory += "%s\t%s\t%s <br />"% (
- dent.initials, times, dent.memo)
+ times = "%s - %s" % (dent.start, dent.end)
+ advisory += "%s\t%s\t%s <br />" % (
+ dent.initials, times, dent.memo)
if advisory.endswith(" <br />"):
advisory = advisory.rstrip(" <br />")
-
+
QtGui.QToolTip.showText(event.globalPos(), advisory)
-
+
def mousePressEvent(self, event):
'''
catch the mouse press event
@@ -680,12 +717,12 @@ class yearCalendar(QtGui.QWidget, calDialogs):
if d != self.selectedDate:
self.setSelectedDate(d)
self.emit(QtCore.SIGNAL("selectedDate"), d)
- if event.button() == 2:
+ if event.button() == 2:
menu = QtGui.QMenu(self)
menu.addAction(_("Edit day memos"))
menu.addAction(_("Edit Public Holiday information"))
self.rightClickMenuResult(menu.exec_(event.globalPos()))
-
+
def rightClickMenuResult(self, result):
if not result:
return
@@ -693,7 +730,7 @@ class yearCalendar(QtGui.QWidget, calDialogs):
self.raisememoDialog()
elif result.text() == _("Edit Public Holiday information"):
self.publicHolidayEnter()
-
+
def getDayData(self):
'''
return a dayData object
@@ -701,13 +738,13 @@ class yearCalendar(QtGui.QWidget, calDialogs):
d = self.selectedDate
retarg = dayData(d)
- datekey = "%d%02d"% (d.month, d.day)
- if self.headingdata.has_key(datekey):
+ datekey = "%d%02d" % (d.month, d.day)
+ if datekey in self.headingdata:
retarg.publicHoliday = self.headingdata[datekey]
- if self.data.has_key(datekey):
+ if datekey in self.data:
retarg.dents = self.data[datekey]
return retarg
-
+
def mouseDoubleClickEvent(self, event):
'''
catch the double click
@@ -718,17 +755,15 @@ class yearCalendar(QtGui.QWidget, calDialogs):
self.emit(QtCore.SIGNAL("selectedDate"), d)
if d:
self.raisememoDialog()
-
-
+
def leaveEvent(self, event):
'''
clear any false stuff from the mouse
'''
- if self.highlightedDate != None:
+ if self.highlightedDate is not None:
self.highlightedDate = None
self.update()
-
def setSelectedDate(self, d):
'''
d is a pydate
@@ -737,7 +772,7 @@ class yearCalendar(QtGui.QWidget, calDialogs):
self.year = d.year
self.setColumnNo()
self.update()
-
+
def paintEvent(self, event=None):
'''
draws the widget - recalled at any point by instance.update()
@@ -745,191 +780,188 @@ class yearCalendar(QtGui.QWidget, calDialogs):
self.setFont()
painter = QtGui.QPainter(self)
painter.setFont(self.font)
-
+
rowHeight = self.height() / 13
-
+
self.columnWidth = (self.width() - self.vheaderwidth) / self.columnNo
-
+
for month in range(13):
- rect = QtCore.QRectF(0, month*rowHeight, self.vheaderwidth,
- rowHeight)
+ rect = QtCore.QRectF(0, month * rowHeight, self.vheaderwidth,
+ rowHeight)
+
+ painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
- painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
-
if month == 0:
#-- draw the year
- painter.setBrush(self.palette().highlight())
+ painter.setBrush(self.palette().highlight())
painter.drawRect(rect)
-
+
painter.setPen(self.palette().color(
- self.palette().HighlightedText))
+ self.palette().HighlightedText))
painter.drawText(rect, QtCore.Qt.AlignCenter, str(self.year))
-
- #rectLeft = rect.adjusted(0, 0,-rect.width()/4, 0)
- #painter.drawPixmap(rectLeft, QtGui.QPixmap(":/back.png"))
- #return
- for col in range (self.columnNo):
+
+ # rectLeft = rect.adjusted(0, 0,-rect.width()/4, 0)
+ # painter.drawPixmap(rectLeft, QtGui.QPixmap(":/back.png"))
+ # return
+ for col in range(self.columnNo):
rect = QtCore.QRectF(
- self.vheaderwidth+col*self.columnWidth,
- month * rowHeight, self.columnWidth, rowHeight)
-
- painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
+ self.vheaderwidth + col * self.columnWidth,
+ month * rowHeight, self.columnWidth, rowHeight)
+
+ painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
painter.drawRect(rect)
-
+
dayno = col % 7
- my_text = ("M","Tu","W","Th","F","Sa","Su")[dayno]
+ my_text = ("M", "Tu", "W", "Th", "F", "Sa", "Su")[dayno]
painter.setPen(self.palette().color(
- self.palette().HighlightedText))
-
+ self.palette().HighlightedText))
+
painter.drawText(rect, QtCore.Qt.AlignCenter, my_text)
-
- else:
- if month%2==0:
- painter.setBrush(self.palette().base())
+
+ else:
+ if month % 2 == 0:
+ painter.setBrush(self.palette().base())
else:
- painter.setBrush(self.palette().alternateBase())
-
+ painter.setBrush(self.palette().alternateBase())
+
painter.drawRect(rect)
painter.setPen(self.palette().color(
- self.palette().WindowText))
-
+ self.palette().WindowText))
+
c_date = datetime.date(self.year, month, 1)
my_text = str(localsettings.monthName(c_date))
painter.drawText(rect, QtCore.Qt.AlignCenter, my_text)
startday = c_date.weekday()
-
- for col in range (self.columnNo):
-
+
+ for col in range(self.columnNo):
+
rect = QtCore.QRectF(
- self.vheaderwidth + col * self.columnWidth,
- month * rowHeight, self.columnWidth, rowHeight)
-
- painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
-
+ self.vheaderwidth + col * self.columnWidth,
+ month * rowHeight, self.columnWidth, rowHeight)
+
+ painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
+
painter.drawRect(rect)
-
+
painter.setPen(self.palette().color(
- self.palette().WindowText))
-
+ self.palette().WindowText))
+
if col >= startday:
try:
- c_date = datetime.date(self.year, month,
- col-startday+1)
+ c_date = datetime.date(self.year, month,
+ col - startday + 1)
my_text = str(c_date.day)
if c_date == self.selectedDate:
painter.save()
painter.setBrush(self.palette().color(
- self.palette().Highlight))
+ self.palette().Highlight))
painter.setPen(self.palette().color(
- self.palette().HighlightedText))
-
+ self.palette().HighlightedText))
+
painter.drawRect(rect)
- painter.drawText(rect,
- QtCore.Qt.AlignCenter, my_text)
+ painter.drawText(rect,
+ QtCore.Qt.AlignCenter, my_text)
painter.restore()
-
+
elif c_date == self.highlightedDate:
#--mouseOver
painter.save()
painter.setBrush(self.mouseBrush)
painter.setPen(self.palette().color(
- self.palette().HighlightedText))
-
+ self.palette().HighlightedText))
+
painter.drawRect(rect)
- painter.drawText(rect,
- QtCore.Qt.AlignCenter, my_text)
+ painter.drawText(rect,
+ QtCore.Qt.AlignCenter, my_text)
painter.restore()
-
- elif c_date.isoweekday() > 5:
- #weekend
+
+ elif c_date.isoweekday() > 5:
+ # weekend
painter.setPen(QtCore.Qt.red)
- painter.drawText(rect,
- QtCore.Qt.AlignCenter, my_text)
+ painter.drawText(rect,
+ QtCore.Qt.AlignCenter, my_text)
else:
painter.setPen(self.palette().color(
- self.palette().WindowText))
- painter.drawText(rect,
- QtCore.Qt.AlignCenter, my_text)
+ self.palette().WindowText))
+ painter.drawText(rect,
+ QtCore.Qt.AlignCenter, my_text)
+
+ datekey = "%d%02d" % (month, c_date.day)
- datekey = "%d%02d"%(month, c_date.day)
-
- if self.headingdata.has_key(datekey):
+ if datekey in self.headingdata:
#-- draw a gray underscore!
painter.save()
painter.setBrush(QtCore.Qt.lightGray)
painter.setPen(QtCore.Qt.lightGray)
- rheight = rect.height()*0.8
+ rheight = rect.height() * 0.8
painter.drawRect(
- rect.adjusted(1, rheight, -1, 0))
+ rect.adjusted(1, rheight, -1, 0))
painter.restore()
-
- if self.flags.get(datekey,False):
+
+ if self.flags.get(datekey, False):
#-- draw a blue triangle!
painter.save()
painter.setBrush(QtCore.Qt.blue)
painter.setPen(QtCore.Qt.blue)
topleftX = rect.topLeft().x() +\
- rect.width()/2
-
+ rect.width() / 2
+
topY = rect.topLeft().y() + 2
rightX = rect.topRight().x()
bottomrightY = rect.topRight().y() +\
- rect.width()/2
-
- shape = QtGui.QPolygon([topleftX, topY,
- rightX, topY, rightX, bottomrightY ])
+ rect.width() / 2
+
+ shape = QtGui.QPolygon([topleftX, topY,
+ rightX, topY, rightX, bottomrightY])
painter.drawPolygon(shape)
painter.restore()
-
- except ValueError:
+
+ except ValueError:
# month doesn't have this day eg feb 30th
pass
-
-
+
if __name__ == "__main__":
def signal_trap(arg=None):
print cal.selectedDate(),
print wcal.selectedDate()
-
+
app = QtGui.QApplication(sys.argv)
cal = controlCalendar()
wcal = weekCalendar()
mcal = monthCalendar()
ycal = yearCalendar()
cal.show()
- wcal.move(cal.width(),0)
+ wcal.move(cal.width(), 0)
wcal.show()
- QtCore.QObject.connect(cal, QtCore.SIGNAL("selectionChanged()"),
- signal_trap)
-
- QtCore.QObject.connect(wcal, QtCore.SIGNAL("weekChanged"),
- signal_trap)
-
-
+ QtCore.QObject.connect(cal, QtCore.SIGNAL("selectionChanged()"),
+ signal_trap)
+
+ QtCore.QObject.connect(wcal, QtCore.SIGNAL("weekChanged"),
+ signal_trap)
+
if False:
localsettings.initiate()
- from openmolar.dbtools import appointments
- startdate = datetime.date(2010,2,1)
- enddate = datetime.date(2010,2,28)
- rows = appointments.getDayInfo(startdate, enddate, (4,6,7))
+ from openmolar.dbtools import appointments
+ startdate = datetime.date(2010, 2, 1)
+ enddate = datetime.date(2010, 2, 28)
+ rows = appointments.getDayInfo(startdate, enddate, (4, 6, 7))
data = appointments.getBankHols(startdate, enddate)
for c in (mcal, ycal):
- c.setDents((4,6,7))
+ c.setDents((4, 6, 7))
c.setData(rows)
- c.setHeadingData(data)
+ c.setHeadingData(data)
c.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/customwidgets/chainLabel.py b/src/openmolar/qt4gui/customwidgets/chainLabel.py
index c56c262..e70ea93 100644
--- a/src/openmolar/qt4gui/customwidgets/chainLabel.py
+++ b/src/openmolar/qt4gui/customwidgets/chainLabel.py
@@ -1,18 +1,38 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
-from PyQt4 import QtGui,QtCore
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+from PyQt4 import QtGui, QtCore
from openmolar.qt4gui import resources_rc
+
class ChainLabel(QtGui.QLabel):
+
'''
a custom label with a chain link
'''
toggled = QtCore.pyqtSignal(object)
+
def __init__(self, parent=None):
QtGui.QLabel.__init__(self, parent)
self.chainpic = QtGui.QPixmap(":/icons/chain.png")
@@ -20,32 +40,31 @@ class ChainLabel(QtGui.QLabel):
self.setFixedWidth(30)
self._chained = True
self._update()
-
+
def mousePressEvent(self, event):
self._chained = not self._chained
self._update()
-
+
def setValue(self, chained):
self._chained = chained
self._update()
-
+
def _update(self):
if self._chained:
self.setPixmap(self.chainpic)
else:
self.setPixmap(self.unchainpic)
self.toggled.emit(self._chained)
-
+
if __name__ == "__main__":
def test(arg):
- print ("chained = %s"% arg)
-
- import sys
+ print ("chained = %s" % arg)
+
+ import sys
app = QtGui.QApplication(sys.argv)
widg = ChainLabel()
- widg.setMinimumSize(QtCore.QSize(100,100))
+ widg.setMinimumSize(QtCore.QSize(100, 100))
widg.toggled.connect(test)
-
+
widg.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/customwidgets/chartwidget.py b/src/openmolar/qt4gui/customwidgets/chartwidget.py
index 9d69c80..b2b4baf 100644
--- a/src/openmolar/qt4gui/customwidgets/chartwidget.py
+++ b/src/openmolar/qt4gui/customwidgets/chartwidget.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
has one class, a custom widget which inherits from QWidget
@@ -22,7 +38,9 @@ from openmolar.qt4gui import colours
LOGGER = logging.getLogger("openmolar")
+
class chartWidget(QtGui.QWidget):
+
'''
a custom widget to show a standard UK dental chart
- allows for user navigation with mouse and/or keyboard
@@ -40,12 +58,12 @@ class chartWidget(QtGui.QWidget):
QtGui.QWidget.__init__(self, parent)
self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
- QtGui.QSizePolicy.Expanding))
+ QtGui.QSizePolicy.Expanding))
- self.grid = (["ur8", "ur7", "ur6", "ur5", 'ur4', 'ur3', 'ur2', 'ur1', \
- 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8'],
- ["lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1', \
- 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'])
+ self.grid = (["ur8", "ur7", "ur6", "ur5", 'ur4', 'ur3', 'ur2', 'ur1',
+ 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8'],
+ ["lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1',
+ 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'])
self.clear()
self.isStaticChart = True
@@ -61,13 +79,13 @@ class chartWidget(QtGui.QWidget):
'''
#--clear individual teeth
self.ur8, self.ur7, self.ur6, self.ur5, self.ur4, self.ur3, self.ur2, \
- self.ur1 = [] ,[], [], [], [], [], [], []
+ self.ur1 = [], [], [], [], [], [], [], []
self.ul8, self.ul7, self.ul6, self.ul5, self.ul4, self.ul3, self.ul2, \
- self.ul1 = [], [], [], [], [], [], [], []
+ self.ul1 = [], [], [], [], [], [], [], []
self.ll8, self.ll7, self.ll6, self.ll5, self.ll4, self.ll3, self.ll2, \
- self.ll1 = [], [], [], [], [], [], [], []
+ self.ll1 = [], [], [], [], [], [], [], []
self.lr8, self.lr7, self.lr6, self.lr5, self.lr4, self.lr3, self.lr2, \
- self.lr1 = [], [], [], [], [], [], [], []
+ self.lr1 = [], [], [], [], [], [], [], []
#--clear comments
self.commentedTeeth = []
@@ -78,14 +96,14 @@ class chartWidget(QtGui.QWidget):
else:
#-- set to an adult dentition
self.chartgrid = {
- 'lr1' : 'lr1', 'lr3' : 'lr3', 'lr2' : 'lr2', 'lr5' : 'lr5',
- 'lr4' : 'lr4', 'lr7' : 'lr7', 'lr6' : 'lr6', 'lr8' : 'lr8',
- 'ul8' : 'ul8', 'ul2' : 'ul2', 'ul3' : 'ul3', 'ul1' : 'ul1',
- 'ul6' : 'ul6', 'ul7' : 'ul7', 'ul4' : 'ul4', 'ul5' : 'ul5',
- 'ur4' : 'ur4', 'ur5' : 'ur5', 'ur6' : 'ur6', 'ur7' : 'ur7',
- 'ur1' : 'ur1', 'ur2' : 'ur2', 'ur3' : 'ur3', 'ur8' : 'ur8',
- 'll8' : 'll8', 'll3' : 'll3', 'll2' : 'll2', 'll1' : 'll1',
- 'll7' : 'll7', 'll6' : 'll6', 'll5' : 'll5', 'll4': 'll4'
+ 'lr1': 'lr1', 'lr3': 'lr3', 'lr2': 'lr2', 'lr5': 'lr5',
+ 'lr4': 'lr4', 'lr7': 'lr7', 'lr6': 'lr6', 'lr8': 'lr8',
+ 'ul8': 'ul8', 'ul2': 'ul2', 'ul3': 'ul3', 'ul1': 'ul1',
+ 'ul6': 'ul6', 'ul7': 'ul7', 'ul4': 'ul4', 'ul5': 'ul5',
+ 'ur4': 'ur4', 'ur5': 'ur5', 'ur6': 'ur6', 'ur7': 'ur7',
+ 'ur1': 'ur1', 'ur2': 'ur2', 'ur3': 'ur3', 'ur8': 'ur8',
+ 'll8': 'll8', 'll3': 'll3', 'll2': 'll2', 'll1': 'll1',
+ 'll7': 'll7', 'll6': 'll6', 'll5': 'll5', 'll4': 'll4'
}
self.showSelected = False
@@ -124,7 +142,7 @@ class chartWidget(QtGui.QWidget):
'''
select multiple teeth
'''
- if self.selected == [-1,-1]:
+ if self.selected == [-1, -1]:
return True
if self.selected in self.multiSelection:
while self.selected in self.multiSelection:
@@ -178,9 +196,9 @@ class chartWidget(QtGui.QWidget):
for prop in proplist:
if prop != "":
if not re.match("!.*", prop):
- prop = "%s "% prop.lower()
+ prop = "%s " % prop.lower()
else:
- prop = "%s "% prop
+ prop = "%s " % prop
self.__dict__[tooth].append(prop)
def mouseMoveEvent(self, event):
@@ -200,15 +218,15 @@ class chartWidget(QtGui.QWidget):
try:
tooth = self.grid[y][x]
show = False
- advisory = "<center><b> %s </b></center><hr />"% tooth.upper()
+ advisory = "<center><b> %s </b></center><hr />" % tooth.upper()
for fill in self.__dict__[tooth]:
if not re.match("!.*", fill):
fill = fill.upper()
- advisory += "%s <br />"% fill
+ advisory += "%s <br />" % fill
show = True
if show:
QtGui.QToolTip.showText(event.globalPos(),
- advisory.rstrip("<br />"))
+ advisory.rstrip("<br />"))
else:
QtGui.QToolTip.showText(event.globalPos(), "")
except IndexError:
@@ -240,30 +258,32 @@ class chartWidget(QtGui.QWidget):
shiftClick = (event.modifiers() == QtCore.Qt.ShiftModifier)
[px, py] = self.selected
- if px == -1: px=0
- if py == -1: py=0
+ if px == -1:
+ px = 0
+ if py == -1:
+ py = 0
#-- needed for shiftClick
if px <= x:
- lowx,highx = px,x
+ lowx, highx = px, x
else:
- lowx,highx = x,px
+ lowx, highx = x, px
if shiftClick:
- for row in set((py,y)):
- for column in range(lowx, highx+1):
+ for row in set((py, y)):
+ for column in range(lowx, highx + 1):
if not [column, row] in self.multiSelection:
- self.multiSelection.append([column,row])
- self.setSelected(x, y, showSelection = True)
+ self.multiSelection.append([column, row])
+ self.setSelected(x, y, showSelection=True)
if ctrlClick:
- if [px,py] not in self.multiSelection:
- self.multiSelection.append([px,py])
+ if [px, py] not in self.multiSelection:
+ self.multiSelection.append([px, py])
if not self.multiSelectADD():
try:
- x,y = self.multiSelection[-1]
+ x, y = self.multiSelection[-1]
except IndexError:
pass
- self.setSelected(x, y, showSelection = True)
+ self.setSelected(x, y, showSelection=True)
else:
if not shiftClick:
self.multiSelectCLEAR()
@@ -271,8 +291,8 @@ class chartWidget(QtGui.QWidget):
teeth = []
if x != -1:
teeth.append(self.grid[y][x])
- for (a,b) in self.multiSelection:
- if (a,b) != (x,y):
+ for (a, b) in self.multiSelection:
+ if (a, b) != (x, y):
teeth.append(self.grid[b][a])
self.teeth_selected_signal.emit(teeth)
@@ -281,11 +301,11 @@ class chartWidget(QtGui.QWidget):
if event.button() == 2:
tooth = teeth[0]
QtCore.QTimer.singleShot(200, partial(
- self.raise_context_menu, tooth , event.globalPos()))
+ self.raise_context_menu, tooth, event.globalPos()))
except AttributeError:
- pass #keyboard events have no attribute "button"
+ pass # keyboard events have no attribute "button"
except IndexError:
- pass # teeth is an empty list!
+ pass # teeth is an empty list!
def raise_context_menu(self, tooth, point):
if self.isStaticChart:
@@ -300,7 +320,7 @@ class chartWidget(QtGui.QWidget):
for prop in self.__dict__[tooth]:
prop = prop.upper().strip(" ")
- action = menu.addAction("%s %s"%(_("Delete"), prop))
+ action = menu.addAction("%s %s" % (_("Delete"), prop))
action.triggered.connect(partial(
self.delete_prop_signal.emit, prop))
@@ -360,15 +380,15 @@ class chartWidget(QtGui.QWidget):
'''
x, y = self.selected
if event.key() == QtCore.Qt.Key_Left:
- x = 15 if x == 0 else x-1
+ x = 15 if x == 0 else x - 1
elif event.key() == QtCore.Qt.Key_Right:
- x = 0 if x == 15 else x+1
+ x = 0 if x == 15 else x + 1
elif event.key() == QtCore.Qt.Key_Up:
- y = 1if y == 0 else y-1
+ y = 1if y == 0 else y - 1
elif event.key() == QtCore.Qt.Key_Down:
- y=0 if y == 1 else y+1
+ y = 0 if y == 1 else y + 1
elif event.key() == QtCore.Qt.Key_Return:
- if y==0:
+ if y == 0:
if x == 15:
y = 1
else:
@@ -406,7 +426,7 @@ class chartWidget(QtGui.QWidget):
#--big horizontal dissection of entire widget
painter.drawLine(leftpad, self.height() / 2, self.width() - rightpad,
- self.height() / 2)
+ self.height() / 2)
#--vertical dissection of entire widget
painter.drawLine(self.width() / 2, 0, self.width() / 2, self.height())
@@ -416,9 +436,9 @@ class chartWidget(QtGui.QWidget):
else:
midx = 0
for y in range(2):
- tooth_notation = self.grid[y][x]
- rect = QtCore.QRectF(x * xOffset + midx, y *yOffset,
- xOffset, yOffset).adjusted(0.5, 0.5, -0.5, -0.5)
+ tooth_notation = self.grid[y][x]
+ rect = QtCore.QRectF(x * xOffset + midx, y * yOffset,
+ xOffset, yOffset).adjusted(0.5, 0.5, -0.5, -0.5)
#-- draw a tooth (subroutine)
self.tooth(painter, rect, tooth_notation)
@@ -452,11 +472,11 @@ class chartWidget(QtGui.QWidget):
if self.showLeftRight:
#--show left/right (this is done here to avoid being overwritten
#--during the rest of the paint job
- painter.drawText(textRect, QtCore.Qt.AlignRight|
- QtCore.Qt.AlignVCenter, (_("Left")))
+ painter.drawText(textRect, QtCore.Qt.AlignRight |
+ QtCore.Qt.AlignVCenter, (_("Left")))
- painter.drawText(textRect, QtCore.Qt.AlignLeft|
- QtCore.Qt.AlignVCenter, (_("Right")))
+ painter.drawText(textRect, QtCore.Qt.AlignLeft |
+ QtCore.Qt.AlignVCenter, (_("Right")))
#--free the painter's saved state
painter.restore()
@@ -472,7 +492,7 @@ class chartWidget(QtGui.QWidget):
#-- split tooth rectangle into a large graphic square...
#-- and a smaller text square
- thirdheight = rect.height()*1/3
+ thirdheight = rect.height() * 1 / 3
if isUpper:
#-- the 2 allows for the "select" box to be drawn around the tooth
toothRect = rect.adjusted(0, 2, 0, -thirdheight)
@@ -486,13 +506,13 @@ class chartWidget(QtGui.QWidget):
painter.setBrush(colours.IVORY)
toothid = self.chartgrid[ident]
- ###################### DRAW THE TOOTH's TEXT###########################
+ # DRAW THE TOOTH's TEXT###########################
#--tooth ident is always ur1, ur2 ...
#--tooth name is more flexible for deciduous teeth etc...
toothtext = toothid[2]
- #check for deciduous teeth
+ # check for deciduous teeth
if toothtext in ("A", "B", "C", "D", "E", "*"):
- #################BABY TOOTH###########################
+ # BABY TOOTH###########################
#-- paint deciduous notation in RED
painter.save()
if self.isEnabled():
@@ -503,9 +523,10 @@ class chartWidget(QtGui.QWidget):
painter.restore()
#-- and "shrink" the tooth
- toothRect = toothRect.adjusted(toothRect.width()*0.1,
- toothRect.height()*0.15,-toothRect.width()*0.1,
- -toothRect.height()*0.15)
+ toothRect = toothRect.adjusted(toothRect.width() * 0.1,
+ toothRect.height(
+ ) * 0.15, -toothRect.width() * 0.1,
+ -toothRect.height() * 0.15)
else:
#--adult tooth
@@ -533,18 +554,18 @@ class chartWidget(QtGui.QWidget):
painter.drawText(comRect, QtCore.Qt.AlignCenter, "!")
painter.restore()
for prop in ("rt ", "ap ", "-m,1 ", "-m,2 ",
- "+p ", "+s ", "oe", "px", "px+"):
+ "+p ", "+s ", "oe", "px", "px+"):
#-- these properties are written in... not drawn
if prop in props:
painter.save()
comRect = textRect.adjusted(0, 0, -textRect.width() * 0.6,
- 0)
+ 0)
painter.setPen(QtGui.QPen(QtCore.Qt.blue, 1))
painter.drawRect(comRect)
sansFont = QtGui.QFont("Helvetica", 7)
painter.setFont(sansFont)
painter.drawText(comRect, QtCore.Qt.AlignCenter,
- prop.upper())
+ prop.upper())
painter.restore()
toothS = toothSurfaces(self, toothRect, toothid, self.isStaticChart)
@@ -554,10 +575,12 @@ class chartWidget(QtGui.QWidget):
class toothSurfaces():
+
'''
draws the tooth surfaces
'''
- def __init__(self, parent, rect, ident, isStatic = True):
+
+ def __init__(self, parent, rect, ident, isStatic=True):
'''
initiate using the following args
parent (a Qwidget), rect (a Qrect), ident (eg. ur5),
@@ -589,22 +612,22 @@ class toothSurfaces():
self.innerRect = self.rect.adjusted(irw, irh, -irw, -irh)
def setProps(self, props):
- #LOGGER.debug(props)
+ # LOGGER.debug(props)
self.props = props
def draw(self, parent, painter=None):
- if painter == None:
+ if painter is None:
self.painter = QtGui.QPainter(parent)
else:
self.painter = painter
for prop in self.props:
if re.match("(br/)?cr,ic|im/", prop):
- adj = self.rect.height()/2
+ adj = self.rect.height() / 2
if self.isUpper:
rect_ = self.rect.adjusted(0, 0, 0, adj)
svg_path = ":lower_implant.svg"
else:
- rect_ = self.rect.adjusted(0,-adj,-0,0)
+ rect_ = self.rect.adjusted(0, -adj, -0, 0)
svg_path = ":upper_implant.svg"
QtSvg.QSvgRenderer(svg_path).render(painter, rect_)
@@ -614,8 +637,8 @@ class toothSurfaces():
if re.match("\(.*", prop):
#-- brackets are used to indicate the start/end of a bridge
#--let's see bridge start by shrinking that edge.
- ##TODO - draw a demarcation line here??
- adj = self.rect.width()*0.10
+ # TODO - draw a demarcation line here??
+ adj = self.rect.width() * 0.10
if self.isUpper:
self.rect = self.rect.adjusted(adj, 0, 0, 0)
else:
@@ -626,7 +649,7 @@ class toothSurfaces():
elif re.match(".*\)$", prop):
#--other end of a bridge
- adj = self.rect.width()*0.10
+ adj = self.rect.width() * 0.10
if self.isUpper:
self.rect = self.rect.adjusted(0, 0, -adj, 0)
else:
@@ -634,20 +657,27 @@ class toothSurfaces():
prop = prop.strip(")")
if "br/p" in prop:
- #bridge pontic found - shrink
+ # bridge pontic found - shrink
self.rect = self.rect.adjusted(0, self.rect.height() * 0.10, 0,
- -self.rect.height() * 0.10)
-
+ -self.rect.height() * 0.10)
#--draw the tooth if static chart or properties to show
#--leave blank if treatment chart.
if self.isStatic or self.props != []:
self.painter.drawRect(self.rect)
self.painter.drawRect(self.innerRect)
- self.painter.drawLine(self.rect.topLeft(), self.innerRect.topLeft())
- self.painter.drawLine(self.rect.topRight(), self.innerRect.topRight())
- self.painter.drawLine(self.rect.bottomLeft(), self.innerRect.bottomLeft())
- self.painter.drawLine(self.rect.bottomRight(), self.innerRect.bottomRight())
+ self.painter.drawLine(
+ self.rect.topLeft(),
+ self.innerRect.topLeft())
+ self.painter.drawLine(
+ self.rect.topRight(),
+ self.innerRect.topRight())
+ self.painter.drawLine(
+ self.rect.bottomLeft(),
+ self.innerRect.bottomLeft())
+ self.painter.drawLine(
+ self.rect.bottomRight(),
+ self.innerRect.bottomRight())
#-deciduous (ie. indeterminate) 6, 7, 8 are marked as "*"
#--paint over these.
@@ -659,9 +689,9 @@ class toothSurfaces():
#--set variables for fill draw points
#--this are NOT static as the widget is resizable
- ##TODO I could probably get performance improvement here.
- ##by having a default set which changes only if the "tooth" has been
- ##resized.
+ # TODO I could probably get performance improvement here.
+ # by having a default set which changes only if the "tooth" has been
+ # resized.
if self.props != []:
if self.backTooth:
@@ -713,26 +743,26 @@ class toothSurfaces():
material = ""
self.painter.save()
- prop = prop.strip("#&")
+ prop = prop.strip("#&")
if prop == "pv":
prop = "pv,pj"
if re.match("!.*", prop):
prop = ""
- if "/" in prop:
+ if "/" in prop:
if re.match("\(.*", prop):
#--start of a bridge
leading_bracket = True
prop = prop[1:]
else:
leading_bracket = False
- if re.match("br/",prop):
+ if re.match("br/", prop):
#--bridge
prop = prop[3:]
if leading_bracket:
prop = prop.replace(",", ",(")
if "p," in prop:
#--some gold crowns are cr/modbl,go
- prop = "PONTIC,%s"% prop[2:]
+ prop = "PONTIC,%s" % prop[2:]
if "mr" in prop:
prop = "p,mr"
elif re.match("im/", prop):
@@ -753,14 +783,14 @@ class toothSurfaces():
#-- change this to "mod,gi"
prop = prop[3:] + ",gl"
- if prop[:2] in ("tm","at"):
+ if prop[:2] in ("tm", "at"):
erase_color = parent.palette().background().color()
self.painter.setPen(erase_color)
self.painter.setBrush(erase_color)
self.painter.drawRect(self.rect)
self.painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
self.painter.drawText(self.rect, QtCore.Qt.AlignCenter,
- prop.upper())
+ prop.upper())
prop = ""
if prop[:2] in ("ue", "pe", "oe", "rp"):
@@ -772,16 +802,20 @@ class toothSurfaces():
self.painter.drawRect(self.rect)
self.painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
if self.backTooth:
- self.painter.drawText(self.rect, QtCore.Qt.AlignCenter, prop)
+ self.painter.drawText(
+ self.rect,
+ QtCore.Qt.AlignCenter,
+ prop)
else:
self.painter.drawText(self.rect.adjusted(0,
- self.rect.height() / 2, 0, 0),
- QtCore.Qt.AlignCenter, prop)
+ self.rect.height(
+ ) / 2, 0, 0),
+ QtCore.Qt.AlignCenter, prop)
#--prevent the o's and p's being interpreted as fills
prop = ""
if ",pr" in prop:
- #TODO - pin??
+ # TODO - pin??
prop = prop.replace(",pr", "")
if "," in prop:
@@ -815,7 +849,7 @@ class toothSurfaces():
if material == "co":
self.painter.setBrush(colours.COMP)
elif material in ("pj", "ot", "pi", "a1", "a2", "v1", "v2",
- "opal", "opalite", "lava", "core", "ic", "ever"):
+ "opal", "opalite", "lava", "core", "ic", "ever"):
self.painter.setBrush(colours.PORC)
elif material == "gl":
self.painter.setBrush(colours.GI)
@@ -831,7 +865,7 @@ class toothSurfaces():
self.painter.setPen(QtGui.QPen(colours.FISSURE, 1))
self.painter.setBrush(colours.FISSURE)
else:
- LOGGER.debug("unhandled material colour %s %s %s"% (
+ LOGGER.debug("unhandled material colour %s %s %s" % (
self.toothtext, prop, material))
if self.quadrant[1] == "l" and prop != "dr":
@@ -852,44 +886,60 @@ class toothSurfaces():
crRect = self.rect.adjusted(0, 2, 0, -2)
self.painter.drawRect(crRect)
self.painter.drawRect(self.innerRect)
- self.painter.drawLine(crRect.topLeft(), self.innerRect.topLeft())
- self.painter.drawLine(crRect.topRight(), self.innerRect.topRight())
+ self.painter.drawLine(
+ crRect.topLeft(),
+ self.innerRect.topLeft())
+ self.painter.drawLine(
+ crRect.topRight(),
+ self.innerRect.topRight())
self.painter.drawLine(crRect.bottomLeft(),
- self.innerRect.bottomLeft())
+ self.innerRect.bottomLeft())
self.painter.drawLine(crRect.bottomRight(),
- self.innerRect.bottomRight())
+ self.innerRect.bottomRight())
if self.backTooth:
self.painter.drawText(self.rect, QtCore.Qt.AlignCenter,
- material)
+ material)
else:
self.painter.drawText(self.rect.adjusted(0,
- self.rect.height() / 2, 0, 0), QtCore.Qt.AlignCenter,
- material)
+ self.rect.height(
+ ) / 2, 0, 0), QtCore.Qt.AlignCenter,
+ material)
if prop == "pv" and self.isUpper:
self.painter.drawPolygon(QtGui.QPolygon(
- [self.rect.topLeft().x(), self.rect.topLeft().y(),
- self.rect.topRight().x(), self.rect.topRight().y(),
- self.innerRect.topRight().x(), self.innerRect.topRight().y(),
- self.innerRect.topLeft().x(), self.innerRect.topLeft().y()]))
+ [self.rect.topLeft(
+ ).x(), self.rect.topLeft().y(),
+ self.rect.topRight().x(
+ ), self.rect.topRight(
+ ).y(),
+ self.innerRect.topRight().x(
+ ), self.innerRect.topRight(
+ ).y(),
+ self.innerRect.topLeft().x(), self.innerRect.topLeft().y()]))
self.painter.drawText(self.rect.adjusted(0, 0, 0,
- -self.rect.height() / 2), QtCore.Qt.AlignCenter, prop)
+ -self.rect.height() / 2), QtCore.Qt.AlignCenter, prop)
prop = ""
if prop == "pv" and not self.isUpper:
self.painter.drawPolygon(QtGui.QPolygon(
- [self.rect.bottomLeft().x(), self.rect.bottomLeft().y(),
- self.rect.bottomRight().x(), self.rect.bottomRight().y(),
- self.innerRect.bottomRight().x(), self.innerRect.bottomRight().y(),
- self.innerRect.bottomLeft().x(), self.innerRect.bottomLeft().y()]))
+ [self.rect.bottomLeft(
+ ).x(), self.rect.bottomLeft().y(),
+ self.rect.bottomRight().x(
+ ), self.rect.bottomRight(
+ ).y(),
+ self.innerRect.bottomRight().x(
+ ), self.innerRect.bottomRight(
+ ).y(),
+ self.innerRect.bottomLeft().x(), self.innerRect.bottomLeft().y()]))
self.painter.drawText(self.rect.adjusted(0,
- self.rect.height() / 2, 0, 0),
- QtCore.Qt.AlignCenter, prop)
+ self.rect.height(
+ ) / 2, 0, 0),
+ QtCore.Qt.AlignCenter, prop)
prop = ""
@@ -899,101 +949,101 @@ class toothSurfaces():
self.painter.setPen(QtGui.QPen(QtCore.Qt.red, 4))
self.painter.drawLine(self.rect.topLeft(),
- self.rect.bottomRight())
+ self.rect.bottomRight())
self.painter.drawLine(self.rect.topRight(),
- self.rect.bottomLeft())
+ self.rect.bottomLeft())
self.painter.restore()
- #IGNORE LIST
+ # IGNORE LIST
if prop in ("px", "oe"):
- prop=""
+ prop = ""
prop = prop.replace("l", "p")
shapes = []
if self.backTooth:
if "fs" in prop:
shapes.append(QtGui.QPolygon(
- [dx, ey-1, fx, ey-1, fx+1, ey+1, dx, ey+1]))
+ [dx, ey - 1, fx, ey - 1, fx + 1, ey + 1, dx, ey + 1]))
shapes.append(QtGui.QPolygon(
- [ex-1, dy, ex+1, dy, ex+1, fy, ex-1, fy]))
+ [ex - 1, dy, ex + 1, dy, ex + 1, fy, ex - 1, fy]))
elif "dr" in prop:
n = QtGui.QPolygon([cx, dy, dx, by, fx, by, hx, dy,
- hx, fy, fx, hy, dx, hy, cx, fy])
+ hx, fy, fx, hy, dx, hy, cx, fy])
shapes.append(n)
elif re.match("[modbp]{5}", prop):
n = QtGui.QPolygon([ax, by, cx, dy, dx, dy, dx, by,
- fx, by, fx, dy, gx, dy, ix, by, ix, hy, gx, fy, fx,
- fy, fx, hy, dx, hy, dx, fy, cx, fy, ax, hy])
+ fx, by, fx, dy, gx, dy, ix, by, ix, hy, gx, fy, fx,
+ fy, fx, hy, dx, hy, dx, fy, cx, fy, ax, hy])
shapes.append(n)
elif re.match("[modb]{4}", prop):
n = QtGui.QPolygon([ax, by, dx, dy, dx, by, fx, by,
- fx, dy, ix, by, ix, hy, fx, fy, dx, fy, ax, hy])
+ fx, dy, ix, by, ix, hy, fx, fy, dx, fy, ax, hy])
shapes.append(n)
elif re.match("[modp]{4}", prop):
n = QtGui.QPolygon([ax, by, dx, dy, fx, dy, ix, by,
- ix, hy, fx, fy, fx, hy, dx, hy, dx, fy, ax, hy])
+ ix, hy, fx, fy, fx, hy, dx, hy, dx, fy, ax, hy])
shapes.append(n)
elif re.match("[mod]{3}", prop):
n = QtGui.QPolygon([ax, by, dx, dy, fx, dy, ix, by,
- ix, hy, fx, fy, dx, fy, ax, hy])
+ ix, hy, fx, fy, dx, fy, ax, hy])
shapes.append(n)
elif re.match("[mob]{3}", prop):
n = QtGui.QPolygon([dx, dy, ex, dy, ex, by, fx, by,
- fx, dy, gx, dy, ix, by, ix, hy, gx, fy, dx, fy])
+ fx, dy, gx, dy, ix, by, ix, hy, gx, fy, dx, fy])
shapes.append(n)
elif re.match("[mop]{3}", prop):
n = QtGui.QPolygon([dx, dy, gx, dy, ix, by, ix, hy,
- gx, fy, fx, fy, fx, hy, ex, hy, ex, fy, dx, fy])
+ gx, fy, fx, fy, fx, hy, ex, hy, ex, fy, dx, fy])
shapes.append(n)
elif re.match("[dob]{3}", prop):
n = QtGui.QPolygon([ax, cy, cx, dy, ex, dy, ex, by,
- fx, by, fx, dy, fx, dy, fx, fy, cx, fy, ax, gy])
+ fx, by, fx, dy, fx, dy, fx, fy, cx, fy, ax, gy])
shapes.append(n)
elif re.match("[dop]{3}", prop):
n = QtGui.QPolygon([ax, cy, cx, dy, fx, dy, fx, fy,
- ex, fy, ex, hy, dx, hy, dx, fy, cx, fy, ax, gy])
+ ex, fy, ex, hy, dx, hy, dx, fy, cx, fy, ax, gy])
shapes.append(n)
elif re.match("[mbd]{3}", prop):
n = QtGui.QPolygon([ax, by, dx, ay, fx, ay, ix, by,
- ix, ey, hx, ey, hx, cy, bx, cy, bx, ey, ax, ey])
+ ix, ey, hx, ey, hx, cy, bx, cy, bx, ey, ax, ey])
shapes.append(n)
elif re.match("[mpd]{3}", prop):
n = QtGui.QPolygon([ax, ey, bx, ey, bx, hy, hx, hy,
- hx, ey, ix, ey, ix, gy, gx, iy, bx, iy, ax, gy])
+ hx, ey, ix, ey, ix, gy, gx, iy, bx, iy, ax, gy])
shapes.append(n)
elif re.match("[ob]{2}", prop):
n = QtGui.QPolygon([cx, ay, gx, ay, fx, cy, fx, fy,
- dx, fy, dx, cy])
+ dx, fy, dx, cy])
shapes.append(n)
elif re.match("[op]{2}", prop):
n = QtGui.QPolygon([dx, dy, fx, dy, fx, gy, gx, iy,
- cx, iy, dx, gy])
+ cx, iy, dx, gy])
shapes.append(n)
elif re.match("[mb]{2}", prop):
n = QtGui.QPolygon([dx, ay, fx, ay, ix, by, ix, ey,
- hx, ey, hx, dy, fx, cy, dx, cy, bx, by])
+ hx, ey, hx, dy, fx, cy, dx, cy, bx, by])
shapes.append(n)
elif re.match("[mp]{2}", prop):
n = QtGui.QPolygon([dx, iy, fx, iy, ix, hy, ix, ey,
- hx, ey, hx, fy, fx, gy, dx, gy, bx, hy])
+ hx, ey, hx, fy, fx, gy, dx, gy, bx, hy])
shapes.append(n)
elif re.match("[db]{2}", prop):
n = QtGui.QPolygon([fx, ay, dx, ay, ax, by, ax, ey,
- bx, ey, bx, dy, dx, cy, fx, cy, hx, by])
+ bx, ey, bx, dy, dx, cy, fx, cy, hx, by])
shapes.append(n)
elif re.match("[dp]{2}", prop):
n = QtGui.QPolygon([fx, iy, dx, iy, ax, hy, ax, ey,
- bx, ey, bx, fy, dx, gy, fx, gy, hx, hy])
+ bx, ey, bx, fy, dx, gy, fx, gy, hx, hy])
shapes.append(n)
elif re.match("[mo]{2}", prop):
n = QtGui.QPolygon([dx, dy, gx, dy, ix, cy, ix, gy,
- gx, fy, dx, fy])
+ gx, fy, dx, fy])
shapes.append(n)
elif re.match("[do]{2}", prop):
n = QtGui.QPolygon([ax, cy, cx, dy, fx, dy, fx, fy,
- cx, fy, ax, gy])
+ cx, fy, ax, gy])
shapes.append(n)
elif "o" in prop:
@@ -1011,110 +1061,118 @@ class toothSurfaces():
elif "b" in prop:
n = QtGui.QPolygon([bx, ay, hx, ay, fx, cy, dx, cy])
shapes.append(n)
- else: #front tooth
+ else: # front tooth
if "dr" in prop:
n = QtGui.QPolygon([cx, dy, dx, by, fx, by, hx, dy,
- hx, fy, fx, hy, dx, hy, cx, fy])
+ hx, fy, fx, hy, dx, hy, cx, fy])
shapes.append(n)
elif re.match("[mbd]{3}", prop):
n = QtGui.QPolygon([ax, by, dx, ay, fx, ay, ix, by,
- ix, ey, hx, ey, hx, cy, bx, cy, bx, ey, ax, ey])
+ ix, ey, hx, ey, hx, cy, bx, cy, bx, ey, ax, ey])
shapes.append(n)
elif re.match("[mpd]{3}", prop):
n = QtGui.QPolygon([ax, ey, bx, ey, bx, hy, hx, hy,
- hx, ey, ix, ey, ix, gy, gx, iy, bx, iy, ax, gy])
+ hx, ey, ix, ey, ix, gy, gx, iy, bx, iy, ax, gy])
shapes.append(n)
elif re.match("[ib]{2}", prop):
n = QtGui.QPolygon([cx, ay, gx, ay, fx, cy, fx, fy,
- dx, fy, dx, cy])
+ dx, fy, dx, cy])
shapes.append(n)
elif re.match("[ip]{2}", prop):
n = QtGui.QPolygon([dx, dy, fx, dy, fx, gy, gx, iy,
- cx, iy, dx, gy])
+ cx, iy, dx, gy])
shapes.append(n)
elif re.match("[mb]{2}", prop):
n = QtGui.QPolygon([dx, ay, fx, ay, ix, by, ix, ey,
- hx, ey, hx, dy, fx, cy, dx, cy, bx, by])
+ hx, ey, hx, dy, fx, cy, dx, cy, bx, by])
shapes.append(n)
elif re.match("[mp]{2}", prop):
n = QtGui.QPolygon([dx, iy, fx, iy, ix, hy, ix, ey,
- hx, ey, hx, fy, fx, gy, dx, gy, bx, hy])
+ hx, ey, hx, fy, fx, gy, dx, gy, bx, hy])
shapes.append(n)
elif re.match("[db]{2}", prop):
n = QtGui.QPolygon([fx, ay, dx, ay, ax, by, ax, ey,
- bx, ey, bx, dy, dx, cy, fx, cy, hx, by])
+ bx, ey, bx, dy, dx, cy, fx, cy, hx, by])
shapes.append(n)
elif re.match("[dp]{2}", prop):
n = QtGui.QPolygon([fx, iy, dx, iy, ax, hy, ax, ey,
- bx, ey, bx, fy, dx, gy, fx, gy, hx, hy])
+ bx, ey, bx, fy, dx, gy, fx, gy, hx, hy])
shapes.append(n)
elif re.match("[mid]{3}", prop):
n = QtGui.QPolygon([ax, cy, cx, dy,
- self.innerRect.topLeft().x(),self.innerRect.topLeft().y(),
- self.innerRect.topRight().x(),self.innerRect.topRight().y(),
- gx, dy, ix, cy, ix, gy, gx, fy,
- self.innerRect.bottomRight().x(),
- self.innerRect.bottomRight().y(),
- self.innerRect.bottomLeft().x(),
- self.innerRect.bottomLeft().y(),cx, fy, ax, gy])
+ self.innerRect.topLeft().x(
+ ), self.innerRect.topLeft().y(),
+ self.innerRect.topRight().x(
+ ), self.innerRect.topRight().y(),
+ gx, dy, ix, cy, ix, gy, gx, fy,
+ self.innerRect.bottomRight().x(),
+ self.innerRect.bottomRight().y(),
+ self.innerRect.bottomLeft().x(),
+ self.innerRect.bottomLeft().y(), cx, fy, ax, gy])
shapes.append(n)
elif re.match("[mi]{2}", prop):
n = QtGui.QPolygon([self.innerRect.topLeft().x(),
- self.innerRect.topLeft().y(),
- self.innerRect.topRight().x(),self.innerRect.topRight().y(),
- gx, dy, ix, cy, ix, gy, gx, fy,
- self.innerRect.bottomRight().x(),
- self.innerRect.bottomRight().y(),
- self.innerRect.bottomLeft().x(),
- self.innerRect.bottomLeft().y(),
- ])
+ self.innerRect.topLeft().y(),
+ self.innerRect.topRight().x(
+ ), self.innerRect.topRight().y(),
+ gx, dy, ix, cy, ix, gy, gx, fy,
+ self.innerRect.bottomRight().x(),
+ self.innerRect.bottomRight().y(),
+ self.innerRect.bottomLeft().x(),
+ self.innerRect.bottomLeft().y(),
+ ])
shapes.append(n)
elif re.match("[di]{2}", prop):
n = QtGui.QPolygon([ax, cy, cx, dy,
- self.innerRect.topLeft().x(),self.innerRect.topLeft().y(),
- self.innerRect.topRight().x(),self.innerRect.topRight().y(),
- self.innerRect.bottomRight().x(),
- self.innerRect.bottomRight().y(),
- self.innerRect.bottomLeft().x(),
- self.innerRect.bottomLeft().y(),
- cx, fy, ax, gy])
+ self.innerRect.topLeft().x(
+ ), self.innerRect.topLeft().y(),
+ self.innerRect.topRight().x(
+ ), self.innerRect.topRight().y(),
+ self.innerRect.bottomRight().x(),
+ self.innerRect.bottomRight().y(),
+ self.innerRect.bottomLeft().x(),
+ self.innerRect.bottomLeft().y(),
+ cx, fy, ax, gy])
shapes.append(n)
elif "i" in prop:
n = QtGui.QPolygon([self.innerRect.topLeft().x(),
- self.innerRect.topLeft().y(),
- self.innerRect.topRight().x(),
- self.innerRect.topRight().y(),
- self.innerRect.bottomRight().x(),
- self.innerRect.bottomRight().y(),
- self.innerRect.bottomLeft().x(),
- self.innerRect.bottomLeft().y()])
+ self.innerRect.topLeft().y(),
+ self.innerRect.topRight().x(),
+ self.innerRect.topRight().y(),
+ self.innerRect.bottomRight().x(),
+ self.innerRect.bottomRight().y(),
+ self.innerRect.bottomLeft().x(),
+ self.innerRect.bottomLeft().y()])
shapes.append(n)
elif "m" in prop:
shapes.append(QtGui.QPolygon(
- [hx, dy, ix, dy, ix, fy, hx, fy, gx, ey]))
+ [hx, dy, ix, dy, ix, fy, hx, fy, gx, ey]))
elif "d" in prop:
shapes.append(QtGui.QPolygon(
- [ax, dy, bx, dy, cx, ey, bx, fy, ax, fy]))
+ [ax, dy, bx, dy, cx, ey, bx, fy, ax, fy]))
elif "p" in prop:
shapes.append(QtGui.QPolygon([cx, hy, cx, gy, ex, fy,
- gx, gy, gx, hy, fx, iy, dx, iy]))
+ gx, gy, gx, hy, fx, iy, dx, iy]))
elif "b" in prop:
shapes.append(QtGui.QPolygon([cx, cy, cx, ay, ex, ay,
- gx, ay, gx, cy, fx, dy, dx, dy]))
+ gx, ay, gx, cy, fx, dy, dx, dy]))
for shape in shapes:
self.painter.drawPolygon(shape)
self.painter.restore()
+
class ToothImage(QtGui.QWidget):
+
'''
a class to grab an image of the tooth widget
'''
+
def __init__(self, tooth, props, parent=None):
QtGui.QWidget.__init__(self, parent)
self.tooth = tooth
self.props = props
- LOGGER.debug("tooth image %s with props %s"% (tooth, props))
+ LOGGER.debug("tooth image %s with props %s" % (tooth, props))
def paintEvent(self, event=None):
recd = QtCore.QRectF(0, 0, self.width(), self.height())
@@ -1135,7 +1193,7 @@ class ToothImage(QtGui.QWidget):
if __name__ == "__main__":
def signal_catcher(*args):
- LOGGER.info("signal caught %s"% str(args))
+ LOGGER.info("signal caught %s" % str(args))
LOGGER.setLevel(logging.DEBUG)
from gettext import gettext as _
@@ -1143,23 +1201,44 @@ if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
form = chartWidget()
form.chartgrid = {'lr1': 'lr1', 'lr3': 'lr3', 'lr2': 'lr2', 'lr5': 'lr5',
- 'lr4': 'lr4', 'lr7': 'lr7', 'lr6': 'lr6', 'lr8': 'lr8','ul8': '***',
- 'ul2': 'ul2', 'ul3': 'ulC', 'ul1': 'ul1', 'ul6': 'ul6', 'ul7': 'ul7',
- 'ul4': 'ul4', 'ul5': 'ul5', 'ur4': 'ur4','ur5': 'ur5', 'ur6': 'ur6',
- 'ur7': 'ur7', 'ur1': 'ur1', 'ur2': 'ur2', 'ur3': 'ur3', 'ur8': 'ur8',
- 'll8': 'll8', 'll3': 'll3','ll2': 'll2', 'll1': 'll1', 'll7': 'll7',
- 'll6': 'll6', 'll5': 'll5', 'll4': 'll4'}
+ 'lr4': 'lr4',
+ 'lr7': 'lr7',
+ 'lr6': 'lr6',
+ 'lr8': 'lr8',
+ 'ul8': '***',
+ 'ul2': 'ul2',
+ 'ul3': 'ulC',
+ 'ul1': 'ul1',
+ 'ul6': 'ul6',
+ 'ul7': 'ul7',
+ 'ul4': 'ul4',
+ 'ul5': 'ul5',
+ 'ur4': 'ur4',
+ 'ur5': 'ur5',
+ 'ur6': 'ur6',
+ 'ur7': 'ur7',
+ 'ur1': 'ur1',
+ 'ur2': 'ur2',
+ 'ur3': 'ur3',
+ 'ur8': 'ur8',
+ 'll8': 'll8',
+ 'll3': 'll3',
+ 'll2': 'll2',
+ 'll1': 'll1',
+ 'll7': 'll7',
+ 'll6': 'll6', 'll5': 'll5', 'll4': 'll4'}
for properties in (
- ("ur7", "ex "), ("ur6", "gi/modbp mb"), ("ur5", "cr,go mp"),
- ("ur4", "mop,co"), ("ur3", "AT"), ("ur2", "di,co b"), ("ur1", "pv rt"),
- ("ul1", "cr,pj"), ("ul2", "dp,co b,co"), ("ul3","di p,go"),
- ("ll3", "pv"), ("ll2", "dip"), ("ll1", "midi"),
- ("lr1", "mpd"), ("lr2", "mld,gl"), ("lr3", "dr"),
- ("ul4", "do"), ("ul6", "mo"), ("lr8", "("),
- ("ul7", "mop,co"), ("ur8", "mdb,gl mpd,go ob"), ("ll4", "b,gl dl,co"),
- ("ll5", "ob ml"), ("ll6", "mod,co"), ("ll7", "pe"), ("ll8", "ue !watch"),
- ("lr4", "im/tit"), ("lr5", "dr"), ("lr7", "fs"), ("lr6", "modbl,pr")):
+ ("ur7", "ex "), ("ur6", "gi/modbp mb"), ("ur5", "cr,go mp"),
+ ("ur4", "mop,co"), ("ur3", "AT"), ("ur2", "di,co b"), ("ur1", "pv rt"),
+ ("ul1", "cr,pj"), ("ul2", "dp,co b,co"), ("ul3", "di p,go"),
+ ("ll3", "pv"), ("ll2", "dip"), ("ll1", "midi"),
+ ("lr1", "mpd"), ("lr2", "mld,gl"), ("lr3", "dr"),
+ ("ul4", "do"), ("ul6", "mo"), ("lr8", "("),
+ ("ul7", "mop,co"), ("ur8", "mdb,gl mpd,go ob"), ("ll4", "b,gl dl,co"),
+ ("ll5", "ob ml"), ("ll6", "mod,co"), (
+ "ll7", "pe"), ("ll8", "ue !watch"),
+ ("lr4", "im/tit"), ("lr5", "dr"), ("lr7", "fs"), ("lr6", "modbl,pr")):
form.setToothProps(properties[0], properties[1])
form.flip_deciduous_signal.connect(signal_catcher)
@@ -1173,4 +1252,3 @@ if __name__ == "__main__":
pixmap.save("/home/neil/chart.png")
form.selected = [0, 2]
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/customwidgets/confirming_check_box.py b/src/openmolar/qt4gui/customwidgets/confirming_check_box.py
index e29ba9f..a6ff611 100644
--- a/src/openmolar/qt4gui/customwidgets/confirming_check_box.py
+++ b/src/openmolar/qt4gui/customwidgets/confirming_check_box.py
@@ -1,46 +1,51 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtCore, QtGui
+
class ConfirmingCheckBox(QtGui.QCheckBox):
+
'''
this is a subclass of QtGui.QCheckBox
I use this to allow for logic BEFORE the state is changed.
Also, new_state_signal is available IN ADDITION to the usual stateChanged
signal.
new_state_signal is only raised if the user changes the state.
- stateChanged will be sent in this condition AND ALSO if the change
+ stateChanged will be sent in this condition AND ALSO if the change
happens programatically.
'''
new_state_signal = QtCore.pyqtSignal(object)
+
def __init__(self, *args):
QtGui.QCheckBox.__init__(self, *args)
self.setTristate(True)
-
+
def nextCheckState(self):
- if not self.check_first():
+ if not self.check_first():
return
-
+
if self.checkState() == QtCore.Qt.PartiallyChecked:
self.setCheckState(QtCore.Qt.Checked)
else:
@@ -49,16 +54,16 @@ class ConfirmingCheckBox(QtGui.QCheckBox):
self.new_state_signal.emit(self.checkState())
def check_first(self):
- return QtGui.QMessageBox.question(self,
- _("Confirm"), _("Are you Sure"),
- QtGui.QMessageBox.Yes|QtGui.QMessageBox.No
- ) == QtGui.QMessageBox.Yes
-
-
+ return QtGui.QMessageBox.question(self,
+ _("Confirm"), _("Are you Sure"),
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.No
+ ) == QtGui.QMessageBox.Yes
+
+
if __name__ == "__main__":
from gettext import gettext as _
app = QtGui.QApplication([])
cb = ConfirmingCheckBox("hello")
cb.show()
cb.setCheckState(QtCore.Qt.PartiallyChecked)
- app.exec_()
\ No newline at end of file
+ app.exec_()
diff --git a/src/openmolar/qt4gui/customwidgets/currency_label.py b/src/openmolar/qt4gui/customwidgets/currency_label.py
index 78a586a..8900d51 100644
--- a/src/openmolar/qt4gui/customwidgets/currency_label.py
+++ b/src/openmolar/qt4gui/customwidgets/currency_label.py
@@ -1,57 +1,62 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2010, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtCore, QtGui
+
class CurrencyLabel(QtGui.QWidget):
+
'''
- a re-implimentation of QLabel which adds the local currency prefix
+ a re-implimentation of QLabel which adds the local currency prefix
if possible.
'''
+
def __init__(self, text="", parent=None):
QtGui.QWidget.__init__(self, parent)
try:
c_txt = QtCore.QLocale().currencySymbol()
except AttributeError:
- #currencySymbol is Qt 4.8 and above
+ # currencySymbol is Qt 4.8 and above
c_txt = ""
-
+
self.suffix_label = QtGui.QLabel(c_txt, self)
self.suffix_label.setFixedWidth(
self.suffix_label.fontMetrics().width(c_txt))
- self.label = QtGui.QLabel(text,self)
- self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)
-
+ self.label = QtGui.QLabel(text, self)
+ self.label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
+
self.text = self.label.text
self.setText = self.label.setText
-
+
layout = QtGui.QHBoxLayout(self)
layout.addWidget(self.suffix_label)
layout.addWidget(self.label)
-
+
def setFont(self, font):
self.label.setFont(font)
self.suffix_label.setFont(font)
-
+
if __name__ == "__main__":
@@ -59,4 +64,3 @@ if __name__ == "__main__":
label = CurrencyLabel("hello")
label.show()
app.exec_()
-
diff --git a/src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py b/src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py
index 11c2b69..5667719 100644
--- a/src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py
+++ b/src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py
@@ -1,14 +1,32 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
+
class dentHygSelector(QtGui.QTreeWidget):
+
def __init__(self, dents, hygs):
QtGui.QTreeWidget.__init__(self)
self.setHeaderHidden(True)
@@ -19,7 +37,7 @@ class dentHygSelector(QtGui.QTreeWidget):
self.dent_root = QtGui.QTreeWidgetItem(self.root, ["All Dentists"])
self.dent_root.setCheckState(0, QtCore.Qt.Checked)
-
+
self.hyg_root = QtGui.QTreeWidgetItem(self.root, ["All Hygenists"])
self.hyg_root.setCheckState(0, QtCore.Qt.Checked)
@@ -34,7 +52,7 @@ class dentHygSelector(QtGui.QTreeWidget):
i = QtGui.QTreeWidgetItem(self.hyg_root, [hyg])
i.setCheckState(0, QtCore.Qt.Checked)
self.hyg_cbs[hyg] = i
-
+
self.expandAll()
self.selectedDents = dents
self.selectedHygs = hygs
@@ -43,23 +61,23 @@ class dentHygSelector(QtGui.QTreeWidget):
def signals(self, connect):
if connect:
self.connect(self,
- QtCore.SIGNAL("itemChanged (QTreeWidgetItem *,int)"),
- self.interact)
+ QtCore.SIGNAL("itemChanged (QTreeWidgetItem *,int)"),
+ self.interact)
else:
self.disconnect(self,
- QtCore.SIGNAL("itemChanged (QTreeWidgetItem *,int)"),
- self.interact)
+ QtCore.SIGNAL(
+ "itemChanged (QTreeWidgetItem *,int)"),
+ self.interact)
- def checkAll(self, checkstate=QtCore.Qt.Checked,
- ignoreHygs=False, ignoreDents=False):
+ def checkAll(self, checkstate=QtCore.Qt.Checked,
+ ignoreHygs=False, ignoreDents=False):
if not ignoreHygs:
for hyg in self.hyg_cbs.values():
hyg.setCheckState(0, checkstate)
if not ignoreDents:
for dent in self.dent_cbs.values():
dent.setCheckState(0, checkstate)
-
-
+
def interact(self, item, column):
self.signals(False)
@@ -69,7 +87,6 @@ class dentHygSelector(QtGui.QTreeWidget):
self.checkAll(self.dent_root.checkState(0), ignoreHygs=True)
elif item == self.hyg_root:
self.checkAll(self.hyg_root.checkState(0), ignoreDents=True)
-
self.selectedDents = []
self.selectedHygs = []
@@ -87,7 +104,7 @@ class dentHygSelector(QtGui.QTreeWidget):
self.selectedHygs.append(hyg)
else:
allHygsChecked = QtCore.Qt.Unchecked
-
+
self.dent_root.setCheckState(0, allDentsChecked)
self.hyg_root.setCheckState(0, allHygsChecked)
@@ -95,12 +112,12 @@ class dentHygSelector(QtGui.QTreeWidget):
allClinicians = QtCore.Qt.Checked
else:
allClinicians = QtCore.Qt.Unchecked
-
+
self.root.setCheckState(0, allClinicians)
self.signals(True)
self.emit(QtCore.SIGNAL("selectionChanged"))
-
+
def getSelectedDents(self):
return self.selectedDents
@@ -109,13 +126,13 @@ class dentHygSelector(QtGui.QTreeWidget):
def getSelectedClinicians(self):
return self.selectedDents + self.selectedHygs
-
+
def allChecked(self):
return self.root.checkState(0) == QtCore.Qt.Checked
-
+
if __name__ == "__main__":
app = QtGui.QApplication([])
- dents = ["Neil","Bea","Helen", "Andy"]
+ dents = ["Neil", "Bea", "Helen", "Andy"]
hygs = ["Rosie", "Sally", "Ariana"]
w = dentHygSelector(dents, hygs)
w.show()
diff --git a/src/openmolar/qt4gui/customwidgets/diary_view_controller.py b/src/openmolar/qt4gui/customwidgets/diary_view_controller.py
index 6162a86..d010484 100644
--- a/src/openmolar/qt4gui/customwidgets/diary_view_controller.py
+++ b/src/openmolar/qt4gui/customwidgets/diary_view_controller.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
@@ -116,4 +118,3 @@ if __name__ == "__main__":
widg.apt_mode_changed.connect(sig_catcher)
app.exec_()
-
diff --git a/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py b/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py
index 0f8acd2..a295041 100644
--- a/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py
+++ b/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
@@ -16,10 +32,13 @@ from openmolar.qt4gui.customwidgets.confirming_check_box import ConfirmingCheckB
LOGGER = logging.getLogger("openmolar")
+
def decimalise(pence):
- return "%d.%02d"% (pence // 100, pence % 100)
+ return "%d.%02d" % (pence // 100, pence % 100)
+
class EstimateItemWidget(QtGui.QWidget):
+
'''
a class to show one specific item of treatment
'''
@@ -55,7 +74,7 @@ class EstimateItemWidget(QtGui.QWidget):
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/eraser.png"),
- QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.delete_pushButton = QtGui.QPushButton()
self.delete_pushButton.setMaximumWidth(30)
self.delete_pushButton.setIcon(icon)
@@ -63,19 +82,18 @@ class EstimateItemWidget(QtGui.QWidget):
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":icons/expand.svg"),
- QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.expand_pushButton = QtGui.QPushButton()
self.expand_pushButton.setIcon(icon)
self.expand_pushButton.setMaximumWidth(30)
self.expand_pushButton.setFlat(True)
self.expand_pushButton.setSizePolicy(QtGui.QSizePolicy(
QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
- )
+ )
self.examine_icon = QtGui.QIcon()
self.examine_icon.addPixmap(QtGui.QPixmap(":/search.png"),
- QtGui.QIcon.Normal, QtGui.QIcon.Off)
-
+ QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.validators()
self.feesLinked = True
@@ -88,16 +106,16 @@ class EstimateItemWidget(QtGui.QWidget):
returns all the sub widgets.
'''
return (
- self.number_label,
- self.itemCode_label,
- self.description_lineEdit,
- self.cset_lineEdit,
- self.fee_lineEdit,
- self.chain,
- self.ptFee_lineEdit,
- self.completed_checkBox,
- self.delete_pushButton,
- self.expand_pushButton)
+ self.number_label,
+ self.itemCode_label,
+ self.description_lineEdit,
+ self.cset_lineEdit,
+ self.fee_lineEdit,
+ self.chain,
+ self.ptFee_lineEdit,
+ self.completed_checkBox,
+ self.delete_pushButton,
+ self.expand_pushButton)
def linkfees(self, arg):
'''
@@ -128,13 +146,13 @@ class EstimateItemWidget(QtGui.QWidget):
Dent - %s<br />
Hashes - %s<br />
DBindex - %s<hr />
- '''% (
- item.itemcode,
- item.feescale,
- item.csetype,
- item.dent,
- str(item.tx_hashes),
- item.ix)
+ ''' % (
+ item.itemcode,
+ item.feescale,
+ item.csetype,
+ item.dent,
+ str(item.tx_hashes),
+ item.ix)
return retarg + "</center>"
def loadValues(self):
@@ -161,7 +179,7 @@ class EstimateItemWidget(QtGui.QWidget):
n_items = len(self.est_items)
if n_items > 1:
- #self.expand_pushButton.setText("%d %s"% (n_items, _("items")))
+ # self.expand_pushButton.setText("%d %s"% (n_items, _("items")))
if all_planned:
self.setCompleted(0)
elif all_completed:
@@ -170,7 +188,7 @@ class EstimateItemWidget(QtGui.QWidget):
self.setCompleted(1)
else:
n_txs = len(self.est_items[0].tx_hashes)
- if n_txs >1:
+ if n_txs > 1:
self.expand_pushButton.setIcon(self.examine_icon)
self.setCompleted(item.completed)
@@ -218,7 +236,7 @@ class EstimateItemWidget(QtGui.QWidget):
self.fee_lineEdit.textEdited.connect(self.update_Fee)
self.ptFee_lineEdit.textEdited.connect(self.update_ptFee)
self.completed_checkBox.new_state_signal.connect(
- self.completed_state_changed)
+ self.completed_state_changed)
def update_cset(self, arg):
'''
@@ -243,7 +261,7 @@ class EstimateItemWidget(QtGui.QWidget):
of items.
'''
try:
- newVal = int(float(arg)*100)
+ newVal = int(float(arg) * 100)
if self.feesLinked and userPerforming:
self.ptFee_lineEdit.setText(arg)
self.update_ptFee(arg, False)
@@ -261,7 +279,7 @@ class EstimateItemWidget(QtGui.QWidget):
of items.
'''
try:
- newVal = int(float(arg)*100)
+ newVal = int(float(arg) * 100)
if self.feesLinked and userPerforming:
self.fee_lineEdit.setText(arg)
self.update_Fee(arg, False)
@@ -320,9 +338,9 @@ class EstimateItemWidget(QtGui.QWidget):
'''
function so that external calls can alter this widget
'''
- #LOGGER.debug("est_item_widget.setCompleted %s"% arg)
- self.completed_checkBox.setCheckState(arg) #ed(bool(arg))
- #self.enable_components()
+ # LOGGER.debug("est_item_widget.setCompleted %s"% arg)
+ self.completed_checkBox.setCheckState(arg) # ed(bool(arg))
+ # self.enable_components()
def deleteItem(self):
'''
@@ -344,8 +362,8 @@ class EstimateItemWidget(QtGui.QWidget):
this is a slot called when the completed checkbox changes
'''
state = (self.completed_checkBox.checkState() == 0 or
- (self.completed_checkBox.checkState() == 1 and
- len(self.est_items) == 1) )
+ (self.completed_checkBox.checkState() == 1 and
+ len(self.est_items) == 1))
self.fee_lineEdit.setEnabled(state)
self.ptFee_lineEdit.setEnabled(state)
@@ -360,7 +378,7 @@ class EstimateItemWidget(QtGui.QWidget):
tx_hashes = []
for item in self.est_items:
tx_hashes += item.tx_hashes
- assert len(tx_hashes) >0 , \
+ assert len(tx_hashes) > 0 , \
"no treatments found.. this shouldn't happen"
txs = []
@@ -370,19 +388,19 @@ class EstimateItemWidget(QtGui.QWidget):
txs.append((att, tx, tx_hash.completed))
list_ = ""
for att, tx, completed in txs:
- list_ += "<li>%s <b>%s</b>"% (att, tx)
+ list_ += "<li>%s <b>%s</b>" % (att, tx)
if completed:
- list_ += " (%s)</li>"% _("completed already")
+ list_ += " (%s)</li>" % _("completed already")
else:
list_ += "</li>"
- message = "%s<ul>%s</ul><hr />%s"%(
- _("There are multiple treatments associated with this estimate item"),
- list_,
- _("All must be completed for the full charge to be applied"))
+ message = "%s<ul>%s</ul><hr />%s" % (
+ _(
+ "There are multiple treatments associated with this estimate item"),
+ list_,
+ _("All must be completed for the full charge to be applied"))
QtGui.QMessageBox.information(self, _("information"), message)
-
@property
def has_no_treatments(self):
for item in self.est_items:
@@ -398,9 +416,10 @@ class EstimateItemWidget(QtGui.QWidget):
LOGGER.debug("EstimateItemWidget.check_first")
if self.est_items[0].is_exam:
if QtGui.QMessageBox.question(self, _("confirm"),
- _("Delete examination from this treatment plan and estimate?"),
- QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel,
- QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Ok:
+ _(
+ "Delete examination from this treatment plan and estimate?"),
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Ok:
self.deleteItem()
return
@@ -411,19 +430,19 @@ class EstimateItemWidget(QtGui.QWidget):
if est_item.has_multi_txs:
return self._multi_tx_check()
else:
- #if we've got this far, then there is only 1 tx associated.
+ # if we've got this far, then there is only 1 tx associated.
completing = not self.completed_checkBox.isChecked()
return self.est_widget.allow_check(est_item, completing)
def _multi_item_check(self):
- #allow for tri-state!!
+ # allow for tri-state!!
if len(self.est_items) == 1:
return True
self.est_widget.raise_multi_treatment_dialog(self)
return False
def _multi_tx_check(self):
- #allow for tri-state!!
+ # allow for tri-state!!
self.est_widget.raise_multi_treatment_dialog(self)
return False
@@ -432,7 +451,7 @@ class EstimateItemWidget(QtGui.QWidget):
a slot for the checkbox state change
should only happen when this is altered by user (not programatically)
'''
- LOGGER.debug("EstimateItemWidget.completed_state_changed %s"% args)
+ LOGGER.debug("EstimateItemWidget.completed_state_changed %s" % args)
completed = self.completed_checkBox.isChecked()
for est in self.est_items:
@@ -443,7 +462,9 @@ class EstimateItemWidget(QtGui.QWidget):
self.edited_signal.emit()
+
class _TestParent(QtGui.QWidget):
+
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
@@ -487,5 +508,4 @@ if __name__ == "__main__":
form.setCentralWidget(widg)
form.show()
-
sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/customwidgets/estimate_widget.py b/src/openmolar/qt4gui/customwidgets/estimate_widget.py
index aeefaa8..d31ce03 100644
--- a/src/openmolar/qt4gui/customwidgets/estimate_widget.py
+++ b/src/openmolar/qt4gui/customwidgets/estimate_widget.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module provides a custom widget "EstimateWidget"
@@ -24,7 +40,9 @@ from openmolar.qt4gui.dialogs.complete_treatment_dialog \
LOGGER = logging.getLogger("openmolar")
+
class EstimateWidget(QtGui.QWidget):
+
'''
provides a custom widget to view/edit the patient's estimate
'''
@@ -42,7 +60,7 @@ class EstimateWidget(QtGui.QWidget):
self.expandAll = False
- #header labels
+ # header labels
self.number_label = QtGui.QLabel(_("No."))
self.code_label = QtGui.QLabel(_("Code"))
self.description_label = QtGui.QLabel(_("Description"))
@@ -66,7 +84,7 @@ class EstimateWidget(QtGui.QWidget):
self.g_layout.addWidget(self.fee_label, 0, 4)
self.g_layout.addWidget(self.charge_label, 0, 6)
- self.g_layout.addWidget(self.expand_all_button, 0,7,1,3)
+ self.g_layout.addWidget(self.expand_all_button, 0, 7, 1, 3)
self.planned_fees_total_le = QtGui.QLineEdit()
self.planned_charges_total_le = QtGui.QLineEdit()
@@ -81,14 +99,14 @@ class EstimateWidget(QtGui.QWidget):
self.interim_charges_total_le = QtGui.QLineEdit()
for le in (
- self.planned_fees_total_le,
- self.completed_fees_total_le,
- self.fees_total_le,
- self.charges_total_le,
- self.planned_charges_total_le,
- self.completed_charges_total_le,
- self.interim_fees_total_le,
- self.interim_charges_total_le):
+ self.planned_fees_total_le,
+ self.completed_fees_total_le,
+ self.fees_total_le,
+ self.charges_total_le,
+ self.planned_charges_total_le,
+ self.completed_charges_total_le,
+ self.interim_fees_total_le,
+ self.interim_charges_total_le):
le.setFixedWidth(EstimateItemWidget.MONEY_WIDTH)
le.setAlignment(QtCore.Qt.AlignRight)
@@ -97,7 +115,7 @@ class EstimateWidget(QtGui.QWidget):
self.completed_total_label = QtGui.QLabel(_("Completed Items Total"))
self.total_label = QtGui.QLabel(_("TOTAL"))
- alignment = QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter
+ alignment = QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter
self.planned_total_label.setAlignment(alignment)
self.interim_total_label.setAlignment(alignment)
self.completed_total_label.setAlignment(alignment)
@@ -115,29 +133,29 @@ class EstimateWidget(QtGui.QWidget):
def add_footer(self):
row = len(self.estItemWidgets)
- self.g_layout.addItem(self.spacer_item, row+1, 0, 1, 9)
- self.g_layout.setRowStretch(row+1, 2)
+ self.g_layout.addItem(self.spacer_item, row + 1, 0, 1, 9)
+ self.g_layout.setRowStretch(row + 1, 2)
row += 2
for i, label in enumerate(
(self.planned_total_label,
- self.interim_total_label,
- self.completed_total_label,
- self.total_label)
- ):
+ self.interim_total_label,
+ self.completed_total_label,
+ self.total_label)
+ ):
self.g_layout.addWidget(label, row + 3 + i, 2, 1, 2)
- self.g_layout.addWidget(self.planned_fees_total_le, 3+row,4)
- self.g_layout.addWidget(self.planned_charges_total_le, 3+row,6)
+ self.g_layout.addWidget(self.planned_fees_total_le, 3 + row, 4)
+ self.g_layout.addWidget(self.planned_charges_total_le, 3 + row, 6)
- self.g_layout.addWidget(self.interim_fees_total_le, 4+row,4)
- self.g_layout.addWidget(self.interim_charges_total_le, 4+row,6)
+ self.g_layout.addWidget(self.interim_fees_total_le, 4 + row, 4)
+ self.g_layout.addWidget(self.interim_charges_total_le, 4 + row, 6)
- self.g_layout.addWidget(self.completed_fees_total_le, 5+row,4)
- self.g_layout.addWidget(self.completed_charges_total_le, 5+row,6)
+ self.g_layout.addWidget(self.completed_fees_total_le, 5 + row, 4)
+ self.g_layout.addWidget(self.completed_charges_total_le, 5 + row, 6)
- self.g_layout.addWidget(self.fees_total_le, 6+row,4)
- self.g_layout.addWidget(self.charges_total_le, 6+row,6)
+ self.g_layout.addWidget(self.fees_total_le, 6 + row, 4)
+ self.g_layout.addWidget(self.charges_total_le, 6 + row, 6)
def minimumSizeHint(self):
min_height = 120 + len(self.estItemWidgets) * 28
@@ -159,7 +177,7 @@ class EstimateWidget(QtGui.QWidget):
pt_interim_total += est.interim_pt_fee
plan_total += est.fee - est.interim_fee
pt_plan_total += est.ptfee - est.interim_pt_fee
- else: #est.PLANNED
+ else: # est.PLANNED
plan_total += est.fee
pt_plan_total += est.ptfee
total += est.fee
@@ -181,7 +199,7 @@ class EstimateWidget(QtGui.QWidget):
LOGGER.debug("est widget using interim fees")
for widg in (self.interim_charges_total_le,
- self.interim_fees_total_le, self.interim_total_label):
+ self.interim_fees_total_le, self.interim_total_label):
widg.setVisible(interim_in_use)
self.updated_fees_signal.emit()
@@ -203,7 +221,7 @@ class EstimateWidget(QtGui.QWidget):
item_is_other = est.itemcode == "-----"
for widg in self.estItemWidgets:
- if widg.itemCode == est.itemcode :
+ if widg.itemCode == est.itemcode:
if item_is_other:
for exist_est in widg.est_items:
if est.description == exist_est.description:
@@ -275,7 +293,7 @@ class EstimateWidget(QtGui.QWidget):
self.updateTotals()
def compress_item(self, item_code):
- LOGGER.debug("compress %s"% item_code)
+ LOGGER.debug("compress %s" % item_code)
self.separate_codes.remove(item_code)
self.expandAll = False
self.resetEstimate()
@@ -283,13 +301,18 @@ class EstimateWidget(QtGui.QWidget):
def add_compress_buts(self):
def add_but():
if start_row is not None:
- self.g_layout.addWidget(but, start_row, 9, row+1-start_row, 1)
+ self.g_layout.addWidget(
+ but,
+ start_row,
+ 9,
+ row + 1 - start_row,
+ 1)
but.setVisible(True)
row, but, code, start_row = None, None, None, None
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":icons/contract.svg"),
- QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ QtGui.QIcon.Normal, QtGui.QIcon.Off)
for row, est_item_widget in enumerate(self.estItemWidgets):
if est_item_widget.itemCode == code:
self.separate_codes.add(code)
@@ -309,7 +332,7 @@ class EstimateWidget(QtGui.QWidget):
add_but()
def tx_hash_complete(self, tx_hash):
- LOGGER.debug("EstimateWidget.tx_hash_complete, %s"% tx_hash)
+ LOGGER.debug("EstimateWidget.tx_hash_complete, %s" % tx_hash)
if tx_hash.completed:
manipulate_plan.tx_hash_complete(self.om_gui, tx_hash)
else:
@@ -333,7 +356,7 @@ class EstimateWidget(QtGui.QWidget):
self.g_layout.removeItem(self.spacer_item)
self.set_expand_mode(self.expandAll)
- #self.updateTotals()
+ # self.updateTotals()
def deleteItemWidget(self, item_widget, confirm_first=True):
'''
@@ -343,16 +366,16 @@ class EstimateWidget(QtGui.QWidget):
LOGGER.debug("EstimateWidget.deleteItemWidget")
if not confirm_first:
- message = u"<p>%s %s %s<br />%s?</p>"%(
+ message = u"<p>%s %s %s<br />%s?</p>" % (
_("Delete"),
item_widget.number_label.text(),
item_widget.description_lineEdit.text(),
_("from treatment plan and estimate")
- )
+ )
if QtGui.QMessageBox.question(self, "confirm",
- message, QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes ) == QtGui.QMessageBox.No:
+ message, QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
return False
assert len(item_widget.est_items) == 1, "bad est item passed"
@@ -377,7 +400,7 @@ class EstimateWidget(QtGui.QWidget):
'''
separate this item
'''
- LOGGER.debug("EstimateWidget.split_item %s"% est_item_widget)
+ LOGGER.debug("EstimateWidget.split_item %s" % est_item_widget)
self.separate_codes.add(est_item_widget.itemCode)
self.resetEstimate()
@@ -402,15 +425,15 @@ class EstimateWidget(QtGui.QWidget):
specific allowable order)
'''
LOGGER.debug(
- "EstimateWidget.allow_check called. Completing = %s"% completing)
+ "EstimateWidget.allow_check called. Completing = %s" % completing)
assert len(est_item.tx_hashes) == 1, \
- "too many tx_hashes passed to EstimateWidget.allow_check"
+ "too many tx_hashes passed to EstimateWidget.allow_check"
check_first = False
for est in self.ests:
if (est.itemcode == est_item.itemcode and
- est.tx_hashes != est_item.tx_hashes):
+ est.tx_hashes != est_item.tx_hashes):
check_first = True
break
@@ -418,17 +441,17 @@ class EstimateWidget(QtGui.QWidget):
LOGGER.debug("EstimateWidget.allow_check granted")
return True
- tx_hash = est_item.tx_hashes[0] # will only have one - see assert
+ tx_hash = est_item.tx_hashes[0] # will only have one - see assert
check_att, check_tx = self.pt.get_tx_from_hash(tx_hash)
- LOGGER.debug("Check uniqueness of hash='%s' att='%s' tx='%s'"% (
+ LOGGER.debug("Check uniqueness of hash='%s' att='%s' tx='%s'" % (
tx_hash, check_att, check_tx))
- #check this treatment off against the other treatments which still
- #require completing/reversing
+ # check this treatment off against the other treatments which still
+ # require completing/reversing
for hash_, att_, tx in self.pt.tx_hash_tups:
- if check_att == att_ and tx == check_tx and hash_ != tx_hash.hash:
+ if check_att == att_ and tx == check_tx and hash_ != tx_hash.hash:
LOGGER.warning(
- "Special code checked via estimate widget, not allowing check")
+ "Special code checked via estimate widget, not allowing check")
if completing:
func_ = manipulate_plan.complete_txs
else:
@@ -447,7 +470,7 @@ class EstimateWidget(QtGui.QWidget):
tx_hashes = []
for item in est_item_widget.est_items:
tx_hashes += item.tx_hashes
- assert len(tx_hashes) >0 , \
+ assert len(tx_hashes) > 0, \
"no treatments found.. this shouldn't happen"
txs = []
@@ -461,18 +484,18 @@ class EstimateWidget(QtGui.QWidget):
return
for att, treat in dl.completed_treatments:
- LOGGER.debug("checking completed %s %s"% (att, treat))
- found = False #only complete 1 treatment!!
+ LOGGER.debug("checking completed %s %s" % (att, treat))
+ found = False # only complete 1 treatment!!
for hash_, att_, tx in self.pt.tx_hash_tups:
if found:
break
if att == att_ and tx == treat:
LOGGER.debug("att and treat match... checking hashes")
for item in est_item_widget.est_items:
- LOGGER.debug("Checking hashes of item %s"% item)
+ LOGGER.debug("Checking hashes of item %s" % item)
for tx_hash in item.tx_hashes:
if tx_hash == hash_ and not tx_hash.completed:
- LOGGER.debug("%s == %s"% (tx_hash, hash_))
+ LOGGER.debug("%s == %s" % (tx_hash, hash_))
tx_hash.completed = True
self.tx_hash_complete(tx_hash)
found = True
@@ -481,18 +504,18 @@ class EstimateWidget(QtGui.QWidget):
break
for att, treat in dl.uncompleted_treatments:
- LOGGER.debug("checking completed %s %s"% (att, treat))
- found = False #only complete 1 treatment!!
+ LOGGER.debug("checking completed %s %s" % (att, treat))
+ found = False # only complete 1 treatment!!
for hash_, att_, tx in reversed(list(self.pt.tx_hash_tups)):
if found:
break
if att == att_ and tx == treat:
LOGGER.debug("att and treat match... checking hashes")
for item in est_item_widget.est_items:
- LOGGER.debug("Checking hashes of item %s"% item)
+ LOGGER.debug("Checking hashes of item %s" % item)
for tx_hash in item.tx_hashes:
if tx_hash == hash_ and tx_hash.completed:
- LOGGER.debug("%s == %s"% (tx_hash, hash_))
+ LOGGER.debug("%s == %s" % (tx_hash, hash_))
tx_hash.completed = False
self.tx_hash_complete(tx_hash)
found = True
@@ -501,9 +524,9 @@ class EstimateWidget(QtGui.QWidget):
break
for att, treat, already_completed in dl.deleted_treatments:
- LOGGER.debug("checking deleted %s %s"% (att, treat))
+ LOGGER.debug("checking deleted %s %s" % (att, treat))
manipulate_plan.remove_treatments_from_plan_and_est(
- self.om_gui, ((att, treat.strip(" ")),), already_completed)
+ self.om_gui, ((att, treat.strip(" ")),), already_completed)
self.resetEstimate()
diff --git a/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py b/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
index ad36169..c522f34 100644
--- a/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
+++ b/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
@@ -1,46 +1,64 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
+
class FiveMinuteTimeEdit(QtGui.QTimeEdit):
+
'''
A custom timeEdit which enforces only 5 minutes
NB - connect to slot "verifiedTime"
'''
- def __init__(self,parent=None):
+
+ def __init__(self, parent=None):
super(FiveMinuteTimeEdit, self).__init__(parent)
self.setDisplayFormat("hh:mm")
- QtCore.QObject.connect(self,
- QtCore.SIGNAL("timeChanged (const QTime&)"), self.timeChanged)
+ QtCore.QObject.connect(self,
+ QtCore.SIGNAL("timeChanged (const QTime&)"), self.timeChanged)
def stepBy(self, steps):
if self.currentSection() == self.MinuteSection:
QtGui.QTimeEdit.stepBy(self, steps * 5)
else:
QtGui.QTimeEdit.stepBy(self, steps)
-
+
def timeChanged(self, t):
min = self.time().minute()
if min % 5 != 0:
- min -= min % 5
+ min -= min % 5
self.setTime(QtCore.QTime(self.time().hour(), min))
self.emit(QtCore.SIGNAL("verifiedTime"), self.time())
-
+
if __name__ == "__main__":
def test(t):
print "signal received", t
-
+
import sys
app = QtGui.QApplication([])
te = FiveMinuteTimeEdit()
QtCore.QObject.connect(te,
- QtCore.SIGNAL("verifiedTime"), test)
+ QtCore.SIGNAL("verifiedTime"), test)
te.show()
- sys.exit(app.exec_())
\ No newline at end of file
+ sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/customwidgets/money_line_edit.py b/src/openmolar/qt4gui/customwidgets/money_line_edit.py
index 648575c..109cc1a 100644
--- a/src/openmolar/qt4gui/customwidgets/money_line_edit.py
+++ b/src/openmolar/qt4gui/customwidgets/money_line_edit.py
@@ -1,40 +1,44 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2010, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
-
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import re
from PyQt4 import QtCore, QtGui
+
class MoneyLineEdit(QtGui.QLineEdit):
+
'''
interestingly, for the input of money values, and having experimented
with validators and spinboxes etc...
none of them acted intuitively.
This one does. try it.
'''
+
def __init__(self, parent=None):
QtGui.QLineEdit.__init__(self, parent)
- self.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)
-
+ self.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
+
@property
def pence_value(self):
'''
@@ -42,75 +46,74 @@ class MoneyLineEdit(QtGui.QLineEdit):
example - if 12.34 is displayed then 1234 is returned.
'''
s = "0" + self.text()
- return int (s.replace(".",""))
-
+ return int(s.replace(".", ""))
+
def check_val(self):
current_txt = self.text()
m = re.match("(\d+)\.(\d)(\d)$", current_txt)
if m:
- return #all is well!
+ return # all is well!
- new_txt = current_txt.replace(".","")
+ new_txt = current_txt.replace(".", "")
if re.match("\d+$", new_txt):
- new_txt = "%s.%s"% (new_txt[:-2], new_txt[-2:])
+ new_txt = "%s.%s" % (new_txt[:-2], new_txt[-2:])
new_txt = new_txt.lstrip("0")
if new_txt.startswith("."):
new_txt = "0" + new_txt
else:
new_txt = "0.00"
-
+
self.setText(new_txt)
if new_txt != current_txt:
self.textEdited.emit(self.text())
-
-
+
def keyPressEvent(self, event):
'''
overrides QWidget's keypressEvent
'''
-
- if event.key() in (QtCore.Qt.Key_Tab,
- QtCore.Qt.Key_Return,
- QtCore.Qt.Key_Backspace,
- QtCore.Qt.Key_Right,
- QtCore.Qt.Key_Left,
- QtCore.Qt.Key_Delete
- ):
+
+ if event.key() in (QtCore.Qt.Key_Tab,
+ QtCore.Qt.Key_Return,
+ QtCore.Qt.Key_Backspace,
+ QtCore.Qt.Key_Right,
+ QtCore.Qt.Key_Left,
+ QtCore.Qt.Key_Delete
+ ):
QtGui.QLineEdit.keyPressEvent(self, event)
self.check_val()
- return
-
+ return
+
input_ = event.text().toAscii()
current_txt = self.text()
-
+
if not re.match("[\d]", input_):
event.ignore()
return
-
+
if current_txt == "":
- self.setText("0.0%s"% input_)
+ self.setText("0.0%s" % input_)
self.textEdited.emit(self.text())
return
-
+
pos = self.cursorPosition()
-
+
if pos != len(current_txt):
QtGui.QLineEdit.keyPressEvent(self, event)
self.check_val()
- return
-
+ return
+
m = re.match("(\d+)\.(\d)(\d)", unicode(current_txt))
if m and pos == len(current_txt):
pounds = m.groups()[0] + m.groups()[1]
pounds = pounds.lstrip("0")
- if pounds =="":
+ if pounds == "":
pounds = "0"
pence = m.groups()[2] + input_
- new_txt = "%s.%s"% (pounds, pence)
+ new_txt = "%s.%s" % (pounds, pence)
self.setText(new_txt)
self.textEdited.emit(self.text())
-
+
event.ignore()
@@ -120,4 +123,3 @@ if __name__ == "__main__":
mle = MoneyLineEdit()
mle.show()
app.exec_()
-
diff --git a/src/openmolar/qt4gui/customwidgets/notification_widget.py b/src/openmolar/qt4gui/customwidgets/notification_widget.py
index 7efd9a5..8c0ade6 100644
--- a/src/openmolar/qt4gui/customwidgets/notification_widget.py
+++ b/src/openmolar/qt4gui/customwidgets/notification_widget.py
@@ -1,14 +1,32 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
-from PyQt4 import QtGui,QtCore
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+from PyQt4 import QtGui, QtCore
class notificationGB(QtGui.QWidget):
+
'''
a customised groupBox
'''
@@ -28,8 +46,7 @@ class notificationGB(QtGui.QWidget):
self.label = QtGui.QLabel()
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setStyleSheet("color: red")
- #self.label.setWordWrap(True)
-
+ # self.label.setWordWrap(True)
icon = QtGui.QIcon.fromTheme(
"window-close", QtGui.QIcon(":/quit.png"))
@@ -40,10 +57,10 @@ class notificationGB(QtGui.QWidget):
self.line.setFrameShape(QtGui.QFrame.HLine)
self.line.setFrameShadow(QtGui.QFrame.Sunken)
- self.layout.addWidget(self.t_label,0,0)
- self.layout.addWidget(self.label,1,0)
- self.layout.addWidget(self.but,0,1,2,1)
- self.layout.addWidget(self.line,2,0,1,2)
+ self.layout.addWidget(self.t_label, 0, 0)
+ self.layout.addWidget(self.label, 1, 0)
+ self.layout.addWidget(self.but, 0, 1, 2, 1)
+ self.layout.addWidget(self.line, 2, 0, 1, 2)
self.line.hide()
@@ -60,10 +77,9 @@ class notificationGB(QtGui.QWidget):
set the label's text
'''
t = QtCore.QTime.currentTime()
- self.t_label.setText("<b>%s:%02d</b>"% (t.hour(), t.minute()))
+ self.t_label.setText("<b>%s:%02d</b>" % (t.hour(), t.minute()))
self.label.setText(message)
-
def set_minimised(self, bool_):
for widg in (self.but, self.t_label, self.label):
widg.setVisible(not bool_)
@@ -75,12 +91,15 @@ class notificationGB(QtGui.QWidget):
'''
self.acknowledged.emit()
+
class notificationWidget(QtGui.QWidget):
+
'''
a custom widget which contains children which come and go
'''
+
def __init__(self, parent=None):
- super(notificationWidget,self).__init__(parent)
+ super(notificationWidget, self).__init__(parent)
self.layout = QtGui.QVBoxLayout(self)
self.layout.setMargin(0)
self.widgets = []
@@ -122,22 +141,23 @@ if __name__ == "__main__":
from functools import partial
def test(arg=None):
- print "clicked = ",arg
+ print "clicked = ", arg
app = QtGui.QApplication([])
form = QtGui.QMainWindow()
form.setMinimumWidth(300)
nw = notificationWidget(form)
- QtCore.QObject.connect(nw,QtCore.SIGNAL("clicked()"), test)
+ QtCore.QObject.connect(nw, QtCore.SIGNAL("clicked()"), test)
for i in range(5):
- QtCore.QTimer.singleShot(i*3000,
- partial(nw.addMessage, "This is test message %d"% (i+1))
- )
+ QtCore.QTimer.singleShot(i * 3000,
+ partial(
+ nw.addMessage, "This is test message %d" %
+ (i + 1))
+ )
form.setCentralWidget(nw)
form.show()
app.exec_()
-
diff --git a/src/openmolar/qt4gui/customwidgets/perioChartWidget.py b/src/openmolar/qt4gui/customwidgets/perioChartWidget.py
index 090dde4..fc87232 100644
--- a/src/openmolar/qt4gui/customwidgets/perioChartWidget.py
+++ b/src/openmolar/qt4gui/customwidgets/perioChartWidget.py
@@ -1,53 +1,82 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
from __future__ import division
-from PyQt4 import QtGui,QtCore
+from PyQt4 import QtGui, QtCore
from openmolar.qt4gui import colours
+
class chartWidget(QtGui.QWidget):
+
'''a custom widget to show a standard UK dental chart
- allows for user navigation with mouse and/or keyboard
'''
+
def __init__(self, parent=None):
- super(chartWidget,self).__init__(parent)
- self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.\
- Expanding))
- self.grid = (8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8)
+ super(chartWidget, self).__init__(parent)
+ self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.
+ Expanding))
+ self.grid = (8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8)
self.setMinimumSize(self.minimumSizeHint())
- self.showLeftRight=True
- self.showSelected=True
- self.selected = [-1,-1]
- self.props={}
- self.type=""
+ self.showLeftRight = True
+ self.showSelected = True
+ self.selected = [-1, -1]
+ self.props = {}
+ self.type = ""
+
def sizeHint(self):
return QtCore.QSize(500, 100)
+
def minimumSizeHint(self):
return QtCore.QSize(500, 100)
- def setShowLeftRight(self,arg):
- self.showLeftRight=arg
- def setShowSelected(self,arg):
- self.showSelected=arg
- def setSelected(self,x,y):
- self.selected=[x,y]
+
+ def setShowLeftRight(self, arg):
+ self.showLeftRight = arg
+
+ def setShowSelected(self, arg):
+ self.showSelected = arg
+
+ def setSelected(self, x, y):
+ self.selected = [x, y]
self.repaint()
- self.emit(QtCore.SIGNAL("toothSelected"),self.grid[y][x]) #emit a signal that the user has selected a tooth
- def setProps(self,tooth,arg):
- if self.type=="Furcation":
- self.props[tooth]=(arg[0],127,arg[1],arg[2],127,arg[3])
- elif self.type=="Mobility":
- self.props[tooth]=(127,arg,127,127,127,127)
+ self.emit(
+ QtCore.SIGNAL("toothSelected"),
+ self.grid[y][x]) # emit a signal that the user has selected a tooth
+
+ def setProps(self, tooth, arg):
+ if self.type == "Furcation":
+ self.props[tooth] = (arg[0], 127, arg[1], arg[2], 127, arg[3])
+ elif self.type == "Mobility":
+ self.props[tooth] = (127, arg, 127, 127, 127, 127)
else:
- self.props[tooth]=arg
+ self.props[tooth] = arg
def mousePressEvent(self, event):
'''overrides QWidget's mouse event'''
xOffset = self.width() / 16
yOffset = self.height() / 2
- x= int(event.x()//xOffset)
+ x = int(event.x() // xOffset)
if event.y() < yOffset:
y = 0
else:
@@ -58,100 +87,161 @@ class chartWidget(QtGui.QWidget):
'''overrudes QWidget's keypressEvent'''
if event.key() == QtCore.Qt.Key_Left:
- self.selected[0] = 15 if self.selected[0] == 0 else self.selected[0] - 1
+ self.selected[
+ 0] = 15 if self.selected[
+ 0] == 0 else self.selected[
+ 0] - 1
elif event.key() == QtCore.Qt.Key_Right:
- self.selected[0] = 0 if self.selected[0] == 15 else self.selected[0] + 1
+ self.selected[
+ 0] = 0 if self.selected[
+ 0] == 15 else self.selected[
+ 0] + 1
elif event.key() == QtCore.Qt.Key_Up:
- self.selected[1] = 1 if self.selected[1] == 0 else self.selected[1] - 1
+ self.selected[
+ 1] = 1 if self.selected[
+ 1] == 0 else self.selected[
+ 1] - 1
elif event.key() == QtCore.Qt.Key_Down:
- self.selected[1] = 0 if self.selected[1] == 1 else self.selected[1] + 1
- event.handled=True
+ self.selected[
+ 1] = 0 if self.selected[
+ 1] == 1 else self.selected[
+ 1] + 1
+ event.handled = True
self.repaint()
- def paintEvent(self,event=None):
+
+ def paintEvent(self, event=None):
'''override the paint event so that we can draw our grid'''
painter = QtGui.QPainter(self)
painter.save()
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
- midline=self.width()/100
- painter.setPen(QtGui.QPen(QtCore.Qt.blue,1)) #red pen
+ midline = self.width() / 100
+ painter.setPen(QtGui.QPen(QtCore.Qt.blue, 1))
+ #red pen
sansFont = QtGui.QFont("Courier", 7)
painter.setFont(sansFont)
fm = QtGui.QFontMetrics(sansFont)
- leftpad=fm.width("R ")
- rightpad=fm.width(" L")
- xOffset = (self.width() - midline-leftpad-rightpad) / 16 #cell width
-
- thirdx=xOffset/3
- thirdy=self.height()/6
-
- attributeWidth=fm.width("13")
- attributeHeight=fm.height()
- painter.setPen(QtGui.QPen(QtCore.Qt.black,1)) #red pen
- textRect=QtCore.QRectF(0,0,self.width(),self.height())
- painter.drawText(textRect,QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter,(QtCore.QString("L")))
- painter.drawText(textRect,QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter,(QtCore.QString("R")))
- quadrants=("ur","ul","ll","lr")
- quadrant=-1
+ leftpad = fm.width("R ")
+ rightpad = fm.width(" L")
+ xOffset = (self.width() - midline - leftpad - rightpad) / \
+ 16 # cell width
+
+ thirdx = xOffset / 3
+ thirdy = self.height() / 6
+
+ attributeWidth = fm.width("13")
+ attributeHeight = fm.height()
+ painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
+ #red pen
+ textRect = QtCore.QRectF(0, 0, self.width(), self.height())
+ painter.drawText(
+ textRect,
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter,
+ (QtCore.QString("L")))
+ painter.drawText(
+ textRect,
+ QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter,
+ (QtCore.QString("R")))
+ quadrants = ("ur", "ul", "ll", "lr")
+ quadrant = -1
for y in range(2):
- lowerlimit=self.height()/2
- if y==0: #upper teeth
- quadrant+=1
- upperlimit=0
+ lowerlimit = self.height() / 2
+ if y == 0: # upper teeth
+ quadrant += 1
+ upperlimit = 0
else:
- upperlimit=self.height()/2
+ upperlimit = self.height() / 2
for x in range(16):
- if x==8:
- midx=midline
- quadrant+=1
- elif x==0:
- midx=0
- id = quadrants[quadrant]+str(self.grid[x])
- rect = QtCore.QRectF(x * xOffset + midx+leftpad, upperlimit,xOffset, lowerlimit)
- self.tooth(painter,rect,id[2])
- painter.setPen(QtGui.QPen(QtCore.Qt.black,1)) #red pen
+ if x == 8:
+ midx = midline
+ quadrant += 1
+ elif x == 0:
+ midx = 0
+ id = quadrants[quadrant] + str(self.grid[x])
+ rect = QtCore.QRectF(
+ x *
+ xOffset +
+ midx +
+ leftpad,
+ upperlimit,
+ xOffset,
+ lowerlimit)
+ self.tooth(painter, rect, id[2])
+ painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
+ #red pen
for i in range(3):
- ypos=thirdy/2
- if i==1:
- ypos=0
- #draw "buccal" attribs (assuming URQ)
- if self.props.has_key(id):
- buccalRect=rect.adjusted(i*thirdx,ypos,(i-2)*thirdx,-2*thirdy)
- palatalRect=rect.adjusted(i*thirdx,2*thirdy,(i-2)*thirdx,-ypos)
- buccal=True
- for attrect in (buccalRect,palatalRect):
+ ypos = thirdy / 2
+ if i == 1:
+ ypos = 0
+ # draw "buccal" attribs (assuming URQ)
+ if id in self.props:
+ buccalRect = rect.adjusted(
+ i * thirdx,
+ ypos,
+ (i - 2) * thirdx,
+ -2 * thirdy)
+ palatalRect = rect.adjusted(
+ i * thirdx,
+ 2 * thirdy,
+ (i - 2) * thirdx,
+ -ypos)
+ buccal = True
+ for attrect in (buccalRect, palatalRect):
if buccal:
- number=self.props[id][i]
+ number = self.props[id][i]
else:
- number=self.props[id][i+3]
- if number!=127:
- if self.type=="Bleeding" or self.type=="Plaque":
- text=("N","Y","D")[number] #plaque is "yes" or "no", but bleeding 2= delayed
- elif self.type=="Mobility":
- text=("","I","II","III")[number] #plaque is "yes" or "no", but bleeding 2= delayed
+ number = self.props[id][i + 3]
+ if number != 127:
+ if self.type == "Bleeding" or self.type == "Plaque":
+ text = ("N", "Y", "D")[number]
+ # plaque is "yes" or "no", but
+ # bleeding 2= delayed
+ elif self.type == "Mobility":
+ text = ("", "I", "II", "III")[number]
+ # plaque is "yes" or "no", but
+ # bleeding 2= delayed
else:
- text=str(number)
- painter.drawText(attrect,QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter,(QtCore.QString(text)))
- buccal=False
+ text = str(number)
+ painter.drawText(
+ attrect,
+ QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter,
+ (QtCore.QString(text)))
+ buccal = False
painter.setPen(QtCore.Qt.red)
- painter.drawLine(leftpad,self.height()/2,self.width()-rightpad,self.height()/2) #big horizontal dissection of entire widget
- painter.drawLine(self.width()/2,0,self.width()/2,self.height()) #vertical dissection of entire widget
+ painter.drawLine(
+ leftpad,
+ self.height() / 2,
+ self.width() - rightpad,
+ self.height() / 2)
+ #big horizontal dissection of entire widget
+ painter.drawLine(self.width() / 2, 0, self.width() / 2, self.height())
+ #vertical dissection of entire widget
painter.restore()
- def tooth(self,painter,rect,id):
- painter.setPen(QtGui.QPen(QtCore.Qt.gray,1)) #red pen
+ def tooth(self, painter, rect, id):
+ painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
+ #red pen
painter.drawRect(rect)
- painter.setPen(QtGui.QPen(QtCore.Qt.blue,1)) #red pen
+ painter.setPen(QtGui.QPen(QtCore.Qt.blue, 1))
+ #red pen
- painter.drawText(rect,QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter,(QtCore.QString(str(id))))
+ painter.drawText(
+ rect,
+ QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter,
+ (QtCore.QString(str(id))))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
form = chartWidget()
- #perioData[tooth]=(recession,pocketing,plaque,bleeding,other,suppuration,furcation,mobility)
+ # perioData[tooth]=(recession,pocketing,plaque,bleeding,other,suppuration,furcation,mobility)
- form.props={'lr1': (7, 2, 5, 7, 2, 5), 'lr3': (9, 6, 9, 9, 3, 9), 'lr2': (9, 3, 9, 9, 3, 9), 'lr5': (2, 2, 2, 2, 1, 2), 'lr4': (5, 2, 7, 5, 2, 7), 'lr7': (4, 2, 2, 4, 2, 2), 'lr6': (127, 127, 127, 127, 127, 127), 'lr8': (6, 6, 6, 6, 2, 6), 'ul8': (9, 3, 3, 9, 6, 3), 'ul2': (6, 8, 9, 6, 1, 9), 'ul3': (9, 5, 9, 9, 9, 9), 'ul1': (1, 1, 1, 1, 6, 1), 'ul6': (127, 127, 127, 127, 127, 127), 'ul7': (3, 1, 9, 3, 1, 9), 'ul4': (9, 2, 9, 9, 3, 9), 'ul5': (3, 1, 9, 3, 1, 9), 'ur4': (7, 1, 4, 7, [...]
+ form.props = {
+ 'lr1': (7, 2, 5, 7, 2, 5), 'lr3': (9, 6, 9, 9, 3, 9), 'lr2': (9, 3, 9, 9, 3, 9), 'lr5': (2, 2, 2, 2, 1, 2), 'lr4':
+ (5, 2, 7, 5, 2, 7), 'lr7': (4, 2, 2, 4, 2, 2), 'lr6': (127, 127, 127, 127, 127, 127), 'lr8': (6, 6, 6, 6, 2, 6),
+ 'ul8': (9, 3, 3, 9, 6, 3), 'ul2': (6, 8, 9, 6, 1, 9), 'ul3': (9, 5, 9, 9, 9, 9), 'ul1': (1, 1, 1, 1, 6, 1), 'ul6': (
+ 127, 127, 127, 127, 127, 127), 'ul7': (3, 1, 9, 3, 1, 9), 'ul4': (9, 2, 9, 9, 3, 9), 'ul5': (3, 1, 9, 3, 1, 9),
+ 'ur4': (7, 1, 4, 7, 1, 4), 'ur5': (7, 1, 4, 7, 4, 4), 'ur6': (127, 127, 127, 127, 127, 127), 'ur7': (9, 5, 6, 9, 7, 6), 'ur1': (9, 2, 4, 9, 1, 4), 'ur2': (9, 1, 9, 9, 8, 9), 'ur3': (8, 1, 8, 8, 1, 8), 'ur8': (8, 1, 9, 8, 6, 9), 'll8': (127, 127, 127, 127, 127, 127), 'll3': (9, 3, 9, 9, 2, 9), 'll2': (6, 6, 9, 6, 1, 9), 'll1': (8, 3, 7, 8, 4, 7), 'll7': (6, 1, 1, 6, 1, 1), 'll6': (127, 127, 127, 127, 127, 127), 'll5': (6, 5, 3, 6, 3, 3), 'll4': (9, 6, 6, 9, 1, 6)}
form.show()
sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/customwidgets/perioToothProps.py b/src/openmolar/qt4gui/customwidgets/perioToothProps.py
index 29292e4..ec0bd61 100644
--- a/src/openmolar/qt4gui/customwidgets/perioToothProps.py
+++ b/src/openmolar/qt4gui/customwidgets/perioToothProps.py
@@ -1,184 +1,245 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.compiled_uis import Ui_toothPerioProps
from openmolar.qt4gui import colours
from openmolar.settings import allowed
-class tpWidget(Ui_toothPerioProps.Ui_Form,QtGui.QWidget):
- def __init__(self,parent=None):
- super(tpWidget,self).__init__(parent)
+
+class tpWidget(Ui_toothPerioProps.Ui_Form, QtGui.QWidget):
+
+ def __init__(self, parent=None):
+ super(tpWidget, self).__init__(parent)
self.setupUi(self)
- hlayout=QtGui.QHBoxLayout(self.le_frame)
- hlayout.setContentsMargins(0,0,0,0)
- self.lineEdit=chartLineEdit()
+ hlayout = QtGui.QHBoxLayout(self.le_frame)
+ hlayout.setContentsMargins(0, 0, 0, 0)
+ self.lineEdit = chartLineEdit()
self.lineEdit.setMaxLength(2)
hlayout.addWidget(self.lineEdit)
- self.oldtooth=tooth() #self.frame)
+ self.oldtooth = tooth() # self.frame)
self.oldtooth.setEnabled(False)
- toothlayout=QtGui.QHBoxLayout(self.orig_frame)
+ toothlayout = QtGui.QHBoxLayout(self.orig_frame)
toothlayout.addWidget(self.oldtooth)
- self.tooth=tooth() #self.frame)
- toothlayout=QtGui.QHBoxLayout(self.new_frame)
+ self.tooth = tooth() # self.frame)
+ toothlayout = QtGui.QHBoxLayout(self.new_frame)
toothlayout.addWidget(self.tooth)
self.signals()
- self.originalProps={}
+ self.originalProps = {}
- def setExistingProps(self,arg):
- if arg=="":
- self.originalProps=""
+ def setExistingProps(self, arg):
+ if arg == "":
+ self.originalProps = ""
self.lineEdit.setText("")
else:
- arg=arg.strip()+":"
- arg=arg.replace(" ",":")
- self.originalProps=arg
+ arg = arg.strip() + ":"
+ arg = arg.replace(" ", ":")
+ self.originalProps = arg
self.lineEdit.setText(arg)
def clear(self):
self.lineEdit.setText("")
self.tooth.clear()
self.tooth.update()
- self.finishedEdit() #doesn';t work!
+ self.finishedEdit() # doesn';t work!
def finishedEdit(self):
- newprops=str(self.lineEdit.text().toAscii())
- self.emit(QtCore.SIGNAL("Changed_Properties"),newprops)
+ newprops = str(self.lineEdit.text().toAscii())
+ self.emit(QtCore.SIGNAL("Changed_Properties"), newprops)
- def keyNav(self,arg):
- if arg=="up":
+ def keyNav(self, arg):
+ if arg == "up":
self.prevTooth()
- elif arg=="down":
+ elif arg == "down":
self.nextTooth()
+
def leftTooth(self):
if self.tooth.isUpper:
self.prevTooth()
else:
self.nextTooth()
+
def rightTooth(self):
if not self.tooth.isUpper:
self.prevTooth()
else:
self.nextTooth()
+
def prevTooth(self):
self.finishedEdit()
- self.emit(QtCore.SIGNAL("NextTooth"),("up"))
+ self.emit(QtCore.SIGNAL("NextTooth"), ("up"))
+
def nextTooth(self):
self.finishedEdit()
- self.emit(QtCore.SIGNAL("NextTooth"),("down"))
+ self.emit(QtCore.SIGNAL("NextTooth"), ("down"))
def signals(self):
- QtCore.QObject.connect(self.clear_pushButton,QtCore.SIGNAL("clicked()"), self.clear)
- QtCore.QObject.connect(self.lineEdit,QtCore.SIGNAL("ArrowKeyPressed"),self.keyNav)
- QtCore.QObject.connect(self.rightTooth_pushButton,QtCore.SIGNAL("clicked()"), self.rightTooth)
- QtCore.QObject.connect(self.leftTooth_pushButton,QtCore.SIGNAL("clicked()"), self.leftTooth)
+ QtCore.QObject.connect(
+ self.clear_pushButton,
+ QtCore.SIGNAL("clicked()"),
+ self.clear)
+ QtCore.QObject.connect(
+ self.lineEdit,
+ QtCore.SIGNAL("ArrowKeyPressed"),
+ self.keyNav)
+ QtCore.QObject.connect(
+ self.rightTooth_pushButton,
+ QtCore.SIGNAL("clicked()"),
+ self.rightTooth)
+ QtCore.QObject.connect(
+ self.leftTooth_pushButton,
+ QtCore.SIGNAL("clicked()"),
+ self.leftTooth)
+
class tooth(QtGui.QWidget):
- def __init__(self,parent=None):
- super(tooth,self).__init__(parent)
- self.isBacktooth=True
- self.quadrant=1
- self.isUpper=True
- self.isRight=True
+
+ def __init__(self, parent=None):
+ super(tooth, self).__init__(parent)
+ self.isBacktooth = True
+ self.quadrant = 1
+ self.isUpper = True
+ self.isRight = True
self.setMouseTracking(True)
self.shapes()
self.clear()
+
def sizeHint(self):
return self.parent().size()
+
def minimumSizeHint(self):
return QtCore.QSize(80, 80)
- def setBacktooth(self,arg):
- if self.isBacktooth!=arg:
- self.isBacktooth=arg
+
+ def setBacktooth(self, arg):
+ if self.isBacktooth != arg:
+ self.isBacktooth = arg
self.shapes()
- def setRightSide(self,arg):
- self.isRight=arg
- def setUpper(self,arg):
- self.isUpper=arg
+
+ def setRightSide(self, arg):
+ self.isRight = arg
+
+ def setUpper(self, arg):
+ self.isUpper = arg
+
def clear(self):
- self.filledSurfaces=""
+ self.filledSurfaces = ""
if self.isBacktooth:
- self.fillcolour=colours.AMALGAM
+ self.fillcolour = colours.AMALGAM
else:
- self.fillcolour=colours.COMP
- def leaveEvent(self,event):
- self.mouseOverSurface=None
+ self.fillcolour = colours.COMP
+
+ def leaveEvent(self, event):
+ self.mouseOverSurface = None
self.update()
- def mouseMoveEvent(self,event):
- y=event.y()
- x=event.x()
- print "mouse moving on perio widget",x,y
+
+ def mouseMoveEvent(self, event):
+ y = event.y()
+ x = event.x()
+ print "mouse moving on perio widget", x, y
+
def mousePressEvent(self, event):
- y=event.y()
- x=event.x()
- self.emit(QtCore.SIGNAL("toothclicked")) ######not used
- def resizeEvent(self,event):
+ y = event.y()
+ x = event.x()
+ self.emit(QtCore.SIGNAL("toothclicked")) # not used
+
+ def resizeEvent(self, event):
self.shapes()
+
def shapes(self):
- self.toothRect=QtCore.QRectF(0,0,self.width(),self.height())
- irw=self.toothRect.width()*0.25 #inner rectangle width
+ self.toothRect = QtCore.QRectF(0, 0, self.width(), self.height())
+ irw = self.toothRect.width() * \
+ 0.25 # inner rectangle width
if self.isBacktooth:
- irh=self.toothRect.height()*0.25 #backtooth inner rectangle height
+ irh = self.toothRect.height() * \
+ 0.25 # backtooth inner rectangle height
else:
- irh=self.toothRect.height()*0.40 #fronttooth inner rectangle height
- self.innerRect=self.toothRect.adjusted(irw,irh,-irw,-irh)
+ irh = self.toothRect.height() * \
+ 0.40 # fronttooth inner rectangle height
+ self.innerRect = self.toothRect.adjusted(irw, irh, -irw, -irh)
- self.mesial=QtGui.QPolygon([0,0,
- self.innerRect.topLeft().x(),self.innerRect.topLeft().y(),
- self.innerRect.bottomLeft().x(),self.innerRect.bottomLeft().y(),
- self.toothRect.bottomLeft().x(),self.toothRect.bottomLeft().y()])
+ self.mesial = QtGui.QPolygon([0, 0,
+ self.innerRect.topLeft().x(
+ ), self.innerRect.topLeft().y(),
+ self.innerRect.bottomLeft().x(
+ ), self.innerRect.bottomLeft().y(),
+ self.toothRect.bottomLeft().x(), self.toothRect.bottomLeft().y()])
- self.occlusal=QtGui.QPolygon([self.innerRect.topLeft().x(),self.innerRect.topLeft().y(),
- self.innerRect.topRight().x(),self.innerRect.topRight().y(),
- self.innerRect.bottomRight().x(),self.innerRect.bottomRight().y(),
- self.innerRect.bottomLeft().x(),self.innerRect.bottomLeft().y()])
+ self.occlusal = QtGui.QPolygon(
+ [self.innerRect.topLeft().x(), self.innerRect.topLeft().y(),
+ self.innerRect.topRight().x(), self.innerRect.topRight().y(),
+ self.innerRect.bottomRight().x(
+ ), self.innerRect.bottomRight().y(),
+ self.innerRect.bottomLeft().x(), self.innerRect.bottomLeft().y()])
- self.distal=QtGui.QPolygon([self.innerRect.topRight().x(),self.innerRect.topRight().y(),
- self.toothRect.topRight().x(),self.toothRect.topRight().y(),
- self.toothRect.bottomRight().x(),self.toothRect.bottomRight().y(),
- self.innerRect.bottomRight().x(),self.innerRect.bottomRight().y()])
+ self.distal = QtGui.QPolygon(
+ [self.innerRect.topRight().x(), self.innerRect.topRight().y(),
+ self.toothRect.topRight().x(), self.toothRect.topRight().y(),
+ self.toothRect.bottomRight().x(
+ ), self.toothRect.bottomRight().y(),
+ self.innerRect.bottomRight().x(), self.innerRect.bottomRight().y()])
- self.buccal=QtGui.QPolygon([0,0,
- self.toothRect.topRight().x(),self.toothRect.topRight().y(),
- self.innerRect.topRight().x(),self.innerRect.topRight().y(),
- self.innerRect.topLeft().x(),self.innerRect.topLeft().y()])
+ self.buccal = QtGui.QPolygon([0, 0,
+ self.toothRect.topRight().x(
+ ), self.toothRect.topRight().y(),
+ self.innerRect.topRight().x(
+ ), self.innerRect.topRight().y(),
+ self.innerRect.topLeft().x(), self.innerRect.topLeft().y()])
- self.palatal=QtGui.QPolygon([self.toothRect.bottomLeft().x(),self.toothRect.bottomLeft().y(),
- self.innerRect.bottomLeft().x(),self.innerRect.bottomLeft().y(),
- self.innerRect.bottomRight().x(),self.innerRect.bottomRight().y(),
- self.toothRect.bottomRight().x(),self.toothRect.bottomRight().y()])
+ self.palatal = QtGui.QPolygon(
+ [self.toothRect.bottomLeft().x(), self.toothRect.bottomLeft().y(),
+ self.innerRect.bottomLeft().x(), self.innerRect.bottomLeft().y(),
+ self.innerRect.bottomRight().x(
+ ), self.innerRect.bottomRight().y(),
+ self.toothRect.bottomRight().x(), self.toothRect.bottomRight().y()])
- self.mouseOverSurface=None #initiate a value
+ self.mouseOverSurface = None # initiate a value
- def paintEvent(self,event=None):
+ def paintEvent(self, event=None):
'''override the paint event so that we can draw our grid'''
if self.isBacktooth:
if self.isUpper:
if self.isRight:
- surfs="DBPMO"
+ surfs = "DBPMO"
else:
- surfs="MBPDO"
+ surfs = "MBPDO"
else:
if self.isRight:
- surfs="DLBMO"
+ surfs = "DLBMO"
else:
- surfs="MLBDO"
+ surfs = "MLBDO"
else:
if self.isUpper:
if self.isRight:
- surfs="DBPMI"
+ surfs = "DBPMI"
else:
- surfs="MBPDI"
+ surfs = "MBPDI"
else:
if self.isRight:
- surfs="DLBMI"
+ surfs = "DLBMI"
else:
- surfs="MLBDI"
+ surfs = "MLBDI"
painter = QtGui.QPainter(self)
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
@@ -186,36 +247,44 @@ class tooth(QtGui.QWidget):
painter.setBrush(colours.IVORY)
painter.drawRect(self.toothRect)
painter.drawRect(self.innerRect)
- painter.drawLine(self.toothRect.topLeft(),self.innerRect.topLeft())
- painter.drawLine(self.toothRect.topRight(),self.innerRect.topRight())
- painter.drawLine(self.toothRect.bottomLeft(),self.innerRect.bottomLeft())
- painter.drawLine(self.toothRect.bottomRight(),self.innerRect.bottomRight())
+ painter.drawLine(self.toothRect.topLeft(), self.innerRect.topLeft())
+ painter.drawLine(self.toothRect.topRight(), self.innerRect.topRight())
+ painter.drawLine(
+ self.toothRect.bottomLeft(),
+ self.innerRect.bottomLeft())
+ painter.drawLine(
+ self.toothRect.bottomRight(),
+ self.innerRect.bottomRight())
option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
- rect=self.toothRect.adjusted(0,0,-self.innerRect.right(),0)
- painter.drawText(QtCore.QRectF(rect),surfs[0],option)
- rect=self.toothRect.adjusted(0,0,0,-self.innerRect.bottom())
- painter.drawText(QtCore.QRectF(rect),surfs[1],option)
- rect=self.toothRect.adjusted(0,self.innerRect.bottom(),0,0)
- painter.drawText(QtCore.QRectF(rect),surfs[2],option)
- rect=self.toothRect.adjusted(self.innerRect.right(),0,0,0)
- painter.drawText(QtCore.QRectF(rect),surfs[3],option)
- painter.drawText(QtCore.QRectF(self.innerRect),surfs[4],option)
+ rect = self.toothRect.adjusted(0, 0, -self.innerRect.right(), 0)
+ painter.drawText(QtCore.QRectF(rect), surfs[0], option)
+ rect = self.toothRect.adjusted(0, 0, 0, -self.innerRect.bottom())
+ painter.drawText(QtCore.QRectF(rect), surfs[1], option)
+ rect = self.toothRect.adjusted(0, self.innerRect.bottom(), 0, 0)
+ painter.drawText(QtCore.QRectF(rect), surfs[2], option)
+ rect = self.toothRect.adjusted(self.innerRect.right(), 0, 0, 0)
+ painter.drawText(QtCore.QRectF(rect), surfs[3], option)
+ painter.drawText(QtCore.QRectF(self.innerRect), surfs[4], option)
+
class chartLineEdit(QtGui.QLineEdit):
+
'''override the keypress event for up and down arrow keys.
'''
+
def __init__(self, parent=None):
- super(chartLineEdit,self).__init__(parent)
+ super(chartLineEdit, self).__init__(parent)
+
def keyPressEvent(self, event):
'''overrudes QWidget's keypressEvent'''
if event.key() == QtCore.Qt.Key_Up:
- self.emit(QtCore.SIGNAL("ArrowKeyPressed"),("up"))
+ self.emit(QtCore.SIGNAL("ArrowKeyPressed"), ("up"))
elif event.key() == QtCore.Qt.Key_Return:
- self.emit(QtCore.SIGNAL("ArrowKeyPressed"),("down"))
+ self.emit(QtCore.SIGNAL("ArrowKeyPressed"), ("down"))
elif event.key() == QtCore.Qt.Key_Down:
- self.emit(QtCore.SIGNAL("ArrowKeyPressed"),("down"))
+ self.emit(QtCore.SIGNAL("ArrowKeyPressed"), ("down"))
else:
- QtGui.QLineEdit.keyPressEvent(self,event)
+ QtGui.QLineEdit.keyPressEvent(self, event)
if __name__ == "__main__":
import sys
@@ -223,7 +292,6 @@ if __name__ == "__main__":
Form = QtGui.QWidget()
ui = tpWidget(Form)
ui.setExistingProps("MOD ")
- #Form.setEnabled(False)
+ # Form.setEnabled(False)
Form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/customwidgets/resources_rc.py b/src/openmolar/qt4gui/customwidgets/resources_rc.py
index bdad8da..d129694 100644
--- a/src/openmolar/qt4gui/customwidgets/resources_rc.py
+++ b/src/openmolar/qt4gui/customwidgets/resources_rc.py
@@ -1,11 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Resource object code
-#
-# Created: Tue Dec 22 11:06:41 2009
-# by: The Resource Compiler for PyQt (Qt v4.5.2)
-#
-# WARNING! All changes made in this file will be lost!
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtCore
diff --git a/src/openmolar/qt4gui/customwidgets/schedule_control.py b/src/openmolar/qt4gui/customwidgets/schedule_control.py
index 0fd638d..635854d 100644
--- a/src/openmolar/qt4gui/customwidgets/schedule_control.py
+++ b/src/openmolar/qt4gui/customwidgets/schedule_control.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
@@ -38,6 +40,7 @@ from openmolar.qt4gui.pt_diary_widget import PtDiaryWidget
LOGGER = logging.getLogger("openmolar")
+
class DiaryScheduleController(QtGui.QStackedWidget):
BROWSE_MODE = 0
SCHEDULE_MODE = 1
@@ -98,7 +101,7 @@ class DiaryScheduleController(QtGui.QStackedWidget):
diary_button.setToolTip(_("Open the patient's diary"))
icon = QtGui.QIcon(":first.png")
- self.first_appt_button = QtGui.QPushButton(icon,"")
+ self.first_appt_button = QtGui.QPushButton(icon, "")
self.first_appt_button.setToolTip(_("Launch the Appointment Wizard"))
icon = QtGui.QIcon(":back.png")
@@ -112,40 +115,40 @@ class DiaryScheduleController(QtGui.QStackedWidget):
self.appt_controls_frame = QtGui.QWidget()
layout = QtGui.QGridLayout(self.appt_controls_frame)
layout.setMargin(1)
- layout.addWidget(diary_button,0,0)
- layout.addWidget(self.first_appt_button,0,1)
- layout.addWidget(self.prev_appt_button,0,2)
- layout.addWidget(self.next_appt_button,0,3)
+ layout.addWidget(diary_button, 0, 0)
+ layout.addWidget(self.first_appt_button, 0, 1)
+ layout.addWidget(self.prev_appt_button, 0, 2)
+ layout.addWidget(self.next_appt_button, 0, 3)
self.appt_controls_frame.setSizePolicy(
QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
- QtGui.QSizePolicy.Minimum))
+ QtGui.QSizePolicy.Minimum))
# now arrange the stacked widget
- #page 0 - Browsing mode
+ # page 0 - Browsing mode
self.addWidget(QtGui.QLabel("Browsing"))
- #page 1 -- scheduling mode
+ # page 1 -- scheduling mode
widg = QtGui.QWidget()
layout = QtGui.QGridLayout(widg)
layout.setMargin(0)
- layout.addWidget(self.patient_label,0,0)
- layout.addWidget(self.get_patient_button,0,1)
- layout.addWidget(self.appt_listView,2,0,1,2)
- layout.addWidget(self.appt_controls_frame,3,0,1,2)
+ layout.addWidget(self.patient_label, 0, 0)
+ layout.addWidget(self.get_patient_button, 0, 1)
+ layout.addWidget(self.appt_listView, 2, 0, 1, 2)
+ layout.addWidget(self.appt_controls_frame, 3, 0, 1, 2)
self.addWidget(widg)
- #page 2 -- blocking mode
+ # page 2 -- blocking mode
widg = QtGui.QWidget()
layout = QtGui.QVBoxLayout(widg)
layout.addWidget(self.block_listView)
self.addWidget(widg)
- #page 4 -- notes mode
+ # page 4 -- notes mode
self.addWidget(QtGui.QLabel("Notes"))
- #connect signals
+ # connect signals
self.appointment_model.appointment_selected.connect(
self.update_selected_appointment)
@@ -193,8 +196,8 @@ class DiaryScheduleController(QtGui.QStackedWidget):
@property
def patient_text(self):
if self.pt:
- return "%s %s (%s)"% (
- self.pt.fname, self.pt.sname, self.pt.serialno)
+ return "%s %s (%s)" % (
+ self.pt.fname, self.pt.sname, self.pt.serialno)
else:
return _("No patient Selected")
@@ -328,13 +331,13 @@ class DiaryScheduleController(QtGui.QStackedWidget):
for slot in sorted(slots):
if (slot.dent in self.selectedClinicians
- and slot.day_no not in self.excluded_days) :
+ and slot.day_no not in self.excluded_days):
self.available_slots.append(slot)
def set_joint_slots(self, dent_slots, hyg_slots, max_wait=10):
LOGGER.debug(
- "ScheduleControl.set join slots %s %s"% (dent_slots, hyg_slots))
+ "ScheduleControl.set join slots %s %s" % (dent_slots, hyg_slots))
self.available_slots = []
self.hygienist_slots = []
@@ -342,11 +345,11 @@ class DiaryScheduleController(QtGui.QStackedWidget):
all_hyg_slots = []
for slot in sorted(dent_slots):
if (slot.dent in self.selectedClinicians
- and slot.day_no not in self.excluded_days) :
+ and slot.day_no not in self.excluded_days):
all_dent_slots.append(slot)
for slot in sorted(hyg_slots):
- if slot.day_no not in self.excluded_days :
+ if slot.day_no not in self.excluded_days:
all_hyg_slots.append(slot)
appt = self.appointment_model.currentAppt
@@ -373,7 +376,7 @@ class DiaryScheduleController(QtGui.QStackedWidget):
self.min_hyg_slot_length,
self.hygienist_slots)
- logging.info("WAIT TIME FOR HYGIENIST = %s minutes"% wait)
+ logging.info("WAIT TIME FOR HYGIENIST = %s minutes" % wait)
return best_slot
@property
@@ -398,10 +401,10 @@ class DiaryScheduleController(QtGui.QStackedWidget):
'''
this determines whether it is worth continuing
'''
- return ( self.is_searching and
- len(self.selectedClinicians)>0 and
- len(self.available_slots)==0
- )
+ return (self.is_searching and
+ len(self.selectedClinicians) > 0 and
+ len(self.available_slots) == 0
+ )
@property
def chosen_slot(self):
@@ -422,7 +425,7 @@ class DiaryScheduleController(QtGui.QStackedWidget):
def show_pt_diary(self):
if self.pt is None:
QtGui.QMessageBox.information(self, _("error"),
- _("No patient selected"))
+ _("No patient selected"))
return
def _find_appt(appt):
@@ -457,18 +460,20 @@ class DiaryScheduleController(QtGui.QStackedWidget):
self.appointment_model.load_from_database(self.pt)
self.enable_scheduling_buttons()
- #now force diary relayout
+ # now force diary relayout
self.appointment_selected.emit(self.appointment_model.currentAppt)
def enable_scheduling_buttons(self):
appt = self.appointment_model.currentAppt
enabled = (appt is not None and appt.unscheduled)
for but in (self.next_appt_button, self.prev_appt_button,
- self.first_appt_button):
+ self.first_appt_button):
but.setEnabled(enabled)
+
class TestWindow(QtGui.QMainWindow):
MODES = ("Browse", "Schedule", "Block", "Notes")
+
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.schedule_controller = DiaryScheduleController()
@@ -499,9 +504,8 @@ class TestWindow(QtGui.QMainWindow):
self.schedule_controller.find_appt.connect(self.sig_catcher)
self.schedule_controller.start_scheduling.connect(self.sig_catcher)
-
def set_but_text(self):
- self.but.setText("set mode (current='%s')"% self.MODES[self.mode])
+ self.but.setText("set mode (current='%s')" % self.MODES[self.mode])
def change_mode(self):
'''
@@ -516,7 +520,7 @@ class TestWindow(QtGui.QMainWindow):
def sig_catcher(self, *args):
QtGui.QMessageBox.information(self, "signal",
- "signal emitted %s"% str(args))
+ "signal emitted %s" % str(args))
if __name__ == "__main__":
import gettext
@@ -529,4 +533,3 @@ if __name__ == "__main__":
obj = TestWindow()
obj.show()
app.exec_()
-
diff --git a/src/openmolar/qt4gui/customwidgets/simple_chartwidget.py b/src/openmolar/qt4gui/customwidgets/simple_chartwidget.py
index 6dcb3f9..c61d3ef 100644
--- a/src/openmolar/qt4gui/customwidgets/simple_chartwidget.py
+++ b/src/openmolar/qt4gui/customwidgets/simple_chartwidget.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
has one class, a custom widget which inherits from QWidget
@@ -19,24 +35,26 @@ from PyQt4 import QtGui, QtCore
from openmolar.qt4gui import colours
from openmolar.settings import images
-GRID = (
-["ur8", "ur7", "ur6", "ur5", 'ur4', 'ur3', 'ur2', 'ur1',
-'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8'],
-["lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1',
-'ll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8']
+GRID = (
+ ["ur8", "ur7", "ur6", "ur5", 'ur4', 'ur3', 'ur2', 'ur1',
+ 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8'],
+ ["lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1',
+ 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8']
)
class SimpleChartWidg(QtGui.QWidget):
+
'''
a custom widget to show a standard UK dental chart
- allows for user navigation with mouse and/or keyboard
'''
+
def __init__(self, parent=None, auto_ctrl_key=False):
QtGui.QWidget.__init__(self, parent)
self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
- QtGui.QSizePolicy.Expanding))
+ QtGui.QSizePolicy.Expanding))
self.grid = GRID
@@ -82,10 +100,10 @@ class SimpleChartWidg(QtGui.QWidget):
returns a list of selected teeth in form ["ur8", "uld"]
'''
- #return (self.selected, self.multiSelection)
+ # return (self.selected, self.multiSelection)
selectedTeeth = []
for x, y in self.selected:
- self.prevSelect = (x,y)
+ self.prevSelect = (x, y)
selectedTeeth.append(self.grid[y][x])
selectedTeeth.sort(reverse=True)
return selectedTeeth
@@ -94,11 +112,11 @@ class SimpleChartWidg(QtGui.QWidget):
'''
set the tooth which is currently selected
'''
- if not (x,y) in self.selected:
- self.selected.add((x,y))
- self.prevSelect = (x,y)
+ if not (x, y) in self.selected:
+ self.selected.add((x, y))
+ self.prevSelect = (x, y)
else:
- self.selected.remove((x,y))
+ self.selected.remove((x, y))
self.update()
def mouseMoveEvent(self, event):
@@ -147,19 +165,19 @@ class SimpleChartWidg(QtGui.QWidget):
if self.grid[y][x] is None:
return
- if (x,y) not in self.selected and shiftClick and self.prevSelect:
+ if (x, y) not in self.selected and shiftClick and self.prevSelect:
prevX, prevY = self.prevSelect
- self.prevSelect = (x,y)
+ self.prevSelect = (x, y)
if x > prevX:
- setX = range(prevX, x+1)
+ setX = range(prevX, x + 1)
else:
- setX = range(x, prevX+1)
+ setX = range(x, prevX + 1)
for row in set([prevY, y]):
for col in setX:
self.selected.add((col, row))
self.update()
else:
- self.setSelected(x,y)
+ self.setSelected(x, y)
def paintEvent(self, event=None):
'''
@@ -186,7 +204,7 @@ class SimpleChartWidg(QtGui.QWidget):
#--big horizontal dissection of entire widget
painter.drawLine(leftpad, self.height() / 2, self.width() - rightpad,
- self.height() / 2)
+ self.height() / 2)
#--vertical dissection of entire widget
painter.drawLine(self.width() / 2, 0, self.width() / 2, self.height())
@@ -195,9 +213,9 @@ class SimpleChartWidg(QtGui.QWidget):
for x in range(16):
midx = midline if x > 7 else 0
for y in range(2):
- ident = self.grid[y][x]
- rect = QtCore.QRect(x * xOffset + midx, y *yOffset,
- xOffset, yOffset)
+ ident = self.grid[y][x]
+ rect = QtCore.QRect(x * xOffset + midx, y * yOffset,
+ xOffset, yOffset)
if ident is not None:
self.tooth(painter, rect.adjusted(-2, -2, 2, 2), ident)
@@ -227,11 +245,11 @@ class SimpleChartWidg(QtGui.QWidget):
if self.showLeftRight:
#--show left/right (this is done here to avoid being overwritten
#--during the rest of the paint job
- painter.drawText(textRect, QtCore.Qt.AlignRight|
- QtCore.Qt.AlignVCenter, (_("Left")))
+ painter.drawText(textRect, QtCore.Qt.AlignRight |
+ QtCore.Qt.AlignVCenter, (_("Left")))
- painter.drawText(textRect, QtCore.Qt.AlignLeft|
- QtCore.Qt.AlignVCenter, (_("Right")))
+ painter.drawText(textRect, QtCore.Qt.AlignLeft |
+ QtCore.Qt.AlignVCenter, (_("Right")))
#--free the painter's saved state
painter.restore()
@@ -249,7 +267,7 @@ class SimpleChartWidg(QtGui.QWidget):
painter.restore()
def set_regex_mask(self, mask):
- new_grid = ([],[])
+ new_grid = ([], [])
for i, arch in enumerate(self.grid):
for tooth in arch:
if re.match(mask, tooth):
@@ -269,8 +287,7 @@ if __name__ == "__main__":
from gettext import gettext as _
app = QtGui.QApplication(sys.argv)
form = SimpleChartWidg()
- #form.disable_lowers()
- #form.disable_uppers()
+ # form.disable_lowers()
+ # form.disable_uppers()
form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/customwidgets/static_control_panel.py b/src/openmolar/qt4gui/customwidgets/static_control_panel.py
index 0798972..7d64b31 100644
--- a/src/openmolar/qt4gui/customwidgets/static_control_panel.py
+++ b/src/openmolar/qt4gui/customwidgets/static_control_panel.py
@@ -1,29 +1,33 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2010-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from functools import partial
from PyQt4 import QtCore, QtGui
+
class StaticControlPanel(QtGui.QWidget):
+
'''
emits such strings as "AT", "TM", "RP" etc.
'''
@@ -65,7 +69,6 @@ class StaticControlPanel(QtGui.QWidget):
ue_button.setFocusPolicy(QtCore.Qt.NoFocus)
ue_button.setToolTip(_("Mark the selected tooth as partially erupted"))
-
dec_button = QtGui.QPushButton("Deciduous")
dec_button.setFocusPolicy(QtCore.Qt.NoFocus)
dec_button.setToolTip(_("Toggle selected tooth/teeth as deciduous"))
@@ -100,7 +103,7 @@ class StaticControlPanel(QtGui.QWidget):
dec_button.clicked.connect(self.deciduous_signal.emit)
def sizeHint(self):
- return QtCore.QSize(150,150)
+ return QtCore.QSize(150, 150)
def _but_clicked(self, message):
self.clicked.emit(message)
@@ -123,5 +126,5 @@ if __name__ == "__main__":
widg = StaticControlPanel()
widg.clicked.connect(sig_catcher)
widg.show()
- widg.setEnabled(1==2)
- app.exec_()
\ No newline at end of file
+ widg.setEnabled(1 == 2)
+ app.exec_()
diff --git a/src/openmolar/qt4gui/customwidgets/toothProps.py b/src/openmolar/qt4gui/customwidgets/toothProps.py
index f58d230..5ab2bdd 100644
--- a/src/openmolar/qt4gui/customwidgets/toothProps.py
+++ b/src/openmolar/qt4gui/customwidgets/toothProps.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009-2013 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import re
@@ -25,12 +41,15 @@ from openmolar.qt4gui.dialogs import toothprop_fulledit
LOGGER = logging.getLogger("openmolar")
+
class chartLineEdit(QtGui.QLineEdit):
+
'''
A custom line edit that accepts only BLOCK LETTERS
and is self aware when verification is needed
override the keypress event for up and down arrow keys.
'''
+
def __init__(self, parent=None):
QtGui.QLineEdit.__init__(self, parent)
self.om_gui = parent
@@ -67,12 +86,12 @@ class chartLineEdit(QtGui.QLineEdit):
'''
props = str(self.text().toAscii())
if props != "" or (props == "" and self.originalPropList != []):
- if not re.match ("..* $", props):
+ if not re.match("..* $", props):
if props != "":
props = props + " "
self.emit(QtCore.SIGNAL("Changed_Properties"), props)
- def additional(self, checkedAlready = False):
+ def additional(self, checkedAlready=False):
'''
we have finished editing, and moving on
'''
@@ -93,10 +112,10 @@ class chartLineEdit(QtGui.QLineEdit):
def updateFromPropList(self, propList):
text = ""
for prop in propList:
- if not prop in (""," "):
- text += "%s "% prop
+ if not prop in ("", " "):
+ text += "%s " % prop
self.setKnownProps(text)
- ##not sure these are needed??
+ # not sure these are needed??
self.om_gui.tooth.clear()
self.om_gui.tooth.update()
self.finishedEdit()
@@ -122,7 +141,7 @@ class chartLineEdit(QtGui.QLineEdit):
verified = True
for prop in snapshotPropList:
if (self.om_gui.selectedChart == "st" and
- not self.propAllowed(prop)):
+ not self.propAllowed(prop)):
verified = False
else:
self.originalPropList.append(prop)
@@ -164,34 +183,35 @@ class chartLineEdit(QtGui.QLineEdit):
'''
check to see if the user has entered garbage
'''
- #print "checking Prop '%s' origs ='%s'"% (prop, self.originalPropList),
- if prop[:1] == "!": #comment
+ # print "checking Prop '%s' origs ='%s'"% (prop,
+ # self.originalPropList),
+ if prop[:1] == "!": # comment
return True
if prop in self.originalPropList:
# print "already present, ignoring"
return True
allowedCode = True
- if prop!= "":
+ if prop != "":
if self.om_gui.tooth.isBacktooth and not (prop in allowed.backToothCodes):
allowedCode = False
if not self.om_gui.tooth.isBacktooth and \
- not (prop in allowed.frontToothCodes):
+ not (prop in allowed.frontToothCodes):
allowedCode = False
if (not self.om_gui.is_Static) and (prop in allowed.treatment_only):
allowedCode = True
if not allowedCode:
message = '''"%s" is not recognised <br />
- do you want to accept anyway?'''% prop
+ do you want to accept anyway?''' % prop
input = QtGui.QMessageBox.question(self, "Confirm", message,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.No )
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No)
if input == QtGui.QMessageBox.Yes:
allowedCode = True
else:
allowedCode = False
if allowedCode:
- LOGGER.debug("toothProps - accepting new entry '%s'"% prop)
+ LOGGER.debug("toothProps - accepting new entry '%s'" % prop)
return allowedCode
def specialKeyPressed(self, arg):
@@ -199,7 +219,7 @@ class chartLineEdit(QtGui.QLineEdit):
handles the events when a user hits space, up, down or return
'''
if arg in ("up", "down"):
- self.emit(QtCore.SIGNAL("NavKeyPressed"),(arg))
+ self.emit(QtCore.SIGNAL("NavKeyPressed"), (arg))
else:
self.additional()
@@ -212,43 +232,56 @@ class chartLineEdit(QtGui.QLineEdit):
elif event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Down):
self.specialKeyPressed("down")
elif event.key() == QtCore.Qt.Key_Space:
- QtGui.QLineEdit.keyPressEvent(self,event)
+ QtGui.QLineEdit.keyPressEvent(self, event)
self.specialKeyPressed("space")
else:
inputT = event.text().toAscii()
if re.match("[a-z]", inputT):
#-- catch and overwrite any lower case
event = QtGui.QKeyEvent(event.type(), event.key(),
- event.modifiers(), event.text().toUpper())
+ event.modifiers(), event.text().toUpper())
if not (inputT == "!" and not self.om_gui.is_Static):
- #don't allow comments if not in static
- QtGui.QLineEdit.keyPressEvent(self,event)
+ # don't allow comments if not in static
+ QtGui.QLineEdit.keyPressEvent(self, event)
+
class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
static_chosen = QtCore.pyqtSignal(object)
+
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.om_gui = parent
self.setupUi(self)
- hlayout=QtGui.QHBoxLayout(self.editframe)
- hlayout.setContentsMargins(0,0,0,0)
- self.lineEdit=chartLineEdit(self)
- self.lineEdit.setMaxLength(34) #as defined in the sql tables for a static entry - may exceed the plan stuff.... but I will validate that anyway.
+ hlayout = QtGui.QHBoxLayout(self.editframe)
+ hlayout.setContentsMargins(0, 0, 0, 0)
+ self.lineEdit = chartLineEdit(self)
+ self.lineEdit.setMaxLength(
+ 34) # as defined in the sql tables for a static entry - may exceed the plan stuff.... but I will validate that anyway.
hlayout.addWidget(self.lineEdit)
- self.tooth = Tooth() #self.frame)
+ self.tooth = Tooth()
self.toothlayout = QtGui.QHBoxLayout(self.frame)
- self.toothlayout.setContentsMargins(0,0,0,0)
+ self.toothlayout.setContentsMargins(2, 2, 2, 2)
+ self.toothlayout.setSpacing(2)
self.toothlayout.addWidget(self.tooth)
+
+ icon = QtGui.QIcon(":/pin.png")
+ pin_button = QtGui.QPushButton(icon, "")
+ pin_button.setMaximumWidth(30)
+ pin_button.setSizePolicy(
+ QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+ pin_button.setToolTip(_("Toggle Pin Retention for current Filling"))
+ self.toothlayout.addWidget(pin_button)
+
self.am_pushButton.setStyleSheet(
- "background-color: %s"% colours.AMALGAM_ )
+ "background-color: %s" % colours.AMALGAM_)
self.co_pushButton.setStyleSheet(
- "background-color: %s"% colours.COMP_ )
+ "background-color: %s" % colours.COMP_)
self.gl_pushButton.setStyleSheet(
- "background-color: %s"% colours.GI_ )
+ "background-color: %s" % colours.GI_)
self.gold_pushButton.setStyleSheet(
- "background-color: %s"% colours.GOLD_ )
+ "background-color: %s" % colours.GOLD_)
self.porc_pushButton.setStyleSheet(
- "background-color: %s"% colours.PORC_ )
+ "background-color: %s" % colours.PORC_)
self.is_Static = False
self.selectedChart = ""
@@ -278,6 +311,7 @@ class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
self.cb_scrollArea.setWidgetResizable(True)
self.signals()
+ pin_button.clicked.connect(self.toggle_pin)
def sizeHint(self):
return QtCore.QSize(120, 500)
@@ -292,7 +326,7 @@ class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
self.selectedTooth = selectedTooth
- self.tooth.setBacktooth(int(selectedTooth[2])>3)
+ self.tooth.setBacktooth(int(selectedTooth[2]) > 3)
self.tooth.setRightSide(selectedTooth[1] == "r")
self.tooth.setUpper(selectedTooth[0] == "u")
@@ -305,11 +339,11 @@ class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
if selectedChart == "st":
self.isStatic(True)
- props = self.om_gui.pt.__dict__["%sst"% selectedTooth]
+ props = self.om_gui.pt.__dict__["%sst" % selectedTooth]
else:
self.isStatic(False)
props = self.om_gui.pt.treatment_course.__dict__[
- "%s%s"% (selectedTooth, selectedChart)]
+ "%s%s" % (selectedTooth, selectedChart)]
self.setExistingProps(props)
@@ -318,8 +352,8 @@ class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
make the widget aware which chart it is linked to
'''
self.selectedChart = arg
- self.isStatic(arg=="st")
- self.static_chosen.emit(arg=="st")
+ self.isStatic(arg == "st")
+ self.static_chosen.emit(arg == "st")
def isStatic(self, arg):
'''
@@ -330,16 +364,16 @@ class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
self.comments_comboBox.setEnabled(arg)
self.ex_pushButton.setEnabled(not arg)
- def comments(self,arg):
+ def comments(self, arg):
'''
comments combobox has been nav'd
'''
- if arg ==_("ADD COMMENTS"):
+ if arg == _("ADD COMMENTS"):
return
- elif arg ==_("DELETE COMMENTS"):
+ elif arg == _("DELETE COMMENTS"):
self.lineEdit.deleteComments()
else:
- newComment = "%s"% arg.replace(" ","_")
+ newComment = "%s" % arg.replace(" ", "_")
self.lineEdit.addItem(newComment)
self.comments_comboBox.setCurrentIndex(0)
@@ -356,7 +390,7 @@ class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
lineEdit.setText(self.lineEdit.text())
dl = toothprop_fulledit.editor(self.selectedTooth, self.selectedChart,
- lineEdit, Dialog)
+ lineEdit, Dialog)
if dl.exec_():
self.lineEdit.setText(dl.result)
@@ -369,70 +403,110 @@ class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
def updateSurfaces(self):
existing = str(self.lineEdit.text().toAscii())
- if " " in existing: #we have an existing filling/property in the tooth
+ if " " in existing: # we have an existing filling/property in the tooth
colonPos = existing.rindex(" ")
- keep = existing[:colonPos+1]
+ keep = existing[:colonPos + 1]
currentFill = existing[colonPos:]
- else: #we don't
+ else: # we don't
keep = ""
currentFill = existing
- if "," in currentFill: #we have a material
+ if "," in currentFill: # we have a material
split = currentFill.split(",")
mat = "," + split[1]
- currentFill = self.tooth.filledSurfaces+mat
- elif "/" in currentFill: #we have a lab item
+ currentFill = self.tooth.filledSurfaces + mat
+ elif "/" in currentFill: # we have a lab item
split = currentFill.split("/")
- mat = split[0]+"/"
- currentFill = mat+self.tooth.filledSurfaces
- else: #virgin tooth
+ mat = split[0] + "/"
+ currentFill = mat + self.tooth.filledSurfaces
+ else: # virgin tooth
currentFill = self.tooth.filledSurfaces
- self.lineEdit.setText(keep+currentFill)
- def changeFillColour(self,arg):
- self.tooth.fillcolour=arg
+ if currentFill.startswith(",") or currentFill.endswith("/ "):
+ currentFill = ""
+
+ self.lineEdit.setText(keep + currentFill)
+
+ def changeFillColour(self, arg):
+ self.tooth.fillcolour = arg
self.tooth.update()
- def plasticMaterial(self,arg):
- existing=str(self.lineEdit.text().toAscii())
+ def plasticMaterial(self, arg):
+ existing = str(self.lineEdit.text().toAscii())
if " " in existing:
- colonPos=existing.rindex(" ")
- keep=existing[:colonPos+1]
- currentFill=existing[colonPos+1:]
+ colonPos = existing.rindex(" ")
+ keep = existing[:colonPos + 1]
+ currentFill = existing[colonPos + 1:]
else:
- keep=""
- currentFill=existing
- if "," in currentFill: #already a material set! replace it.
- split=currentFill.split(",")
- surfaces=split[0]
- currentFill=surfaces+","+arg
- elif "/" in currentFill: #already has a lab item
- split=currentFill.split("/")
- surfaces=split[1]
- currentFill=surfaces+","+arg
+ keep = ""
+ currentFill = existing
+ pinned = ",PR" in currentFill
+ if pinned:
+ currentFill = currentFill.replace(",PR", "")
+ if currentFill.strip(" ") == "":
+ return
+ if "/" in currentFill: # already has a lab item
+ split = currentFill.split("/")
+ surfaces = split[1]
+ currentFill = surfaces + "," + arg
+ elif "," in currentFill: # already a material set! replace it.
+ split = currentFill.split(",")
+ surfaces = split[0]
+ currentFill = surfaces + "," + arg
else:
- currentFill+=","+arg
- self.lineEdit.setText(keep+currentFill)
+ currentFill += "," + arg
+
+ if pinned:
+ currentFill += ",PR"
+
+ self.lineEdit.setText(keep + currentFill)
- def labMaterial(self,arg):
- existing=str(self.lineEdit.text().toAscii())
+ def toggle_pin(self):
+ existing = str(self.lineEdit.text().toAscii())
if " " in existing:
- colonPos=existing.rindex(" ")
- keep=existing[:colonPos+1]
- currentFill=existing[colonPos+1:]
+ colonPos = existing.rindex(" ")
+ keep = existing[:colonPos + 1]
+ current = existing[colonPos + 1:]
else:
- keep=""
- currentFill=existing
- if "," in currentFill: #already a material set! replace it.
- split=currentFill.split(",")
- surfaces=split[0]
- currentFill=arg+"/"+surfaces
- elif "/" in currentFill: #already has a lab item
- split=currentFill.split("/")
- surfaces=split[1]
- currentFill=arg+"/"+surfaces
+ keep = ""
+ current = existing
+ if current.strip(" ") == "":
+ return
+ if ",PR" in current:
+ current = current.replace(",PR", "")
else:
- currentFill=arg+"/"+currentFill
- self.lineEdit.setText(keep+currentFill)
+ current += ",PR"
+ self.lineEdit.setText(keep + current)
+
+ def labMaterial(self, arg):
+ existing = str(self.lineEdit.text().toAscii())
+ if " " in existing:
+ colonPos = existing.rindex(" ")
+ keep = existing[:colonPos + 1]
+ currentFill = existing[colonPos + 1:]
+ else:
+ keep = ""
+ currentFill = existing
+ if currentFill.strip(" ") == "":
+ return
+ pinned = ",PR" in currentFill
+ if pinned:
+ currentFill = currentFill.replace(",PR", "")
+
+ if "," in currentFill: # already a material set! replace it.
+ split = currentFill.split(",")
+ surfaces = split[0]
+ currentFill = arg + "/" + surfaces
+ elif "/" in currentFill: # already has a lab item
+ split = currentFill.split("/")
+ surfaces = split[1]
+ currentFill = arg + "/" + surfaces
+ else:
+ currentFill = arg + "/" + currentFill
+
+ if pinned:
+ currentFill += ",PR"
+
+ self.lineEdit.setText(keep + currentFill)
def am(self):
self.changeFillColour(colours.AMALGAM)
@@ -475,12 +549,12 @@ class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
def prevTooth(self):
if self.lineEdit.verifyProps():
self.lineEdit.finishedEdit()
- self.emit(QtCore.SIGNAL("NextTooth"),("up"))
+ self.emit(QtCore.SIGNAL("NextTooth"), ("up"))
def nextTooth(self):
if self.lineEdit.verifyProps():
self.lineEdit.finishedEdit()
- self.emit(QtCore.SIGNAL("NextTooth"),("down"))
+ self.emit(QtCore.SIGNAL("NextTooth"), ("down"))
def static_input(self, value):
self.lineEdit.addItem(value)
@@ -514,7 +588,7 @@ class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
dl = BridgeDialog(self.om_gui)
if dl.exec_():
for tooth, tx in dl.chosen_treatments:
- LOGGER.debug("adding bridge unit '%s' '%s'"% (tooth, tx))
+ LOGGER.debug("adding bridge unit '%s' '%s'" % (tooth, tx))
self.setTooth(tooth, self.selectedChart)
self.lineEdit.addItem(tx)
self.lineEdit.additional()
@@ -563,51 +637,51 @@ class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
def signals(self):
QtCore.QObject.connect(self.am_pushButton,
- QtCore.SIGNAL("clicked()"), self.am)
+ QtCore.SIGNAL("clicked()"), self.am)
QtCore.QObject.connect(self.co_pushButton,
- QtCore.SIGNAL("clicked()"), self.co)
+ QtCore.SIGNAL("clicked()"), self.co)
QtCore.QObject.connect(self.gl_pushButton,
- QtCore.SIGNAL("clicked()"), self.gl)
+ QtCore.SIGNAL("clicked()"), self.gl)
QtCore.QObject.connect(self.gold_pushButton,
- QtCore.SIGNAL("clicked()"), self.go)
+ QtCore.SIGNAL("clicked()"), self.go)
QtCore.QObject.connect(self.porc_pushButton,
- QtCore.SIGNAL("clicked()"), self.pi)
+ QtCore.SIGNAL("clicked()"), self.pi)
- #user has clicked a surface
- QtCore.QObject.connect(self.tooth,QtCore.
- SIGNAL("toothSurface"), self.updateSurfaces)
+ # user has clicked a surface
+ QtCore.QObject.connect(self.tooth, QtCore.
+ SIGNAL("toothSurface"), self.updateSurfaces)
QtCore.QObject.connect(self.clear_pushButton,
- QtCore.SIGNAL("clicked()"), self.lineEdit.removeEndItem)
+ QtCore.SIGNAL("clicked()"), self.lineEdit.removeEndItem)
QtCore.QObject.connect(self.edit_pushButton,
- QtCore.SIGNAL("clicked()"), self.fulledit)
+ QtCore.SIGNAL("clicked()"), self.fulledit)
QtCore.QObject.connect(self.pushButton,
- QtCore.SIGNAL("clicked()"), self.lineEdit.additional)
+ QtCore.SIGNAL("clicked()"), self.lineEdit.additional)
QtCore.QObject.connect(self.lineEdit,
- QtCore.SIGNAL("NavKeyPressed"),self.keyNav)
+ QtCore.SIGNAL("NavKeyPressed"), self.keyNav)
QtCore.QObject.connect(self.rightTooth_pushButton,
- QtCore.SIGNAL("clicked()"), self.rightTooth)
+ QtCore.SIGNAL("clicked()"), self.rightTooth)
QtCore.QObject.connect(self.leftTooth_pushButton,
- QtCore.SIGNAL("clicked()"), self.leftTooth)
+ QtCore.SIGNAL("clicked()"), self.leftTooth)
QtCore.QObject.connect(self.ex_pushButton,
- QtCore.SIGNAL("clicked()"), self.ex)
+ QtCore.SIGNAL("clicked()"), self.ex)
QtCore.QObject.connect(self.rt_pushButton,
- QtCore.SIGNAL("clicked()"), self.rt)
+ QtCore.SIGNAL("clicked()"), self.rt)
self.dressing_pushButton.clicked.connect(self.dressing)
QtCore.QObject.connect(self.comments_comboBox,
- QtCore.SIGNAL("currentIndexChanged (const QString&)"), self.comments)
+ QtCore.SIGNAL("currentIndexChanged (const QString&)"), self.comments)
self.crown_but.clicked.connect(self.crown)
self.post_but.clicked.connect(self.posts)
@@ -618,7 +692,9 @@ class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
self.endo_but.clicked.connect(self.endo_but_clicked)
self.surgical_but.clicked.connect(self.surgical_but_clicked)
+
class Tooth(QtGui.QWidget):
+
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.isBacktooth = True
@@ -635,172 +711,188 @@ class Tooth(QtGui.QWidget):
def minimumSizeHint(self):
return QtCore.QSize(80, 80)
- def setBacktooth(self,arg):
- if self.isBacktooth!=arg:
- self.isBacktooth=arg
+ def setBacktooth(self, arg):
+ if self.isBacktooth != arg:
+ self.isBacktooth = arg
self.shapes()
- def setRightSide(self,arg):
- self.isRight=arg
+ def setRightSide(self, arg):
+ self.isRight = arg
- def setUpper(self,arg):
- self.isUpper=arg
+ def setUpper(self, arg):
+ self.isUpper = arg
def clear(self):
- self.filledSurfaces=""
+ self.filledSurfaces = ""
if self.isBacktooth:
- self.fillcolour=colours.AMALGAM
+ self.fillcolour = colours.AMALGAM
else:
- self.fillcolour=colours.COMP
+ self.fillcolour = colours.COMP
- def sortSurfaces(self,arg):
- '''sort the filling surfaces to fit with conventional notation eg... MOD not DOM etc..'''
- retarg=""
+ def sortSurfaces(self, arg):
+ '''
+ sort the filling surfaces to fit with conventional notation
+ eg... MOD not DOM etc..
+ '''
+ retarg = ""
if "M" in arg:
- retarg+="M"
+ retarg += "M"
if "D" in arg and not "M" in retarg:
- retarg+="D"
+ retarg += "D"
if "O" in arg:
- retarg+="O"
+ retarg += "O"
if "D" in arg and not "D" in retarg:
- retarg+="D"
+ retarg += "D"
if "B" in arg:
- retarg+="B"
+ retarg += "B"
if "P" in arg:
- retarg+="P"
+ retarg += "P"
if "L" in arg:
- retarg+="L"
+ retarg += "L"
if "I" in arg:
- retarg+="I"
+ retarg += "I"
return retarg
- def setFilledSurfaces(self,arg):
+ def setFilledSurfaces(self, arg):
if arg in self.filledSurfaces:
- self.filledSurfaces=self.filledSurfaces.replace(arg,"")
+ self.filledSurfaces = self.filledSurfaces.replace(arg, "")
else:
- self.filledSurfaces+=arg
- self.filledSurfaces=self.sortSurfaces(self.filledSurfaces)
+ self.filledSurfaces += arg
+ self.filledSurfaces = self.sortSurfaces(self.filledSurfaces)
self.update()
- def leaveEvent(self,event):
- self.mouseOverSurface=None
+ def leaveEvent(self, event):
+ self.mouseOverSurface = None
self.update()
- def mouseMoveEvent(self,event):
- y=event.y()
- x=event.x()
- if self.mesial.containsPoint(QtCore.QPoint(x,y),QtCore.Qt.OddEvenFill):
- self.mouseOverSurface=self.mesial
+ def mouseMoveEvent(self, event):
+ y = event.y()
+ x = event.x()
+ if self.mesial.containsPoint(QtCore.QPoint(x, y), QtCore.Qt.OddEvenFill):
+ self.mouseOverSurface = self.mesial
self.update()
- elif self.occlusal.containsPoint(QtCore.QPoint(x,y),QtCore.Qt.OddEvenFill):
- self.mouseOverSurface=self.occlusal
+ elif self.occlusal.containsPoint(QtCore.QPoint(x, y), QtCore.Qt.OddEvenFill):
+ self.mouseOverSurface = self.occlusal
self.update()
- elif self.distal.containsPoint(QtCore.QPoint(x,y),QtCore.Qt.OddEvenFill):
- self.mouseOverSurface=self.distal
+ elif self.distal.containsPoint(QtCore.QPoint(x, y), QtCore.Qt.OddEvenFill):
+ self.mouseOverSurface = self.distal
self.update()
- elif self.buccal.containsPoint(QtCore.QPoint(x,y),QtCore.Qt.OddEvenFill):
- self.mouseOverSurface=self.buccal
+ elif self.buccal.containsPoint(QtCore.QPoint(x, y), QtCore.Qt.OddEvenFill):
+ self.mouseOverSurface = self.buccal
self.update()
- elif self.palatal.containsPoint(QtCore.QPoint(x,y),QtCore.Qt.OddEvenFill):
- self.mouseOverSurface=self.palatal
+ elif self.palatal.containsPoint(QtCore.QPoint(x, y), QtCore.Qt.OddEvenFill):
+ self.mouseOverSurface = self.palatal
self.update()
def mousePressEvent(self, event):
- y=event.y()
- x=event.x()
- if self.mesial.containsPoint(QtCore.QPoint(x,y),QtCore.Qt.OddEvenFill):
+ y = event.y()
+ x = event.x()
+ if self.mesial.containsPoint(QtCore.QPoint(x, y), QtCore.Qt.OddEvenFill):
if self.isRight:
self.setFilledSurfaces("D")
else:
self.setFilledSurfaces("M")
- elif self.occlusal.containsPoint(QtCore.QPoint(x,y),QtCore.Qt.OddEvenFill):
+ elif self.occlusal.containsPoint(QtCore.QPoint(x, y), QtCore.Qt.OddEvenFill):
if self.isBacktooth:
self.setFilledSurfaces("O")
else:
self.setFilledSurfaces("I")
- elif self.distal.containsPoint(QtCore.QPoint(x,y),QtCore.Qt.OddEvenFill):
+ elif self.distal.containsPoint(QtCore.QPoint(x, y), QtCore.Qt.OddEvenFill):
if not self.isRight:
self.setFilledSurfaces("D")
else:
self.setFilledSurfaces("M")
- elif self.buccal.containsPoint(QtCore.QPoint(x,y),QtCore.Qt.OddEvenFill):
+ elif self.buccal.containsPoint(QtCore.QPoint(x, y), QtCore.Qt.OddEvenFill):
if self.isUpper:
self.setFilledSurfaces("B")
else:
self.setFilledSurfaces("L")
- elif self.palatal.containsPoint(QtCore.QPoint(x,y),QtCore.Qt.OddEvenFill):
+ elif self.palatal.containsPoint(QtCore.QPoint(x, y), QtCore.Qt.OddEvenFill):
if self.isUpper:
self.setFilledSurfaces("P")
else:
self.setFilledSurfaces("B")
else:
- return #missed!!
+ return # missed!!
self.emit(QtCore.SIGNAL("toothSurface"))
- def resizeEvent(self,event):
+ def resizeEvent(self, event):
self.shapes()
def shapes(self):
- self.toothRect=QtCore.QRectF(0,0,self.width(),self.height())
- irw=self.toothRect.width()*0.25 #inner rectangle width
+ self.toothRect = QtCore.QRectF(0, 0, self.width(), self.height())
+ irw = self.toothRect.width() * \
+ 0.25 # inner rectangle width
if self.isBacktooth:
- irh=self.toothRect.height()*0.25 #backtooth inner rectangle height
+ irh = self.toothRect.height() * \
+ 0.25 # backtooth inner rectangle height
else:
- irh=self.toothRect.height()*0.40 #fronttooth inner rectangle height
- self.innerRect=self.toothRect.adjusted(irw,irh,-irw,-irh)
-
- self.mesial=QtGui.QPolygon([0,0,
- self.innerRect.topLeft().x(),self.innerRect.topLeft().y(),
- self.innerRect.bottomLeft().x(),self.innerRect.bottomLeft().y(),
- self.toothRect.bottomLeft().x(),self.toothRect.bottomLeft().y()])
-
- self.occlusal=QtGui.QPolygon([self.innerRect.topLeft().x(),self.innerRect.topLeft().y(),
- self.innerRect.topRight().x(),self.innerRect.topRight().y(),
- self.innerRect.bottomRight().x(),self.innerRect.bottomRight().y(),
- self.innerRect.bottomLeft().x(),self.innerRect.bottomLeft().y()])
-
- self.distal=QtGui.QPolygon([self.innerRect.topRight().x(),self.innerRect.topRight().y(),
- self.toothRect.topRight().x(),self.toothRect.topRight().y(),
- self.toothRect.bottomRight().x(),self.toothRect.bottomRight().y(),
- self.innerRect.bottomRight().x(),self.innerRect.bottomRight().y()])
-
- self.buccal=QtGui.QPolygon([0,0,
- self.toothRect.topRight().x(),self.toothRect.topRight().y(),
- self.innerRect.topRight().x(),self.innerRect.topRight().y(),
- self.innerRect.topLeft().x(),self.innerRect.topLeft().y()])
-
- self.palatal=QtGui.QPolygon([self.toothRect.bottomLeft().x(),self.toothRect.bottomLeft().y(),
- self.innerRect.bottomLeft().x(),self.innerRect.bottomLeft().y(),
- self.innerRect.bottomRight().x(),self.innerRect.bottomRight().y(),
- self.toothRect.bottomRight().x(),self.toothRect.bottomRight().y()])
-
- self.mouseOverSurface=None #initiate a value
-
- def paintEvent(self,event=None):
+ irh = self.toothRect.height() * \
+ 0.40 # fronttooth inner rectangle height
+ self.innerRect = self.toothRect.adjusted(irw, irh, -irw, -irh)
+
+ self.mesial = QtGui.QPolygon([0, 0,
+ self.innerRect.topLeft().x(
+ ), self.innerRect.topLeft().y(),
+ self.innerRect.bottomLeft().x(
+ ), self.innerRect.bottomLeft().y(),
+ self.toothRect.bottomLeft().x(), self.toothRect.bottomLeft().y()])
+
+ self.occlusal = QtGui.QPolygon(
+ [self.innerRect.topLeft().x(), self.innerRect.topLeft().y(),
+ self.innerRect.topRight().x(), self.innerRect.topRight().y(),
+ self.innerRect.bottomRight().x(
+ ), self.innerRect.bottomRight().y(),
+ self.innerRect.bottomLeft().x(), self.innerRect.bottomLeft().y()])
+
+ self.distal = QtGui.QPolygon(
+ [self.innerRect.topRight().x(), self.innerRect.topRight().y(),
+ self.toothRect.topRight().x(), self.toothRect.topRight().y(),
+ self.toothRect.bottomRight().x(
+ ), self.toothRect.bottomRight().y(),
+ self.innerRect.bottomRight().x(), self.innerRect.bottomRight().y()])
+
+ self.buccal = QtGui.QPolygon([0, 0,
+ self.toothRect.topRight().x(
+ ), self.toothRect.topRight().y(),
+ self.innerRect.topRight().x(
+ ), self.innerRect.topRight().y(),
+ self.innerRect.topLeft().x(), self.innerRect.topLeft().y()])
+
+ self.palatal = QtGui.QPolygon(
+ [self.toothRect.bottomLeft().x(), self.toothRect.bottomLeft().y(),
+ self.innerRect.bottomLeft().x(), self.innerRect.bottomLeft().y(),
+ self.innerRect.bottomRight().x(
+ ), self.innerRect.bottomRight().y(),
+ self.toothRect.bottomRight().x(), self.toothRect.bottomRight().y()])
+
+ self.mouseOverSurface = None # initiate a value
+
+ def paintEvent(self, event=None):
'''override the paint event so that we can draw our grid'''
if self.isBacktooth:
if self.isUpper:
if self.isRight:
- surfs="DBPMO"
+ surfs = "DBPMO"
else:
- surfs="MBPDO"
+ surfs = "MBPDO"
else:
if self.isRight:
- surfs="DLBMO"
+ surfs = "DLBMO"
else:
- surfs="MLBDO"
+ surfs = "MLBDO"
else:
if self.isUpper:
if self.isRight:
- surfs="DBPMI"
+ surfs = "DBPMI"
else:
- surfs="MBPDI"
+ surfs = "MBPDI"
else:
if self.isRight:
- surfs="DLBMI"
+ surfs = "DLBMI"
else:
- surfs="MLBDI"
+ surfs = "MLBDI"
painter = QtGui.QPainter(self)
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
@@ -808,20 +900,24 @@ class Tooth(QtGui.QWidget):
painter.setBrush(colours.IVORY)
painter.drawRect(self.toothRect)
painter.drawRect(self.innerRect)
- painter.drawLine(self.toothRect.topLeft(),self.innerRect.topLeft())
- painter.drawLine(self.toothRect.topRight(),self.innerRect.topRight())
- painter.drawLine(self.toothRect.bottomLeft(),self.innerRect.bottomLeft())
- painter.drawLine(self.toothRect.bottomRight(),self.innerRect.bottomRight())
+ painter.drawLine(self.toothRect.topLeft(), self.innerRect.topLeft())
+ painter.drawLine(self.toothRect.topRight(), self.innerRect.topRight())
+ painter.drawLine(
+ self.toothRect.bottomLeft(),
+ self.innerRect.bottomLeft())
+ painter.drawLine(
+ self.toothRect.bottomRight(),
+ self.innerRect.bottomRight())
option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
- rect=self.toothRect.adjusted(0,0,-self.innerRect.right(),0)
- painter.drawText(QtCore.QRectF(rect),surfs[0],option)
- rect=self.toothRect.adjusted(0,0,0,-self.innerRect.bottom())
- painter.drawText(QtCore.QRectF(rect),surfs[1],option)
- rect=self.toothRect.adjusted(0,self.innerRect.bottom(),0,0)
- painter.drawText(QtCore.QRectF(rect),surfs[2],option)
- rect=self.toothRect.adjusted(self.innerRect.right(),0,0,0)
- painter.drawText(QtCore.QRectF(rect),surfs[3],option)
- painter.drawText(QtCore.QRectF(self.innerRect),surfs[4],option)
+ rect = self.toothRect.adjusted(0, 0, -self.innerRect.right(), 0)
+ painter.drawText(QtCore.QRectF(rect), surfs[0], option)
+ rect = self.toothRect.adjusted(0, 0, 0, -self.innerRect.bottom())
+ painter.drawText(QtCore.QRectF(rect), surfs[1], option)
+ rect = self.toothRect.adjusted(0, self.innerRect.bottom(), 0, 0)
+ painter.drawText(QtCore.QRectF(rect), surfs[2], option)
+ rect = self.toothRect.adjusted(self.innerRect.right(), 0, 0, 0)
+ painter.drawText(QtCore.QRectF(rect), surfs[3], option)
+ painter.drawText(QtCore.QRectF(self.innerRect), surfs[4], option)
painter.setBrush(self.fillcolour)
if "M" in self.filledSurfaces:
if self.isRight:
@@ -844,7 +940,7 @@ class Tooth(QtGui.QWidget):
painter.drawPolygon(self.buccal)
if "P" in self.filledSurfaces:
painter.drawPolygon(self.palatal)
- if self.mouseOverSurface!=None:
+ if self.mouseOverSurface is not None:
painter.setBrush(colours.TRANSPARENT)
painter.setPen(QtGui.QColor("red"))
painter.drawPolygon(self.mouseOverSurface)
@@ -855,8 +951,7 @@ if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
mw = QtGui.QMainWindow()
ui = ToothPropertyEditingWidget()
- ui.setExistingProps("MOD B,GL !COMMENT_TWO")
+ ui.setExistingProps("MOD B,GL !COMMENT_TWO ")
mw.setCentralWidget(ui)
mw.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py b/src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py
index d8c6953..9fafce4 100644
--- a/src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py
+++ b/src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py
@@ -1,32 +1,36 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
-
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
+
class UpperCaseLineEdit(QtGui.QLineEdit):
+
'''
A custom line edit that accepts only BLOCK LETTERS.
'''
+
def setText(self, text):
QtGui.QLineEdit.setText(self, QtCore.QString(text).toUpper())
@@ -38,9 +42,9 @@ class UpperCaseLineEdit(QtGui.QLineEdit):
QtGui.QLineEdit.keyPressEvent(self, event)
self.setText(self.text())
self.textEdited.emit(self.text())
-
+
if __name__ == "__main__":
app = QtGui.QApplication([])
te = UpperCaseLineEdit()
te.show()
- app.exec_()
\ No newline at end of file
+ app.exec_()
diff --git a/src/openmolar/qt4gui/dialogs/__init__.py b/src/openmolar/qt4gui/dialogs/__init__.py
index e69de29..3af96a9 100755
--- a/src/openmolar/qt4gui/dialogs/__init__.py
+++ b/src/openmolar/qt4gui/dialogs/__init__.py
@@ -0,0 +1,77 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+from openmolar.qt4gui.dialogs import saveMemo
+from openmolar.qt4gui.dialogs import permissions
+from openmolar.qt4gui.dialogs import select_language
+
+from openmolar.qt4gui.dialogs.newBPE import BPE_Dialog
+from openmolar.qt4gui.dialogs.assistant_select_dialog import AssistantSelectDialog
+from openmolar.qt4gui.dialogs.clinician_select_dialog import ClinicianSelectDialog
+from openmolar.qt4gui.dialogs.duplicate_receipt_dialog import DuplicateReceiptDialog
+from openmolar.qt4gui.dialogs.save_discard_cancel import SaveDiscardCancelDialog
+from openmolar.qt4gui.dialogs.med_notes_dialog import MedNotesDialog
+from openmolar.qt4gui.dialogs.choose_tooth_dialog import ChooseToothDialog
+from openmolar.qt4gui.dialogs.exam_wizard import ExamWizard
+from openmolar.qt4gui.dialogs.hygTreatWizard import HygTreatWizard
+from openmolar.qt4gui.dialogs.recall_dialog import RecallDialog
+from openmolar.qt4gui.dialogs.child_smile_dialog import ChildSmileDialog
+from openmolar.qt4gui.dialogs.alter_todays_notes import AlterTodaysNotesDialog
+from openmolar.qt4gui.dialogs.find_patient_dialog import FindPatientDialog
+from openmolar.qt4gui.dialogs.family_manage_dialog import LoadRelativesDialog
+from openmolar.qt4gui.dialogs.auto_address_dialog import AutoAddressDialog
+from openmolar.qt4gui.dialogs.family_manage_dialog import FamilyManageDialog
+from openmolar.qt4gui.dialogs.nhs_forms_config_dialog import NHSFormsConfigDialog
+from openmolar.qt4gui.dialogs.advanced_tx_planning_dialog import AdvancedTxPlanningDialog
+from openmolar.qt4gui.dialogs.document_dialog import DocumentDialog
+from openmolar.qt4gui.dialogs.account_severity_dialog import AccountSeverityDialog
+from openmolar.qt4gui.dialogs.daybook_item_dialog import DaybookItemDialog
+from openmolar.qt4gui.dialogs.daybook_edit_dialog import DaybookEditDialog
+
+__all__ = ['AccountSeverityDialog',
+ 'AdvancedTxPlanningDialog',
+ 'AlterTodaysNotesDialog',
+ 'AssistantSelectDialog',
+ 'AutoAddressDialog',
+ 'BPE_Dialog',
+ 'ChildSmileDialog',
+ 'ChooseToothDialog',
+ 'ClinicianSelectDialog',
+ 'DaybookItemDialog',
+ 'DaybookEditDialog',
+ 'DocumentDialog',
+ 'DuplicateReceiptDialog',
+ 'ExamWizard',
+ 'FamilyManageDialog',
+ 'FindPatientDialog',
+ 'HygTreatWizard',
+ 'LoadRelativesDialog',
+ 'MedNotesDialog',
+ 'NHSFormsConfigDialog',
+ 'RecallDialog',
+ 'SaveDiscardCancelDialog',
+ ]
+
+if __name__ == "__main__":
+ print "All imports suceeded!"
diff --git a/src/openmolar/qt4gui/dialogs/account_severity_dialog.py b/src/openmolar/qt4gui/dialogs/account_severity_dialog.py
new file mode 100644
index 0000000..0719979
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/account_severity_dialog.py
@@ -0,0 +1,71 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+import logging
+
+from PyQt4 import QtGui, QtCore
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class AccountSeverityDialog(BaseDialog):
+
+ def __init__(self, parent=None):
+ BaseDialog.__init__(self, parent)
+ self.setWindowTitle(_("Account Dialog"))
+ label = QtGui.QLabel(_("Please Choose the tone of this letter"))
+ label.setAlignment(QtCore.Qt.AlignCenter)
+ self.radio_button_a = QtGui.QRadioButton(
+ _("Normal Account - Very Polite"))
+ self.radio_button_b = QtGui.QRadioButton(_("Mildly assertive request"))
+ self.radio_button_c = QtGui.QRadioButton(
+ _("Threaten with Debt Collector"))
+
+ self.insertWidget(label)
+ self.insertWidget(self.radio_button_a)
+ self.insertWidget(self.radio_button_b)
+ self.insertWidget(self.radio_button_c)
+
+ self.radio_button_a.setChecked(True)
+ self.enableApply()
+
+ @property
+ def severity(self):
+ if self.radio_button_a.isChecked():
+ return "A"
+ if self.radio_button_b.isChecked():
+ return "B"
+ return "C"
+
+ def sizeHint(self):
+ return QtCore.QSize(300, 200)
+
+if __name__ == "__main__":
+ LOGGER.setLevel(logging.DEBUG)
+ app = QtGui.QApplication([])
+
+ dl = AccountSeverityDialog()
+ if dl.exec_():
+ print dl.severity
diff --git a/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py b/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py
index d6e69b7..b77e71b 100644
--- a/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
@@ -13,7 +30,9 @@ from openmolar.settings import localsettings
from openmolar.qt4gui.compiled_uis import Ui_addTreatment
from openmolar.qt4gui.compiled_uis import Ui_treatmentItemWidget
+
class itemWidget(Ui_treatmentItemWidget.Ui_Form):
+
def __init__(self, parent, widget):
self.parent = parent
self.setupUi(widget)
@@ -27,20 +46,22 @@ class itemWidget(Ui_treatmentItemWidget.Ui_Form):
def setDescription(self, description):
self.description = description
- self.label.setText("%s (%s)"% (self.description, self.itemcode))
+ self.label.setText("%s (%s)" % (self.description, self.itemcode))
class AddTreatmentDialog(QtGui.QDialog, Ui_addTreatment.Ui_Dialog):
+
'''
a custom dialog to offer a range of treatments for selection
'''
+
def __init__(self, usercodes, pt, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
self.items = []
feetable = pt.fee_table
for att, shortcut in usercodes:
- item = feetable.getItemCodeFromUserCode("%s %s"% (att, shortcut))
+ item = feetable.getItemCodeFromUserCode("%s %s" % (att, shortcut))
item_description = feetable.getItemDescription(item, shortcut)
self.items.append((item, item_description, (att, shortcut)))
@@ -90,11 +111,10 @@ if __name__ == "__main__":
items = (
("exam", "CE"),
("xray", "M"),
- ("perio","SP")
- )
+ ("perio", "SP")
+ )
dl = AddTreatmentDialog(items, pt)
dl.use_completed_messages()
for att, shortcut in dl.getInput():
- print "chosen item = %s %s"% (att, shortcut)
-
+ print "chosen item = %s %s" % (att, shortcut)
diff --git a/src/openmolar/qt4gui/dialogs/address_match_dialog.py b/src/openmolar/qt4gui/dialogs/address_match_dialog.py
index 5b9d251..1d01716 100644
--- a/src/openmolar/qt4gui/dialogs/address_match_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/address_match_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import datetime
import re
@@ -28,91 +30,72 @@ from openmolar.settings import localsettings
from openmolar.connect import connect
from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
-QUERY = '''select
- case when addr1 = %s then 4 else 0 end +
- case when addr1 like %s then 3 else 0 end +
- case when addr2 like %s then 3 else 0 end +
- case when addr3 like %s then 1 else 0 end +
- case when town like %s then 1 else 0 end +
- case when pcde = %s then 5 else 0 end as matches ,
- serialno, title, fname, sname, dob, addr1, addr2, addr3, town, pcde
-from patients
-where
-addr1 like %s or
-((addr2 != "" and addr2 is not NULL) and addr2 like %s) or
-((town != "" and town is not NULL) and town like %s)or
-(pcde=%s and pcde != "")
-order by matches desc
-limit 12
-'''
-
-HEADERS = ['score', 'serialno', _('Title'), _('Forename'), _('Surname'),
-_('dob'), _('Address1'), _('Address2'), _('Address3'), _('Town'),
-_('POSTCODE')]
-
+from openmolar.dbtools import families
+
+
+HEADERS = ['score', 'serialno', _('Title'), _('Forename'), _('Surname'),
+ _('dob'), _('Address1'), _('Address2'), _('Address3'), _('Town'),
+ _('POSTCODE')]
+
class AddressMatchDialog(BaseDialog):
+
def __init__(self, om_gui):
BaseDialog.__init__(self, om_gui, remove_stretch=True)
self.om_gui = om_gui
-
+
title = _("Address Matches")
self.setWindowTitle(title)
-
+
self.table_widget = QtGui.QTableWidget()
self.table_widget.setSelectionBehavior(
QtGui.QAbstractItemView.SelectRows)
self.table_widget.setAlternatingRowColors(True)
self.table_widget.setSortingEnabled(True)
-
- addr = "%s, %s, %s, %s, %s, %s"% (
- self.om_gui.pt.addr1,
- self.om_gui.pt.addr2,
- self.om_gui.pt.addr3,
- self.om_gui.pt.town,
- self.om_gui.pt.county,
- self.om_gui.pt.pcde)
-
+
+ if self.om_gui.pt.serialno == 0:
+ self.address = localsettings.LAST_ADDRESS[1:]
+ else:
+ self.address = (self.om_gui.pt.addr1,
+ self.om_gui.pt.addr2,
+ self.om_gui.pt.addr3,
+ self.om_gui.pt.town,
+ self.om_gui.pt.county,
+ self.om_gui.pt.pcde,
+ )
+
+ addr = "%s, %s, %s, %s, %s, %s" % (
+ self.address[0],
+ self.address[1],
+ self.address[2],
+ self.address[3],
+ self.address[4],
+ self.address[5],
+ )
+
while re.search(", *,", addr):
- addr = re.sub(", *,",", ", addr)
-
- message = u"<b>%s<b><hr />%s"% (
+ addr = re.sub(", *,", ", ", addr)
+
+ message = u"<b>%s<b><hr />%s" % (
_("Top 12 address matches for"), addr)
-
+
label = QtGui.QLabel()
label.setText(message)
-
+
self.insertWidget(label)
self.insertWidget(self.table_widget)
-
+
self.load_values()
-
+
self.table_widget.itemSelectionChanged.connect(self.enableApply)
-
+
def sizeHint(self):
- return QtCore.QSize(1000,600)
+ return QtCore.QSize(1000, 600)
def load_values(self):
- db = connect()
- cursor = db.cursor()
- values = (
- self.om_gui.pt.addr1,
- self.om_gui.pt.addr1[:10],
- self.om_gui.pt.addr2[:10],
- self.om_gui.pt.addr3[:10],
- self.om_gui.pt.town[:10],
- self.om_gui.pt.pcde,
- self.om_gui.pt.addr1[:10],
- self.om_gui.pt.addr2[:10],
- self.om_gui.pt.town[:10],
- self.om_gui.pt.pcde[:10],
- )
-
- cursor.execute(QUERY, (values))
- rows = cursor.fetchall()
- cursor.close()
-
+ rows = families.get_address_matches(self.address)
+
self.table_widget.clear()
self.table_widget.setSortingEnabled(False)
#--good practice to disable this while loading
@@ -120,7 +103,7 @@ class AddressMatchDialog(BaseDialog):
self.table_widget.setColumnCount(len(HEADERS))
self.table_widget.setHorizontalHeaderLabels(HEADERS)
self.table_widget.horizontalHeader().setStretchLastSection(True)
- #table.verticalHeader().hide()
+ # table.verticalHeader().hide()
for row, result in enumerate(rows):
for col, field in enumerate(result):
if field is None:
@@ -128,23 +111,22 @@ class AddressMatchDialog(BaseDialog):
if col == 5:
item = QtGui.QTableWidgetItem(
localsettings.formatDate(field))
- elif col == 0: #match
- item = QtGui.QTableWidgetItem("%04d"% field)
- elif col == 1: #serialno
- item = QtGui.QTableWidgetItem("%d"% field)
+ elif col == 0: # match
+ item = QtGui.QTableWidgetItem("%04d" % field)
+ elif col == 1: # serialno
+ item = QtGui.QTableWidgetItem("%d" % field)
else:
item = QtGui.QTableWidgetItem(field)
self.table_widget.setItem(row, col, item)
-
+
self.table_widget.resizeColumnsToContents()
- #hide match and serialno column
+ # hide match and serialno column
self.table_widget.setColumnWidth(0, 0)
self.table_widget.setColumnWidth(1, 0)
self.table_widget.setSortingEnabled(True)
self.table_widget.sortItems(0, QtCore.Qt.DescendingOrder)
#--allow user to sort pt attributes
-
-
+
@property
def selected_patients(self):
'''
@@ -157,7 +139,7 @@ class AddressMatchDialog(BaseDialog):
for row in rows:
patients.append(int(self.table_widget.item(row, 1).text()))
return patients
-
+
if __name__ == "__main__":
@@ -167,11 +149,10 @@ if __name__ == "__main__":
from family_manage_dialog import _DuckPatient
mw = QtGui.QWidget()
- mw.pt = _DuckPatient((1,"","","","The Gables",
- "Craggiemore Daviot","Inverness","","","IV2 5XQ", "", "active", ""))
-
+ mw.pt = _DuckPatient((1, "", "", "", "The Gables",
+ "Craggiemore Daviot", "Inverness", "", "", "IV2 5XQ", "", "active", ""))
+
print mw.pt
dl = AddressMatchDialog(mw)
if dl.exec_():
print dl.selected_patients
-
\ No newline at end of file
diff --git a/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py b/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py
index 2fdd983..7dedad0 100644
--- a/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import re
@@ -32,6 +34,7 @@ from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
class TxDisplayWidget(QtGui.QWidget):
text_edited = QtCore.pyqtSignal()
+
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
@@ -61,19 +64,19 @@ class TxDisplayWidget(QtGui.QWidget):
self.cmp_lineedit.textChanged.connect(self.text_edited.emit)
def _complete_treatments(self):
- self.cmp_lineedit.setText(u"%s %s"% (self.cmp_text, self.plan_text))
+ self.cmp_lineedit.setText(u"%s %s" % (self.cmp_text, self.plan_text))
self.pl_lineedit.setText("")
@property
def plan_text(self):
txt = unicode(self.pl_lineedit.text().toUtf8())
- #denture codes are dumb!
+ # denture codes are dumb!
return re.sub("SR\ ", "SR_", txt)
@property
def cmp_text(self):
txt = unicode(self.cmp_lineedit.text().toUtf8())
- #denture codes are dumb!
+ # denture codes are dumb!
return re.sub("SR\ ", "SR_", txt)
@property
@@ -91,6 +94,7 @@ class TxDisplayWidget(QtGui.QWidget):
class AdvancedTxPlanningDialog(ExtendableDialog):
SHOW_CHART_ITEMS = False
+
def __init__(self, parent=None):
ExtendableDialog.__init__(self, parent, remove_stretch=True)
self.setWindowTitle(_("Advanced Treatment Planning"))
@@ -172,8 +176,8 @@ class AdvancedTxPlanningDialog(ExtendableDialog):
if self.pt is None:
return
for att in CURRTRT_ROOT_ATTS:
- pl = self.pt.treatment_course.__dict__["%spl"% att]
- cmp = self.pt.treatment_course.__dict__["%scmp"% att]
+ pl = self.pt.treatment_course.__dict__["%spl" % att]
+ cmp = self.pt.treatment_course.__dict__["%scmp" % att]
widg = self.widgets[att]
widg.set_plan_text(pl)
widg.set_completed_text(cmp)
@@ -208,7 +212,7 @@ class AdvancedTxPlanningDialog(ExtendableDialog):
att_widg = self.widgets[att]
if att_widg.plan_edited:
exist_items = \
- self.pt.treatment_course.__dict__["%spl"% att].split(" ")
+ self.pt.treatment_course.__dict__["%spl" % att].split(" ")
new_list = att_widg.plan_text.split(" ")
for item in set(new_list):
if item == "":
@@ -216,13 +220,14 @@ class AdvancedTxPlanningDialog(ExtendableDialog):
n_adds = new_list.count(item) - exist_items.count(item)
for i in range(n_adds):
yield att, item
+
@property
def _new_cmp_items(self):
for att in CURRTRT_ROOT_ATTS:
att_widg = self.widgets[att]
if att_widg.cmp_edited:
exist_items = \
- self.pt.treatment_course.__dict__["%scmp"% att].split(" ")
+ self.pt.treatment_course.__dict__["%scmp" % att].split(" ")
new_list = att_widg.cmp_text.split(" ")
for item in set(new_list):
if item == "":
@@ -230,6 +235,7 @@ class AdvancedTxPlanningDialog(ExtendableDialog):
n_adds = new_list.count(item) - exist_items.count(item)
for i in range(n_adds):
yield att, item
+
@property
def _deleted_plan_items(self):
for att in CURRTRT_ROOT_ATTS:
@@ -237,13 +243,14 @@ class AdvancedTxPlanningDialog(ExtendableDialog):
if att_widg.plan_edited:
new_items = att_widg.plan_text.split(" ")
exist_items = \
- self.pt.treatment_course.__dict__["%spl"% att].split(" ")
+ self.pt.treatment_course.__dict__["%spl" % att].split(" ")
for item in set(exist_items):
if item == "":
continue
n_adds = exist_items.count(item) - new_items.count(item)
for i in range(n_adds):
yield att, item
+
@property
def _deleted_cmp_items(self):
for att in CURRTRT_ROOT_ATTS:
@@ -251,7 +258,7 @@ class AdvancedTxPlanningDialog(ExtendableDialog):
if att_widg.cmp_edited:
new_items = att_widg.cmp_text.split(" ")
exist_items = \
- self.pt.treatment_course.__dict__["%scmp"% att].split(" ")
+ self.pt.treatment_course.__dict__["%scmp" % att].split(" ")
for item in set(exist_items):
if item == "":
continue
@@ -305,7 +312,6 @@ class AdvancedTxPlanningDialog(ExtendableDialog):
return False
-
if __name__ == "__main__":
from gettext import gettext as _
from openmolar.dbtools.patient_class import patient
@@ -316,14 +322,14 @@ if __name__ == "__main__":
dl = AdvancedTxPlanningDialog(mw)
if dl.exec_():
for att, item in dl.deleted_plan_items:
- print "%spl %s deleted" %(att, item)
+ print "%spl %s deleted" % (att, item)
for att, item in dl.deleted_cmp_items:
- print "%scmp %s deleted" %(att, item)
+ print "%scmp %s deleted" % (att, item)
for att, item in dl.new_plan_items:
- print "%spl %s added" %(att, item)
+ print "%spl %s added" % (att, item)
for att, item in dl.new_cmp_items:
- print "%scmp %s added" %(att, item)
+ print "%scmp %s added" % (att, item)
for att, item in dl.completed_items:
- print "%s %s was completed" %(att, item)
+ print "%s %s was completed" % (att, item)
for att, item in dl.reversed_items:
- print "%s %s was reveresed" %(att, item)
+ print "%s %s was reveresed" % (att, item)
diff --git a/src/openmolar/qt4gui/dialogs/alterAday.py b/src/openmolar/qt4gui/dialogs/alterAday.py
index 05ced53..faef87a 100644
--- a/src/openmolar/qt4gui/dialogs/alterAday.py
+++ b/src/openmolar/qt4gui/dialogs/alterAday.py
@@ -1,11 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.compiled_uis import Ui_activeDentStartFinish
@@ -14,29 +29,32 @@ from openmolar.qt4gui.customwidgets import fiveminutetimeedit
from openmolar.settings import localsettings
from openmolar.dbtools import appointments
+
class adayData():
+
'''
a custom data structure to stor data
'''
- def __init__(self,dent):
+
+ def __init__(self, dent):
self.apptix = localsettings.apptix.get(dent)
self.dent = dent
self.active = False
- self.start = QtCore.QTime(8,30)
- self.finish = QtCore.QTime(18,0)
+ self.start = QtCore.QTime(8, 30)
+ self.finish = QtCore.QTime(18, 0)
self.memo = ""
- def setStart(self,arg):
+ def setStart(self, arg):
'''
takes a time in form 800 (==8:00)
'''
- self.start = QtCore.QTime(arg/100,arg%100)
+ self.start = QtCore.QTime(arg / 100, arg % 100)
- def setFinish(self,arg):
+ def setFinish(self, arg):
'''
takes a time in form 800 (==8:00)
'''
- self.finish = QtCore.QTime(arg/100,arg%100)
+ self.finish = QtCore.QTime(arg / 100, arg % 100)
def sqlStart(self):
'''
@@ -50,43 +68,45 @@ class adayData():
'''
return int(self.finish.toString("hmm"))
- def setMemo(self,arg):
- if arg != None:
+ def setMemo(self, arg):
+ if arg is not None:
self.memo = arg
def __repr__(self):
- return"%s %s %s %s %s %s"%(
- self.apptix,self.dent,self.active,self.start,self.finish,self.memo)
+ return"%s %s %s %s %s %s" % (
+ self.apptix, self.dent, self.active, self.start, self.finish, self.memo)
def __cmp__(self, other):
eq = 0
if (self.active != other.active or self.start != other.start or
- self.finish != other.finish or self.memo != other.memo):
+ self.finish != other.finish or self.memo != other.memo):
eq = 1
return eq
class dentWidget(Ui_activeDentStartFinish.Ui_Form):
+
'''
a custom widget collection to get user input
'''
- def __init__(self,widget):
+
+ def __init__(self, widget):
self.setupUi(widget)
QtCore.QObject.connect(self.checkBox,
- QtCore.SIGNAL("stateChanged(int)"),self.toggle)
+ QtCore.SIGNAL("stateChanged(int)"), self.toggle)
self.addTimeEdits()
def addTimeEdits(self):
self.start_timeEdit = \
- fiveminutetimeedit.FiveMinuteTimeEdit(self.widget)
+ fiveminutetimeedit.FiveMinuteTimeEdit(self.widget)
l = QtGui.QVBoxLayout(self.widget)
l.addWidget(self.start_timeEdit)
self.finish_timeEdit = \
- fiveminutetimeedit.FiveMinuteTimeEdit(self.widget_2)
+ fiveminutetimeedit.FiveMinuteTimeEdit(self.widget_2)
l = QtGui.QVBoxLayout(self.widget_2)
l.addWidget(self.finish_timeEdit)
@@ -95,11 +115,11 @@ class dentWidget(Ui_activeDentStartFinish.Ui_Form):
self.finish_timeEdit.setMaximumTime(localsettings.latestFinish)
- def toggle(self,arg):
+ def toggle(self, arg):
self.start_timeEdit.setEnabled(arg)
self.finish_timeEdit.setEnabled(arg)
- def setData(self,arg):
+ def setData(self, arg):
'''
set the data with an instance of adayData
'''
@@ -112,25 +132,28 @@ class dentWidget(Ui_activeDentStartFinish.Ui_Form):
self.finish_timeEdit.setTime(arg.finish)
self.lineEdit.setText(arg.memo)
+
class alterDayDialog(Ui_aslotEdit.Ui_Dialog):
+
'''
a custom dialog to enter the start dates, end dates and availability
of a clinician
'''
+
def __init__(self, diary_widget, date):
- #date passed in is a QDate
+ # date passed in is a QDate
self.dialog = QtGui.QDialog(diary_widget)
self.diary_widget = diary_widget
self.setupUi(self.dialog)
self.data_list = []
self.date = date
self.dialog.setWindowTitle(_("Clinician Times") +
- " - %s"%date.toString())
+ " - %s" % date.toString())
self.loadData()
self.showItems()
QtCore.QObject.connect(self.copy_pushButton,
- QtCore.SIGNAL("clicked()"), self.copy_to_clipboard)
+ QtCore.SIGNAL("clicked()"), self.copy_to_clipboard)
self.pastebutton_orig_text = self.paste_pushButton.text()
if diary_widget.alterAday_clipboard_date:
@@ -139,13 +162,13 @@ class alterDayDialog(Ui_aslotEdit.Ui_Dialog):
self.paste_pushButton.setEnabled(False)
QtCore.QObject.connect(self.paste_pushButton,
- QtCore.SIGNAL("clicked()"), self.paste)
+ QtCore.SIGNAL("clicked()"), self.paste)
def setPasteButtonText(self):
text = self.pastebutton_orig_text
self.paste_pushButton.setText(text + " " + _("values from") +
- " " + self.diary_widget.alterAday_clipboard_date.toString())
+ " " + self.diary_widget.alterAday_clipboard_date.toString())
def copy_to_clipboard(self):
self.diary_widget.alterAday_clipboard_date = self.date
@@ -154,7 +177,7 @@ class alterDayDialog(Ui_aslotEdit.Ui_Dialog):
self.setPasteButtonText()
def paste(self):
- i=0
+ i = 0
for clinician in self.diary_widget.alterAday_clipboard:
dw = self.dentWidgets[i]
dw.checkBox.setChecked(clinician.active)
@@ -215,15 +238,15 @@ class alterDayDialog(Ui_aslotEdit.Ui_Dialog):
alteredClinician = updated_vals[i]
if alteredClinician != clinician:
retarg.append(alteredClinician)
- i+=1
+ i += 1
return retarg
- def applyChanges(self,changes):
+ def applyChanges(self, changes):
d = self.date.toPyDate()
changed = False
for change in changes:
changed = True
- appointments.updateAday(d,change)
+ appointments.updateAday(d, change)
return changed
def getInput(self):
@@ -241,4 +264,3 @@ if __name__ == "__main__":
dl = alterDayDialog(d_widg, date)
print dl.getInput()
-
diff --git a/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py b/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py
index 193bb9d..8e5ee56 100644
--- a/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
@@ -30,24 +32,25 @@ from openmolar.qt4gui.dialogs import permissions
from openmolar.dbtools.cashbook import cashbookCodesDict
-QUERY = '''select cbdate, ref, descr, code, dntid, amt from cashbook
+QUERY = '''select cbdate, ref, descr, code, dntid, amt from cashbook
where id = %s'''
-UPDATE_QUERY = '''update cashbook
+UPDATE_QUERY = '''update cashbook
set cbdate=%s, ref=%s, descr=%s, code=%s, dntid=%s, amt=%s
where id = %s'''
class AlterCashbookDialog(ExtendableDialog):
+
def __init__(self, ix, parent=None):
ExtendableDialog.__init__(self, parent)
self.ix = ix
title = _("Alter Cashbook Entry")
self.setWindowTitle(title)
- label = QtGui.QLabel(u"<b>%s</b>"% title)
+ label = QtGui.QLabel(u"<b>%s</b>" % title)
label.setAlignment(QtCore.Qt.AlignCenter)
-
+
frame = QtGui.QFrame()
form_layout = QtGui.QFormLayout(frame)
@@ -56,28 +59,27 @@ class AlterCashbookDialog(ExtendableDialog):
self.date_edit = QtGui.QDateEdit()
self.dentist_cb = QtGui.QComboBox()
self.dentist_cb.addItems(localsettings.activedents)
-
+
self.code_cb = QtGui.QComboBox()
self.amount_sb = QtGui.QDoubleSpinBox()
- self.amount_sb.setRange(0,10000)
-
+ self.amount_sb.setRange(0, 10000)
+
self.codestrings = cashbookCodesDict.values()
self.code_cb.addItems(self.codestrings)
-
+
form_layout.addRow(_("Patient Number"), self.serialno_le)
form_layout.addRow(_("Patient Name"), self.patient_le)
form_layout.addRow(_("Date"), self.date_edit)
form_layout.addRow(_("Dentist"), self.dentist_cb)
form_layout.addRow(_("Payment Type"), self.code_cb)
form_layout.addRow(_("Amount"), self.amount_sb)
-
+
self.serialno_le.setEnabled(False)
- self.patient_le.setEnabled(False)
+ self.patient_le.setEnabled(False)
self.date_edit.setEnabled(False)
self.dentist_cb.setEnabled(False)
self.amount_sb.setEnabled(False)
-
-
+
self.insertWidget(label)
self.insertWidget(frame)
@@ -96,7 +98,7 @@ class AlterCashbookDialog(ExtendableDialog):
self.dentist_cb.setEnabled(True)
self.code_cb.setEnabled(True)
self.amount_sb.setEnabled(True)
- self.patient_le.setEnabled(True)
+ self.patient_le.setEnabled(True)
self.showExtension(False)
def check_enable(self):
@@ -112,26 +114,26 @@ class AlterCashbookDialog(ExtendableDialog):
cursor.execute(QUERY, (self.ix,))
cbdate, ref, descr, code, dntid, amt = cursor.fetchone()
cursor.close()
-
+
self.serialno_le.setText(ref)
self.patient_le.setText(descr)
self.date_edit.setDate(cbdate)
self.dentist_cb.setCurrentIndex(0)
-
+
try:
- pos = localsettings.activedent_ixs.index(dntid)
+ pos = localsettings.activedent_ixs.index(dntid)
except ValueError:
pos = -1
self.dentist_cb.setCurrentIndex(pos)
-
+
code_str = cashbookCodesDict.get(code)
self.code_cb.setCurrentIndex(self.codestrings.index(code_str))
- pounds = amt // 100
+ pounds = amt // 100
pence = amt % 100
- double_val = float("%s.%s"% (pounds, pence))
+ double_val = float("%s.%s" % (pounds, pence))
self.amount_sb.setValue(double_val)
-
+
self.check_enable()
def apply(self):
@@ -144,18 +146,18 @@ class AlterCashbookDialog(ExtendableDialog):
break
dntid = localsettings.ops_reverse[str(self.dentist_cb.currentText())]
- currency = "%.02f"%self.amount_sb.value()
+ currency = "%.02f" % self.amount_sb.value()
amt = int(currency.replace(".", ""))
-
+
values = (date_, ref, descr, code, dntid, amt, self.ix)
-
+
db = connect()
cursor = db.cursor()
cursor.execute(UPDATE_QUERY, values)
db.commit()
def sizeHint(self):
- return QtCore.QSize(300,350)
+ return QtCore.QSize(300, 350)
def exec_(self):
if ExtendableDialog.exec_(self):
@@ -169,6 +171,5 @@ if __name__ == "__main__":
app = QtGui.QApplication([])
dl = AlterCashbookDialog(152039)
-
+
print (dl.exec_())
-
\ No newline at end of file
diff --git a/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py b/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py
index a61a22f..dccad6c 100644
--- a/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py
@@ -1,31 +1,33 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import re
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.customwidgets.upper_case_line_edit import \
-UpperCaseLineEdit
+ UpperCaseLineEdit
from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
from openmolar.qt4gui.customwidgets.simple_chartwidget import SimpleChartWidg
@@ -38,10 +40,12 @@ VALID_INPUTS = (
"SL",
"RE",
"IMP",
- "", # this one in case of no input whatsoever!
- )
+ "", # this one in case of no input whatsoever!
+)
+
class _OptionPage(QtGui.QWidget):
+
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.dialog = parent
@@ -82,7 +86,9 @@ class _OptionPage(QtGui.QWidget):
def cleanup(self):
pass
+
class PageZero(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.label.setText(_("What are you Modifying?"))
@@ -99,7 +105,7 @@ class PageZero(_OptionPage):
@property
def is_completed(self):
return (self.upper_radioButton.isChecked() or
- self.lower_radioButton.isChecked())
+ self.lower_radioButton.isChecked())
@property
def return_text(self):
@@ -111,12 +117,14 @@ class PageZero(_OptionPage):
return "upper"
return "lower"
+
class PageOne(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
options = ["Reline", "Soft Reline", "Repair",
- "Tooth Addition(s)", "Clasp Addition(s)"]
+ "Tooth Addition(s)", "Clasp Addition(s)"]
layout = QtGui.QVBoxLayout(self.frame)
self.rad_buts = []
@@ -141,7 +149,7 @@ class PageOne(_OptionPage):
return 2
if self.rad_buts[4].isChecked():
return 3
- return 4 #ALL DONE!
+ return 4 # ALL DONE!
@property
def return_text(self):
@@ -157,7 +165,9 @@ class PageOne(_OptionPage):
return "A/C"
return ""
+
class PageTwo(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
@@ -173,25 +183,27 @@ class PageTwo(_OptionPage):
@property
def is_completed(self):
return (self.acrylic_radioButton.isChecked() or
- self.metal_radioButton.isChecked())
+ self.metal_radioButton.isChecked())
def cleanup(self):
text = self.dialog.default_lineedit.text()
if self.acrylic_radioButton.isChecked():
- text = "%s%s"% ("SR_", text)
+ text = "%s%s" % ("SR_", text)
if self.metal_radioButton.isChecked():
- text = "%s%s"% ("CC_", text)
+ text = "%s%s" % ("CC_", text)
self.dialog.default_lineedit.setText(text)
@property
def return_text(self):
return ""
+
class PageThree(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.label.setText(_(
- "Please select teeth to be added to this denture"))
+ "Please select teeth to be added to this denture"))
self.chartwidg = SimpleChartWidg(self, auto_ctrl_key=True)
if parent.is_upper_input:
self.chartwidg.disable_lowers()
@@ -233,6 +245,7 @@ class PageThree(_OptionPage):
class PageFour(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.label.setText(_("How Many Clasps?"))
@@ -252,14 +265,16 @@ class PageFour(_OptionPage):
n_clasps = self.clasp_input.value()
if n_clasps > 1:
text = unicode(self.dialog.default_lineedit.text().toUtf8())
- text = text.replace("A/C", "A/%dC"% n_clasps)
+ text = text.replace("A/C", "A/%dC" % n_clasps)
self.dialog.default_lineedit.setText(text)
@property
def return_text(self):
return ""
+
class PageFive(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.label.setText(
@@ -275,7 +290,7 @@ class PageFive(_OptionPage):
@property
def is_completed(self):
return (self.yes_radioButton.isChecked() or
- self.no_radioButton.isChecked())
+ self.no_radioButton.isChecked())
@property
def _additional_text(self):
@@ -292,15 +307,18 @@ class PageFive(_OptionPage):
class AcceptPage(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
- self.label.setText("%s<hr />%s"% (
- _("You have completed your input."),
- _("Please click on Apply")))
+ self.label.setText("%s<hr />%s" % (
+ _("You have completed your input."),
+ _("Please click on Apply")))
self.frame.hide()
+
class AlterDentureDialog(ExtendableDialog):
- def __init__(self, om_gui = None):
+
+ def __init__(self, om_gui=None):
ExtendableDialog.__init__(self, om_gui)
self.om_gui = om_gui
@@ -365,7 +383,7 @@ class AlterDentureDialog(ExtendableDialog):
def next_widget(self):
if not self.current_page.is_completed:
QtGui.QMessageBox.information(self, _("Whoops"),
- self.current_page.error_message)
+ self.current_page.error_message)
return
if self.current_index == 0:
@@ -418,9 +436,9 @@ class AlterDentureDialog(ExtendableDialog):
matched = True
break
if not matched:
- LOGGER.debug("failed to match %s %s"% (input_, odu))
+ LOGGER.debug("failed to match %s %s" % (input_, odu))
QtGui.QMessageBox.warning(self, _("Warning"),
- _("Your upper denture input is invalid"))
+ _("Your upper denture input is invalid"))
return False
for odl in odls.split(" "):
matched = False
@@ -429,9 +447,9 @@ class AlterDentureDialog(ExtendableDialog):
matched = True
break
if not matched:
- LOGGER.debug("failed to match %s %s"% (input_, odu))
+ LOGGER.debug("failed to match %s %s" % (input_, odu))
QtGui.QMessageBox.warning(self, _("Warning"),
- _("Your lower denture input is invalid"))
+ _("Your lower denture input is invalid"))
return False
return True
diff --git a/src/openmolar/qt4gui/dialogs/alter_todays_notes.py b/src/openmolar/qt4gui/dialogs/alter_todays_notes.py
index 6b85bfa..dc62686 100644
--- a/src/openmolar/qt4gui/dialogs/alter_todays_notes.py
+++ b/src/openmolar/qt4gui/dialogs/alter_todays_notes.py
@@ -1,29 +1,32 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
if __name__ == "__main__":
- import os, sys
+ import os
+ import sys
sys.path.insert(0, os.path.abspath("../../../"))
from openmolar.settings import localsettings
@@ -34,9 +37,11 @@ from openmolar import connect
from openmolar.dbtools import patient_write_changes
from openmolar.dbtools import db_patients
+
class AlterTodaysNotesDialog(BaseDialog):
result = ""
patient_loaded = True
+
def __init__(self, sno, parent):
BaseDialog.__init__(self, parent)
self.sno = sno
@@ -54,13 +59,13 @@ class AlterTodaysNotesDialog(BaseDialog):
self.insertWidget(self.patient_label)
self.insertWidget(self.text_edit)
self.insertWidget(phrasebook_button)
- #self.text_edit.setLineWrapMode(self.text_edit.FixedColumnWidth)
- #self.text_edit.setLineWrapColumnOrWidth(80)
+ # self.text_edit.setLineWrapMode(self.text_edit.FixedColumnWidth)
+ # self.text_edit.setLineWrapColumnOrWidth(80)
QtCore.QTimer.singleShot(0, self.get_patient_name)
def sizeHint(self):
- return QtCore.QSize(800,200)
+ return QtCore.QSize(800, 200)
def get_patient_name(self):
try:
@@ -73,7 +78,7 @@ class AlterTodaysNotesDialog(BaseDialog):
newNotes = ""
if dl.exec_():
for phrase in dl.selectedPhrases:
- newNotes += phrase + "\n"
+ newNotes += phrase + "\n"
self.text_edit.append(newNotes)
def get_todays_notes(self):
@@ -96,7 +101,7 @@ class AlterTodaysNotesDialog(BaseDialog):
if self.patient_loaded and not count:
QtGui.QMessageBox.information(self, "message",
- "No notes found for today!")
+ "No notes found for today!")
return
text = ""
@@ -108,7 +113,6 @@ class AlterTodaysNotesDialog(BaseDialog):
self.text_edit.textChanged.connect(self.item_edited)
-
def item_edited(self):
self.enableApply()
@@ -116,7 +120,7 @@ class AlterTodaysNotesDialog(BaseDialog):
lines = (unicode(self.text_edit.toPlainText())).split("\n")
short_lines = []
for note in lines:
- while len(note)>79:
+ while len(note) > 79:
if " " in note[:79]:
pos = note[:79].rindex(" ")
#--try to split nicely
@@ -127,15 +131,15 @@ class AlterTodaysNotesDialog(BaseDialog):
pos = 79
#--ok, no option (unlikely to happen though)
short_lines.append(note[:pos])
- note = note[pos+1:]
- short_lines.append(note+"\n")
+ note = note[pos + 1:]
+ short_lines.append(note + "\n")
values = []
i = 0
for ix, note in self.notes:
try:
values.append((short_lines[i], ix))
- except IndexError: #a line has been deleted.
+ except IndexError: # a line has been deleted.
values.append(("", ix))
i += 1
@@ -148,8 +152,7 @@ class AlterTodaysNotesDialog(BaseDialog):
if len(short_lines) > i:
patient_write_changes.toNotes(self.sno,
- [("newNOTE", n) for n in short_lines[i:]])
-
+ [("newNOTE", n) for n in short_lines[i:]])
def exec_(self):
if BaseDialog.exec_(self):
@@ -159,7 +162,7 @@ class AlterTodaysNotesDialog(BaseDialog):
if __name__ == "__main__":
localsettings.initiate()
- localsettings.operator="NW"
+ localsettings.operator = "NW"
app = QtGui.QApplication([])
dl = AlterTodaysNotesDialog(11956, None)
diff --git a/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py b/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py
index 5d1c413..78ab31a 100644
--- a/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
from PyQt4 import QtGui, QtCore
@@ -37,14 +39,13 @@ class AppointmentCardDialog(BaseDialog):
self.pt = patient
self.main_ui = parent
- patient_label = QtGui.QLabel("%s<br /><b>%s</b>"% (
- _("Appointment Card for"), patient.name_id))
+ patient_label = QtGui.QLabel("%s<br /><b>%s</b>" % (
+ _("Appointment Card for"), patient.name_id))
patient_label.setAlignment(QtCore.Qt.AlignCenter)
self.appointments_label = QtGui.QLabel()
-
self.check_box = QtGui.QCheckBox(_("Include Today's appointments?"))
self.check_box.setChecked(True)
@@ -63,14 +64,13 @@ class AppointmentCardDialog(BaseDialog):
QtCore.QTimer.singleShot(100, self.get_data)
-
def sizeHint(self):
return QtCore.QSize(260, 300)
def set_label_text(self):
html = "<ul>"
for appt in self.appts:
- html += "<li>%s</li>"% appt.html
+ html += "<li>%s</li>" % appt.html
html += "</ul>"
self.appointments_label.setText(html)
@@ -103,7 +103,7 @@ class AppointmentCardDialog(BaseDialog):
def accept(self):
if self.appts == []:
QtGui.QMessageBox.information(self, "warning",
- _("No appointments to print!"))
+ _("No appointments to print!"))
self.reject()
card = apptcardPrint.Card()
diff --git a/src/openmolar/qt4gui/dialogs/apptOpenDay.py b/src/openmolar/qt4gui/dialogs/apptOpenDay.py
index fb558dd..17581ae 100644
--- a/src/openmolar/qt4gui/dialogs/apptOpenDay.py
+++ b/src/openmolar/qt4gui/dialogs/apptOpenDay.py
@@ -1,156 +1,187 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.compiled_uis import Ui_apptOpenDay
from openmolar.settings import localsettings
from openmolar.dbtools import appointments
+
class apptDialog(Ui_apptOpenDay.Ui_Dialog):
- def __init__(self,dialog,parent=None):
+
+ def __init__(self, dialog, parent=None):
self.setupUi(dialog)
- self.dialog=dialog
+ self.dialog = dialog
self.comboBox.addItems(
- localsettings.activedents+localsettings.activehygs)
-
+ localsettings.activedents + localsettings.activehygs)
+
self.comboBox.setCurrentIndex(-1)
- self.minTime=self.getMinTime()
- self.maxTime=self.getMaxTime()
- self.setTimeLimits()
- self.dateEdit.setDate(QtCore.QDate.currentDate())
- self.init_es1("11:00","11:40")
- self.init_es2("16:00","16:40")
- self.init_lunch("13:00","14:00")
-
+ self.minTime = self.getMinTime()
+ self.maxTime = self.getMaxTime()
+ self.setTimeLimits()
+ self.dateEdit.setDate(QtCore.QDate.currentDate())
+ self.init_es1("11:00", "11:40")
+ self.init_es2("16:00", "16:40")
+ self.init_lunch("13:00", "14:00")
+
def getMinTime(self):
- return QtCore.QTime.fromString("08:30","hh:mm")
-
+ return QtCore.QTime.fromString("08:30", "hh:mm")
+
def getMaxTime(self):
- return QtCore.QTime.fromString("18:00","hh:mm")
-
+ return QtCore.QTime.fromString("18:00", "hh:mm")
+
def setTimeLimits(self):
'''
set the boundary values for the time widgets
'''
for widg in (
- self.dayStart_timeEdit,
- self.dayFinish_timeEdit,
- self.es1Start_timeEdit,
- self.es1Finish_timeEdit,
- self.es2Start_timeEdit,
- self.es2Finish_timeEdit,
- self.lunchStart_timeEdit,
- self.lunchFinish_timeEdit,
+ self.dayStart_timeEdit,
+ self.dayFinish_timeEdit,
+ self.es1Start_timeEdit,
+ self.es1Finish_timeEdit,
+ self.es2Start_timeEdit,
+ self.es2Finish_timeEdit,
+ self.lunchStart_timeEdit,
+ self.lunchFinish_timeEdit,
):
widg.setMinimumTime(self.minTime)
widg.setMaximumTime(self.maxTime)
self.day_limits()
- def day_limits(self,start=None,finish=None):
+ def day_limits(self, start=None, finish=None):
'''
set day start and finish
'''
- if start==None:
+ if start is None:
self.dayStart_timeEdit.setTime(self.minTime)
else:
self.dayStart_timeEdit.setTime(
- QtCore.QTime.fromString(start,"hh:mm"))
-
- if finish==None:
+ QtCore.QTime.fromString(start, "hh:mm"))
+
+ if finish is None:
self.dayFinish_timeEdit.setTime(self.maxTime)
else:
self.dayFinish_timeEdit.setTime(
- QtCore.QTime.fromString(finish,"hh:mm"))
-
- def init_es1(self,start,finish):
+ QtCore.QTime.fromString(finish, "hh:mm"))
+
+ def init_es1(self, start, finish):
self.es1_checkBox.setChecked(True)
self.es1Start_timeEdit.setTime(
- QtCore.QTime.fromString(start,"hh:mm"))
+ QtCore.QTime.fromString(start, "hh:mm"))
self.es1Finish_timeEdit.setTime(
- QtCore.QTime.fromString(finish,"hh:mm"))
-
- def init_es2(self,start,finish):
+ QtCore.QTime.fromString(finish, "hh:mm"))
+
+ def init_es2(self, start, finish):
self.es2_checkBox.setChecked(True)
self.es2Start_timeEdit.setTime(
- QtCore.QTime.fromString(start,"hh:mm"))
+ QtCore.QTime.fromString(start, "hh:mm"))
self.es2Finish_timeEdit.setTime(
- QtCore.QTime.fromString(finish,"hh:mm"))
-
- def init_lunch(self,start,finish):
+ QtCore.QTime.fromString(finish, "hh:mm"))
+
+ def init_lunch(self, start, finish):
self.lunch_checkBox.setChecked(True)
self.lunchStart_timeEdit.setTime(
- QtCore.QTime.fromString(start,"hh:mm"))
+ QtCore.QTime.fromString(start, "hh:mm"))
self.lunchFinish_timeEdit.setTime(
- QtCore.QTime.fromString(finish,"hh:mm"))
-
+ QtCore.QTime.fromString(finish, "hh:mm"))
+
def checkDate(self):
- if self.dateEdit.date()>=QtCore.QDate.currentDate():
+ if self.dateEdit.date() >= QtCore.QDate.currentDate():
return True
else:
print 'date chosen is in the past!'
-
+
def checkDent(self):
- self.chosenDent=localsettings.apptix.get(str(self.comboBox.currentText()))
- if self.chosenDent!=None:
+ self.chosenDent = localsettings.apptix.get(
+ str(self.comboBox.currentText()))
+ if self.chosenDent is not None:
return True
-
+
def checkTimes(self):
- result=True
+ result = True
#-- does the day end before it starts?
- result=result and \
- self.dayStart_timeEdit.time()<self.dayFinish_timeEdit.time()
-
+ result = result and \
+ self.dayStart_timeEdit.time() < self.dayFinish_timeEdit.time()
+
#-- is es1 ok?
if self.es1_checkBox.isChecked():
- result=result and \
- self.dayStart_timeEdit.time()<=self.es1Start_timeEdit.time()
+ result = result and \
+ self.dayStart_timeEdit.time() <= self.es1Start_timeEdit.time()
if self.lunch_checkBox.isChecked():
- result=result and \
- self.es1Finish_timeEdit.time()<=self.lunchStart_timeEdit.time()
+ result = result and \
+ self.es1Finish_timeEdit.time(
+ ) <= self.lunchStart_timeEdit.time()
elif self.es2_checkBox.isChecked():
- result=result and \
- self.es1Finish_timeEdit.time()<=self.es2Start_timeEdit.time()
+ result = result and \
+ self.es1Finish_timeEdit.time(
+ ) <= self.es2Start_timeEdit.time()
else:
- result=result and \
- self.es1Finish_timeEdit.time()<=self.dayFinish_timeEdit.time()
-
- #-- is lunch ok?
+ result = result and \
+ self.es1Finish_timeEdit.time(
+ ) <= self.dayFinish_timeEdit.time()
+
+ #-- is lunch ok?
if self.lunch_checkBox.isChecked():
- result=result and \
- self.dayStart_timeEdit.time()<=self.lunchStart_timeEdit.time()
+ result = result and \
+ self.dayStart_timeEdit.time(
+ ) <= self.lunchStart_timeEdit.time()
- result=result and \
- self.lunchStart_timeEdit.time()<self.lunchFinish_timeEdit.time()
+ result = result and \
+ self.lunchStart_timeEdit.time(
+ ) < self.lunchFinish_timeEdit.time()
if self.es2_checkBox.isChecked():
- result=result and \
- self.lunchFinish_timeEdit.time()<=self.es2Start_timeEdit.time()
+ result = result and \
+ self.lunchFinish_timeEdit.time(
+ ) <= self.es2Start_timeEdit.time(
+ )
else:
- result=result and \
- self.lunchFinish_timeEdit.time()<=self.dayFinish_timeEdit.time()
-
+ result = result and \
+ self.lunchFinish_timeEdit.time(
+ ) <= self.dayFinish_timeEdit.time(
+ )
+
#-- is es2 ok?
if self.es2_checkBox.isChecked():
- result=result and \
- self.dayStart_timeEdit.time()<=self.es2Start_timeEdit.time()
+ result = result and \
+ self.dayStart_timeEdit.time() <= self.es2Start_timeEdit.time()
+
+ result = result and \
+ self.es2Start_timeEdit.time() < self.es2Finish_timeEdit.time()
- result=result and \
- self.es2Start_timeEdit.time()<self.es2Finish_timeEdit.time()
+ result = result and \
+ self.es2Finish_timeEdit.time(
+ ) <= self.dayFinish_timeEdit.time(
+ )
- result=result and \
- self.es2Finish_timeEdit.time()<=self.dayFinish_timeEdit.time()
-
return result
-
+
def writeToDB(self):
'''
user has entered a good sequence, so write it to the DB now
@@ -161,42 +192,39 @@ class apptDialog(Ui_apptOpenDay.Ui_Dialog):
day.start = int(self.dayStart_timeEdit.time().toString("hmm"))
day.end = int(self.dayFinish_timeEdit.time().toString("hmm"))
day.memo = str(self.memo_lineEdit.text())
-
-
- #QtGui.QMessageBox.information(self.dialog,"sorry","this method is deprecated")
- #return
-#########################################################################################
-
- result=appointments.alterDay(day)
+
+ # QtGui.QMessageBox.information(self.dialog,"sorry","this method is deprecated")
+ # return
+#
+ result = appointments.alterDay(day)
if result:
return True
else:
- QtGui.QMessageBox.information(self.dialog,"error",
- result.message)
-
+ QtGui.QMessageBox.information(self.dialog, "error",
+ result.message)
+
def exec_(self):
while True:
if not self.dialog.exec_():
return False
else:
- result=True
+ result = True
if not self.checkTimes():
- result=False
+ result = False
QtGui.QMessageBox.information(self.dialog,
- "Error","Incorrect Time sequence - Please Try Again")
+ "Error", "Incorrect Time sequence - Please Try Again")
if not self.checkDent():
- result=False
+ result = False
QtGui.QMessageBox.information(self.dialog,
- "Error","Dentist not understood - Please Try Again")
+ "Error", "Dentist not understood - Please Try Again")
if not self.checkDate():
- result=False
+ result = False
QtGui.QMessageBox.information(self.dialog,
- "Error","Date is in the past - Please Try Again")
+ "Error", "Date is in the past - Please Try Again")
if result:
return self.writeToDB()
-
-
-
+
+
if __name__ == "__main__":
localsettings.initiate()
import sys
@@ -205,4 +233,3 @@ if __name__ == "__main__":
dl = apptDialog(Dialog)
if dl.exec_():
print "accepted"
-
diff --git a/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py b/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py
index 658477c..a1d113b 100644
--- a/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py
@@ -1,29 +1,32 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
if __name__ == "__main__":
- import os, sys
+ import os
+ import sys
sys.path.insert(0, os.path.abspath("../../../"))
from openmolar.settings import localsettings
@@ -47,22 +50,22 @@ class ApptModeDialog(BaseDialog):
self.insertWidget(label)
for mode, description, value in (
- ( _("Browsing"),
+ (_("Browsing"),
"",
self.VIEW_MODE
- ),
+ ),
- ( _("Scheduling"),
+ (_("Scheduling"),
_("make appointments for a patient"),
self.SCHEDULING_MODE
- ),
+ ),
- ( _("Blocking"),
+ (_("Blocking"),
_("block time periods. eg. lunch times etc."),
self.BLOCKING_MODE
- ),
+ ),
- ( _("Note Checking"),
+ (_("Note Checking"),
_("check notes for today's patients"),
self.NOTES_MODE),
):
@@ -77,7 +80,7 @@ class ApptModeDialog(BaseDialog):
self.apply_but.hide()
def sizeHint(self):
- return QtCore.QSize(300,300)
+ return QtCore.QSize(300, 300)
def but_clicked(self):
@@ -90,4 +93,4 @@ if __name__ == "__main__":
dl = ApptModeDialog()
if dl.exec_():
- print (dl.mode)
\ No newline at end of file
+ print (dl.mode)
diff --git a/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py b/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py
index 55a3c1c..4a06b60 100644
--- a/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
@@ -27,16 +29,18 @@ from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
from openmolar import connect
-RECALL_METHODS = ["post","email","sms"]
+RECALL_METHODS = ["post", "email", "sms"]
+
class ShortcutButs(QtGui.QWidget):
clicked = QtCore.pyqtSignal(object)
+
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
layout = QtGui.QHBoxLayout(self)
layout.setMargin(0)
- for term in (1,2,3,6,9,12):
- but = QtGui.QPushButton("%d"% term)
+ for term in (1, 2, 3, 6, 9, 12):
+ but = QtGui.QPushButton("%d" % term)
but.setMaximumWidth(40)
layout.addWidget(but)
if term == 9:
@@ -47,14 +51,16 @@ class ShortcutButs(QtGui.QWidget):
but = self.sender()
self.clicked.emit(int(but.text()))
+
class ApptPrefsDialog(BaseDialog):
+
def __init__(self, patient, parent):
BaseDialog.__init__(self, parent)
self.pt = patient
self.main_ui = parent
- self.patient_label = QtGui.QLabel("%s<br /><b>%s</b>"% (
- _("Appointment Preferences for Patient"), patient.name_id))
+ self.patient_label = QtGui.QLabel("%s<br /><b>%s</b>" % (
+ _("Appointment Preferences for Patient"), patient.name_id))
self.patient_label.setAlignment(QtCore.Qt.AlignCenter)
@@ -77,13 +83,12 @@ class ApptPrefsDialog(BaseDialog):
self.recdent_date_edit.setDate(QtCore.QDate.currentDate())
self.dent_shortcut_buts = ShortcutButs()
-
layout = QtGui.QFormLayout(self.recdent_groupbox)
layout.addRow(_("dentist recall period (months)"),
- self.recdent_period_spinbox)
+ self.recdent_period_spinbox)
layout.addRow(_("Next Recall Date"), self.recdent_date_edit)
layout.addRow(_("Shortcuts (months from today)"),
- self.dent_shortcut_buts)
+ self.dent_shortcut_buts)
self.rechyg_groupbox = QtGui.QGroupBox(
_("Hygienist Recall"))
@@ -91,7 +96,6 @@ class ApptPrefsDialog(BaseDialog):
self.rechyg_groupbox.setCheckable(True)
self.rechyg_groupbox.setChecked(False)
-
self.rechyg_period_spinbox = QtGui.QSpinBox()
self.rechyg_period_spinbox.setMinimum(1)
self.rechyg_period_spinbox.setMaximum(24)
@@ -99,35 +103,33 @@ class ApptPrefsDialog(BaseDialog):
self.rechyg_date_edit.setCalendarPopup(True)
self.rechyg_date_edit.setDate(QtCore.QDate.currentDate())
-
layout = QtGui.QFormLayout(self.rechyg_groupbox)
layout.addRow(_("hygienist recall period (months)"),
- self.rechyg_period_spinbox)
+ self.rechyg_period_spinbox)
layout.addRow(_("Next Recall"), self.rechyg_date_edit)
-
self.recall_method_combobox = QtGui.QComboBox()
self.recall_method_combobox.addItems(
[_("Post"), _("email"), _("sms")])
- #self.sms_reminders_checkbox = QtGui.QCheckBox(
+ # self.sms_reminders_checkbox = QtGui.QCheckBox(
# _("sms reminders for appointments?"))
- #self.combined_appointment_checkbox = QtGui.QCheckBox(
+ # self.combined_appointment_checkbox = QtGui.QCheckBox(
# _("Don't offer joint appointments"))
layout = QtGui.QGridLayout(self.recall_groupbox)
- layout.addWidget(self.recdent_groupbox,0,0,1,2)
- layout.addWidget(self.rechyg_groupbox,1,0,1,2)
+ layout.addWidget(self.recdent_groupbox, 0, 0, 1, 2)
+ layout.addWidget(self.rechyg_groupbox, 1, 0, 1, 2)
- layout.addWidget(QtGui.QLabel(_("Recall method")), 2,0)
- layout.addWidget(self.recall_method_combobox, 2,1)
+ layout.addWidget(QtGui.QLabel(_("Recall method")), 2, 0)
+ layout.addWidget(self.recall_method_combobox, 2, 1)
self.insertWidget(self.patient_label)
self.insertWidget(self.recall_groupbox)
- #self.insertWidget(self.sms_reminders_checkbox)
- #self.insertWidget(self.combined_appointment_checkbox)
+ # self.insertWidget(self.sms_reminders_checkbox)
+ # self.insertWidget(self.combined_appointment_checkbox)
QtCore.QTimer.singleShot(0, self.get_appt_prefs)
@@ -164,16 +166,16 @@ class ApptPrefsDialog(BaseDialog):
def init_edited_signals(self):
for widg in (
- self.recall_groupbox,
- self.recdent_groupbox,
- self.rechyg_groupbox,
- #self.sms_reminders_checkbox,
- #self.combined_appointment_checkbox
- ):
+ self.recall_groupbox,
+ self.recdent_groupbox,
+ self.rechyg_groupbox,
+ # self.sms_reminders_checkbox,
+ # self.combined_appointment_checkbox
+ ):
widg.toggled.connect(self._set_enabled)
for widg in (
- self.recdent_date_edit,
- self.rechyg_date_edit,
+ self.recdent_date_edit,
+ self.rechyg_date_edit,
):
widg.dateChanged.connect(self._set_enabled)
@@ -194,11 +196,14 @@ class ApptPrefsDialog(BaseDialog):
self.pt.appt_prefs.recall_active = self.recall_groupbox.isChecked()
if self.recdent_groupbox.isChecked():
- self.pt.appt_prefs.recdent_period = self.recdent_period_spinbox.value()
- self.pt.appt_prefs.recdent = self.recdent_date_edit.date().toPyDate()
+ self.pt.appt_prefs.recdent_period = self.recdent_period_spinbox.value(
+ )
+ self.pt.appt_prefs.recdent = self.recdent_date_edit.date(
+ ).toPyDate()
if self.rechyg_groupbox.isChecked():
- self.pt.appt_prefs.rechyg_period = self.rechyg_period_spinbox.value()
+ self.pt.appt_prefs.rechyg_period = self.rechyg_period_spinbox.value(
+ )
self.pt.appt_prefs.rechyg = self.rechyg_date_edit.date().toPyDate()
i = self.recall_method_combobox.currentIndex()
diff --git a/src/openmolar/qt4gui/dialogs/appt_wizard_dialog.py b/src/openmolar/qt4gui/dialogs/appt_wizard_dialog.py
index 44b7766..10b3794 100644
--- a/src/openmolar/qt4gui/dialogs/appt_wizard_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/appt_wizard_dialog.py
@@ -1,68 +1,89 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings, appointment_shortcuts
from openmolar.qt4gui.compiled_uis import Ui_apptWizard
from openmolar.qt4gui.compiled_uis import Ui_apptWizardItem
+
class apptWidget(Ui_apptWizardItem.Ui_Form):
+
def __init__(self, parent, widget):
self.parent = parent
self.setupUi(widget)
self.signals()
self.appointments = []
-
+
def signals(self):
'''
sets the various signals required to monitor user input
'''
QtCore.QObject.connect(self.pushButton,
- QtCore.SIGNAL("clicked()"), self.add)
-
+ QtCore.SIGNAL("clicked()"), self.add)
+
def addAppointments(self, arg):
'''
let this widget be self aware, give it control over the appointments
'''
self.appointments = arg
- self.comboBox.addItems(["%d appointments"% len(self.appointments)])
+ self.comboBox.addItems(["%d appointments" % len(self.appointments)])
for appt in self.appointments:
- if not appt.has_key("clinician"):
+ if "clinician" not in appt:
if self.parent.parent.pt.dnt2 != 0:
appt["clinician"] = self.parent.parent.pt.dnt2
else:
appt["clinician"] = self.parent.parent.pt.dnt1
initials = localsettings.apptix_reverse.get(appt.get("clinician"))
- mystr = "%s %d mins with %s"% (
- appt.get("trt1"), appt.get("length"), initials )
+ mystr = "%s %d mins with %s" % (
+ appt.get("trt1"), appt.get("length"), initials)
self.comboBox.addItems([mystr])
-
+
def setLabelText(self, arg):
'''
this label has the description for the shortcut
'''
self.label.setText(arg)
-
+
def add(self):
'''
user is applying the appointments contained by this widget
'''
- self.parent.dialog.emit(QtCore.SIGNAL("AddAppointments"),
- (self.appointments))
+ self.parent.dialog.emit(QtCore.SIGNAL("AddAppointments"),
+ (self.appointments))
self.parent.dialog.accept()
+
class apptWizard(Ui_apptWizard.Ui_Dialog):
+
def __init__(self, dialog, parent=None):
self.setupUi(dialog)
self.dialog = dialog
self.items = []
self.parent = parent
self.setShortcuts()
-
+
def setShortcuts(self):
self.shortcuts = appointment_shortcuts.getShortCuts()
self.showAppts()
@@ -77,22 +98,24 @@ class apptWizard(Ui_apptWizard.Ui_Dialog):
i.addAppointments(shortcut.get("appointments"))
self.apptWidgets.append(i)
vlayout.addWidget(iw)
- spacerItem = QtGui.QSpacerItem(1, 20, QtGui.QSizePolicy.Minimum,
- QtGui.QSizePolicy.Expanding)
-
+ spacerItem = QtGui.QSpacerItem(1, 20, QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+
vlayout.addItem(spacerItem)
-
-
+
+
if __name__ == "__main__":
import sys
from openmolar.dbtools import patient_class
-
+
class testGui():
+
def __init__(self):
self.pt = patient_class.patient(3)
+
def test(a):
- print "signal caught",a
-
+ print "signal caught", a
+
localsettings.initiate()
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
@@ -100,4 +123,3 @@ if __name__ == "__main__":
ui = apptWizard(Dialog, mainGui)
Dialog.connect(Dialog, QtCore.SIGNAL("AddAppointments"), test)
Dialog.exec_()
-
diff --git a/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py b/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py
index 7afd034..40dad51 100644
--- a/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py
@@ -1,37 +1,54 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
-import types
+
from openmolar.settings import localsettings
-from xml.dom import minidom
-class Dialog(QtGui.QDialog):
+
+class AssistantSelectDialog(QtGui.QDialog):
+
def __init__(self, parent=None):
- super(Dialog, self).__init__(parent)
+ QtGui.QDialog.__init__(self, parent)
self.setWindowTitle(_("Select an Assitant"))
-
+
layout = QtGui.QVBoxLayout(self)
self.listwidget = QtGui.QListWidget()
self.listwidget.setSelectionBehavior(
QtGui.QAbstractItemView.SelectRows)
self.listwidget.setSelectionMode(
QtGui.QAbstractItemView.SingleSelection)
-
- assistants = [_("NONE")] + localsettings.allowed_logins
+
+ assistants = [_("No Assistant")] + localsettings.allowed_logins
self.listwidget.addItems(assistants)
-
+
self.listwidget.setCurrentRow(0)
-
+
self.buttonBox = QtGui.QDialogButtonBox(self)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(
- QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
layout.addWidget(self.listwidget)
@@ -39,25 +56,23 @@ class Dialog(QtGui.QDialog):
self.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), self.accept)
self.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), self.reject)
-
-
+
@property
def selectedAssistant(self):
if self.listwidget.currentRow() == 0:
return ""
return str(self.listwidget.currentItem().text().toAscii())
-
+
def result(self):
if self.exec_():
u2 = self.selectedAssistant
localsettings.setOperator(localsettings.clinicianInits, u2)
return (True, u2)
return (False, None)
-
+
if __name__ == "__main__":
- from openmolar.qt4gui import resources_rc
localsettings.initiateUsers()
- app = QtGui.QApplication([])
- ui = Dialog()
- print ui.result()
+ app = QtGui.QApplication([])
+ dl = AssistantSelectDialog()
+ print dl.result()
app.closeAllWindows()
diff --git a/src/openmolar/qt4gui/dialogs/auto_address_dialog.py b/src/openmolar/qt4gui/dialogs/auto_address_dialog.py
index 2480c79..746d6ae 100644
--- a/src/openmolar/qt4gui/dialogs/auto_address_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/auto_address_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
from PyQt4 import QtGui, QtCore
@@ -28,15 +30,16 @@ from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
class AutoAddressDialog(BaseDialog):
+
def __init__(self, om_gui):
BaseDialog.__init__(self, om_gui)
self.om_gui = om_gui
title = _("Apply Saved Address")
self.setWindowTitle(title)
- label = QtGui.QLabel(u"<b>%s</b>"% title)
+ label = QtGui.QLabel(u"<b>%s</b>" % title)
label.setAlignment(QtCore.Qt.AlignCenter)
-
+
frame = QtGui.QFrame()
layout = QtGui.QGridLayout(frame)
@@ -63,7 +66,7 @@ class AutoAddressDialog(BaseDialog):
self.county_le = QtGui.QLineEdit()
self.pcde_le = QtGui.QLineEdit()
self.tel1_le = QtGui.QLineEdit()
-
+
self.addr1_cb = QtGui.QCheckBox()
self.addr2_cb = QtGui.QCheckBox()
self.addr3_cb = QtGui.QCheckBox()
@@ -71,10 +74,9 @@ class AutoAddressDialog(BaseDialog):
self.county_cb = QtGui.QCheckBox()
self.pcde_cb = QtGui.QCheckBox()
self.tel1_cb = QtGui.QCheckBox()
-
- self.old_header_label = QtGui.QLabel(u"%s"% _("Existing"))
- new_header_label = QtGui.QLabel(u"%s"% _("New"))
-
+
+ self.old_header_label = QtGui.QLabel(u"%s" % _("Existing"))
+ new_header_label = QtGui.QLabel(u"%s" % _("New"))
rows = (
(label_1, self.old_addr1_le, self.addr1_le, self.addr1_cb),
@@ -84,34 +86,31 @@ class AutoAddressDialog(BaseDialog):
(label_5, self.old_county_le, self.county_le, self.county_cb),
(label_6, self.old_pcde_le, self.pcde_le, self.pcde_cb),
(label_7, self.old_tel1_le, self.tel1_le, self.tel1_cb),
- )
+ )
layout.addWidget(self.old_header_label, 0, 1)
layout.addWidget(new_header_label, 0, 2)
for row, (lab, old_le, new_le, cb) in enumerate(rows):
- layout.addWidget(lab, row+1, 0)
- layout.addWidget(old_le, row+1, 1)
- layout.addWidget(new_le, row+1, 2)
- layout.addWidget(cb, row+1, 3)
+ layout.addWidget(lab, row + 1, 0)
+ layout.addWidget(old_le, row + 1, 1)
+ layout.addWidget(new_le, row + 1, 2)
+ layout.addWidget(cb, row + 1, 3)
cb.setChecked(True)
-
-
-
self.insertWidget(label)
self.insertWidget(frame)
self.load_values()
self.enableApply()
-
+
def load_values(self):
'''
default NP has been pressed - so apply the address and surname
from the previous patient
'''
dup_tup = localsettings.LAST_ADDRESS
-
+
self.addr1_le.setText(dup_tup[1])
self.addr2_le.setText(dup_tup[2])
self.addr3_le.setText(dup_tup[3])
@@ -119,7 +118,7 @@ class AutoAddressDialog(BaseDialog):
self.county_le.setText(dup_tup[5])
self.pcde_le.setText(dup_tup[6])
self.tel1_le.setText(dup_tup[7])
-
+
self.old_addr1_le.setText(self.om_gui.ui.addr1Edit.text())
self.old_addr2_le.setText(self.om_gui.ui.addr2Edit.text())
self.old_addr3_le.setText(self.om_gui.ui.addr3Edit.text())
@@ -145,7 +144,7 @@ class AutoAddressDialog(BaseDialog):
self.om_gui.ui.tel1Edit.setText(self.tel1_le.text())
def sizeHint(self):
- return QtCore.QSize(600,350)
+ return QtCore.QSize(600, 350)
def exec_(self):
if localsettings.LAST_ADDRESS == ("",) * 8:
@@ -162,6 +161,5 @@ if __name__ == "__main__":
mw = QtGui.QWidget()
dl = AutoAddressDialog(mw)
-
+
print (dl.exec_())
-
\ No newline at end of file
diff --git a/src/openmolar/qt4gui/dialogs/base_dialogs.py b/src/openmolar/qt4gui/dialogs/base_dialogs.py
index be11a48..cebda35 100644
--- a/src/openmolar/qt4gui/dialogs/base_dialogs.py
+++ b/src/openmolar/qt4gui/dialogs/base_dialogs.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module provide 2 classes, BaseDialog and ExtendableDialog.
@@ -28,20 +30,23 @@ These are backported from openmolar2
from PyQt4 import QtGui, QtCore
+
class BaseDialog(QtGui.QDialog):
+
'''
A base class for all my dialogs
provides a button box with ok and cancel buttons,
slots connected to accept and reject
has a VBoxlayout - accessed by self.layout_
'''
+
def __init__(self, parent=None, remove_stretch=False):
QtGui.QDialog.__init__(self, parent)
self.button_box = QtGui.QDialogButtonBox(self)
self.button_box.setOrientation(QtCore.Qt.Horizontal)
self.button_box.setStandardButtons(
- self.button_box.Cancel|self.button_box.Apply)
+ self.button_box.Cancel | self.button_box.Apply)
self.cancel_but = self.button_box.button(self.button_box.Cancel)
self.apply_but = self.button_box.button(self.button_box.Apply)
@@ -57,7 +62,7 @@ class BaseDialog(QtGui.QDialog):
self.enableApply(False)
self.spacer = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Expanding,
- QtGui.QSizePolicy.Expanding)
+ QtGui.QSizePolicy.Expanding)
self.layout_.addItem(self.spacer)
self.layout_.addWidget(self.button_box)
self.insertpoint_offset = 2
@@ -125,9 +130,9 @@ class BaseDialog(QtGui.QDialog):
if not self.check_before_reject_if_dirty:
self.reject()
if (not self.dirty or QtGui.QMessageBox.question(self,
- _("Confirm"), _("Abandon Changes?"),
- QtGui.QMessageBox.Yes|QtGui.QMessageBox.Cancel,
- QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Yes):
+ _("Confirm"), _("Abandon Changes?"),
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Yes):
self.reject()
def enableApply(self, enable=True):
@@ -137,7 +142,7 @@ class BaseDialog(QtGui.QDialog):
self.apply_but.setEnabled(enable)
def get_confirm(self, message,
- accept="ok", reject="cancel", default="accept"):
+ accept="ok", reject="cancel", default="accept"):
'''
a convenience function to raise a dialog for confirmation of an action
'''
@@ -151,17 +156,20 @@ class BaseDialog(QtGui.QDialog):
elif reject == "no":
reject_but = QtGui.QMessageBox.No
- buttons = accept_but|reject_but
+ buttons = accept_but | reject_but
default_but = accept_but if default == "accept" else reject_but
- return QtGui.QMessageBox.question(self,_("Confirm"),
- message, buttons, default_but) == accept_but
+ return QtGui.QMessageBox.question(self, _("Confirm"),
+ message, buttons, default_but) == accept_but
+
class ExtendableDialog(BaseDialog):
+
'''
builds on BaseDialog, adding an area for advanced options
unlike BaseDialog.. this dialog has no spacer item by default
'''
+
def __init__(self, parent=None, remove_stretch=False):
BaseDialog.__init__(self, parent, remove_stretch)
diff --git a/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py b/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py
index ecc970d..bc14838 100644
--- a/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
@@ -43,19 +45,19 @@ class BeginMakeApptDialog(BaseDialog):
BaseDialog.__init__(self, parent)
self.setWindowTitle(_("Begin Make Appointment Dialog"))
- label = QtGui.QLabel("<b>%s</b>"%
- _("Please set criteria for making this appointment"))
+ label = QtGui.QLabel("<b>%s</b>" %
+ _("Please set criteria for making this appointment"))
label.setAlignment(QtCore.Qt.AlignCenter)
self.pt = pt
self.appt = appt
- #WHEN TO LOOK
+ # WHEN TO LOOK
begin_search_frame = QtGui.QFrame()
- w_label = QtGui.QLabel("<b>%s</b>"% _("When to Look"))
+ w_label = QtGui.QLabel("<b>%s</b>" % _("When to Look"))
w_label.setAlignment(QtCore.Qt.AlignCenter)
layout = QtGui.QGridLayout(begin_search_frame)
- layout.addWidget(w_label,0,0,1,3)
+ layout.addWidget(w_label, 0, 0, 1, 3)
self.first_available_appointment_radiobut = QtGui.QRadioButton(
_("Find First Available Appointment"))
@@ -70,12 +72,12 @@ class BeginMakeApptDialog(BaseDialog):
layout.addWidget(self.week_ahead_appointment_radiobut)
layout.addWidget(self.follow_on_appointment_radiobut)
- #DAY OR WEEK VIEW
+ # DAY OR WEEK VIEW
day_week_frame = QtGui.QFrame()
- w_label = QtGui.QLabel("<b>%s</b>"% _("Day or Week Graphical View"))
+ w_label = QtGui.QLabel("<b>%s</b>" % _("Day or Week Graphical View"))
w_label.setAlignment(QtCore.Qt.AlignCenter)
layout = QtGui.QGridLayout(day_week_frame)
- layout.addWidget(w_label,0,0,1,2)
+ layout.addWidget(w_label, 0, 0, 1, 2)
self.day_radio_but = QtGui.QRadioButton(_("Day View"))
self.day_radio_but.setChecked(not WEEK_VIEW)
@@ -85,10 +87,9 @@ class BeginMakeApptDialog(BaseDialog):
layout.addWidget(self.day_radio_but)
layout.addWidget(week_radio_but)
-
- #CLINICIAN POLICY
+ # CLINICIAN POLICY
clinician_frame = QtGui.QFrame()
- c_label = QtGui.QLabel("<b>%s</b>"% _("Clinician selection policy"))
+ c_label = QtGui.QLabel("<b>%s</b>" % _("Clinician selection policy"))
c_label.setAlignment(QtCore.Qt.AlignCenter)
layout = QtGui.QGridLayout(clinician_frame)
@@ -100,39 +101,36 @@ class BeginMakeApptDialog(BaseDialog):
self.any_hygienist_radiobut.setChecked(ANY_HYGIENIST)
self.any_clinician_radiobut = QtGui.QRadioButton(_("Any Clinician"))
- layout.addWidget(c_label,0,0,1,2)
- layout.addWidget(self.specified_clinician_radiobut,1,0)
- layout.addWidget(self.any_dentist_radiobut,1,1)
- layout.addWidget(self.any_hygienist_radiobut,2,0)
- layout.addWidget(self.any_clinician_radiobut,2,1)
-
+ layout.addWidget(c_label, 0, 0, 1, 2)
+ layout.addWidget(self.specified_clinician_radiobut, 1, 0)
+ layout.addWidget(self.any_dentist_radiobut, 1, 1)
+ layout.addWidget(self.any_hygienist_radiobut, 2, 0)
+ layout.addWidget(self.any_clinician_radiobut, 2, 1)
ignore_emergencies_frame = QtGui.QFrame()
layout = QtGui.QVBoxLayout(ignore_emergencies_frame)
emergency_label = QtGui.QLabel(
- "<b>%s</b>"% _("Emergency time management"))
+ "<b>%s</b>" % _("Emergency time management"))
self.ignore_emergency_checkbox = QtGui.QCheckBox(
_("Ignore Emergency Spaces"))
self.ignore_emergency_checkbox.setChecked(False)
layout.addWidget(emergency_label)
layout.addWidget(self.ignore_emergency_checkbox)
-
- #DAY OF WEEK
+ # DAY OF WEEK
self.dow_checkboxes = []
dow_frame = QtGui.QFrame()
- dow_label = QtGui.QLabel("<b>%s</b>"%
- _("Look for appointments on these days"))
+ dow_label = QtGui.QLabel("<b>%s</b>" %
+ _("Look for appointments on these days"))
dow_label.setAlignment(QtCore.Qt.AlignCenter)
layout = QtGui.QGridLayout(dow_frame)
- layout.addWidget(dow_label,0,0,1,7)
+ layout.addWidget(dow_label, 0, 0, 1, 7)
self.add_dow_checkboxes(layout)
- #JOINT APPOINTMENTS
- self.joint_appt_checkbox= QtGui.QCheckBox(
+ # JOINT APPOINTMENTS
+ self.joint_appt_checkbox = QtGui.QCheckBox(
_("Look for Joint Appointments with the hygienist"))
-
self.insertWidget(label)
self.insertWidget(self.joint_appt_checkbox)
self.insertWidget(clinician_frame)
@@ -147,9 +145,9 @@ class BeginMakeApptDialog(BaseDialog):
def add_dow_checkboxes(self, layout):
for i in range(7):
- cb = QtGui.QCheckBox(QtCore.QDate.shortDayName(i+1))
+ cb = QtGui.QCheckBox(QtCore.QDate.shortDayName(i + 1))
cb.setChecked(True)
- layout.addWidget(cb,1,i)
+ layout.addWidget(cb, 1, i)
self.dow_checkboxes.append(cb)
@property
@@ -167,7 +165,7 @@ class BeginMakeApptDialog(BaseDialog):
days = []
for i in range(7):
if not self.dow_checkboxes[i].isChecked():
- days.append(i+1)
+ days.append(i + 1)
return days
@property
@@ -193,7 +191,7 @@ class BeginMakeApptDialog(BaseDialog):
@property
def message(self):
- message = "<body>%s <b>%s</b><br />%s"% (
+ message = "<body>%s <b>%s</b><br />%s" % (
_("begin making appointment for patient"),
self.pt.name_id,
self.appt.html)
diff --git a/src/openmolar/qt4gui/dialogs/block_wizard.py b/src/openmolar/qt4gui/dialogs/block_wizard.py
index 5202593..b4c402e 100644
--- a/src/openmolar/qt4gui/dialogs/block_wizard.py
+++ b/src/openmolar/qt4gui/dialogs/block_wizard.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.compiled_uis import Ui_block_wizard
@@ -12,11 +29,13 @@ from openmolar.qt4gui.customwidgets import fiveminutetimeedit
from openmolar.settings import localsettings
from openmolar.dbtools import appointments
+
class blocker(Ui_block_wizard.Ui_Dialog):
- def __init__(self,dialog,parent=None):
+
+ def __init__(self, dialog, parent=None):
self.setupUi(dialog)
self.progressBar.hide()
- self.dialog=dialog
+ self.dialog = dialog
self.clinicianDict = self.addClinicians()
self.dayDict = self.addDays()
self.addTimeEdit()
@@ -24,7 +43,7 @@ class blocker(Ui_block_wizard.Ui_Dialog):
self.end_dateEdit.setDate(localsettings.bookEnd)
self.lineEdit.setText(_("emergency"))
QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL("clicked(QAbstractButton*)"),self.writeToDB)
+ QtCore.SIGNAL("clicked(QAbstractButton*)"), self.writeToDB)
def addClinicians(self):
'''
@@ -33,7 +52,7 @@ class blocker(Ui_block_wizard.Ui_Dialog):
retarg = {}
vbox = QtGui.QHBoxLayout()
for clinician in (localsettings.activedents
- + localsettings.activehygs):
+ + localsettings.activehygs):
cb = QtGui.QCheckBox(clinician)
vbox.addWidget(cb)
retarg[clinician] = cb
@@ -52,7 +71,7 @@ class blocker(Ui_block_wizard.Ui_Dialog):
row = 0
else:
row = 1
- vbox.addWidget(cb, row, day%4)
+ vbox.addWidget(cb, row, day % 4)
retarg[day] = cb
self.day_groupBox.setLayout(vbox)
return retarg
@@ -65,14 +84,14 @@ class blocker(Ui_block_wizard.Ui_Dialog):
vlayout.setMargin(0)
self.start_timeEdit = fiveminutetimeedit.FiveMinuteTimeEdit()
vlayout.addWidget(self.start_timeEdit)
- self.start_timeEdit.setTime(QtCore.QTime(12,0,0))
+ self.start_timeEdit.setTime(QtCore.QTime(12, 0, 0))
def writeToDB(self, arg):
'''
user has entered a good sequence, so write it to the DB now
'''
if self.buttonBox.buttonRole(arg) == (
- QtGui.QDialogButtonBox.RejectRole):
+ QtGui.QDialogButtonBox.RejectRole):
self.dialog.reject()
return
sdate = self.start_dateEdit.date()
@@ -88,20 +107,21 @@ class blocker(Ui_block_wizard.Ui_Dialog):
self.progressBar.show()
for clinician in self.clinicianDict.keys():
if self.clinicianDict[clinician].isChecked():
- self.progress_label.setText("%s %s"%(
- _("applying changes for"), clinician))
+ self.progress_label.setText("%s %s" % (
+ _("applying changes for"), clinician))
dt = sdate
while dt <= fdate:
- progress = int(100 * (total - dt.daysTo(fdate))/total)
+ progress = int(100 * (total - dt.daysTo(fdate)) / total)
if self.progressBar.value() != progress:
self.progressBar.setValue(progress)
- if self.dayDict[dt.dayOfWeek()-1].isChecked():
+ if self.dayDict[dt.dayOfWeek() - 1].isChecked():
appointments.make_appt(dt.toPyDate(),
- localsettings.apptix[clinician],
- start, end, self.lineEdit.text().toAscii(),
- 0,"","","","",-128,0,0,0)
+ localsettings.apptix[clinician],
+ start, end, self.lineEdit.text(
+ ).toAscii(),
+ 0, "", "", "", "", -128, 0, 0, 0)
dt = dt.addDays(1)
@@ -115,4 +135,3 @@ if __name__ == "__main__":
Dialog = QtGui.QDialog()
dl = blocker(Dialog)
Dialog.exec_()
-
diff --git a/src/openmolar/qt4gui/dialogs/blockslot.py b/src/openmolar/qt4gui/dialogs/blockslot.py
index 84fc36e..c06dde3 100644
--- a/src/openmolar/qt4gui/dialogs/blockslot.py
+++ b/src/openmolar/qt4gui/dialogs/blockslot.py
@@ -1,11 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtCore, QtGui
from openmolar.settings import localsettings
@@ -17,8 +32,10 @@ from openmolar.qt4gui.compiled_uis import Ui_blockSlot
from openmolar.qt4gui.dialogs.find_patient_dialog import FindPatientDialog
from openmolar.qt4gui.customwidgets import fiveminutetimeedit
+
class blockDialog(Ui_blockSlot.Ui_Dialog):
- def __init__(self, Dialog, om_gui = None):
+
+ def __init__(self, Dialog, om_gui=None):
self.Dialog = Dialog
self.om_gui = om_gui
self.setupUi(Dialog)
@@ -44,19 +61,19 @@ class blockDialog(Ui_blockSlot.Ui_Dialog):
self.tabWidget.setCurrentIndex(0)
QtCore.QObject.connect(self.changePt_pushButton,
- QtCore.SIGNAL("clicked()"), self.changePt)
+ QtCore.SIGNAL("clicked()"), self.changePt)
QtCore.QObject.connect(self.start_timeEdit,
- QtCore.SIGNAL("verifiedTime"), self.changedTimes)
+ QtCore.SIGNAL("verifiedTime"), self.changedTimes)
QtCore.QObject.connect(self.finish_timeEdit,
- QtCore.SIGNAL("verifiedTime"), self.changedTimes)
+ QtCore.SIGNAL("verifiedTime"), self.changedTimes)
QtCore.QObject.connect(self.appointment_timeEdit,
- QtCore.SIGNAL("verifiedTime"), self.changedStart)
+ QtCore.SIGNAL("verifiedTime"), self.changedStart)
QtCore.QObject.connect(self.length_spinBox,
- QtCore.SIGNAL("valueChanged (int)"), self.changedLength)
+ QtCore.SIGNAL("valueChanged (int)"), self.changedLength)
self.earliestStart = None
self.latestFinish = None
@@ -67,17 +84,17 @@ class blockDialog(Ui_blockSlot.Ui_Dialog):
'''
user has modded the appointment start time, sync the other start
'''
- finish = self.start_timeEdit.time().addSecs(mins*60)
+ finish = self.start_timeEdit.time().addSecs(mins * 60)
self.finish_timeEdit.setTime(finish)
self.setLength()
- def changedStart(self,t):
+ def changedStart(self, t):
'''
user has modded the appointment start time, sync the other start
'''
self.start_timeEdit.setTime(t)
- def changedTimes(self,t):
+ def changedTimes(self, t):
'''
user has altered the block start
'''
@@ -89,16 +106,16 @@ class blockDialog(Ui_blockSlot.Ui_Dialog):
errors = []
if self.start_timeEdit.time() < self.earliestStart:
errors.append(
- _("Start is outwith slot bounds (too early)"))
+ _("Start is outwith slot bounds (too early)"))
if self.start_timeEdit.time() > self.latestFinish:
errors.append(
- _("Start is outwith slot bounds (too late)"))
+ _("Start is outwith slot bounds (too late)"))
if self.finish_timeEdit.time() > self.latestFinish:
errors.append(
- _("Finish is outwith slot bounds (too late"))
+ _("Finish is outwith slot bounds (too late"))
if self.finish_timeEdit.time() > self.latestFinish:
errors.append(
- _("Finish is outwith slot bounds (too early"))
+ _("Finish is outwith slot bounds (too early"))
if self.length < self.minimumLength:
errors.append(_("length of appointment is too short"))
if self.tabWidget.currentIndex() == 0:
@@ -110,11 +127,11 @@ class blockDialog(Ui_blockSlot.Ui_Dialog):
if errors:
errorlist = ""
for error in errors:
- errorlist += "<li>%s</li>"% error
- message = "<p>%s...<ul>%s</ul></p>"% (
- _("Unable to commit because"), errorlist )
- QtGui.QMessageBox.information(self.Dialog,_("error"),
- message)
+ errorlist += "<li>%s</li>" % error
+ message = "<p>%s...<ul>%s</ul></p>" % (
+ _("Unable to commit because"), errorlist)
+ QtGui.QMessageBox.information(self.Dialog, _("error"),
+ message)
else:
self.block = self.tabWidget.currentIndex() == 0
@@ -130,7 +147,7 @@ class blockDialog(Ui_blockSlot.Ui_Dialog):
self.setPatient(patient_class.patient(serialno))
except localsettings.PatientNotFoundError:
QtGui.QMessageBox.information(self.Dialog,
- _("Error"), _("patient not found"))
+ _("Error"), _("patient not found"))
self.setPatient(patient_class.patient(0))
@@ -140,7 +157,7 @@ class blockDialog(Ui_blockSlot.Ui_Dialog):
'''
if pt is not None and pt.serialno != 0:
self.pt_label.setText(
- _("Chosen Patient is")+"<br />%s"% pt.name_id)
+ _("Chosen Patient is") + "<br />%s" % pt.name_id)
else:
self.pt_label.setText(_("no patient chosen"))
@@ -157,14 +174,14 @@ class blockDialog(Ui_blockSlot.Ui_Dialog):
self.finish_timeEdit.setTime(finish)
self.setLength(True)
- def setLength(self, initialise = False):
+ def setLength(self, initialise=False):
start = self.start_timeEdit.time()
finish = self.finish_timeEdit.time()
- self.length = (finish.hour() * 60 + finish.minute()) -(
- start.hour() * 60 + start.minute())
+ self.length = (finish.hour() * 60 + finish.minute()) - (
+ start.hour() * 60 + start.minute())
- self.length_label.setText("%d<br />"% self.length + _("minutes"))
+ self.length_label.setText("%d<br />" % self.length + _("minutes"))
if initialise:
self.length_spinBox.setMaximum(self.length)
self.length_spinBox.setValue(self.length)
@@ -174,10 +191,9 @@ if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
dialog = QtGui.QDialog()
dl = blockDialog(dialog)
- start = QtCore.QTime(14,40)
- finish = QtCore.QTime(15,15)
+ start = QtCore.QTime(14, 40)
+ finish = QtCore.QTime(15, 15)
dl.setTimes(start, finish)
dl.exec_()
app.closeAllWindows()
-
diff --git a/src/openmolar/qt4gui/dialogs/bridge_denture.py b/src/openmolar/qt4gui/dialogs/bridge_denture.py
index d3814f8..ba44d6a 100644
--- a/src/openmolar/qt4gui/dialogs/bridge_denture.py
+++ b/src/openmolar/qt4gui/dialogs/bridge_denture.py
@@ -1,113 +1,154 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
from PyQt4 import QtGui, QtCore
class tooth(QtGui.QWidget):
- def __init__(self,name="",parent=None):
- super(tooth,self).__init__(parent)
- self.name=name
+
+ def __init__(self, name="", parent=None):
+ super(tooth, self).__init__(parent)
+ self.name = name
self.setRect()
self.setDefaultColors()
self.setMouseTracking(True)
+
def setRect(self):
- rect=QtCore.QRectF()
- rect.setRect(10,10,20,20)
- self.rect=rect
+ rect = QtCore.QRectF()
+ rect.setRect(10, 10, 20, 20)
+ self.rect = rect
+
def setDefaultColors(self):
- self.boundaryColour=QtGui.QColor("blue")
- def mouseMoveEvent(self,event):
- self.boundaryColour=QtGui.QColor("red")
+ self.boundaryColour = QtGui.QColor("blue")
+
+ def mouseMoveEvent(self, event):
+ self.boundaryColour = QtGui.QColor("red")
self.update()
- def mousePressEvent(self,event):
- print "clicked %s"%self.name
- def leaveEvent(self,event):
+
+ def mousePressEvent(self, event):
+ print "clicked %s" % self.name
+
+ def leaveEvent(self, event):
self.setDefaultColors()
self.update()
-
- def paintEvent(self,event=None):
+
+ def paintEvent(self, event=None):
painter = QtGui.QPainter(self)
painter.save()
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
- painter.setPen(QtGui.QPen(self.boundaryColour,2)) #red pen
+ painter.setPen(QtGui.QPen(self.boundaryColour, 2))
+ #red pen
sansFont = QtGui.QFont("Sans", 8)
painter.setFont(sansFont)
- painter.drawText(self.rect,QtCore.Qt.AlignCenter,(self.name[2]))
+ painter.drawText(self.rect, QtCore.Qt.AlignCenter, (self.name[2]))
painter.drawRect(self.rect)
painter.restore()
+
class labChartWidget(QtGui.QWidget):
+
'''a custom widget to show a standard UK dental chart
- allows for user navigation with mouse and/or keyboard
'''
+
def __init__(self, parent=None):
- super(labChartWidget,self).__init__(parent)
+ super(labChartWidget, self).__init__(parent)
self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
- QtGui.QSizePolicy.Expanding))
- self.grid = (8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8)
+ QtGui.QSizePolicy.Expanding))
+ self.grid = (8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8)
self.setMinimumSize(self.minimumSizeHint())
- self.showLeftRight=True
- self.showSelected=True
- self.selected = [-1,-1]
- self.props={}
- self.teeth=[]
+ self.showLeftRight = True
+ self.showSelected = True
+ self.selected = [-1, -1]
+ self.props = {}
+ self.teeth = []
self.addTeeth()
-
+
def sizeHint(self):
return QtCore.QSize(100, 200)
+
def minimumSizeHint(self):
return QtCore.QSize(200, 300)
- def setShowLeftRight(self,arg):
- self.showLeftRight=arg
- def setShowSelected(self,arg):
- self.showSelected=arg
- def setSelected(self,x,y):
- self.selected=[x,y]
+
+ def setShowLeftRight(self, arg):
+ self.showLeftRight = arg
+
+ def setShowSelected(self, arg):
+ self.showSelected = arg
+
+ def setSelected(self, x, y):
+ self.selected = [x, y]
self.repaint()
- self.emit(QtCore.SIGNAL("toothSelected"),self.grid[y][x]) #emit a signal that the user has selected a tooth
-
+ self.emit(
+ QtCore.SIGNAL("toothSelected"),
+ self.grid[y][x]) # emit a signal that the user has selected a tooth
+
def addTeeth(self):
for i in self.grid:
- t=tooth("ur%s"%i,self)
+ t = tooth("ur%s" % i, self)
self.teeth.append(t)
self.update()
-
- def paintEvent(self,event=None):
+
+ def paintEvent(self, event=None):
'''override the paint event so that we can draw our grid'''
-
- centrepoint=(self.width()/2,self.height()/2)
-
+
+ centrepoint = (self.width() / 2, self.height() / 2)
+
painter = QtGui.QPainter(self)
painter.save()
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
- midline=self.width()/100
- xOffset = (self.width() - midline) / 16 #cell width
- yOffset = self.height() / 2 #cell height
- painter.setPen(QtGui.QPen(QtCore.Qt.red,2)) #red pen
+ midline = self.width() / 100
+ xOffset = (self.width() - midline) / \
+ 16 # cell width
+ yOffset = self.height() / \
+ 2 # cell height
+ painter.setPen(QtGui.QPen(QtCore.Qt.red, 2))
+ #red pen
sansFont = QtGui.QFont("Helvetica", 8)
painter.setFont(sansFont)
fm = QtGui.QFontMetrics(sansFont)
- leftpad=fm.width("Right ")
- rightpad=fm.width(" Left")
+ leftpad = fm.width("Right ")
+ rightpad = fm.width(" Left")
+
+ painter.drawLine(leftpad, centrepoint[1],
+ self.width() - rightpad, centrepoint[1]) # big horizontal dissection of entire widget
- painter.drawLine(leftpad,centrepoint[1],
- self.width()- rightpad,centrepoint[1]) #big horizontal dissection of entire widget
+ textRect = QtCore.QRectF(0, 0, self.width(), self.height())
+ painter.drawText(
+ textRect,
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter,
+ (QtCore.QString("Left")))
+ painter.drawText(
+ textRect,
+ QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter,
+ (QtCore.QString("Right")))
- textRect=QtCore.QRectF(0,0,self.width(),self.height())
- painter.drawText(textRect,QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter,(QtCore.QString("Left")))
- painter.drawText(textRect,QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter,(QtCore.QString("Right")))
-
for tooth in self.teeth:
tooth.update()
-
- painter.restore()
+ painter.restore()
if __name__ == "__main__":
@@ -115,7 +156,6 @@ if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = labChartWidget(Form)
- #Form.setEnabled(False)
+ # Form.setEnabled(False)
Form.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/dialogs/bridge_dialog.py b/src/openmolar/qt4gui/dialogs/bridge_dialog.py
index dc8987e..c550b78 100644
--- a/src/openmolar/qt4gui/dialogs/bridge_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/bridge_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import re
@@ -30,8 +32,10 @@ from openmolar.qt4gui.dialogs.new_bridge_dialog import NewBridgeDialog
LOGGER = logging.getLogger("openmolar")
+
class BridgeDialog(BaseDialog):
- def __init__(self, om_gui = None):
+
+ def __init__(self, om_gui=None):
BaseDialog.__init__(self, om_gui)
self.chosen_treatments = []
@@ -45,9 +49,9 @@ class BridgeDialog(BaseDialog):
layout = QtGui.QHBoxLayout(frame)
new_but = QtGui.QPushButton(_("Plan a New Bridge"))
- new_but.setMinimumSize(QtCore.QSize(150,150))
+ new_but.setMinimumSize(QtCore.QSize(150, 150))
alt_but = QtGui.QPushButton(_("Recement/Repairs"))
- alt_but.setMinimumSize(QtCore.QSize(150,150))
+ alt_but.setMinimumSize(QtCore.QSize(150, 150))
layout.addWidget(new_but)
layout.addWidget(alt_but)
@@ -75,9 +79,9 @@ class BridgeDialog(BaseDialog):
material = dl.chosen_properties["material"]
for key, value in dl.chosen_properties.iteritems():
if re.match("[ul][lr][1-8]", key) and value == "pontic":
- self.chosen_treatments.append((key, "BR/P,%s"% material))
+ self.chosen_treatments.append((key, "BR/P,%s" % material))
elif re.match("[ul][lr][1-8]", key) and value == "retainer":
- self.chosen_treatments.append((key, "BR/CR,%s"% material))
+ self.chosen_treatments.append((key, "BR/CR,%s" % material))
self.accept()
else:
self.reject()
diff --git a/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py b/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py
index ac7828f..4e47bf1 100644
--- a/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from collections import namedtuple
from functools import partial
@@ -28,31 +30,32 @@ from PyQt4 import QtCore, QtGui
from openmolar.settings import localsettings
from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
-#these lists are shortcut, description, tooltip
+# these lists are shortcut, description, tooltip
FS_ITEMS = (
("FS", _("Fissure Sealant"), ""),
("FS,CO", _("PRR restoration with composite"), ""),
- )
+)
ENDO_ITEMS = (
("PX", _("Pulp Extirpation - 1 canal"), ""),
("PX+", _("Pulp Extirpation - multiple canals"), ""),
("RT", _("Root Canal"), ""),
- ("IE",_("Incomplete Endodontics"), ""),
- )
+ ("IE", _("Incomplete Endodontics"), ""),
+)
SURGICAL_ITEMS = (
("EX", _("Extraction"), ""),
("EX/S1", _("Surgical Extraction"), ""),
("AP", _("Apicectomy"), ""),
- )
+)
class ChartTxChoiceDialog(ExtendableDialog):
FS_ITEMS = FS_ITEMS
ENDO_ITEMS = ENDO_ITEMS
SURGICAL_ITEMS = SURGICAL_ITEMS
+
def __init__(self, static, parent=None):
ExtendableDialog.__init__(self, parent, remove_stretch=True)
self.setWindowTitle(_("Chart Treatment Choice Dialog"))
@@ -72,7 +75,7 @@ class ChartTxChoiceDialog(ExtendableDialog):
self.more_but.hide()
else:
all_tx_but = QtGui.QPushButton(
- _("Show Treatments from all feescales"))
+ _("Show Treatments from all feescales"))
all_tx_but.clicked.connect(self._show_all_txs)
self.add_advanced_widget(all_tx_but)
@@ -83,7 +86,7 @@ class ChartTxChoiceDialog(ExtendableDialog):
but_list = []
for shortcut, description, tooltip in items:
button = namedtuple('Button',
- ("shortcut", "description", "tooltip"))
+ ("shortcut", "description", "tooltip"))
button.description = description
button.tooltip = ""
button.shortcut = shortcut
@@ -96,13 +99,13 @@ class ChartTxChoiceDialog(ExtendableDialog):
widget_item = self.but_layout.takeAt(0)
try:
widget_item.widget().setParent(None)
- except AttributeError: #stretch item has no attribute "widget"
+ except AttributeError: # stretch item has no attribute "widget"
pass
if chart_buttons == []:
label = QtGui.QLabel(_(
- "No Matching items to show. "
- "Perhaps this is due to the feescale for this patient?"))
+ "No Matching items to show. "
+ "Perhaps this is due to the feescale for this patient?"))
label.setWordWrap(True)
self.but_layout.addWidget(label)
for button in chart_buttons:
@@ -120,7 +123,7 @@ class ChartTxChoiceDialog(ExtendableDialog):
def _show_all_txs(self):
if self.all_tx_buttons == []:
QtGui.QMessageBox.information(self, _("Error"),
- _("No items of this type have found in any feescale"))
+ _("No items of this type have found in any feescale"))
self.add_buttons(self.all_tx_buttons)
self.hide_extension()
diff --git a/src/openmolar/qt4gui/dialogs/child_smile_dialog.py b/src/openmolar/qt4gui/dialogs/child_smile_dialog.py
index 152ea7c..998185b 100644
--- a/src/openmolar/qt4gui/dialogs/child_smile_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/child_smile_dialog.py
@@ -1,33 +1,39 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import re
+import socket
import urllib2
from xml.dom import minidom
+from xml.parsers.expat import ExpatError
+
from PyQt4 import QtGui, QtCore
if __name__ == "__main__":
- import os, sys
+ import os
+ import sys
sys.path.insert(0, os.path.abspath("../../../"))
from openmolar.settings import localsettings
@@ -38,7 +44,7 @@ LOGGER = logging.getLogger("openmolar")
LOOKUP_URL = "http://www.psd.scot.nhs.uk/dev/simd/simdLookup.aspx"
-## here is the result when using this
+# here is the result when using this
EXAMPLE_RESULT = '''
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
@@ -57,11 +63,13 @@ EXAMPLE_RESULT = '''
</html>
'''
-TODAYS_LOOKUPS = {} #{"IV1 1PP": "SIMD Area: 1"}
+TODAYS_LOOKUPS = {} # {"IV1 1PP": "SIMD Area: 1"}
+
class ChildSmileDialog(BaseDialog):
result = ""
is_checking_website = False
+
def __init__(self, parent):
BaseDialog.__init__(self, parent)
@@ -83,7 +91,7 @@ class ChildSmileDialog(BaseDialog):
self.fl_checkbox = QtGui.QCheckBox(_("Fluoride Varnish Applied"))
self.fl_checkbox.setToolTip(
_("Fee claimable for patients betwen 2 and 5"))
- self.fl_checkbox.setChecked(2 <= self.main_ui.pt.ageYears <=5)
+ self.fl_checkbox.setChecked(2 <= self.main_ui.pt.ageYears <= 5)
self.insertWidget(self.header_label)
self.insertWidget(self.pcde_le)
@@ -94,6 +102,8 @@ class ChildSmileDialog(BaseDialog):
self.pcde_le.textEdited.connect(self.check_pcde)
+ self._simd = None
+
@property
def pcde(self):
try:
@@ -117,68 +127,81 @@ class ChildSmileDialog(BaseDialog):
self.simd_label.setText("")
self.enableApply(False)
- def check_hung(self):
- '''
- this is called by a timout of the web polling
- '''
- if self.is_checking_website:
- QtGui.QApplication.instance().restoreOverrideCursor()
- QtGui.QMessageBox.warning(self, "error",
- "unable to poll NHS website")
- self.reject()
- return
-
-
def simd_lookup(self):
'''
poll the server for a simd for a postcode
'''
+ QtGui.QApplication.instance().processEvents()
global TODAYS_LOOKUPS
try:
self.result = TODAYS_LOOKUPS[self.pcde]
- self.simd_label.setText(self.result)
+ self.simd_label.setText("%s %s" % (_("KNOWN SIMD"), self.result))
self.enableApply(True)
LOGGER.debug("simd_lookup unnecessary, value known")
return
except KeyError:
pass
- try:
- self.is_checking_website = True
- QtCore.QTimer.singleShot(15000, self.check_hung)
- self.header_label.setText(_("Polling website with Postcode"))
- QtGui.QApplication.instance().setOverrideCursor(
- QtCore.Qt.WaitCursor)
+ self.header_label.setText(_("Polling website with Postcode"))
- pcde = self.pcde.replace(" ", "%20")
+ pcde = self.pcde.replace(" ", "%20")
- url = "%s?pCode=%s" %(LOOKUP_URL, pcde)
+ url = "%s?pCode=%s" % (LOOKUP_URL, pcde)
+ try:
+ QtGui.QApplication.instance().setOverrideCursor(
+ QtCore.Qt.WaitCursor)
req = urllib2.Request(url)
- response = urllib2.urlopen(req)
+ response = urllib2.urlopen(req, timeout=10)
result = response.read()
self.result = self._parse_result(result)
- TODAYS_LOOKUPS[self.pcde] = self.result
- self.simd_label.setText(self.result)
-
- self.enableApply(True)
- self.is_checking_website = False
+ except urllib2.URLError as exc:
+ raise socket.timeout(exc)
+ LOGGER.error("url error polling NHS website?")
+ self.result = _("Error polling website")
+ except socket.timeout as e:
+ LOGGER.error("timeout error polling NHS website?")
+ self.result = _("Timeout polling website")
+ finally:
QtGui.QApplication.instance().restoreOverrideCursor()
- except Exception as exc:
- LOGGER.exception("error polling NHS website?")
- QtGui.QApplication.instance().restoreOverrideCursor()
- QtGui.QMessageBox.warning(self, "error",
- "unable to poll NHS website")
- self.reject()
+
+ self.simd_label.setText("%s = %s" % (_("RESULT"), self.result))
+ QtGui.QApplication.instance().processEvents()
+
+ TODAYS_LOOKUPS[self.pcde] = "SIMD: %s" % self.simd_number
+ self.enableApply(self.simd_number is not None)
+
+ self.header_label.setText("SIMD %d" % self.simd_number)
def _parse_result(self, result):
- dom = minidom.parseString(result)
- e=dom.getElementsByTagName("span")[0]
- return e.firstChild.data
+ try:
+ dom = minidom.parseString(result)
+ e = dom.getElementsByTagName("span")[0]
+ return e.firstChild.data
+ except ExpatError:
+ return "UNDECIPHERABLE REPLY"
+
+ def manual_entry(self):
+ simd, result = QtGui.QInputDialog.getInteger(self,
+ _(
+ "Manual Input Required"),
+ _(
+ "Online lookup has failed, please enter the SIMD manually"),
+ 4, 1, 5)
+ if not result:
+ self.reject()
+ return simd
@property
def simd_number(self):
- return int(re.search("(\d+)", self.result).groups()[0])
+ if self._simd is None:
+ m = re.search("(\d+)", self.result)
+ if m:
+ self._simd = int(m.groups()[0])
+ else:
+ self._simd = 4
+ self._simd = self.manual_entry()
+ return self._simd
@property
def tbi_performed(self):
@@ -196,7 +219,7 @@ class ChildSmileDialog(BaseDialog):
def tx_items(self):
age = self.main_ui.pt.ageYears
dentist = localsettings.clinicianNo in localsettings.dentDict.keys()
- LOGGER.debug("Performed by dentist = %s"% dentist)
+ LOGGER.debug("Performed by dentist = %s" % dentist)
if age < 3:
if self.simd_number < 4:
yield ("other", "CS1")
@@ -222,23 +245,23 @@ class ChildSmileDialog(BaseDialog):
if self.fl_applied:
yield ("other", "CSFL")
-
def exec_(self):
- self.check_pcde()
- QtCore.QTimer.singleShot(100, self.postcode_warning)
+ QtCore.QTimer.singleShot(100, self.check_pcde)
+ QtCore.QTimer.singleShot(500, self.postcode_warning)
if BaseDialog.exec_(self):
if self.valid_postcode:
self.main_ui.pt.pcde = self.pcde
- self.main_ui.addNewNote("CHILDSMILE (postcode '%s'): %s"%
- (self.pcde, self.result))
+ self.main_ui.addNewNote("CHILDSMILE (postcode '%s'): %s" %
+ (self.pcde, self.result))
return True
if __name__ == "__main__":
LOGGER.setLevel(logging.DEBUG)
+
def _mock_function(*args):
pass
from collections import namedtuple
@@ -247,19 +270,19 @@ if __name__ == "__main__":
app = QtGui.QApplication([])
ui = QtGui.QMainWindow()
- ui.pt = namedtuple("pt",("pcde","ageYears"))
+ ui.pt = namedtuple("pt", ("pcde", "ageYears"))
ui.pt.pcde = "Iv1 1P"
ui.pt.ageYears = 3
ui.addNewNote = _mock_function
dl = ChildSmileDialog(ui)
- #print dl._parse_result(EXAMPLE_RESULT)
+ # print dl._parse_result(EXAMPLE_RESULT)
if dl.exec_():
print (dl.result)
print (dl.simd_number)
- print ("toothbrush instruction = %s"% dl.tbi_performed)
- print ("dietary advice = %s"% dl.di_performed)
+ print ("toothbrush instruction = %s" % dl.tbi_performed)
+ print ("dietary advice = %s" % dl.di_performed)
for item in dl.tx_items:
- print item
\ No newline at end of file
+ print item
diff --git a/src/openmolar/qt4gui/dialogs/choose_clinicians.py b/src/openmolar/qt4gui/dialogs/choose_clinicians.py
index 51de734..2b811e7 100644
--- a/src/openmolar/qt4gui/dialogs/choose_clinicians.py
+++ b/src/openmolar/qt4gui/dialogs/choose_clinicians.py
@@ -1,14 +1,33 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2010 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.compiled_uis import Ui_choose_clinicians
+
class dialog(Ui_choose_clinicians.Ui_Dialog, QtGui.QDialog):
+
def __init__(self, widg, parent=None):
super(dialog, self).__init__(parent)
self.setupUi(self)
@@ -22,4 +41,4 @@ if __name__ == "__main__":
l = QtGui.QListView()
dl = dialog(l)
dl.exec_()
- app.closeAllWindows()
\ No newline at end of file
+ app.closeAllWindows()
diff --git a/src/openmolar/qt4gui/dialogs/choose_tooth_dialog.py b/src/openmolar/qt4gui/dialogs/choose_tooth_dialog.py
index 85ade0e..9d7c590 100644
--- a/src/openmolar/qt4gui/dialogs/choose_tooth_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/choose_tooth_dialog.py
@@ -1,17 +1,35 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.compiled_uis import Ui_choose_tooth
from openmolar.qt4gui.customwidgets.simple_chartwidget import SimpleChartWidg
+
class ChooseToothDialog(QtGui.QDialog, Ui_choose_tooth.Ui_Dialog):
+
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
@@ -30,4 +48,4 @@ class ChooseToothDialog(QtGui.QDialog, Ui_choose_tooth.Ui_Dialog):
if __name__ == "__main__":
app = QtGui.QApplication([])
dl = ChooseToothDialog()
- dl.getInput()
\ No newline at end of file
+ dl.getInput()
diff --git a/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py b/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py
index 68dc60e..3fd4831 100644
--- a/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py
@@ -1,42 +1,59 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
-import types
+
from openmolar.settings import localsettings
-from xml.dom import minidom
-class Dialog(QtGui.QDialog):
+
+class ClinicianSelectDialog(QtGui.QDialog):
+
def __init__(self, parent=None):
- super(Dialog, self).__init__(parent)
+ QtGui.QDialog.__init__(self, parent)
self.setWindowTitle(_("Select a Clinician"))
-
+
layout = QtGui.QVBoxLayout(self)
self.listwidget = QtGui.QListWidget()
self.listwidget.setSelectionBehavior(
QtGui.QAbstractItemView.SelectRows)
self.listwidget.setSelectionMode(
QtGui.QAbstractItemView.SingleSelection)
-
+
clinicians = [_("NONE")] + localsettings.activedents + \
localsettings.activehygs
self.listwidget.addItems(clinicians)
-
+
try:
i = clinicians.index(localsettings.clinicianInits)
except ValueError:
i = 0
self.listwidget.setCurrentRow(i)
-
+
self.buttonBox = QtGui.QDialogButtonBox(self)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(
- QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
layout.addWidget(self.listwidget)
@@ -44,14 +61,13 @@ class Dialog(QtGui.QDialog):
self.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), self.accept)
self.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), self.reject)
-
-
+
@property
def selectedClinician(self):
if self.listwidget.currentRow() == 0:
return ""
return str(self.listwidget.currentItem().text().toAscii())
-
+
def result(self):
if self.exec_():
chosen = self.selectedClinician
@@ -64,20 +80,20 @@ class Dialog(QtGui.QDialog):
if u2 == chosen:
u2 = ""
if u2:
- input = QtGui.QMessageBox.question(self, _("Confirm"),
- _("Set assistant as") + " %s?"% u2,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ input = QtGui.QMessageBox.question(self, _("Confirm"),
+ _("Set assistant as") +
+ " %s?" % u2,
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if input == QtGui.QMessageBox.No:
u2 = ""
localsettings.setOperator(chosen, u2)
return (change_needed, chosen)
return (False, None)
-
+
if __name__ == "__main__":
- from openmolar.qt4gui import resources_rc
localsettings.initiate()
- app = QtGui.QApplication([])
- ui = Dialog()
- print ui.result()
+ app = QtGui.QApplication([])
+ dl = ClinicianSelectDialog()
+ print dl.result()
app.closeAllWindows()
diff --git a/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py b/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py
index c4cfca9..c3f8315 100644
--- a/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import re
@@ -34,19 +36,21 @@ from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
LOGGER = logging.getLogger("openmolar")
+
class CompleteTreatmentDialog(ExtendableDialog):
def __init__(self, treatments, parent=None):
ExtendableDialog.__init__(self, parent, remove_stretch=True)
self.om_gui = parent
- LOGGER.debug("CompleteTreatmentDialog %s"% treatments)
+ LOGGER.debug("CompleteTreatmentDialog %s" % treatments)
self.setWindowTitle(_("Complete Multiple Treatments"))
- label = QtGui.QLabel(u"%s<br />%s"%(
- _("You have selected multiple treatments."),
- _("Please complete, reverse or delete then apply changes.")
- ))
+ label = QtGui.QLabel(u"%s<br />%s" % (
+ _("You have selected multiple treatments."),
+ _(
+ "Please complete, reverse or delete then apply changes.")
+ ))
self.insertWidget(label)
self.treatments = treatments
@@ -61,7 +65,7 @@ class CompleteTreatmentDialog(ExtendableDialog):
col = 1
for header in (_("Planned"), _("Completed")):
- label = QtGui.QLabel(u"<b>%s</b>"% header)
+ label = QtGui.QLabel(u"<b>%s</b>" % header)
label.setAlignment(QtCore.Qt.AlignCenter)
self.but_layout.addWidget(label, row, col)
col += 1
@@ -71,10 +75,10 @@ class CompleteTreatmentDialog(ExtendableDialog):
self.complete_icon = QtGui.QIcon(":forward.png")
for i, (att, treatment, completed) in enumerate(treatments):
- row = i+1
+ row = i + 1
label = QtGui.QLabel(
- "%s - <b>%s</b>"% (att.upper(), treatment.upper()))
- label.setAlignment(QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
+ "%s - <b>%s</b>" % (att.upper(), treatment.upper()))
+ label.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.but_layout.addWidget(label, row, 0)
if completed:
@@ -86,7 +90,7 @@ class CompleteTreatmentDialog(ExtendableDialog):
but = QtGui.QPushButton(icon, "")
but.setIconSize(QtCore.QSize(10, 10))
but.setMaximumWidth(50)
- self.but_layout.addWidget(but, row, col+1)
+ self.but_layout.addWidget(but, row, col + 1)
but.clicked.connect(partial(self._but_clicked, row))
@@ -99,7 +103,7 @@ class CompleteTreatmentDialog(ExtendableDialog):
but.clicked.connect(partial(self._del_but_clicked, row))
self.but_layout.addItem(QtGui.QSpacerItem(0, 10))
- self.but_layout.setRowStretch(row+1, 2)
+ self.but_layout.setRowStretch(row + 1, 2)
but_frame = QtGui.QFrame()
layout = QtGui.QHBoxLayout(but_frame)
@@ -119,8 +123,7 @@ class CompleteTreatmentDialog(ExtendableDialog):
self.insertWidget(scroll_area)
self.insertWidget(but_frame)
-
- #no advanced options yet
+ # no advanced options yet
self.more_but.hide()
def sizeHint(self):
@@ -175,7 +178,6 @@ class CompleteTreatmentDialog(ExtendableDialog):
for button in self.cmp_buttons:
button.click()
-
def _enable(self):
for val in self.completed_treatments:
self.enableApply()
@@ -202,7 +204,7 @@ class CompleteTreatmentDialog(ExtendableDialog):
iterate and return all buttons in the left column
'''
for i in range(len(self.treatments)):
- row = i+1
+ row = i + 1
item = self.but_layout.itemAtPosition(row, 1)
if item is not None:
yield item.widget()
@@ -213,7 +215,7 @@ class CompleteTreatmentDialog(ExtendableDialog):
iterate and return all buttons in the right column
'''
for i in range(len(self.treatments)):
- row = i+1
+ row = i + 1
item = self.but_layout.itemAtPosition(row, 2)
if item is not None:
yield item.widget()
@@ -221,7 +223,7 @@ class CompleteTreatmentDialog(ExtendableDialog):
@property
def uncompleted_treatments(self):
for i, (att, treat, prev_completed) in enumerate(self.treatments):
- row = i+1
+ row = i + 1
now_planned = self.but_layout.itemAtPosition(row, 2) is None
if now_planned and prev_completed:
yield (att, treat)
@@ -229,7 +231,7 @@ class CompleteTreatmentDialog(ExtendableDialog):
@property
def completed_treatments(self):
for i, (att, treat, prev_completed) in enumerate(self.treatments):
- row = i+1
+ row = i + 1
now_completed = self.but_layout.itemAtPosition(row, 1) is None
if now_completed and not prev_completed:
yield (att, treat)
@@ -237,7 +239,7 @@ class CompleteTreatmentDialog(ExtendableDialog):
@property
def deleted_treatments(self):
for i, (att, treat, prev_completed) in enumerate(self.treatments):
- row = i+1
+ row = i + 1
if not self.but_layout.itemAtPosition(row, 0).widget().isEnabled():
yield (att, treat, prev_completed)
@@ -257,13 +259,13 @@ if __name__ == "__main__":
("ur5", "MOD", False),
("ur5", "RT", False),
("ur4", "DR", True)
- ], mw)
+ ], mw)
if dl.exec_():
for att, treat in dl.completed_treatments:
- print "%s %s was completed"% (att, treat)
+ print "%s %s was completed" % (att, treat)
for att, treat in dl.uncompleted_treatments:
- print "%s %s was reversed"% (att, treat)
+ print "%s %s was reversed" % (att, treat)
for att, treat, completed in dl.deleted_treatments:
- print "%s %s %s was deleted"% (att, treat, completed)
+ print "%s %s %s was deleted" % (att, treat, completed)
diff --git a/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py b/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py
index 00c3f59..10c4788 100644
--- a/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from collections import namedtuple
from functools import partial
@@ -31,19 +33,19 @@ from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
STATIC_LIST = []
for shortcut, description in (
-("CR,PJ", _("Porcelain Jacket")),
-("CR,GO", _("Gold")),
-("CR,V1", _("Porcelain/Metal")),
-("CR,LAVA", _("Lava")),
-("CR,OPAL", _("Opalite")),
-("CR,EMAX", _("Emax")),
-("CR,EVER", _("Everest")),
-("CR,SS", _("Stainless")),
-("CR,SR", _("Resin")),
-("CR,OT", _("Other")),
+ ("CR,PJ", _("Porcelain Jacket")),
+ ("CR,GO", _("Gold")),
+ ("CR,V1", _("Porcelain/Metal")),
+ ("CR,LAVA", _("Lava")),
+ ("CR,OPAL", _("Opalite")),
+ ("CR,EMAX", _("Emax")),
+ ("CR,EVER", _("Everest")),
+ ("CR,SS", _("Stainless")),
+ ("CR,SR", _("Resin")),
+ ("CR,OT", _("Other")),
):
crown_chart_button = namedtuple('CrownType',
- ("shortcut", "description", "tooltip"))
+ ("shortcut", "description", "tooltip"))
crown_chart_button.description = description
crown_chart_button.tooltip = ""
crown_chart_button.shortcut = shortcut
@@ -51,6 +53,7 @@ for shortcut, description in (
class CrownChoiceDialog(ExtendableDialog):
+
def __init__(self, static, parent=None):
ExtendableDialog.__init__(self, parent, remove_stretch=True)
self.setWindowTitle(_("Crown Choice Dialog"))
@@ -71,7 +74,7 @@ class CrownChoiceDialog(ExtendableDialog):
self.add_buttons(STATIC_LIST)
else:
all_crowns_but = QtGui.QPushButton(
- _("Show Crowns types from all feescales"))
+ _("Show Crowns types from all feescales"))
all_crowns_but.clicked.connect(self._show_all_crowns)
self.add_advanced_widget(all_crowns_but)
@@ -91,8 +94,8 @@ class CrownChoiceDialog(ExtendableDialog):
but.setToolTip(crown_button.tooltip)
but.clicked.connect(
partial(self.but_clicked, crown_button.shortcut))
- self.but_layout.addWidget(but, row//2, row%2)
- self.but_layout.setRowStretch((row+2)//2,100)
+ self.but_layout.addWidget(but, row // 2, row % 2)
+ self.but_layout.setRowStretch((row + 2) // 2, 100)
def _show_all_crowns(self):
self.add_buttons(localsettings.FEETABLES.ui_crown_chart_buttons)
@@ -115,4 +118,4 @@ if __name__ == "__main__":
localsettings.loadFeeTables()
dl = CrownChoiceDialog(False, mw)
if dl.exec_():
- print dl.chosen_shortcut
\ No newline at end of file
+ print dl.chosen_shortcut
diff --git a/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py b/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py
new file mode 100644
index 0000000..a367656
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py
@@ -0,0 +1,128 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+import logging
+from PyQt4 import QtGui, QtCore
+
+from openmolar.dbtools import daybook
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+KEYS = ("diagn", "perio", "anaes", "misc", "ndu", "ndl", "odu", "odl", "other")
+
+
+class DaybookEditDialog(ExtendableDialog):
+
+ def __init__(self, daybook_id, feesa=None, feesb=None, parent=None):
+ ExtendableDialog.__init__(self, parent)
+ self.daybook_id = daybook_id
+ self.orig_values = []
+
+ header_label = QtGui.QLabel(
+ "<b>%s %s</b>" % (_("Inspecting daybook row"), self.daybook_id))
+ header_label.setAlignment(QtCore.Qt.AlignCenter)
+
+ frame = QtGui.QFrame()
+ form = QtGui.QFormLayout(frame)
+ self.line_edits = {}
+ for key in KEYS:
+ self.line_edits[key] = QtGui.QLineEdit()
+
+ self.chart_edit = QtGui.QTextEdit()
+
+ form.addRow(_("Diagnosis"), self.line_edits[KEYS[0]])
+ form.addRow(_("Perio"), self.line_edits[KEYS[1]])
+ form.addRow(_("Anaesthetics"), self.line_edits[KEYS[2]])
+ form.addRow(_("Misc"), self.line_edits[KEYS[3]])
+ form.addRow(_("New Denture (upper)"), self.line_edits[KEYS[4]])
+ form.addRow(_("New Denture (lower)"), self.line_edits[KEYS[5]])
+ form.addRow(_("Other Denture (upper)"), self.line_edits[KEYS[6]])
+ form.addRow(_("Other Denture (lower)"), self.line_edits[KEYS[7]])
+ form.addRow(_("Other Treatment"), self.line_edits[KEYS[8]])
+ form.addRow(_("Chart Treatment"), self.chart_edit)
+
+ self.insertWidget(header_label)
+ self.insertWidget(frame)
+
+ self.adv_widget = QtGui.QLabel(_("No advanced options available"))
+ self.add_advanced_widget(self.adv_widget)
+ # self.remove_spacer()
+
+ QtCore.QTimer.singleShot(100, self.get_data)
+
+ def advise(self, message):
+ QtGui.QMessageBox.information(self, _("message"), message)
+
+ def sizeHint(self):
+ return QtCore.QSize(400, 400)
+
+ def get_data(self):
+ row = daybook.get_treatments(self.daybook_id)
+ for i, value in enumerate(row):
+ value = value.strip(" ")
+ try:
+ line_edit = self.line_edits[KEYS[i]]
+ line_edit.setText(value.strip(" "))
+ self.orig_values.append("%s " % value)
+ line_edit.textChanged.connect(self._check_applicable)
+ except IndexError:
+ self.orig_values.append("%s " % value)
+ self.chart_edit.setText(value.replace(" ", "\n"))
+ self.chart_edit.textChanged.connect(self._check_applicable)
+
+ def _check_applicable(self):
+ for i, value in enumerate(self.new_values()):
+ if value != self.orig_values[i]:
+ self.enableApply()
+ return
+ self.enableApply(False)
+
+ @property
+ def new_chart_value(self):
+ newval = ""
+ for line in str(self.chart_edit.document().toPlainText()).split("\n"):
+ if line.strip(" ") != "":
+ newval += "%s " % line.strip(" ")
+ return newval.upper()
+
+ def new_values(self):
+ for key in KEYS:
+ val = str(self.line_edits[key].text().toAscii().trimmed())
+ yield "" if val == "" else "%s " % val.upper()
+ yield self.new_chart_value
+
+ def update_treatments(self):
+ '''
+ apply any edits (should be called if self.exec_() == True)
+ '''
+ daybook.update_treatments(self.daybook_id, self.new_values())
+
+if __name__ == "__main__":
+
+ app = QtGui.QApplication([])
+ LOGGER.setLevel(logging.DEBUG)
+ dl = DaybookEditDialog(337646)
+ if dl.exec_():
+ dl.update_treatments()
diff --git a/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py b/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py
new file mode 100644
index 0000000..ab3d5e9
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py
@@ -0,0 +1,184 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+import logging
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.dbtools import daybook
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+from openmolar.qt4gui.dialogs import permissions
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class DaybookItemAdvancedWidget(QtGui.QWidget):
+ update_totals_signal = QtCore.pyqtSignal()
+ update_fee_signal = QtCore.pyqtSignal()
+ update_ptfee_signal = QtCore.pyqtSignal()
+ delete_row_signal = QtCore.pyqtSignal()
+
+ def __init__(self, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+ layout = QtGui.QVBoxLayout(self)
+
+ but1 = QtGui.QPushButton(
+ _("Update the daybook row with these new Totals"))
+ but2 = QtGui.QPushButton(
+ _("Update the daybook row with Fee Total Only"))
+ but3 = QtGui.QPushButton(
+ _("Update the daybook row with Charge Total Only"))
+ but4 = QtGui.QPushButton(
+ _("Delete this row from the daybook"))
+
+ layout.addWidget(but1)
+ layout.addWidget(but2)
+ layout.addWidget(but3)
+ layout.addStretch()
+ layout.addWidget(but4)
+
+ but1.clicked.connect(self.update_totals_signal.emit)
+ but2.clicked.connect(self.update_fee_signal.emit)
+ but3.clicked.connect(self.update_ptfee_signal.emit)
+ but4.clicked.connect(self.delete_row_signal.emit)
+
+ self.update_buts = (but1, but2, but3)
+
+ def disable_fee_updates(self):
+ for but in self.update_buts:
+ but.setEnabled(False)
+
+
+class DaybookItemDialog(ExtendableDialog):
+
+ def __init__(self, daybook_id, feesa=None, feesb=None, parent=None):
+ ExtendableDialog.__init__(self, parent)
+ self.daybook_id = daybook_id
+ self.feesa = feesa
+ self.feesb = feesb
+
+ header_label = QtGui.QLabel(
+ "<b>%s %s</b>" % (_("Inspecting daybook row"), self.daybook_id))
+ header_label.setAlignment(QtCore.Qt.AlignCenter)
+
+ self.feesa_label = QtGui.QLabel()
+ self.feesa_label.setStyleSheet("color:red;")
+ self.feesb_label = QtGui.QLabel()
+ self.feesb_label.setStyleSheet("color:red;")
+
+ self.apply_but.setText(_("Ok"))
+ self.cancel_but.hide()
+ self.enableApply()
+
+ self.insertWidget(header_label)
+ self.web_view = QtGui.QTextBrowser()
+ self.insertWidget(self.web_view)
+ self.insertWidget(self.feesa_label)
+ self.insertWidget(self.feesb_label)
+
+ self.adv_widget = DaybookItemAdvancedWidget()
+ self.add_advanced_widget(self.adv_widget)
+ self.remove_spacer()
+
+ self.total_fee = 0
+ self.total_ptfee = 0
+
+ self.adv_widget.update_totals_signal.connect(self.update_totals)
+ self.adv_widget.update_fee_signal.connect(self.update_fee)
+ self.adv_widget.update_ptfee_signal.connect(self.update_ptfee)
+ self.adv_widget.delete_row_signal.connect(self.delete_row)
+
+ QtCore.QTimer.singleShot(100, self.get_data)
+
+ def advise(self, message):
+ QtGui.QMessageBox.information(self, _("message"), message)
+
+ def sizeHint(self):
+ return QtCore.QSize(400, 400)
+
+ def get_data(self):
+ rows = daybook.inspect_item(self.daybook_id)
+ if rows == ():
+ html = _("No Information found in estimates for this daybook item")
+ self.adv_widget.disable_fee_updates()
+ else:
+ html = '''<table border="1" width="100%%">
+ <tr><th>%s</th><th>%s</th><th>%s</th></tr>''' % (
+ _("Description"), _("Fee"), _("Charge")
+ )
+ for description, fee, ptfee in rows:
+ self.total_fee += fee
+ self.total_ptfee += ptfee
+ html += '''<tr><td>%s</td>
+ <td align="right">%s</td>
+ <td align="right">%s</td></tr>''' % (
+ description,
+ localsettings.formatMoney(fee),
+ localsettings.formatMoney(ptfee)
+ )
+ html += '''<tr><th>%s</th>
+ <th align="right">%s</th><th align="right">%s</th></tr>''' % (
+ _("TOTAL"),
+ localsettings.formatMoney(self.total_fee),
+ localsettings.formatMoney(self.total_ptfee)
+ )
+
+ if self.feesa is not None and self.total_fee != self.feesa:
+ self.feesa_label.setText(_("Fee Differs"))
+ if self.feesb is not None and self.total_ptfee != self.feesb:
+ self.feesb_label.setText(_("Charge Differs"))
+
+ self.web_view.setHtml(html)
+
+ def update_totals(self):
+ if daybook.update_row_fees(
+ self.daybook_id, self.total_fee, self.total_ptfee):
+ self.advise(_("Successfully applied changes"))
+ else:
+ self.advise(_("No changes made"))
+
+ def update_fee(self):
+ if daybook.update_row_fee(self.daybook_id, self.total_fee):
+ self.advise(_("Successfully applied change"))
+ else:
+ self.advise(_("No changes made"))
+
+ def update_ptfee(self):
+ if daybook.update_row_ptfee(self.daybook_id, self.total_ptfee):
+ self.advise(_("Successfully applied change"))
+ else:
+ self.advise(_("No changes made"))
+
+ def delete_row(self):
+ if permissions.granted(self) and daybook.delete_row(self.daybook_id):
+ self.advise(_("Successfully deleted row"))
+ else:
+ self.advise(_("No changes made"))
+
+if __name__ == "__main__":
+
+ app = QtGui.QApplication([])
+ LOGGER.setLevel(logging.DEBUG)
+ dl = DaybookItemDialog(337646, 5700, 1300)
+ dl.exec_()
diff --git a/src/openmolar/qt4gui/dialogs/denture_dialog.py b/src/openmolar/qt4gui/dialogs/denture_dialog.py
index 0e7a220..7012189 100644
--- a/src/openmolar/qt4gui/dialogs/denture_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/denture_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
@@ -30,9 +32,11 @@ from openmolar.qt4gui.dialogs.new_denture_dialog import NewDentureDialog
LOGGER = logging.getLogger("openmolar")
+
class DentureDialog(BaseDialog):
chosen_treatments = []
- def __init__(self, om_gui = None):
+
+ def __init__(self, om_gui=None):
BaseDialog.__init__(self, om_gui)
self.om_gui = om_gui
@@ -45,9 +49,9 @@ class DentureDialog(BaseDialog):
layout = QtGui.QHBoxLayout(frame)
new_but = QtGui.QPushButton(_("Plan a New Denture"))
- new_but.setMinimumSize(QtCore.QSize(150,150))
+ new_but.setMinimumSize(QtCore.QSize(150, 150))
alt_but = QtGui.QPushButton(_("Alter an Existing Denture"))
- alt_but.setMinimumSize(QtCore.QSize(150,150))
+ alt_but.setMinimumSize(QtCore.QSize(150, 150))
layout.addWidget(new_but)
layout.addWidget(alt_but)
@@ -89,4 +93,4 @@ if __name__ == "__main__":
if dl.exec_():
print dl.chosen_treatments
else:
- print "dialog rejected"
\ No newline at end of file
+ print "dialog rejected"
diff --git a/src/openmolar/qt4gui/dialogs/document_dialog.py b/src/openmolar/qt4gui/dialogs/document_dialog.py
index 38d45e8..3ab2e0c 100644
--- a/src/openmolar/qt4gui/dialogs/document_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/document_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2014 Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import os
@@ -32,10 +34,13 @@ from xml.dom import minidom
LOGGER = logging.getLogger("openmolar")
+
def _null_func():
return None
+
class _FileListWidget(QtGui.QScrollArea):
+
def __init__(self, files, parent=None):
assert files != [], "no files passed to FileListWidget"
QtGui.QScrollArea.__init__(self, parent)
@@ -50,8 +55,8 @@ class _FileListWidget(QtGui.QScrollArea):
layout = QtGui.QVBoxLayout(frame)
self.setWidget(frame)
self.setWidgetResizable(True)
- for file_ in self.files:
- rb = QtGui.QRadioButton(file_)
+ for label in self.labels:
+ rb = QtGui.QRadioButton(label)
layout.addWidget(rb)
self.radio_buts.append(rb)
@@ -61,9 +66,11 @@ class _FileListWidget(QtGui.QScrollArea):
return self.files[i]
def sizeHint(self):
- return QtCore.QSize(200,400)
+ return QtCore.QSize(200, 400)
+
class _LabelledFileListWidget(_FileListWidget):
+
def __init__(self, nodelist, parent=None):
QtGui.QScrollArea.__init__(self, parent)
self.files = []
@@ -75,20 +82,24 @@ class _LabelledFileListWidget(_FileListWidget):
assert self.files != [], "no files passed to _LabelledFileListWidget"
self.layout_widgets()
+
class DocumentDialog(ExtendableDialog):
+
def __init__(self, parent=None):
ExtendableDialog.__init__(self, parent, remove_stretch=True)
title = _("Openmolar Documents Dialog")
self.setWindowTitle(title)
- label = QtGui.QLabel("<b>%s</b>"% _("Please choose a document to open"))
+ label = QtGui.QLabel(
+ "<b>%s</b>" %
+ _("Please choose a document to open"))
label.setAlignment(QtCore.Qt.AlignCenter)
self.chosen_document = None
- message = '<p>%s<br /><a href="%s">%s</a></p>'% (
- _("For help configuring this feature, see"),
- urls.DOCUMENT_HELP, urls.DOCUMENT_HELP)
+ message = '<p>%s<br /><a href="%s">%s</a></p>' % (
+ _("For help configuring this feature, see"),
+ urls.DOCUMENT_HELP, urls.DOCUMENT_HELP)
advanced_label = QtGui.QLabel(message)
advanced_label.setOpenExternalLinks(True)
@@ -97,9 +108,9 @@ class DocumentDialog(ExtendableDialog):
files = os.listdir(localsettings.DOCS_DIRECTORY)
if files == []:
- widg = QtGui.QLabel("<p>%s %s</p><hr />%s"% (
- _("You have no documents stored in"),
- localsettings.DOCS_DIRECTORY, message))
+ widg = QtGui.QLabel("<p>%s %s</p><hr />%s" % (
+ _("You have no documents stored in"),
+ localsettings.DOCS_DIRECTORY, message))
widg.setAlignment(QtCore.Qt.AlignCenter)
widg.setOpenExternalLinks(True)
widg.selected_file = _null_func
@@ -115,15 +126,17 @@ class DocumentDialog(ExtendableDialog):
for group in doc_node.getElementsByTagName("group"):
docs = group.getElementsByTagName("document")
group_widg = _LabelledFileListWidget(docs)
- tab = widg.addTab(group_widg, group.getAttribute("heading"))
+ tab = widg.addTab(
+ group_widg,
+ group.getAttribute("heading"))
group_widg.radio_buts[0].setChecked(True)
widg.selected_file = widg.currentWidget().selected_file
except:
- LOGGER.exception("unable to parse '%s'"% control_f)
+ LOGGER.exception("unable to parse '%s'" % control_f)
widg = QtGui.QLabel(_("docs.xml is not parseable"))
else:
- #self.remove_spacer()
+ # self.remove_spacer()
widg = _FileListWidget(files)
self.enableApply(bool(widg.selected_file()))
@@ -139,7 +152,7 @@ class DocumentDialog(ExtendableDialog):
return self._widg
def sizeHint(self):
- return QtCore.QSize(400,350)
+ return QtCore.QSize(400, 350)
def _open_document(self):
'''
@@ -150,8 +163,8 @@ class DocumentDialog(ExtendableDialog):
return
try:
doc = os.path.abspath(
- os.path.join(localsettings.DOCS_DIRECTORY, doc))
- LOGGER.info("opening %s"% doc)
+ os.path.join(localsettings.DOCS_DIRECTORY, doc))
+ LOGGER.info("opening %s" % doc)
localsettings.openPDF(doc)
except Exception as exc:
message = _("Error opening PDF file")
@@ -167,9 +180,10 @@ class DocumentDialog(ExtendableDialog):
if __name__ == "__main__":
app = QtGui.QApplication([])
+
def advise(message, severity):
QtGui.QMessageBox.information(dl, "message", message)
-
+
mw = QtGui.QWidget()
dl = DocumentDialog(mw)
dl.exec_()
diff --git a/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py b/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py
index 207454f..2cbd8c0 100644
--- a/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
from PyQt4 import QtGui, QtCore
@@ -34,17 +36,19 @@ from openmolar import connect
LOGGER = logging.getLogger("openmolar")
-RECALL_METHODS = ["post","email","sms"]
+RECALL_METHODS = ["post", "email", "sms"]
+
class DuplicateReceiptDialog(BaseDialog):
duplicate_printed = False
+
def __init__(self, patient, parent):
BaseDialog.__init__(self, parent)
self.pt = patient
self.main_ui = parent
- patient_label = QtGui.QLabel("%s<br /><b>%s</b>"% (
- _("Duplicate receipts for Patient"), patient.name_id))
+ patient_label = QtGui.QLabel("%s<br /><b>%s</b>" % (
+ _("Duplicate receipts for Patient"), patient.name_id))
patient_label.setAlignment(QtCore.Qt.AlignCenter)
@@ -61,7 +65,6 @@ class DuplicateReceiptDialog(BaseDialog):
new_dup_receipt_groupbox = QtGui.QGroupBox(
_("Generate a Duplicate receipt"))
-
self.dup_date_edit = QtGui.QDateEdit()
self.dup_date_edit.setDate(QtCore.QDate.currentDate())
@@ -77,7 +80,6 @@ class DuplicateReceiptDialog(BaseDialog):
layout.addRow(_("Amount"), self.amount_spinbox)
layout.addRow(print_dup_button)
-
self.insertWidget(patient_label)
self.insertWidget(self.no_receipts_found_label)
self.insertWidget(self.prev_receipts_groupbox)
@@ -88,7 +90,6 @@ class DuplicateReceiptDialog(BaseDialog):
QtCore.QTimer.singleShot(0, self.get_previous_receipts)
-
def sizeHint(self):
return QtCore.QSize(260, 400)
@@ -121,7 +122,7 @@ class DuplicateReceiptDialog(BaseDialog):
no_receipts = len(self.prev_receipts)
if no_receipts > 3:
widget = QtGui.QWidget(self)
- label = QtGui.QLabel("%d more receipts"% (no_receipts-3))
+ label = QtGui.QLabel("%d more receipts" % (no_receipts - 3))
but = QtGui.QPushButton(_("show"))
but.clicked.connect(self.show_all_prev_receipts)
layout = QtGui.QHBoxLayout(widget)
@@ -151,7 +152,7 @@ class DuplicateReceiptDialog(BaseDialog):
def print_existing(self):
ix = self.sender().ix
- print "reprint document %s"% ix
+ print "reprint document %s" % ix
try:
data, version = docsprinted.getData(ix)
f = open(localsettings.TEMP_PDF, "wb")
@@ -161,7 +162,7 @@ class DuplicateReceiptDialog(BaseDialog):
except Exception:
LOGGER.exception("view PDF error")
QtGui.QMessageBox.warning(self, "error",
- _("error reviewing PDF file"))
+ _("error reviewing PDF file"))
def print_duplicate(self):
amount = self.amount_spinbox.value()
@@ -169,18 +170,18 @@ class DuplicateReceiptDialog(BaseDialog):
myreceipt = receiptPrint.Receipt()
myreceipt.setProps(self.pt.title, self.pt.fname, self.pt.sname,
- self.pt.addr1, self.pt.addr2, self.pt.addr3, self.pt.town,
- self.pt.county, self.pt.pcde)
+ self.pt.addr1, self.pt.addr2, self.pt.addr3, self.pt.town,
+ self.pt.county, self.pt.pcde)
- myreceipt.total = amount*100
+ myreceipt.total = amount * 100
- myreceipt.receivedDict = {_("Professional Services"):amount*100}
+ myreceipt.receivedDict = {_("Professional Services"): amount * 100}
myreceipt.isDuplicate = True
myreceipt.dupdate = self.dup_date_edit.date()
if myreceipt.print_():
- self.pt.addHiddenNote("printed", "%s %.02f"% (
- _("duplicate receipt for"), amount))
+ self.pt.addHiddenNote("printed", "%s %.02f" % (
+ _("duplicate receipt for"), amount))
self.duplicate_printed = True
self.accept()
diff --git a/src/openmolar/qt4gui/dialogs/exam_wizard.py b/src/openmolar/qt4gui/dialogs/exam_wizard.py
index 355cb84..fcbcc7f 100644
--- a/src/openmolar/qt4gui/dialogs/exam_wizard.py
+++ b/src/openmolar/qt4gui/dialogs/exam_wizard.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
from PyQt4 import QtGui, QtCore
@@ -16,7 +33,9 @@ from openmolar.qt4gui.fees import manipulate_plan
LOGGER = logging.getLogger("openmolar")
+
class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
+
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.om_gui = parent
@@ -36,7 +55,7 @@ class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
def getInput(self):
result = True
- while result == True:
+ while result:
result = self.exec_()
if self.examA_radioButton.isChecked():
exam = "CE"
@@ -57,54 +76,53 @@ class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
return()
def check_dent(self, examdent):
- if examdent == localsettings.ops.get(self.pt.dnt1):
+ if examdent == localsettings.ops.get(self.pt.dnt1):
if (self.pt.dnt2 == 0 or
- self.pt.dnt2 == self.pt.dnt1): #--no dnt2
+ self.pt.dnt2 == self.pt.dnt1): # --no dnt2
APPLIED = True
else:
message = u'''<p>%s %s<br />%s</p>
- <hr /><p><i>%s %s</i></p>'''% (
- examdent,
- _("is now both the registered and course dentist"),
- _("Is this correct?"),
- _("confirming this will remove reference to"),
- localsettings.ops.get(self.pt.dnt2))
+ <hr /><p><i>%s %s</i></p>''' % (
+ examdent,
+ _("is now both the registered and course dentist"),
+ _("Is this correct?"),
+ _("confirming this will remove reference to"),
+ localsettings.ops.get(self.pt.dnt2))
if QtGui.QMessageBox.question(self,
- "Confirm", message,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+ "Confirm", message,
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
self.pt.dnt2 = 0
self.om_gui.updateDetails()
APPLIED = True
else:
- message = u'<p>%s %s<br />%s</p>'%(
+ message = u'<p>%s %s<br />%s</p>' % (
examdent,
_("performed this exam"),
_("Is this correct?"))
if examdent != localsettings.ops.get(self.pt.dnt2):
- message += u'<br /><i>%s, %s</i></p>'%(
- _("confirming this will change the course dentist"),
- _("but not the registered dentist")
+ message += u'<br /><i>%s, %s</i></p>' % (
+ _("confirming this will change the course dentist"),
+ _("but not the registered dentist")
)
else:
- message += u'<i>%s %s %s</i>'%(
- _("consider making"),
- examdent,
- _("the registered dentist"))
+ message += u'<i>%s %s %s</i>' % (
+ _("consider making"),
+ examdent,
+ _("the registered dentist"))
if QtGui.QMessageBox.question(self,
- _("Confirm"), message,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+ _("Confirm"), message,
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
self.pt.dnt2 = localsettings.ops_reverse[examdent]
self.om_gui.updateDetails()
APPLIED = True
return APPLIED, examdent
-
def perform_exam(self):
'''
perform an exam
@@ -113,9 +131,10 @@ class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
om_gui.advise("no patient selected", 1)
return
if self.pt.treatment_course.has_exam:
- self.om_gui.advise(u"<p>%s</p><hr /><p>%s</p>"%(
- _('You already have a completed exam on this course of treatment'),
- _("Unable to perform exam")), 1)
+ self.om_gui.advise(u"<p>%s</p><hr /><p>%s</p>" % (
+ _(
+ 'You already have a completed exam on this course of treatment'),
+ _("Unable to perform exam")), 1)
return
APPLIED = False
@@ -141,22 +160,24 @@ class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
self.update_recall_date()
- self.pt.addHiddenNote("exam", "%s"% examtype)
+ self.pt.addHiddenNote("exam", "%s" % examtype)
dentid = localsettings.ops_reverse[examdent]
- hash_ = localsettings.hash_func("%sexam1%s"% (courseno, examtype))
+ hash_ = localsettings.hash_func(
+ "%sexam1%s" %
+ (courseno, examtype))
tx_hash = TXHash(hash_, True)
manipulate_plan.add_treatment_to_estimate(
self.om_gui, "exam", examtype, dentid, [tx_hash])
newnotes = unicode(
- self.om_gui.ui.notesEnter_textEdit.toPlainText().toUtf8())
+ self.om_gui.ui.notesEnter_textEdit.toPlainText().toUtf8())
if newnotes != "" and newnotes[-1] != "\n":
newnotes += "\n"
- newnotes += "%s %s %s\n"%(
- examtype, _("performed by"), examdent)
+ newnotes += "%s %s %s\n" % (
+ examtype, _("performed by"), examdent)
self.om_gui.ui.notesEnter_textEdit.setText(newnotes)
return APPLIED
@@ -164,11 +185,10 @@ class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
def update_recall_date(self):
if not self.pt.appt_prefs.recall_active:
self.om_gui.advise(
- _("WARNING - Not updating recall due to patients recall settings")
- ,1)
+ _("WARNING - Not updating recall due to patients recall settings"), 1)
else:
date_ = localsettings.formatDate(self.pt.appt_prefs.new_recdent)
- self.om_gui.advise("updating recall date to %s"% date_, 1)
+ self.om_gui.advise("updating recall date to %s" % date_, 1)
self.pt.appt_prefs.update_recdent()
@@ -177,7 +197,7 @@ if __name__ == "__main__":
localsettings.initiate()
localsettings.loadFeeTables()
- localsettings.station="reception"
+ localsettings.station = "reception"
from openmolar.qt4gui import maingui
from openmolar.dbtools import patient_class
diff --git a/src/openmolar/qt4gui/dialogs/family_manage_dialog.py b/src/openmolar/qt4gui/dialogs/family_manage_dialog.py
index dee3d8b..08305ff 100644
--- a/src/openmolar/qt4gui/dialogs/family_manage_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/family_manage_dialog.py
@@ -1,31 +1,33 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import datetime
+import logging
import re
from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings
-from openmolar.connect import connect
from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
from openmolar.qt4gui.dialogs.find_patient_dialog import FindPatientDialog
@@ -33,27 +35,20 @@ from openmolar.qt4gui.dialogs.address_match_dialog import AddressMatchDialog
from openmolar.ptModules import patientDetails
-QUERY = '''select serialno, title, fname, sname,
-addr1, addr2, addr3, town, county, pcde, dob, status, tel1 from patients
-where familyno = %s order by dob'''
+from openmolar.dbtools import families
-LINK_QUERY = 'update patients set familyno=%s where serialno=%s'
-SYNC_QUERY = '''update patients set
-addr1=%s, addr2=%s, addr3=%s, town=%s, county=%s, pcde=%s
-where familyno=%s'''
+HEADERS = (
+ _("Address 1"), _("Address 2"), _("Address 3"),
+ _("TOWN"), _("County"), _("Postcode")
+)
-NEXT_FAMILYNO_QUERY = "select max(familyno)+1 from patients"
-NEW_GROUP_QUERY = "update patients set familyno=%s where serialno=%s"
-DELETE_FAMILYNO_QUERY = "update patients set familyno=NULL where familyno=%s"
+LOGGER = logging.getLogger("openmolar")
-HEADERS = (
- _("Address 1"),_("Address 2"),_("Address 3"),
- _("TOWN"), _("County"), _("Postcode")
- )
class _DuckPatient(object):
+
def __init__(self, result):
self.serialno = result[0]
self.title = result[1]
@@ -68,7 +63,7 @@ class _DuckPatient(object):
self.dob = result[10]
self.status = result[11]
self.tel1 = result[12]
-
+
def getAge(self):
'''
return the age in form (year(int), months(int), isToday(bool))
@@ -79,11 +74,11 @@ class _DuckPatient(object):
try:
nextbirthday = datetime.date(today.year, self.dob.month,
- self.dob.day)
+ self.dob.day)
except ValueError:
- #catch leap years!!
+ # catch leap years!!
nextbirthday = datetime.date(today.year, self.dob.month,
- self.dob.day-1)
+ self.dob.day - 1)
ageYears = today.year - self.dob.year
@@ -95,136 +90,137 @@ class _DuckPatient(object):
if self.dob.day > today.day:
months -= 1
- isToday = nextbirthday == today
+ isToday = nextbirthday == today
return (ageYears, months, isToday)
+
class _ConfirmDialog(BaseDialog):
+
def __init__(self, serialno, parent=None):
BaseDialog.__init__(self, parent)
self.browser = QtGui.QTextBrowser()
-
- label = QtGui.QLabel(u"%s %s %s" %(_("Add Record"), serialno,
- _("to this family group?")))
+
+ label = QtGui.QLabel(u"%s %s %s" % (_("Add Record"), serialno,
+ _("to this family group?")))
self.insertWidget(label)
self.insertWidget(self.browser)
-
+
self.load(serialno)
self.enableApply()
-
+
def load(self, serialno):
- db = connect()
- cursor = db.cursor()
- cursor.execute(QUERY.replace("familyno", "serialno"), (serialno,))
- member = cursor.fetchone()
- cursor.close()
- pt = _DuckPatient(member)
+ member = families.get_patient_details(serialno)
+ pt = _DuckPatient(member)
self.browser.setText(patientDetails.header(pt))
-
+
+
class _ChooseAddressDialog(BaseDialog):
+
def __init__(self, addresses, parent=None):
BaseDialog.__init__(self, parent)
-
+
self.addresses = list(addresses)
label = QtGui.QLabel(_("Which address should be used?"))
self.table_widget = QtGui.QTableWidget()
self.table_widget.setSelectionBehavior(
QtGui.QAbstractItemView.SelectRows)
self.table_widget.setAlternatingRowColors(True)
-
+
self.table_widget.setRowCount(len(addresses))
self.table_widget.setColumnCount(len(HEADERS))
self.table_widget.setHorizontalHeaderLabels(HEADERS)
self.table_widget.horizontalHeader().setStretchLastSection(True)
-
+
for row, fields in enumerate(addresses):
for col, field in enumerate(fields):
if field is None:
continue
item = QtGui.QTableWidgetItem(field)
self.table_widget.setItem(row, col, item)
-
+
self.insertWidget(label)
self.insertWidget(self.table_widget)
self.table_widget.resizeColumnsToContents()
-
+
self.table_widget.itemSelectionChanged.connect(self.enableApply)
def sizeHint(self):
- return QtCore.QSize(800,200)
-
+ return QtCore.QSize(800, 200)
+
@property
def chosen_address(self):
return self.addresses[self.table_widget.currentIndex().row()]
+
class _AdvancedWidget(QtGui.QWidget):
sync_address_signal = QtCore.pyqtSignal()
add_member_signal = QtCore.pyqtSignal()
find_others_signal = QtCore.pyqtSignal()
delete_group_signal = QtCore.pyqtSignal()
-
+
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
-
- icon = QtGui.QIcon(":/agt_reload.png")
+
+ icon = QtGui.QIcon(":/agt_reload.png")
sync_address_but = QtGui.QPushButton(icon, _("Synchronise Addresses"))
sync_address_but.clicked.connect(self.sync_address_signal.emit)
- icon = QtGui.QIcon(":/search.png")
+ icon = QtGui.QIcon(":/search.png")
add_member_but = QtGui.QPushButton(icon, _("Standard Search"))
add_member_but.clicked.connect(self.add_member_signal.emit)
-
+
find_address_but = QtGui.QPushButton(icon, _("Address Search"))
find_address_but.clicked.connect(self.find_others_signal.emit)
-
- icon = QtGui.QIcon(":/eraser.png")
- delete_group_but = QtGui.QPushButton(icon,_("Delete this group"))
+
+ icon = QtGui.QIcon(":/eraser.png")
+ delete_group_but = QtGui.QPushButton(icon, _("Delete this group"))
delete_group_but.clicked.connect(self.delete_group_signal.emit)
layout = QtGui.QHBoxLayout(self)
-
+
add_groupbox = QtGui.QGroupBox(_("Add members"))
add_layout = QtGui.QVBoxLayout(add_groupbox)
add_layout.addWidget(add_member_but)
add_layout.addWidget(find_address_but)
- manage_groupbox = QtGui.QGroupBox(_("Manage Group"))
+ manage_groupbox = QtGui.QGroupBox(_("Manage Group"))
manage_layout = QtGui.QVBoxLayout(manage_groupbox)
manage_layout.addWidget(sync_address_but)
manage_layout.addWidget(delete_group_but)
-
-
+
layout.addWidget(add_groupbox)
layout.addWidget(manage_groupbox)
-
+
class FamilyManageDialog(ExtendableDialog):
+
def __init__(self, om_gui):
ExtendableDialog.__init__(self, om_gui, remove_stretch=True)
self.om_gui = om_gui
-
+
title = _("Manage Family Group")
self.setWindowTitle(title)
- label = QtGui.QLabel(u"<b>%s</b>"% title)
+ label = QtGui.QLabel(u"<b>%s</b>" % title)
label.setAlignment(QtCore.Qt.AlignCenter)
-
+
frame = QtGui.QFrame()
self.frame_layout = QtGui.QGridLayout(frame)
scroll_area = QtGui.QScrollArea()
scroll_area.setWidget(frame)
scroll_area.setWidgetResizable(True)
-
+
self.insertWidget(label)
self.insertWidget(scroll_area)
-
+
self.member_dict = {}
self.widgets = []
self.apply_but.hide()
self.cancel_but.setText(_("Close"))
-
+
self.advanced_widg = _AdvancedWidget(self)
self.advanced_widg.sync_address_signal.connect(self.sync_addresses)
self.advanced_widg.add_member_signal.connect(self.record_search)
@@ -232,47 +228,43 @@ class FamilyManageDialog(ExtendableDialog):
self.advanced_widg.delete_group_signal.connect(self.delete_group)
self.advanced_widg.setEnabled(False)
self.add_advanced_widget(self.advanced_widg)
-
+
self.load_values()
-
+
def sizeHint(self):
- return QtCore.QSize(800,600)
+ return QtCore.QSize(800, 600)
- def load_values(self, mes1 = _("Unlink"), mes2=_("from group")):
+ def load_values(self, mes1=_("Unlink"), mes2=_("from group")):
self.family_no = self.om_gui.pt.familyno
+ LOGGER.debug("FamilyManage loading family number %d" % self.family_no)
self.member_dict = {}
-
- db = connect()
- cursor = db.cursor()
- cursor.execute(QUERY, (self.family_no,))
- members = cursor.fetchall()
- cursor.close()
+ members = families.get_members(self.family_no)
for widget in self.widgets:
self.frame_layout.removeWidget(widget)
widget.setParent(None)
for i, member in enumerate(members):
pt = _DuckPatient(member)
-
+
browser = QtGui.QTextBrowser()
browser.setText(patientDetails.header(pt))
-
- row = (i//4)*2
- column = i%4
+
+ row = (i // 4) * 2
+ column = i % 4
self.frame_layout.addWidget(browser, row, column)
- message = u"%s %s %s"% (mes1, pt.serialno, mes2)
+ message = u"%s %s %s" % (mes1, pt.serialno, mes2)
if mes1 == _("Unlink"):
icon = QtGui.QIcon(":/eraser.png")
else:
icon = QtGui.QIcon(":/logo.png")
member_but = QtGui.QPushButton(icon, message)
- self.frame_layout.addWidget(member_but, row+1, column)
-
+ self.frame_layout.addWidget(member_but, row + 1, column)
+
self.member_dict[member_but] = pt
member_but.clicked.connect(self.member_but_clicked)
-
+
self.widgets.append(member_but)
self.widgets.append(browser)
-
+
if len(members) == 0:
label = QtGui.QLabel(
_("This patient does not belong to any family group."))
@@ -281,143 +273,123 @@ class FamilyManageDialog(ExtendableDialog):
but.clicked.connect(self.new_family_group)
but2 = QtGui.QPushButton(_("Show similar addresses"))
- but2.clicked.connect(self.show_addresses)
-
+ but2.clicked.connect(self.show_addresses)
+
self.widgets.append(label)
self.widgets.append(but)
self.widgets.append(but2)
-
+
self.frame_layout.addWidget(label, 0, 0)
- self.frame_layout.addWidget(but,0, 1)
- self.frame_layout.addWidget(but2,1, 1)
+ self.frame_layout.addWidget(but, 0, 1)
+ self.frame_layout.addWidget(but2, 1, 1)
else:
self.advanced_widg.setEnabled(True)
-
+
def member_but_clicked(self):
pt = self.member_dict[self.sender()]
if QtGui.QMessageBox.question(self, _("Confirm"),
- u"%s %s %s %s %s" %(_("Remove"), pt.title, pt.fname, pt.sname,
- _("from this family group?")),
- QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel,
- QtGui.QMessageBox.Ok) == QtGui.QMessageBox.Cancel:
+ u"%s %s %s %s %s" % (_("Remove"), pt.title, pt.fname, pt.sname,
+ _("from this family group?")),
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Ok) == QtGui.QMessageBox.Cancel:
return
-
- db = connect()
- cursor = db.cursor()
- cursor.execute(LINK_QUERY, (None, pt.serialno,))
- cursor.close()
+ families.remove_member(pt.serialno)
self.load_values()
-
+
def confirm_add(self, serialno):
if not serialno:
return False
-
+
dl = _ConfirmDialog(serialno, self)
- return dl.exec_()
-
+ return dl.exec_()
+
def record_search(self):
dl = FindPatientDialog(self)
if dl.exec_():
self.add_member(dl.chosen_sno)
-
+
def add_member(self, serialno):
if self.confirm_add(serialno):
- db = connect()
- cursor = db.cursor()
- cursor.execute(LINK_QUERY, (self.family_no, serialno))
- cursor.close()
+ families.add_member(self.family_no, serialno)
self.load_values()
-
+
def sync_addresses(self):
address_set = set([])
for member in self.member_dict.values():
address_tup = (
- member.addr1,
- member.addr2,
+ member.addr1,
+ member.addr2,
member.addr3,
member.town,
member.county,
member.pcde
- )
+ )
address_set.add(address_tup)
-
+
if len(address_set) == 1:
QtGui.QMessageBox.information(self, _("Information"),
- _("Addresses are all identical - nothing to do!"))
+ _("Addresses are all identical - nothing to do!"))
return
-
+
dl = _ChooseAddressDialog(address_set, self)
if dl.exec_():
- db = connect()
- cursor = db.cursor()
- values = tuple(dl.chosen_address) + (self.family_no,)
- count = cursor.execute(SYNC_QUERY, values)
- cursor.close()
+ count = families.sync_addresses(self.family_no, dl.chosen_address)
QtGui.QMessageBox.information(self, _("Information"),
- u"%d %s"% (count, _("Address(es) updated")))
+ u"%d %s" % (count, _("Address(es) updated")))
self.load_values()
-
+
def address_search(self):
dl = AddressMatchDialog(self.om_gui)
if dl.exec_():
for serialno in dl.selected_patients:
self.add_member(serialno)
-
+
def show_addresses(self):
dl = AddressMatchDialog(self.om_gui)
dl.table_widget.setSelectionMode(
QtGui.QAbstractItemView.NoSelection)
-
+
dl.exec_()
-
-
+
def new_family_group(self):
- db = connect()
- cursor = db.cursor()
- cursor.execute(NEXT_FAMILYNO_QUERY)
- familyno = cursor.fetchone()[0]
- cursor.execute(NEW_GROUP_QUERY, (familyno, self.om_gui.pt.serialno,))
- cursor.close()
- self.om_gui.pt.familyno = familyno
+ self.om_gui.pt.familyno = families.new_group(self.om_gui.pt.serialno)
self.load_values()
-
+
def delete_group(self):
if QtGui.QMessageBox.question(self, _("Confirm"),
- _("Delete this family group?"),
- QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel,
- QtGui.QMessageBox.Ok) == QtGui.QMessageBox.Cancel:
+ _("Delete this family group?"),
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Ok) == QtGui.QMessageBox.Cancel:
return
-
- db = connect()
- cursor = db.cursor()
- cursor.execute(DELETE_FAMILYNO_QUERY, (self.family_no,))
+ families.delete_group(self.family_no)
self.load_values()
-
+
+
class LoadRelativesDialog(FamilyManageDialog):
chosen_sno = 0
+
def load_values(self):
- FamilyManageDialog.load_values(self,_("Load Patient"), "")
-
+ FamilyManageDialog.load_values(self, _("Load Patient"), "")
+
def member_but_clicked(self):
pt = self.member_dict[self.sender()]
self.chosen_sno = pt.serialno
self.accept()
-
+
if __name__ == "__main__":
localsettings.initiate()
app = QtGui.QApplication([])
mw = QtGui.QWidget()
- mw.pt = _DuckPatient((1,"","","","The Gables",
- "Craggiemore Daviot","Inverness","","","IV2 5XQ", "", "active", ""))
-
+ mw.pt = _DuckPatient((1, "", "", "", "The Gables",
+ "Craggiemore Daviot", "Inverness", "", "", "IV2 5XQ", "", "active", ""))
+
mw.pt.familyno = 1
dl = FamilyManageDialog(mw)
dl.exec_()
-
-
- #dl = LoadRelativesDialog(mw)
- #dl.exec_()
-
\ No newline at end of file
+
+
+ # dl = LoadRelativesDialog(mw)
+ # dl.exec_()
diff --git a/src/openmolar/qt4gui/dialogs/finalise_appt_time.py b/src/openmolar/qt4gui/dialogs/finalise_appt_time.py
index e8cfea8..b135817 100644
--- a/src/openmolar/qt4gui/dialogs/finalise_appt_time.py
+++ b/src/openmolar/qt4gui/dialogs/finalise_appt_time.py
@@ -1,62 +1,81 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.compiled_uis import Ui_finalise_appt_time
from openmolar.settings import localsettings
+
class ftDialog(Ui_finalise_appt_time.Ui_Dialog, QtGui.QDialog):
+
'''
- a custom dialog,
+ a custom dialog,
the initialiser takes the following params
- slotstarttime (datetime.time) - the earliest available time in the slot
+ slotstarttime (datetime.time) - the earliest available time in the slot
slotLength(int) - the length (in minutes) of the slot
apptLength(int) - the appointment being fitted in
parent widget (optional) - parent qt widget
-
- if exec_() returns true then the user has accepted the dialog and the
+
+ if exec_() returns true then the user has accepted the dialog and the
values of selectedtime gives the user chosen time
'''
+
def __init__(self, slotstarttime, slotLength, apptLength, parent=None):
- super (ftDialog, self).__init__(parent)
+ super(ftDialog, self).__init__(parent)
self.setupUi(self)
self.starttime = localsettings.pyTimeToMinutesPastMidnight(
slotstarttime)
self.maxtime = self.starttime + slotLength
self.length = apptLength
self.minslotlength = 5
- self.selectedTime = slotstarttime #this value is what the user chooses
- self.verticalSlider.setMinimum(self.starttime//self.minslotlength)
+ self.selectedTime = slotstarttime # this value is what the user chooses
+ self.verticalSlider.setMinimum(self.starttime // self.minslotlength)
self.verticalSlider.setMaximum(
- (self.maxtime-self.length)//self.minslotlength)
- QtCore.QObject.connect(self.verticalSlider,
- QtCore.SIGNAL("valueChanged(int)"),self.updateLabels)
+ (self.maxtime - self.length) // self.minslotlength)
+ QtCore.QObject.connect(self.verticalSlider,
+ QtCore.SIGNAL("valueChanged(int)"), self.updateLabels)
self.updateLabels(self.verticalSlider.value())
-
- def updateLabels(self,arg):
- minB4 = (arg-self.verticalSlider.minimum())*self.minslotlength
- minL8r = (self.verticalSlider.maximum()-arg)*self.minslotlength
+
+ def updateLabels(self, arg):
+ minB4 = (arg - self.verticalSlider.minimum()) * self.minslotlength
+ minL8r = (self.verticalSlider.maximum() - arg) * self.minslotlength
self.selectedTime = localsettings.minutesPastMidnighttoPytime(
- self.starttime+minB4)
- self.minutesB4label.setText("%d minutes"% minB4)
- self.apptTimelabel.setText("%s - %s"% (
- localsettings.humanTime(arg*self.minslotlength),
- localsettings.humanTime(arg*self.minslotlength+self.length)))
- self.minutesL8Rlabel.setText("%d minutes"% minL8r)
-
-
+ self.starttime + minB4)
+ self.minutesB4label.setText("%d minutes" % minB4)
+ self.apptTimelabel.setText("%s - %s" % (
+ localsettings.humanTime(arg * self.minslotlength),
+ localsettings.humanTime(arg * self.minslotlength + self.length)))
+ self.minutesL8Rlabel.setText("%d minutes" % minL8r)
+
+
if __name__ == "__main__":
- import datetime, sys
+ import datetime
+ import sys
app = QtGui.QApplication(sys.argv)
- Dialog = ftDialog(datetime.time(8,30), 60, 15)
+ Dialog = ftDialog(datetime.time(8, 30), 60, 15)
if Dialog.exec_():
- print "accepted - selected appointment is (%s, %d)"% (
+ print "accepted - selected appointment is (%s, %d)" % (
Dialog.selectedTime, Dialog.length)
else:
print "rejected"
-
\ No newline at end of file
diff --git a/src/openmolar/qt4gui/dialogs/find_patient_dialog.py b/src/openmolar/qt4gui/dialogs/find_patient_dialog.py
index 878dfe5..2c3ee57 100644
--- a/src/openmolar/qt4gui/dialogs/find_patient_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/find_patient_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import datetime
import logging
@@ -35,6 +37,7 @@ from openmolar.qt4gui.compiled_uis import Ui_select_patient
class FindPatientDialog(QtGui.QDialog, Ui_patient_finder.Ui_Dialog):
chosen_sno = None
+
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
@@ -68,15 +71,16 @@ class FindPatientDialog(QtGui.QDialog, Ui_patient_finder.Ui_Dialog):
if serialno > 0:
self.chosen_sno = serialno
- #self.getrecord(serialno, True)
+ # self.getrecord(serialno, True)
else:
candidates = search.getcandidates(dob, addr, tel, sname,
- self.snameSoundex_checkBox.checkState(), fname,
- self.fnameSoundex_checkBox.checkState(), pcde)
+ self.snameSoundex_checkBox.checkState(
+ ), fname,
+ self.fnameSoundex_checkBox.checkState(), pcde)
if candidates == ():
QtGui.QMessageBox.warning(self.parent(), "warning",
- _("no match found"))
+ _("no match found"))
return False
else:
if len(candidates) > 1:
@@ -90,8 +94,10 @@ class FindPatientDialog(QtGui.QDialog, Ui_patient_finder.Ui_Dialog):
return False
+
class FinalChoiceDialog(QtGui.QDialog, Ui_select_patient.Ui_Dialog):
chosen_sno = None
+
def __init__(self, candidates, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
@@ -99,31 +105,31 @@ class FinalChoiceDialog(QtGui.QDialog, Ui_select_patient.Ui_Dialog):
self.tableWidget.setSortingEnabled(False)
#--good practice to disable this while loading
self.tableWidget.setRowCount(len(candidates))
- headers=('Serialno', 'Surname', 'Forename', 'dob', 'Address1',
- 'Address2', 'POSTCODE')
+ headers = ('Serialno', 'Surname', 'Forename', 'dob', 'Address1',
+ 'Address2', 'POSTCODE')
- widthFraction=(0, 20, 20, 15, 30, 30, 10)
+ widthFraction = (0, 20, 20, 15, 30, 30, 10)
self.tableWidget.setColumnCount(len(headers))
self.tableWidget.setHorizontalHeaderLabels(headers)
self.tableWidget.verticalHeader().hide()
self.tableWidget.horizontalHeader().setStretchLastSection(True)
- row=0
+ row = 0
for col in range(len(headers)):
- self.tableWidget.setColumnWidth(col, widthFraction[col]*\
- (self.width()-100)/130)
+ self.tableWidget.setColumnWidth(col, widthFraction[col] *
+ (self.width() - 100) / 130)
for candidate in candidates:
- col=0
+ col = 0
for attr in candidate:
- if type(attr) == datetime.date:
+ if isinstance(attr, datetime.date):
item = QtGui.QTableWidgetItem(
- localsettings.formatDate(attr))
+ localsettings.formatDate(attr))
else:
item = QtGui.QTableWidgetItem(str(attr))
self.tableWidget.setItem(row, col, item)
- col+=1
- row+=1
+ col += 1
+ row += 1
self.tableWidget.setCurrentCell(0, 1)
self.tableWidget.itemDoubleClicked.connect(self.accept)
@@ -142,6 +148,6 @@ if __name__ == "__main__":
app = QtGui.QApplication([])
dl = FindPatientDialog()
- print ("chosen sno = %s"% dl.chosen_sno)
+ print ("chosen sno = %s" % dl.chosen_sno)
if dl.exec_():
print (dl.chosen_sno)
diff --git a/src/openmolar/qt4gui/dialogs/gp17_printdialog.py b/src/openmolar/qt4gui/dialogs/gp17_printdialog.py
index fe6523c..53f7c0e 100644
--- a/src/openmolar/qt4gui/dialogs/gp17_printdialog.py
+++ b/src/openmolar/qt4gui/dialogs/gp17_printdialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
@@ -28,10 +30,12 @@ from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
from openmolar.qt4gui.printing.gp17.gp17_data import Gp17Data
from openmolar.qt4gui.printing.gp17 import GP17Front, GP17iFront, GP17iBack
-class ChooseFormWidget(QtGui.QWidget):
+
+class ChooseFormWidget(QtGui.QGroupBox):
FORMS = (GP17Front, GP17iFront, GP17iBack)
+
def __init__(self, parent=None):
- QtGui.QWidget.__init__(self, parent)
+ QtGui.QGroupBox.__init__(self, _("Form options"), parent)
layout = QtGui.QVBoxLayout(self)
self.checkboxes = []
@@ -49,7 +53,7 @@ class ChooseFormWidget(QtGui.QWidget):
layout.addWidget(self.image_checkbox)
def sizeHint(self):
- return QtCore.QSize(300,100)
+ return QtCore.QSize(200, 100)
@property
def chosen_forms(self):
@@ -58,25 +62,55 @@ class ChooseFormWidget(QtGui.QWidget):
yield form
+class CourseChoiceWidget(QtGui.QWidget):
+ DEFAULT = 0
+ PRIOR_APPROVAL = 1
+
+ def __init__(self, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+ layout = QtGui.QHBoxLayout(self)
+
+ cb = QtGui.QRadioButton(_("Completed Treatment"))
+ self.pa_cb = QtGui.QRadioButton(_("Prior Approval"))
+
+ cb.setChecked(True)
+
+ layout.addWidget(cb)
+ layout.addWidget(self.pa_cb)
+
+ @property
+ def chosen(self):
+ if self.pa_cb.isChecked():
+ return self.PRIOR_APPROVAL
+ return self.DEFAULT
+
+
class GP17PrintDialog(ExtendableDialog):
+
def __init__(self, patient, parent=None):
ExtendableDialog.__init__(self, parent)
self.pt = patient
self.data = Gp17Data(patient)
- title = _("GP17 Dialog")
- self.setWindowTitle(title)
- label = QtGui.QLabel(u"<b>%s</b>"% title)
- label.setAlignment(QtCore.Qt.AlignCenter)
+ self.setWindowTitle(_("GP17 Dialog"))
+ label = QtGui.QLabel("<b>%s</b>" % _("Print a GP17 Form"))
+ label.setAlignment(QtCore.Qt.AlignCenter)
+ self.insertWidget(label)
self.dentist_combobox = QtGui.QComboBox()
self.dentist_combobox.addItems(localsettings.activedents)
+ self.course_choice_widget = CourseChoiceWidget(self)
+
frame = QtGui.QFrame()
- layout = QtGui.QFormLayout(frame)
- layout.addRow(_("Use this dentists stamp?"), self.dentist_combobox)
+
+ layout = QtGui.QGridLayout(frame)
+ label = QtGui.QLabel(_("Use this dentists stamp?"))
+ layout.addWidget(label, 0, 0)
+ layout.addWidget(self.dentist_combobox, 0, 1)
+ layout.addWidget(self.course_choice_widget, 1, 0, 1, 2)
self.chart_cb = QtGui.QCheckBox(_("Chart"))
self.bpe_cb = QtGui.QCheckBox(_("BPE"))
@@ -87,30 +121,37 @@ class GP17PrintDialog(ExtendableDialog):
self.charting_gb = QtGui.QGroupBox(_("Include Chart Details"))
self.charting_gb.setCheckable(True)
- layout = QtGui.QVBoxLayout(self.charting_gb)
- layout.addWidget(self.chart_cb)
- layout.addWidget(self.bpe_cb)
+
+ gb_layout = QtGui.QVBoxLayout(self.charting_gb)
+ gb_layout.addWidget(self.chart_cb)
+ gb_layout.addWidget(self.bpe_cb)
self.course_gb = QtGui.QGroupBox(_("Include Course Details"))
self.course_gb.setCheckable(True)
- layout = QtGui.QVBoxLayout(self.course_gb)
- layout.addWidget(self.accd_cb)
- layout.addWidget(self.cmpd_cb)
- layout.addWidget(self.tx_cb)
- self.insertWidget(label)
+ gb_layout = QtGui.QVBoxLayout(self.course_gb)
+ gb_layout.addWidget(self.accd_cb)
+ gb_layout.addWidget(self.cmpd_cb)
+ gb_layout.addWidget(self.tx_cb)
+
+ self.choose_form_widget = ChooseFormWidget(self)
+
+ adv_widg = QtGui.QFrame()
+ layout = QtGui.QGridLayout(adv_widg)
+
+ layout.addWidget(self.charting_gb, 0, 0)
+ layout.addWidget(self.course_gb, 1, 0)
+ layout.addWidget(self.choose_form_widget, 0, 1, 2, 1)
+
+ self.set_advanced_but_text(_("Options"))
+ self.add_advanced_widget(adv_widg)
+
self.insertWidget(frame)
- self.insertWidget(self.charting_gb)
- self.insertWidget(self.course_gb)
self.set_dentist()
self.set_default_values()
self.enableApply()
- self.choose_form_widget = ChooseFormWidget(self)
- self.set_advanced_but_text(_("select form(s) to print"))
- self.add_advanced_widget(self.choose_form_widget)
-
self.course_gb.toggled.connect(self.toggle_cbs)
self.charting_gb.toggled.connect(self.toggle_cbs)
@@ -127,9 +168,9 @@ class GP17PrintDialog(ExtendableDialog):
attempt to set the correct dentist for the form
'''
if localsettings.apptix_reverse.get(self.data.dentist) in \
- localsettings.activedents:
- pos=localsettings.activedents.index(
- localsettings.apptix_reverse.get(self.data.dentist))
+ localsettings.activedents:
+ pos = localsettings.activedents.index(
+ localsettings.apptix_reverse.get(self.data.dentist))
self.dentist_combobox.setCurrentIndex(pos)
else:
self.dentist_combobox.setCurrentIndex(-1)
@@ -145,7 +186,7 @@ class GP17PrintDialog(ExtendableDialog):
self.tx_cb.setChecked(True)
def sizeHint(self):
- return QtCore.QSize(300,350)
+ return QtCore.QSize(450, 150)
@property
def chosen_forms(self):
@@ -167,9 +208,14 @@ class GP17PrintDialog(ExtendableDialog):
def chosen_dentist(self):
return localsettings.ops_reverse.get(self.dent_inits)
+ @property
+ def prior_approval(self):
+ return self.course_choice_widget.chosen == \
+ self.course_choice_widget.PRIOR_APPROVAL
+
def apply(self):
'''
- todo - apply changes to the gp17 data object
+ applies user specified changes to the gp17 data object
'''
self.data.dentist = self.chosen_dentist
@@ -183,6 +229,8 @@ class GP17PrintDialog(ExtendableDialog):
if not cb.isChecked():
self.data.exclusions.append(att)
+ self.data.completed_only = not self.prior_approval
+
def exec_(self):
if ExtendableDialog.exec_(self):
self.apply()
@@ -193,7 +241,7 @@ if __name__ == "__main__":
import os
from openmolar.dbtools import patient_class
- os.chdir(os.path.expanduser("~")) #for save pdf
+ os.chdir(os.path.expanduser("~")) # for save pdf
localsettings.initiate()
@@ -209,4 +257,3 @@ if __name__ == "__main__":
form.set_testing_mode(dl.print_boxes)
form.set_background_mode(dl.print_background)
form.controlled_print()
-
diff --git a/src/openmolar/qt4gui/dialogs/hygTreatWizard.py b/src/openmolar/qt4gui/dialogs/hygTreatWizard.py
index c05800c..3a598ef 100644
--- a/src/openmolar/qt4gui/dialogs/hygTreatWizard.py
+++ b/src/openmolar/qt4gui/dialogs/hygTreatWizard.py
@@ -1,9 +1,27 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings
@@ -13,23 +31,27 @@ from openmolar.qt4gui.fees import manipulate_plan
from openmolar.qt4gui.compiled_uis import Ui_hygenist_wizard
+
class HygTreatWizard(QtGui.QDialog, Ui_hygenist_wizard.Ui_Dialog):
- def __init__(self,parent=None):
+
+ def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
self.om_gui = parent
- self.practitioners=localsettings.activedents+localsettings.activehygs
+ self.practitioners = localsettings.activedents + \
+ localsettings.activehygs
self.dents_comboBox.addItems(self.practitioners)
self.setPractitioner(localsettings.clinicianNo)
if self.om_gui.pt.has_planned_perio_txs:
tx_list = ""
for trt in self.om_gui.pt.treatment_course.periopl.split(" "):
- tx_list += "<li>%s</li>"% trt
- self.label.setText(u"<b>%s</b><hr /><ul>%s</ul>"% (
- _("WARNING - THE FOLLOWING TREATMENTS ARE ALREADY PLANNED."),
- tx_list
- ))
+ tx_list += "<li>%s</li>" % trt
+ self.label.setText(u"<b>%s</b><hr /><ul>%s</ul>" % (
+ _(
+ "WARNING - THE FOLLOWING TREATMENTS ARE ALREADY PLANNED."),
+ tx_list
+ ))
self.buttonBox.setEnabled(False)
self.pushButton.clicked.connect(self._re_enable)
self.groupBox.hide()
@@ -51,7 +73,8 @@ class HygTreatWizard(QtGui.QDialog, Ui_hygenist_wizard.Ui_Dialog):
'''
try:
inits = localsettings.ops[arg]
- self.dents_comboBox.setCurrentIndex(self.practitioners.index(inits))
+ self.dents_comboBox.setCurrentIndex(
+ self.practitioners.index(inits))
except:
self.dents_comboBox.setCurrentIndex(-1)
@@ -60,9 +83,9 @@ class HygTreatWizard(QtGui.QDialog, Ui_hygenist_wizard.Ui_Dialog):
if self.sp_radioButton.isChecked():
return "SP"
elif self.db_radioButton.isChecked():
- return "SP-"
+ return "SP-"
elif self.extsp_radioButton.isChecked():
- return "SP+"
+ return "SP+"
@property
def dent(self):
@@ -73,7 +96,7 @@ class HygTreatWizard(QtGui.QDialog, Ui_hygenist_wizard.Ui_Dialog):
called to exec the dialog
'''
result = True
- while result == True:
+ while result:
if self.exec_():
if self.dent == "":
message = _("Please enter a dentist / hygienist")
@@ -104,18 +127,20 @@ class HygTreatWizard(QtGui.QDialog, Ui_hygenist_wizard.Ui_Dialog):
if self.trt in pt.treatment_course.periopl:
n_txs = pt.treatment_course.periocmp.split(
" ").count(self.trt) + 1
- hash_ = localsettings.hash_func("%sperio%s%s"% (courseno, n_txs, self.trt))
+ hash_ = localsettings.hash_func(
+ "%sperio%s%s" %
+ (courseno, n_txs, self.trt))
tx_hash = TXHash(hash_)
manipulate_plan.tx_hash_complete(self.om_gui, tx_hash)
else:
- trts = (("perio", "%s"% self.trt),)
+ trts = (("perio", "%s" % self.trt),)
manipulate_plan.add_treatments_to_plan(self.om_gui, trts, True)
newnotes = unicode(
self.om_gui.ui.notesEnter_textEdit.toPlainText().toUtf8())
if newnotes != "" and newnotes[-1] != "\n":
- newnotes += "\n"
- newnotes += "%s %s %s\n"%(
+ newnotes += "\n"
+ newnotes += "%s %s %s\n" % (
self.trt,
_("performed by"),
self.dent)
@@ -129,7 +154,7 @@ class HygTreatWizard(QtGui.QDialog, Ui_hygenist_wizard.Ui_Dialog):
if __name__ == "__main__":
localsettings.initiate()
localsettings.loadFeeTables()
- localsettings.station="reception"
+ localsettings.station = "reception"
from openmolar.qt4gui import maingui
from openmolar.dbtools import patient_class
diff --git a/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py b/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py
index 0827acd..a9e450f 100644
--- a/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from collections import namedtuple
from functools import partial
@@ -36,9 +38,9 @@ for shortcut, description in (
("CR,IC", _("Implant Crown")),
("BR/CR,IC", _("Implant Bridge Retainer")),
("BR/P,IC", _("Implant Bridge Pontic")),
- ):
+):
implant_chart_button = namedtuple('ImplantType',
- ("shortcut", "description", "tooltip"))
+ ("shortcut", "description", "tooltip"))
implant_chart_button.description = description
implant_chart_button.tooltip = ""
implant_chart_button.shortcut = shortcut
@@ -46,6 +48,7 @@ for shortcut, description in (
class ImplantChoiceDialog(ExtendableDialog):
+
def __init__(self, static, parent=None):
ExtendableDialog.__init__(self, parent, remove_stretch=True)
self.setWindowTitle(_("Implant Choice Dialog"))
@@ -77,7 +80,9 @@ class ImplantChoiceDialog(ExtendableDialog):
for implant_button in implant_chart_buttons:
but = QtGui.QPushButton(implant_button.description)
but.setToolTip(implant_button.tooltip)
- but.clicked.connect(partial(self.but_clicked, implant_button.shortcut))
+ but.clicked.connect(
+ partial(self.but_clicked,
+ implant_button.shortcut))
self.but_layout.addWidget(but)
self.but_layout.addStretch(100)
@@ -98,4 +103,4 @@ if __name__ == "__main__":
localsettings.loadFeeTables()
dl = ImplantChoiceDialog(False, mw)
if dl.exec_():
- print dl.chosen_shortcut
\ No newline at end of file
+ print dl.chosen_shortcut
diff --git a/src/openmolar/qt4gui/dialogs/medNotes.py b/src/openmolar/qt4gui/dialogs/medNotes.py
deleted file mode 100644
index 4097ce9..0000000
--- a/src/openmolar/qt4gui/dialogs/medNotes.py
+++ /dev/null
@@ -1,106 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
-
-from PyQt4 import QtGui, QtCore
-import datetime
-from openmolar.settings import localsettings
-from openmolar.qt4gui.compiled_uis import Ui_medhist
-from openmolar.dbtools import updateMH
-
-def showDialog(Dialog,pt):
- def updateDate():
- dl.dateEdit.setDate(datetime.date.today())
- dl.dateEdit.show()
- dl.date_label.show()
- dl = Ui_medhist.Ui_Dialog()
- dl.setupUi(Dialog)
- Dialog.connect(dl.checked_pushButton,QtCore.SIGNAL("clicked()"),updateDate)
- data=pt.MH
- chkdate=None
- alert=False
- if data != None:
- item=0
- for lineEdit in (
- dl.doctor_lineEdit,
- dl.doctorAddy_lineEdit,
- dl.curMeds_lineEdit,
- dl.pastMeds_lineEdit,
- dl.allergies_lineEdit,
- dl.heart_lineEdit,
- dl.lungs_lineEdit,
- dl.liver_lineEdit,
- dl.bleeding_lineEdit,
- dl.kidneys_lineEdit,
- dl.anaesthetic_lineEdit,
- dl.other_lineEdit
- ):
- lineEdit.setText(data[item])
- item+=1
- alert=data[12]
- chkdate=data[13]
-
- if chkdate:
- dl.dateEdit.setDate(chkdate)
- else:
- dl.date_label.hide()
- dl.dateEdit.hide()
- dl.checkBox.setChecked(alert)
-
- if Dialog.exec_():
- newdata=[]
- for lineEdit in (
- dl.doctor_lineEdit,
- dl.doctorAddy_lineEdit,
- dl.curMeds_lineEdit,
- dl.pastMeds_lineEdit,
- dl.allergies_lineEdit,
- dl.heart_lineEdit,
- dl.lungs_lineEdit,
- dl.liver_lineEdit,
- dl.bleeding_lineEdit,
- dl.kidneys_lineEdit,
- dl.anaesthetic_lineEdit,
- dl.other_lineEdit
- ):
- newdata.append(str(lineEdit.text().toAscii()))
- newdata.append(dl.checkBox.isChecked())
- chkdate=dl.dateEdit.date().toPyDate()
- if chkdate != datetime.date(1900,1,1):
- newdata.append(chkdate)
- else:
- newdata.append(None)
- result=tuple(newdata)
- if data!=result:
- print "MH changed"
- updateMH.write(pt.serialno,result)
- pt.MH=result
- pt.MEDALERT=result[12]
-
- pt.addHiddenNote("mednotes")
-
- mnhistChanges=[]
- if data!=None:
- for a in range(11):
- if data[a]!=result[a] and str(data[a])!="":
- mnhistChanges.append((a+140,data[a]))
- if mnhistChanges!=[]:
- updateMH.writeHist(pt.serialno,mnhistChanges)
- pt.addHiddenNote("mednotes","saved previous")
- return True
- else:
- print "unchanged"
-
-
-if __name__=="__main__":
- app=QtGui.QApplication([])
- Dialog = QtGui.QDialog()
- from openmolar.dbtools import patient_class
- try:
- pt=patient_class.patient(11956)
- showDialog(Dialog,pt)
- except localsettings.PatientNotFoundError:
- print "no such pt in THIS database"
diff --git a/src/openmolar/qt4gui/dialogs/med_notes_dialog.py b/src/openmolar/qt4gui/dialogs/med_notes_dialog.py
new file mode 100644
index 0000000..c1d4d31
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/med_notes_dialog.py
@@ -0,0 +1,145 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+import logging
+import datetime
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.qt4gui.compiled_uis import Ui_medhist
+from openmolar.dbtools import updateMH
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class MedNotesDialog(QtGui.QDialog, Ui_medhist.Ui_Dialog):
+
+ def __init__(self, pt, parent=None):
+ QtGui.QDialog.__init__(self)
+ self.setupUi(self)
+ self.checked_pushButton.clicked.connect(self.update_date)
+ self.alert = False
+ self.chkdate = None
+
+ self.pt = pt
+ self.data = pt.MH
+
+ self.load_data()
+ self.set_date()
+ self.checkBox.setChecked(self.alert)
+
+ def update_date(self):
+ self.dateEdit.setDate(datetime.date.today())
+ self.dateEdit.show()
+ self.date_label.show()
+
+ def load_data(self):
+ if self.data is None:
+ return
+ for i, lineEdit in enumerate((
+ self.doctor_lineEdit,
+ self.doctorAddy_lineEdit,
+ self.curMeds_lineEdit,
+ self.pastMeds_lineEdit,
+ self.allergies_lineEdit,
+ self.heart_lineEdit,
+ self.lungs_lineEdit,
+ self.liver_lineEdit,
+ self.bleeding_lineEdit,
+ self.kidneys_lineEdit,
+ self.anaesthetic_lineEdit,
+ self.other_lineEdit)):
+ lineEdit.setText(self.data[i])
+
+ self.alert = self.data[12]
+ self.chkdate = self.data[13]
+
+ def set_date(self):
+ if self.chkdate:
+ self.dateEdit.setDate(self.chkdate)
+ else:
+ self.date_label.hide()
+ self.dateEdit.hide()
+
+ def exec_(self):
+ if not QtGui.QDialog.exec_(self):
+ return False
+ newdata = []
+ for lineEdit in (
+ self.doctor_lineEdit,
+ self.doctorAddy_lineEdit,
+ self.curMeds_lineEdit,
+ self.pastMeds_lineEdit,
+ self.allergies_lineEdit,
+ self.heart_lineEdit,
+ self.lungs_lineEdit,
+ self.liver_lineEdit,
+ self.bleeding_lineEdit,
+ self.kidneys_lineEdit,
+ self.anaesthetic_lineEdit,
+ self.other_lineEdit
+ ):
+ newdata.append(unicode(lineEdit.text().toUtf8()))
+
+ newdata.append(self.checkBox.isChecked())
+ chkdate = self.dateEdit.date().toPyDate()
+ if chkdate != datetime.date(1900, 1, 1):
+ newdata.append(chkdate)
+ else:
+ newdata.append(None)
+
+ self.result = tuple(newdata)
+
+ return self.data != self.result
+
+ def apply(self):
+ LOGGER.info("applying new MH data")
+ updateMH.write(self.pt.serialno, self.result)
+ self.pt.MH = self.result
+ self.pt.MEDALERT = self.result[12]
+
+ self.pt.addHiddenNote("mednotes")
+
+ mnhistChanges = []
+ if self.data is not None:
+ for i, orig in enumerate(self.data[:11]):
+ if orig and orig != self.result[i]:
+ mnhistChanges.append((i + 140, orig))
+ if mnhistChanges != []:
+ updateMH.writeHist(self.pt.serialno, mnhistChanges)
+ self.pt.addHiddenNote("mednotes", "saved previous MH")
+ return True
+
+
+if __name__ == "__main__":
+ app = QtGui.QApplication([])
+ from openmolar.dbtools import patient_class
+ try:
+ pt = patient_class.patient(1)
+ dl = MedNotesDialog(pt)
+ if dl.exec_():
+ dl.apply()
+ except localsettings.PatientNotFoundError:
+ LOGGER.exception("no such pt in THIS database")
diff --git a/src/openmolar/qt4gui/dialogs/newBPE.py b/src/openmolar/qt4gui/dialogs/newBPE.py
index f3059ea..2b90648 100644
--- a/src/openmolar/qt4gui/dialogs/newBPE.py
+++ b/src/openmolar/qt4gui/dialogs/newBPE.py
@@ -1,43 +1,69 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.compiled_uis import Ui_newBPE
from openmolar.settings import localsettings
-class Ui_Dialog(Ui_newBPE.Ui_Dialog):
- def __init__(self,dialog,parent=None):
- self.setupUi(dialog)
- self.dialog=dialog
- for cb in (self.bpe_comboBox,self.bpe2_comboBox,self.bpe3_comboBox,self.bpe4_comboBox,self.bpe5_comboBox,self.bpe6_comboBox):
+
+class BPE_Dialog(QtGui.QDialog, Ui_newBPE.Ui_Dialog):
+
+ def __init__(self, parent=None):
+ QtGui.QDialog.__init__(self, parent)
+ self.setupUi(self)
+ for cb in (self.bpe_comboBox,
+ self.bpe2_comboBox,
+ self.bpe3_comboBox,
+ self.bpe4_comboBox,
+ self.bpe5_comboBox,
+ self.bpe6_comboBox):
cb.setCurrentIndex(-1)
+
def getInput(self):
- if self.dialog.exec_():
- return (True,self.getBPE())
+ if QtGui.QDialog.exec_(self):
+ return (True, self.getBPE())
else:
- return (False,None)
- def getBPE(self): #####this could be simplified!!!!
- retarg=""
- for i in (self.bpe_comboBox.currentText(),self.bpe2_comboBox.currentText(),
- self.bpe3_comboBox.currentText(),self.bpe4_comboBox.currentText(),
- self.bpe5_comboBox.currentText(),self.bpe6_comboBox.currentText()):
- val=str(i)
- if val=="":
- val="_"
- retarg+=val
+ return (False, None)
+
+ def getBPE(self): # this could be simplified!!!!
+ retarg = ""
+ for i in (
+ self.bpe_comboBox.currentText(), self.bpe2_comboBox.currentText(),
+ self.bpe3_comboBox.currentText(), self.bpe4_comboBox.currentText(),
+ self.bpe5_comboBox.currentText(), self.bpe6_comboBox.currentText()):
+ val = str(i)
+ if val == "":
+ val = "_"
+ retarg += val
return retarg # a 6 character string.
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
- Dialog = QtGui.QDialog()
- ui = Ui_Dialog(Dialog)
+ ui = BPE_Dialog()
print str(ui.getInput())
- #if Dialog.exec_():
+ # if Dialog.exec_():
# print "accepted"
- #else:
+ # else:
# print "rejected"
diff --git a/src/openmolar/qt4gui/dialogs/newCourse.py b/src/openmolar/qt4gui/dialogs/newCourse.py
index a3612ef..36eed60 100644
--- a/src/openmolar/qt4gui/dialogs/newCourse.py
+++ b/src/openmolar/qt4gui/dialogs/newCourse.py
@@ -1,44 +1,64 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.compiled_uis import Ui_newCourse
from openmolar.settings import localsettings
+
class NewCourseDialog(Ui_newCourse.Ui_Dialog):
+
'''
a custom dialog to set the variables for a new course of treatment
'''
+
def __init__(self, dialog, dnt1, dnt2, csetype, parent=None):
self.setupUi(dialog)
- self.dialog=dialog
+ self.dialog = dialog
self.dateEdit.setDate(QtCore.QDate().currentDate())
self.dnt1_comboBox.addItems(localsettings.activedents)
try:
- pos=localsettings.activedents.index(dnt1)
+ pos = localsettings.activedents.index(dnt1)
except ValueError:
- pos=-1
+ pos = -1
self.dnt1_comboBox.setCurrentIndex(pos)
self.dnt2_comboBox.addItems(localsettings.activedents)
try:
- pos=localsettings.activedents.index(dnt2)
+ pos = localsettings.activedents.index(dnt2)
except ValueError:
- pos=-1
+ pos = -1
self.dnt2_comboBox.setCurrentIndex(pos)
- self.cseType_comboBox.addItems(localsettings.csetypes)
+ self.cseType_comboBox.addItems(localsettings.CSETYPES)
try:
- pos=localsettings.csetypes.index(csetype)
+ pos = localsettings.CSETYPES.index(csetype)
except ValueError:
- pos=-1
+ pos = -1
self.cseType_comboBox.setCurrentIndex(pos)
-
+
def getInput(self):
'''
- called to show and execute the dialog until
+ called to show and execute the dialog until
sensible values are returned
'''
while True:
@@ -48,13 +68,13 @@ class NewCourseDialog(Ui_newCourse.Ui_Dialog):
cset = str(self.cseType_comboBox.currentText())
retarg = (dnt1, dnt2, cset, self.dateEdit.date())
if "" in retarg:
- QtGui.QMessageBox.information(self.dialog,
- _("Error"), _("Some fields are missing, please check"))
+ QtGui.QMessageBox.information(self.dialog,
+ _("Error"), _("Some fields are missing, please check"))
else:
- return (True,retarg)
+ return (True, retarg)
else:
return(False, None)
-
+
if __name__ == "__main__":
import sys
localsettings.initiate()
@@ -62,4 +82,3 @@ if __name__ == "__main__":
dl = QtGui.QDialog()
ui = NewCourseDialog(dl, "BW", "AH", "")
print ui.getInput()
-
diff --git a/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py b/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py
index f7a4012..04899a6 100644
--- a/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/new_bridge_dialog.py
@@ -1,50 +1,54 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import re
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.customwidgets.upper_case_line_edit import \
-UpperCaseLineEdit
+ UpperCaseLineEdit
from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
from openmolar.qt4gui.customwidgets.simple_chartwidget import SimpleChartWidg
LOGGER = logging.getLogger("openmolar")
RETAINER_LIST = [
-("GO", _("Gold")),
-("V1", _("Bonded Porcelain")),
-("LAVA", _("Lava")),
-("OPAL", _("Opalite")),
-("EMAX", _("Emax")),
-("EVER", _("Everest")),
-("SR", _("Resin")),
-("OT", _("Other")),
+ ("GO", _("Gold")),
+ ("V1", _("Bonded Porcelain")),
+ ("LAVA", _("Lava")),
+ ("OPAL", _("Opalite")),
+ ("EMAX", _("Emax")),
+ ("EVER", _("Everest")),
+ ("SR", _("Resin")),
+ ("OT", _("Other")),
]
PONTIC_LIST = RETAINER_LIST
+
class _OptionPage(QtGui.QWidget):
+
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.dialog = parent
@@ -85,7 +89,9 @@ class _OptionPage(QtGui.QWidget):
def cleanup(self):
pass
+
class PageZero(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.upper_radioButton = QtGui.QRadioButton(_("Upper Bridge"))
@@ -98,7 +104,7 @@ class PageZero(_OptionPage):
@property
def is_completed(self):
return (self.upper_radioButton.isChecked() or
- self.lower_radioButton.isChecked())
+ self.lower_radioButton.isChecked())
@property
def properties(self):
@@ -106,7 +112,9 @@ class PageZero(_OptionPage):
return (("arch", "upper"),)
return (("arch", "lower"),)
+
class PageOne(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.label.setText(_("Bridge Type"))
@@ -120,7 +128,7 @@ class PageOne(_OptionPage):
@property
def is_completed(self):
return (self.radioButton1.isChecked() or
- self.radioButton2.isChecked())
+ self.radioButton2.isChecked())
@property
def properties(self):
@@ -128,7 +136,9 @@ class PageOne(_OptionPage):
return (("type", "conventional"),)
return (("type", "resin_retained"),)
+
class PageTwo(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.label.setText(_("Material"))
@@ -136,11 +146,11 @@ class PageTwo(_OptionPage):
layout = QtGui.QGridLayout(self.frame)
i = 0
for shortcut, description in RETAINER_LIST:
- if self.radio_buttons.has_key(shortcut):
+ if shortcut in self.radio_buttons:
LOGGER.warning("duplication in BRIDGE MATERIAL LIST")
continue
rad_but = QtGui.QRadioButton(description)
- layout.addWidget(rad_but, i//2, i%2)
+ layout.addWidget(rad_but, i // 2, i % 2)
self.radio_buttons[shortcut] = rad_but
i += 1
@@ -157,12 +167,14 @@ class PageTwo(_OptionPage):
if rad_but.isChecked():
return (("material", shortcut),)
+
class PageThree(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.dl = parent
self.label.setText(_(
- "Please select teeth which are to be used as retainers"))
+ "Please select teeth which are to be used as retainers"))
self.chartwidg = SimpleChartWidg(self, auto_ctrl_key=True)
layout = QtGui.QVBoxLayout(self.frame)
layout.addWidget(self.chartwidg)
@@ -179,15 +191,17 @@ class PageThree(_OptionPage):
@property
def properties(self):
- for tooth in self.chartwidg.getSelected():
+ for tooth in self.chartwidg.getSelected():
yield(tooth, "retainer")
+
class PageFour(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.dl = parent
self.label.setText(_(
- "Please select teeth which are to be used as pontics"))
+ "Please select teeth which are to be used as pontics"))
self.chartwidg = SimpleChartWidg(self, auto_ctrl_key=True)
layout = QtGui.QVBoxLayout(self.frame)
layout.addWidget(self.chartwidg)
@@ -204,19 +218,23 @@ class PageFour(_OptionPage):
@property
def properties(self):
- for tooth in self.chartwidg.getSelected():
+ for tooth in self.chartwidg.getSelected():
yield(tooth, "pontic")
+
class AcceptPage(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
- self.label.setText("%s<hr />%s"% (
- _("You have completed your input."),
- _("Please click on Apply")))
+ self.label.setText("%s<hr />%s" % (
+ _("You have completed your input."),
+ _("Please click on Apply")))
self.frame.hide()
+
class NewBridgeDialog(ExtendableDialog):
- def __init__(self, om_gui = None):
+
+ def __init__(self, om_gui=None):
ExtendableDialog.__init__(self, om_gui)
self.chosen_properties = {}
@@ -268,7 +286,7 @@ class NewBridgeDialog(ExtendableDialog):
def next_widget(self):
if not self.current_page.is_completed:
QtGui.QMessageBox.information(self, _("Whoops"),
- self.current_page.error_message)
+ self.current_page.error_message)
return
for key, value in self.current_page.properties:
@@ -300,4 +318,4 @@ if __name__ == "__main__":
LOGGER.setLevel(logging.DEBUG)
dl = NewBridgeDialog(None)
if dl.exec_():
- print dl.chosen_properties
\ No newline at end of file
+ print dl.chosen_properties
diff --git a/src/openmolar/qt4gui/dialogs/new_denture_dialog.py b/src/openmolar/qt4gui/dialogs/new_denture_dialog.py
index 9a1d44f..16be470 100644
--- a/src/openmolar/qt4gui/dialogs/new_denture_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/new_denture_dialog.py
@@ -1,31 +1,33 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import re
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.customwidgets.upper_case_line_edit import \
-UpperCaseLineEdit
+ UpperCaseLineEdit
from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
from openmolar.qt4gui.customwidgets.simple_chartwidget import SimpleChartWidg
@@ -40,10 +42,12 @@ VALID_INPUTS = (
"FL_P/(R[1-8]{1,8},)?(L[1-8]{1,8})?$",
"SL",
"ST",
- "", # this one in case of no input whatsoever!
- )
+ "", # this one in case of no input whatsoever!
+)
+
class _OptionPage(QtGui.QWidget):
+
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.dialog = parent
@@ -84,7 +88,9 @@ class _OptionPage(QtGui.QWidget):
def cleanup(self):
pass
+
class PageTwo(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
layout = QtGui.QVBoxLayout(self.frame)
@@ -110,7 +116,7 @@ class PageTwo(_OptionPage):
def next_index(self):
if self.partial_radioButton.isChecked():
return 1
- #skip the teeth choosing page if a complete denture
+ # skip the teeth choosing page if a complete denture
return 2
@property
@@ -119,7 +125,9 @@ class PageTwo(_OptionPage):
return "F"
return "P/"
+
class PageZero(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.upper_radioButton = QtGui.QRadioButton(_("Upper Denture"))
@@ -132,7 +140,7 @@ class PageZero(_OptionPage):
@property
def is_completed(self):
return (self.upper_radioButton.isChecked() or
- self.lower_radioButton.isChecked())
+ self.lower_radioButton.isChecked())
@property
def return_text(self):
@@ -144,7 +152,9 @@ class PageZero(_OptionPage):
return "upper"
return "lower"
+
class PageOne(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.acrylic_radioButton = QtGui.QRadioButton(_("Acrylic Denture"))
@@ -165,12 +175,14 @@ class PageOne(_OptionPage):
if self.flexible_radioButton.isChecked():
return "FL_"
+
class PageThree(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.dl = parent
self.label.setText(_(
- "Please select teeth which this denture is to replace"))
+ "Please select teeth which this denture is to replace"))
self.chartwidg = SimpleChartWidg(self, auto_ctrl_key=True)
layout = QtGui.QVBoxLayout(self.frame)
layout.addWidget(self.chartwidg)
@@ -206,11 +218,13 @@ class PageThree(_OptionPage):
retval += tooth
return retval
+
class PageFour(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
self.label.setText(_(
- "You may wish to add the following optional items"))
+ "You may wish to add the following optional items"))
self.st_checkBox = QtGui.QCheckBox(_("Special Tray"))
self.sl_checkBox = QtGui.QCheckBox(_("Soft Lining"))
@@ -236,15 +250,18 @@ class PageFour(_OptionPage):
class AcceptPage(_OptionPage):
+
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
- self.label.setText("%s<hr />%s"% (
- _("You have completed your input."),
- _("Please click on Apply")))
+ self.label.setText("%s<hr />%s" % (
+ _("You have completed your input."),
+ _("Please click on Apply")))
self.frame.hide()
+
class NewDentureDialog(ExtendableDialog):
- def __init__(self, om_gui = None):
+
+ def __init__(self, om_gui=None):
ExtendableDialog.__init__(self, om_gui)
self.om_gui = om_gui
@@ -306,7 +323,7 @@ class NewDentureDialog(ExtendableDialog):
def next_widget(self):
if not self.current_page.is_completed:
QtGui.QMessageBox.information(self, _("Whoops"),
- self.current_page.error_message)
+ self.current_page.error_message)
return
if self.current_index == 0:
@@ -338,7 +355,6 @@ class NewDentureDialog(ExtendableDialog):
else:
self._default_lineedit = self.ndl_le
-
def _clicked(self, but):
'''
"private" function called when button box is clicked
@@ -359,17 +375,17 @@ class NewDentureDialog(ExtendableDialog):
matched = True
if not matched:
QtGui.QMessageBox.warning(self, _("Warning"),
- _("Your upper denture input is invalid"))
+ _("Your upper denture input is invalid"))
return False
for ndl in ndls.split(" "):
- LOGGER.debug("checking '%s'"% ndl)
+ LOGGER.debug("checking '%s'" % ndl)
matched = False
for input_ in VALID_INPUTS:
if re.match(input_, ndl):
matched = True
if not matched:
QtGui.QMessageBox.warning(self, _("Warning"),
- _("Your lower denture input is invalid"))
+ _("Your lower denture input is invalid"))
return False
return True
diff --git a/src/openmolar/qt4gui/dialogs/nhs_forms_config_dialog.py b/src/openmolar/qt4gui/dialogs/nhs_forms_config_dialog.py
index 2eb1519..5d4f91a 100644
--- a/src/openmolar/qt4gui/dialogs/nhs_forms_config_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/nhs_forms_config_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
@@ -28,8 +30,10 @@ from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
from openmolar.qt4gui.printing.gp17.gp17_config import gp17config
+
class _PrintSettings(QtGui.QWidget):
user_input = QtCore.pyqtSignal()
+
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.left_sb = QtGui.QSpinBox()
@@ -42,17 +46,17 @@ class _PrintSettings(QtGui.QWidget):
form_layout.addRow(_("Top Offset"), self.top_sb)
form_layout.addRow(_("Horizontal Scaling"), self.scale_x_sb)
form_layout.addRow(_("Vertical Scaling"), self.scale_y_sb)
-
+
def set_initial_values(self, left, top, scale_x, scale_y):
self.left_sb.setValue(left)
self.top_sb.setValue(top)
self.scale_x_sb.setValue(scale_x)
self.scale_y_sb.setValue(scale_y)
-
- for widg in (self.left_sb, self.top_sb,
- self.scale_x_sb, self.scale_y_sb):
+
+ for widg in (self.left_sb, self.top_sb,
+ self.scale_x_sb, self.scale_y_sb):
widg.valueChanged.connect(self.emit_user_input)
-
+
def value(self, attribute):
if attribute == "left":
return str(self.left_sb.value())
@@ -62,66 +66,68 @@ class _PrintSettings(QtGui.QWidget):
return str(self.scale_x_sb.value())
elif attribute == "scale_y":
return str(self.scale_y_sb.value())
-
+
def emit_user_input(self, *args):
self.user_input.emit()
+
class NHSFormsConfigDialog(BaseDialog):
+
def __init__(self, parent=None):
BaseDialog.__init__(self, parent)
title = _("NHS Form Configuration")
self.setWindowTitle(title)
- label = QtGui.QLabel(u"<b>%s</b>"% title)
+ label = QtGui.QLabel(u"<b>%s</b>" % title)
label.setAlignment(QtCore.Qt.AlignCenter)
-
+
self.gp17_widget = _PrintSettings()
self.gp17_widget.set_initial_values(
gp17config.OFFSET_LEFT,
gp17config.OFFSET_TOP,
gp17config.SCALE_X,
gp17config.SCALE_Y)
-
+
self.gp17ifront_widget = _PrintSettings()
self.gp17ifront_widget.set_initial_values(
gp17config.GP17i_OFFSET_LEFT,
gp17config.GP17i_OFFSET_TOP,
gp17config.GP17i_SCALE_X,
gp17config.GP17i_SCALE_Y)
-
+
self.gp17iback_widget = _PrintSettings()
self.gp17iback_widget.set_initial_values(
gp17config.GP17iback_OFFSET_LEFT,
gp17config.GP17iback_OFFSET_TOP,
gp17config.GP17iback_SCALE_X,
gp17config.GP17iback_SCALE_Y)
-
+
self.gp17_widget.user_input.connect(self.enableApply)
self.gp17ifront_widget.user_input.connect(self.enableApply)
self.gp17iback_widget.user_input.connect(self.enableApply)
-
+
tab_widget = QtGui.QTabWidget()
tab_widget.addTab(self.gp17_widget, "GP17")
tab_widget.addTab(self.gp17ifront_widget, "GP17i (front)")
tab_widget.addTab(self.gp17iback_widget, "GP17i (back)")
-
+
self.insertWidget(label)
self.insertWidget(tab_widget)
def apply(self):
for widg, section in (
(self.gp17_widget, "gp17Front"),
- (self.gp17ifront_widget, "gp17iFront"),
+ (self.gp17ifront_widget, "gp17iFront"),
(self.gp17iback_widget, "gp17iBack")
- ):
+ ):
for option in ("top", "left", "scale_x", "scale_y"):
gp17config.set(section, option, widg.value(option))
-
+
gp17config.save_config()
gp17config.read_conf()
-
+
def sizeHint(self):
- return QtCore.QSize(300,350)
+ return QtCore.QSize(300, 350)
def exec_(self):
if BaseDialog.exec_(self):
@@ -135,6 +141,5 @@ if __name__ == "__main__":
app = QtGui.QApplication([])
dl = NHSFormsConfigDialog()
-
+
print (dl.exec_())
-
\ No newline at end of file
diff --git a/src/openmolar/qt4gui/dialogs/payment_dialog.py b/src/openmolar/qt4gui/dialogs/payment_dialog.py
index b715d82..cc20831 100644
--- a/src/openmolar/qt4gui/dialogs/payment_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/payment_dialog.py
@@ -1,30 +1,33 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2010, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from types import IntType
from PyQt4 import QtCore, QtGui
if __name__ == "__main__":
- import os, sys
+ import os
+ import sys
sys.path.insert(0, os.path.abspath("../../../"))
@@ -33,7 +36,9 @@ from openmolar.qt4gui.customwidgets.currency_label import CurrencyLabel
from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
class MiscPaymentWidget(QtGui.QWidget):
+
'''
the "advanced" widget added to the payment dialog.
'''
@@ -47,10 +52,10 @@ class MiscPaymentWidget(QtGui.QWidget):
self.other_le = MoneyLineEdit()
self.refund_le = MoneyLineEdit()
self.refund_le.setStyleSheet("color:red")
-
- layout.addRow(_("Annual Hdp Payment"),self.hdp_le)
- layout.addRow(_("Other Payments"),self.other_le)
- layout.addRow(_("Patient Refunds"),self.refund_le)
+
+ layout.addRow(_("Annual Hdp Payment"), self.hdp_le)
+ layout.addRow(_("Other Payments"), self.other_le)
+ layout.addRow(_("Patient Refunds"), self.refund_le)
self.hdp_le.textEdited.connect(self.updated.emit)
self.other_le.textEdited.connect(self.updated.emit)
@@ -60,7 +65,7 @@ class MiscPaymentWidget(QtGui.QWidget):
if hide:
self.hdp_le.setEnabled(False)
self.refund_le.setEnabled(False)
-
+
@property
def hdp_value(self):
return self.hdp_le.pence_value
@@ -123,72 +128,67 @@ class PaymentDialog(ExtendableDialog):
self.grand_tot_label.setFont(f)
-
- for label in ( self.cash_tot_label, self.cheque_tot_label,
- self.card_tot_label, self.tx_tot_label,
- self.sundries_tot_label, self.grand_tot_label):
+ for label in (self.cash_tot_label, self.cheque_tot_label,
+ self.card_tot_label, self.tx_tot_label,
+ self.sundries_tot_label, self.grand_tot_label):
label.setMinimumWidth(80)
- layout.addWidget(tx_label,0,1,1,2)
- layout.addWidget(sundries_label,0,3)
- layout.addWidget(total_label,0,4)
-
- layout.addWidget(cash_label,1,0)
- layout.addWidget(cheque_label,2,0)
- layout.addWidget(card_label,3,0)
+ layout.addWidget(tx_label, 0, 1, 1, 2)
+ layout.addWidget(sundries_label, 0, 3)
+ layout.addWidget(total_label, 0, 4)
- layout.addWidget(self.cash_le,1,1)
- layout.addWidget(self.cheque_le,2,1)
- layout.addWidget(self.card_le,3,1)
+ layout.addWidget(cash_label, 1, 0)
+ layout.addWidget(cheque_label, 2, 0)
+ layout.addWidget(card_label, 3, 0)
- layout.addWidget(self.cash_but,1,2)
- layout.addWidget(self.cheque_but,2,2)
- layout.addWidget(self.card_but,3,2)
+ layout.addWidget(self.cash_le, 1, 1)
+ layout.addWidget(self.cheque_le, 2, 1)
+ layout.addWidget(self.card_le, 3, 1)
- layout.addWidget(self.cash_sundries_le,1,3)
- layout.addWidget(self.cheque_sundries_le,2,3)
- layout.addWidget(self.card_sundries_le,3,3)
+ layout.addWidget(self.cash_but, 1, 2)
+ layout.addWidget(self.cheque_but, 2, 2)
+ layout.addWidget(self.card_but, 3, 2)
- layout.addWidget(self.cash_tot_label,1,4)
- layout.addWidget(self.cheque_tot_label,2,4)
- layout.addWidget(self.card_tot_label,3,4)
+ layout.addWidget(self.cash_sundries_le, 1, 3)
+ layout.addWidget(self.cheque_sundries_le, 2, 3)
+ layout.addWidget(self.card_sundries_le, 3, 3)
- layout.addWidget(self.tx_tot_label,4,1)
- layout.addWidget(self.sundries_tot_label,4,3)
- layout.addWidget(self.grand_tot_label,4,4)
+ layout.addWidget(self.cash_tot_label, 1, 4)
+ layout.addWidget(self.cheque_tot_label, 2, 4)
+ layout.addWidget(self.card_tot_label, 3, 4)
+ layout.addWidget(self.tx_tot_label, 4, 1)
+ layout.addWidget(self.sundries_tot_label, 4, 3)
+ layout.addWidget(self.grand_tot_label, 4, 4)
self.insertWidget(frame)
for widg in (self.cash_le, self.cheque_le, self.card_le,
- self.cash_sundries_le, self.cheque_sundries_le, self.card_sundries_le):
+ self.cash_sundries_le, self.cheque_sundries_le, self.card_sundries_le):
widg.textEdited.connect(self.update_totals)
-
self.cash_but.clicked.connect(self.cash_but_clicked)
self.cheque_but.clicked.connect(self.cheque_but_clicked)
self.card_but.clicked.connect(self.card_but_clicked)
-
self.misc_payment_widget = MiscPaymentWidget(self)
self.set_advanced_but_text(_("unusual payments"))
self.add_advanced_widget(self.misc_payment_widget)
self.misc_payment_widget.updated.connect(self.update_totals)
-
def int_to_decimal(self, i):
- assert type(i) == IntType, "input must be an integer, not %s, (%s)"% (
- i, type(i))
+ assert isinstance(i, IntType), "input must be an integer, not %s, (%s)" % (
+ i, type(i))
ss = str(i)
negative = "-" if "-" in ss else ""
ss = ss.strip("-")
if len(ss) == 0:
return "0.00"
if len(ss) == 1:
- return "%s0.0%s"% (negative, ss)
+ return "%s0.0%s" % (negative, ss)
if len(ss) == 2:
- return "%s0.%s"% (negative, ss)
- return "%s%s.%s"% (negative, ss[:-2], ss[-2:])
+ return "%s0.%s" % (negative, ss)
+ return "%s%s.%s" % (negative, ss[:-2], ss[-2:])
def update_totals(self, *args):
self.cash_tot_label.setText(self.int_to_decimal(self.cash_total))
@@ -217,17 +217,17 @@ class PaymentDialog(ExtendableDialog):
@property
def grand_total(self):
val = (self.cash_total + self.cheque_total +
- self.card_total + self.hdp + self.other + self.refund)
+ self.card_total + self.hdp + self.other + self.refund)
self.enableApply(val != 0 or self.refund != 0)
return val
@property
def tx_total_text(self):
- return self.int_to_decimal(self.tx_total+self.hdp)
+ return self.int_to_decimal(self.tx_total + self.hdp)
@property
def sundry_total_text(self):
- return self.int_to_decimal(self.sundries_total+self.other)
+ return self.int_to_decimal(self.sundries_total + self.other)
@property
def grand_total_text(self):
@@ -236,11 +236,11 @@ class PaymentDialog(ExtendableDialog):
@property
def other_text(self):
return self.int_to_decimal(self.other)
-
+
@property
def refund_text(self):
return self.int_to_decimal(self.refund)
-
+
@property
def cash_total(self):
return self.cash_le.pence_value + self.cash_sundries_le.pence_value
@@ -312,6 +312,6 @@ if __name__ == "__main__":
from gettext import gettext as _
app = QtGui.QApplication([])
dl = PaymentDialog()
- #dl.hide_treatment(True)
+ # dl.hide_treatment(True)
dl.exec_()
app.closeAllWindows()
diff --git a/src/openmolar/qt4gui/dialogs/permissions.py b/src/openmolar/qt4gui/dialogs/permissions.py
index 2a3b3b1..45b8311 100644
--- a/src/openmolar/qt4gui/dialogs/permissions.py
+++ b/src/openmolar/qt4gui/dialogs/permissions.py
@@ -1,44 +1,63 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
-import datetime, hashlib
+import datetime
+import hashlib
from openmolar.settings import localsettings
from openmolar.qt4gui.compiled_uis import Ui_permissions
+
def granted(parent=None):
- if localsettings.permissionsRaised==True:
- if localsettings.permissionExpire>datetime.datetime.now():
+ if localsettings.permissionsRaised:
+ if localsettings.permissionExpire > datetime.datetime.now():
resetExpireTime()
return True
else:
- localsettings.permissionsRaised=False
+ localsettings.permissionsRaised = False
- Dialog=QtGui.QDialog(parent)
+ Dialog = QtGui.QDialog(parent)
dl = Ui_permissions.Ui_Dialog()
dl.setupUi(Dialog)
if Dialog.exec_():
- hash = hashlib.sha1(str((dl.lineEdit.text().toAscii()))).hexdigest()
- if hash == localsettings.SUPERVISOR:
- localsettings.permissionsRaised=True
+ hash = hashlib.sha1(str((dl.lineEdit.text().toAscii()))).hexdigest()
+ if hash == localsettings.SUPERVISOR:
+ localsettings.permissionsRaised = True
resetExpireTime()
return True
else:
- QtGui.QMessageBox.information(parent,"whoops","wrong password")
+ QtGui.QMessageBox.information(parent, "whoops", "wrong password")
return False
+
def resetExpireTime():
- diff=datetime.timedelta(minutes=5)
- localsettings.permissionExpire=datetime.datetime.now()+diff
+ diff = datetime.timedelta(minutes=5)
+ localsettings.permissionExpire = datetime.datetime.now() + diff
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
print granted()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/dialogs/post_choice_dialog.py b/src/openmolar/qt4gui/dialogs/post_choice_dialog.py
index add085a..3154995 100644
--- a/src/openmolar/qt4gui/dialogs/post_choice_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/post_choice_dialog.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from collections import namedtuple
from functools import partial
@@ -29,18 +31,20 @@ from openmolar.settings import localsettings
from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
PostChartButton = namedtuple('PostChartButton',
- ("shortcut", "description", "tooltip"))
+ ("shortcut", "description", "tooltip"))
STATIC_LIST = []
for shortcut, description in (
-("CR,C1", _("Cast Precious Metal")),
-("CR,C2", _("Cast Non-Precious Metal")),
-("CR,OP", _("Other")),
+ ("CR,C1", _("Cast Precious Metal")),
+ ("CR,C2", _("Cast Non-Precious Metal")),
+ ("CR,OP", _("Other")),
):
pcb = PostChartButton(shortcut, description, "")
STATIC_LIST.append(pcb)
+
class PostChoiceDialog(ExtendableDialog):
+
def __init__(self, static, parent=None):
ExtendableDialog.__init__(self, parent, remove_stretch=True)
self.setWindowTitle(_("Post Choice Dialog"))
@@ -61,7 +65,7 @@ class PostChoiceDialog(ExtendableDialog):
self.add_buttons(STATIC_LIST)
else:
all_posts_but = QtGui.QPushButton(
- _("Show Post types from all feescales"))
+ _("Show Post types from all feescales"))
all_posts_but.clicked.connect(self._show_all_posts)
self.add_advanced_widget(all_posts_but)
@@ -81,8 +85,8 @@ class PostChoiceDialog(ExtendableDialog):
but.setToolTip(post_button.tooltip)
but.clicked.connect(
partial(self.but_clicked, post_button.shortcut))
- self.but_layout.addWidget(but, row//2, row%2)
- self.but_layout.setRowStretch((row+2)//2,100)
+ self.but_layout.addWidget(but, row // 2, row % 2)
+ self.but_layout.setRowStretch((row + 2) // 2, 100)
def _show_all_posts(self):
self.add_buttons(localsettings.FEETABLES.ui_post_chart_buttons)
@@ -105,4 +109,4 @@ if __name__ == "__main__":
localsettings.loadFeeTables()
dl = PostChoiceDialog(False, mw)
if dl.exec_():
- print dl.chosen_shortcut
\ No newline at end of file
+ print dl.chosen_shortcut
diff --git a/src/openmolar/qt4gui/dialogs/print_record_dialog.py b/src/openmolar/qt4gui/dialogs/print_record_dialog.py
index 47a3858..28427ac 100644
--- a/src/openmolar/qt4gui/dialogs/print_record_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/print_record_dialog.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
from PyQt4 import QtGui, QtCore, QtWebKit
@@ -31,13 +33,14 @@ from openmolar.ptModules import patientDetails
class PrintRecordDialog(BaseDialog):
+
def __init__(self, patient, chartimage, parent):
BaseDialog.__init__(self, parent)
self.pt = patient
self.main_ui = parent
- patient_label = QtGui.QLabel("%s<br /><b>%s</b>"% (
- _("Print the record of"), patient.name_id))
+ patient_label = QtGui.QLabel("%s<br /><b>%s</b>" % (
+ _("Print the record of"), patient.name_id))
patient_label.setAlignment(QtCore.Qt.AlignCenter)
@@ -46,16 +49,15 @@ class PrintRecordDialog(BaseDialog):
self.insertWidget(patient_label)
self.insertWidget(self.web_view)
- html = patientDetails.header(patient).replace("center","left")
+ html = patientDetails.header(patient).replace("center", "left")
- html += '<img src="%s" height = "120px" /><hr />'% (
+ html += '<img src="%s" height = "120px" /><hr />' % (
chartimage)
html += formatted_notes.notes(patient.notes_dict)
self.web_view.setHtml(html)
self.apply_but.setText("Print")
self.enableApply()
-
def sizeHint(self):
return QtCore.QSize(600, 600)
diff --git a/src/openmolar/qt4gui/dialogs/recall_dialog.py b/src/openmolar/qt4gui/dialogs/recall_dialog.py
index 9e29c1d..6adf41a 100644
--- a/src/openmolar/qt4gui/dialogs/recall_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/recall_dialog.py
@@ -1,41 +1,46 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2010, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings
+
class RecallDialog(QtGui.QDialog):
+
'''
generates SQL and values to be used to select patients to recall
'''
- def __init__(self,parent=None):
+
+ def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.dent_cbs = []
self.setWindowTitle("Set Recall Conditions")
today = QtCore.QDate.currentDate()
start = QtCore.QDate(today.year(), today.month(), 1)
- end = QtCore.QDate(today.year(), today.month()+1, 1).addDays(-1)
+ end = QtCore.QDate(today.year(), today.month() + 1, 1).addDays(-1)
start_label = QtGui.QLabel(_("start date (inclusive)"))
self.start_date = QtGui.QDateEdit()
@@ -66,13 +71,13 @@ class RecallDialog(QtGui.QDialog):
but_box.addButton(but_box.Cancel).clicked.connect(self.reject)
layout = QtGui.QGridLayout(self)
- layout.addWidget(start_label,1,0)
- layout.addWidget(self.start_date,1,1)
- layout.addWidget(end_label,2,0)
- layout.addWidget(self.end_date,2,1)
- layout.addWidget(self.end_date,2,1)
- layout.addWidget(self.dent_gb,3,0,1,2)
- layout.addWidget(but_box,4,0,1,2)
+ layout.addWidget(start_label, 1, 0)
+ layout.addWidget(self.start_date, 1, 1)
+ layout.addWidget(end_label, 2, 0)
+ layout.addWidget(self.end_date, 2, 1)
+ layout.addWidget(self.end_date, 2, 1)
+ layout.addWidget(self.dent_gb, 3, 0, 1, 2)
+ layout.addWidget(but_box, 4, 0, 1, 2)
@property
def conditions(self):
diff --git a/src/openmolar/qt4gui/dialogs/saveDiscardCancel.py b/src/openmolar/qt4gui/dialogs/saveDiscardCancel.py
deleted file mode 100644
index eece600..0000000
--- a/src/openmolar/qt4gui/dialogs/saveDiscardCancel.py
+++ /dev/null
@@ -1,98 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
-
-from PyQt4 import QtGui, QtCore
-from openmolar.qt4gui.compiled_uis import Ui_saveDiscardCancel
-
-import gettext
-gettext.install("openmolar")
-
-class sdcDialog(Ui_saveDiscardCancel.Ui_Dialog):
- def __init__(self, dialog):
- self.dialog=dialog
- self.setupUi(self.dialog)
- self.changes=[]
- self.signals()
- self.result=""
- self.dialog.setFixedHeight(154)
- self.compressed = True
-
- def setPatient(self, arg):
- '''
- let the dialog know who it is referring to
- '''
- message = _("You have unsaved changes to the record of")
- self.label.setText("%s<br />%s"% (message, arg))
-
- def setChanges(self,changelist):
- '''
- a list of changes
- '''
- self.changes = changelist
- self.listWidget.addItems(self.changes)
-
- def allowDiscard(self, option):
- '''
- if not exiting, the changes cannot be discarded
- '''
- if not option:
- for button in self.buttonBox.buttons():
- if self.buttonBox.buttonRole(button) == (
- QtGui.QDialogButtonBox.DestructiveRole):
- self.buttonBox.removeButton(button)
-
- def signals(self):
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL("accepted()"), self.save)
-
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL("rejected()"), self.cancel)
-
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL("clicked(QAbstractButton*)"),self.slot)
-
- self.pushButton.connect(self.pushButton,
- QtCore.SIGNAL("clicked()"),self.showDetails)
-
- def showDetails(self):
-
- if not self.compressed:
- self.dialog.setFixedHeight(154)
- self.pushButton.setText(_("What's Changed?"))
- else:
- self.dialog.setFixedHeight(283)
- self.pushButton.setText(_("Hide"))
- self.compressed = not self.compressed
-
- def slot(self, arg=None):
- if self.buttonBox.buttonRole(arg) == (
- QtGui.QDialogButtonBox.DestructiveRole):
- self.discard()
-
- def save(self):
- self.result="save"
- self.dialog.accept()
- def cancel(self):
- self.dialog.reject()
- def discard(self):
- if QtGui.QMessageBox.question(self.dialog,_("Confirm"),
- "Are you sure you want to discard your changes?",
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.No )==QtGui.QMessageBox.Yes:
- self.result="discard"
- self.dialog.accept()
-
-if __name__ == "__main__":
- import sys
- app = QtGui.QApplication(sys.argv)
- Dialog = QtGui.QDialog()
- ui = sdcDialog(Dialog)
- ui.setPatient("TestRecord - 000356")
- ui.setChanges(["Sname","Fname"]*2)
- #ui.setOfferDiscard(False)
- if Dialog.exec_():
- print ui.result
\ No newline at end of file
diff --git a/src/openmolar/qt4gui/dialogs/saveMemo.py b/src/openmolar/qt4gui/dialogs/saveMemo.py
index ee9cfbe..a7afba9 100644
--- a/src/openmolar/qt4gui/dialogs/saveMemo.py
+++ b/src/openmolar/qt4gui/dialogs/saveMemo.py
@@ -1,58 +1,77 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
from openmolar.qt4gui.compiled_uis import Ui_saveMemo
from openmolar.settings import localsettings
from openmolar.dbtools import memos
+
class Ui_Dialog(Ui_saveMemo.Ui_Dialog):
- def __init__(self,dialog,sno):
- self.dialog=dialog
+
+ def __init__(self, dialog, sno):
+ self.dialog = dialog
self.setupUi(dialog)
self.dateEdit.setDate(QtCore.QDate().currentDate())
self.author_comboBox.addItems(localsettings.allowed_logins)
- self.serialno=sno
+ self.serialno = sno
self.author_comboBox.setCurrentIndex(-1)
-
+
def getInput(self):
if not self.dialog.exec_():
return False
if not self.noExpire_radioButton.isChecked():
exdate = self.dateEdit.date().toPyDate()
- else:
+ else:
exdate = None
-
+
author = str(self.author_comboBox.currentText())
if author == "":
author = "Anon"
-
+
open = True
-
+
message = self.textEdit.toPlainText().toAscii()
-
+
if self.viewSurgery_radioButton.isChecked():
type = "surg"
elif self.viewReception_radioButton.isChecked():
type = "rec"
else:
type = "all"
-
- return memos.saveMemo(self.serialno, author, type, exdate,
- message, open)
-
+
+ return memos.saveMemo(self.serialno, author, type, exdate,
+ message, open)
+
if __name__ == "__main__":
localsettings.initiate()
import sys
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
- ui = Ui_Dialog(Dialog,11956)
+ ui = Ui_Dialog(Dialog, 11956)
print ui.getInput()
- #if Dialog.exec_():
+ # if Dialog.exec_():
# print "accepted"
- #else:
+ # else:
# print "rejected"
diff --git a/src/openmolar/qt4gui/dialogs/save_discard_cancel.py b/src/openmolar/qt4gui/dialogs/save_discard_cancel.py
new file mode 100644
index 0000000..fabfc1f
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/save_discard_cancel.py
@@ -0,0 +1,100 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+from PyQt4 import QtCore, QtGui
+
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+
+class SaveDiscardCancelDialog(ExtendableDialog):
+ SAVE = 0
+ DISCARD = 1
+ CANCEL = 2
+
+ def __init__(self, message, changes, parent=None):
+ '''
+ offers a choiced of save discard cancel, but allows for examination
+ of what has changed.
+ changes should be a function, which returns a string list
+ '''
+ ExtendableDialog.__init__(self, parent)
+ self.set_advanced_but_text(_("What's changed?"))
+ self.apply_but.setText("&Save")
+ self.enableApply()
+ self.save_on_exit = True
+
+ label = QtGui.QLabel(message)
+ label.setAlignment(QtCore.Qt.AlignCenter)
+ self.insertWidget(label)
+
+ self.discard_but = self.button_box.addButton(
+ QtGui.QDialogButtonBox.Discard)
+ self.discard_but.setToolTip(_("Discard All Changes"))
+
+ self.cancel_but.setToolTip(_("Cancel and Continue Editing"))
+
+ self.changes = changes
+ self.changes_list_widget = QtGui.QListWidget()
+ self.add_advanced_widget(self.changes_list_widget)
+
+ self.result = self.SAVE
+
+ def sizeHint(self):
+ return QtCore.QSize(400, 100)
+
+ def _clicked(self, but):
+ if but == self.discard_but:
+ self.discard()
+ return
+ ExtendableDialog._clicked(self, but)
+
+ def discard(self):
+ if QtGui.QMessageBox.question(self, _("Confirm"),
+ _(
+ "Are you sure you want to discard these changes?"),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
+ self.result = self.DISCARD
+ self.accept()
+
+ def showExtension(self, extend):
+ if extend:
+ self.changes_list_widget.clear()
+ self.changes_list_widget.addItems(self.changes)
+ ExtendableDialog.showExtension(self, extend)
+
+ def reject(self):
+ self.result = self.CANCEL
+ QtGui.QDialog.reject(self)
+
+if __name__ == "__main__":
+ from gettext import gettext as _
+ changes = ["Sname", "Fname"]
+
+ app = QtGui.QApplication([])
+ message = "You have unsaved changes"
+
+ dl = SaveDiscardCancelDialog(message, changes)
+ dl.exec_()
+ print dl.result
diff --git a/src/openmolar/qt4gui/dialogs/select_language.py b/src/openmolar/qt4gui/dialogs/select_language.py
index fa53fb8..9234f62 100644
--- a/src/openmolar/qt4gui/dialogs/select_language.py
+++ b/src/openmolar/qt4gui/dialogs/select_language.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import gettext
import os
@@ -14,6 +31,7 @@ from openmolar.qt4gui.compiled_uis import Ui_choose_language
LOGGER = logging.getLogger("openmolar")
+
def getCurrentLanguage():
'''
get the current language in use
@@ -23,47 +41,50 @@ def getCurrentLanguage():
cl = cl[:cl.index(".")]
return cl
+
def getAvailableLanguages():
'''
return a list of installed languages - I do this manually at the moment :(
'''
- available = [
- _("English (United Kingdom)") +" - en_GB",
- _("English (Australia)") +" - en_AUS",
- _("Afrikaans") + " - af",
- _("Danish") + " - da",
- _("French") + " - fr",
- _("German") + " - de",
- _("Hungarian") + " - hu",
- _("Indonesian") + " - id",
- _("Italian") + " - it",
- _("Occitan") + " - oc",
- _("Polish") + " - pl",
- _("Portuguese") + " - pt",
- _("Slovak") + " - sk",
- _("Spanish") + " - es",
- _("Turkish") + " - tr",
- _("Romanian") + " - ro",
- _("Greek") + " - el",
- ]
- available.sort()
+ available = sorted([
+ _("English (United Kingdom)") + " - en_GB",
+ _("English (Australia)") + " - en_AUS",
+ _("Afrikaans") + " - af",
+ _("Danish") + " - da",
+ _("French") + " - fr",
+ _("German") + " - de",
+ _("Hungarian") + " - hu",
+ _("Indonesian") + " - id",
+ _("Italian") + " - it",
+ _("Occitan") + " - oc",
+ _("Polish") + " - pl",
+ _("Portuguese") + " - pt",
+ _("Slovak") + " - sk",
+ _("Spanish") + " - es",
+ _("Turkish") + " - tr",
+ _("Romanian") + " - ro",
+ _("Greek") + " - el",
+ ])
return available
+
def setLanguage(lang):
'''
install the language chosen
'''
lang = lang.split(" - ")[1]
- lang1 = gettext.translation('openmolar', languages=[lang,])
+ lang1 = gettext.translation('openmolar', languages=[lang, ])
try:
print "trying install your environment language", lang1
- lang1 = gettext.translation('openmolar', languages=[lang,])
+ lang1 = gettext.translation('openmolar', languages=[lang, ])
lang1.install(unicode=True)
- except IOError:
- LOGGER.exception("%s not found, sorry"% lang1)
+ except IOError:
+ LOGGER.exception("%s not found, sorry" % lang1)
gettext.install('openmolar', unicode=True)
+
class language_dialog(Ui_choose_language.Ui_Dialog):
+
def __init__(self, dialog, parent=None):
self.setupUi(dialog)
self.dialog = dialog
@@ -76,24 +97,24 @@ class language_dialog(Ui_choose_language.Ui_Dialog):
rb.setChecked(True)
self.radioboxes.append(rb)
vbox.addWidget(rb)
-
-
+
def getInput(self):
if self.dialog.exec_():
for rb in self.radioboxes:
if rb.isChecked():
- lang = rb.text().toAscii()
+ lang = rb.text().toAscii()
try:
- print "changing language to '%s' ...."% lang,
+ print "changing language to '%s' ...." % lang,
setLanguage(str(lang))
print "ok"
return True
except IOError:
LOGGER.exception("unable to find translation file")
- message = _("no translation file found for %s")% lang
+ message = _("no translation file found for %s") % lang
QtGui.QMessageBox.information(self.dialog,
- _("Advisory"), message)
-
+ _("Advisory"), message)
+
+
def run(parent=None):
'''
fire up a dialog to offer a selection of languages
@@ -101,11 +122,11 @@ def run(parent=None):
Dialog = QtGui.QDialog()
dl = language_dialog(Dialog, parent)
return dl.getInput()
-
+
if __name__ == "__main__":
import sys
logging.basicConfig()
-
+
app = QtGui.QApplication(sys.argv)
gettext.install('openmolar')
- print run()
+ print run()
diff --git a/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py b/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py
index 023fd1b..df55c44 100644
--- a/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py
+++ b/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for
-# more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
@@ -16,7 +32,9 @@ from openmolar.qt4gui.customwidgets.chartwidget import ToothImage
LOGGER = logging.getLogger("openmolar")
+
class editor(Ui_toothprops_full_edit.Ui_Dialog):
+
def __init__(self, tooth, chart, lineEdit, dialog):
self.dialog = dialog
self.setupUi(self.dialog)
@@ -25,7 +43,7 @@ class editor(Ui_toothprops_full_edit.Ui_Dialog):
self.setLabel()
self.lineEdit = lineEdit
hlayout = QtGui.QHBoxLayout(self.frame)
- hlayout.setContentsMargins(0,0,0,0)
+ hlayout.setContentsMargins(0, 0, 0, 0)
hlayout.addWidget(self.lineEdit)
self.setData()
self.tableWidget.setColumnWidth(0, 50)
@@ -33,11 +51,14 @@ class editor(Ui_toothprops_full_edit.Ui_Dialog):
self.signals()
def setLabel(self):
- if self.chart == "st": type= _("Static")
- elif self.chart == "pl": type= _("Planned")
- else: type= _("Completed")
+ if self.chart == "st":
+ type = _("Static")
+ elif self.chart == "pl":
+ type = _("Planned")
+ else:
+ type = _("Completed")
- self.tooth_label.setText("%s - %s items"% (self.tooth.upper(), type))
+ self.tooth_label.setText("%s - %s items" % (self.tooth.upper(), type))
def setData(self):
self.initialVal = str(self.lineEdit.text().toAscii())
@@ -47,12 +68,12 @@ class editor(Ui_toothprops_full_edit.Ui_Dialog):
self.tableWidget.setColumnCount(4)
self.tableWidget.setRowCount(len(props))
self.tableWidget.setHorizontalHeaderLabels(["",
- _("Item Shortcut"), _("Demote"), _("Erase")])
+ _("Item Shortcut"), _("Demote"), _("Erase")])
for row, prop in enumerate(props):
self.fillRow(prop, row)
- def fillRow(self,prop, row):
+ def fillRow(self, prop, row):
if prop and prop[0] != "!":
self.drawProp(prop, row)
else:
@@ -76,7 +97,7 @@ class editor(Ui_toothprops_full_edit.Ui_Dialog):
'''
tooth = ToothImage(self.tooth, [str(prop).lower()])
icon_tableitem = QtGui.QTableWidgetItem()
- image = tooth.image.scaled(40,40)
+ image = tooth.image.scaled(40, 40)
icon_tableitem.setData(QtCore.Qt.DecorationRole, image)
icon_tableitem.setToolTip(_("click to edit Item - ") + prop)
@@ -88,14 +109,14 @@ class editor(Ui_toothprops_full_edit.Ui_Dialog):
'''
adds a pushbutton to the tableWidget
'''
- p_map = QtGui.QPixmap(":/eraser.png").scaled(24,24)
+ p_map = QtGui.QPixmap(":/eraser.png").scaled(24, 24)
tableItem = QtGui.QTableWidgetItem()
tableItem.setData(QtCore.Qt.DecorationRole, p_map)
tableItem.setToolTip(_("click to delete item - ") + prop)
self.tableWidget.setItem(row, 3, tableItem)
def addDownArrow(self, prop, row):
- p_map = QtGui.QPixmap(QtGui.QPixmap(":/down.png")).scaled(24,24)
+ p_map = QtGui.QPixmap(QtGui.QPixmap(":/down.png")).scaled(24, 24)
tableItem = QtGui.QTableWidgetItem()
tableItem.setData(QtCore.Qt.DecorationRole, p_map)
tableItem.setToolTip(_("click to promote Item - ") + prop)
@@ -103,7 +124,7 @@ class editor(Ui_toothprops_full_edit.Ui_Dialog):
def signals(self):
self.tableWidget.connect(self.tableWidget,
- QtCore.SIGNAL("cellPressed (int,int)"), self.tableClicked)
+ QtCore.SIGNAL("cellPressed (int,int)"), self.tableClicked)
def tableClicked(self, row, column):
if column == 3:
@@ -116,16 +137,16 @@ class editor(Ui_toothprops_full_edit.Ui_Dialog):
self.updateLineEdit()
def promoteRow(self, row):
- if row+1 < self.tableWidget.rowCount():
+ if row + 1 < self.tableWidget.rowCount():
self.tableWidget.insertRow(row)
- self.fillRow(self.tableWidget.item(row+2,1).text(), row)
- self.tableWidget.removeRow(row+2)
+ self.fillRow(self.tableWidget.item(row + 2, 1).text(), row)
+ self.tableWidget.removeRow(row + 2)
self.updateLineEdit()
def updateLineEdit(self):
s = QtCore.QString("")
for row in range(self.tableWidget.rowCount()):
- s += self.tableWidget.item(row, 1).text()+" "
+ s += self.tableWidget.item(row, 1).text() + " "
self.lineEdit.setText(s)
def exec_(self):
@@ -145,6 +166,5 @@ if __name__ == "__main__":
le = QtGui.QLineEdit()
le.setText("IM/TIT MOD RT CR,GO !KUO")
- dl = editor("ul7","st", le, Dialog)
+ dl = editor("ul7", "st", le, Dialog)
dl.exec_()
-
diff --git a/src/openmolar/qt4gui/diary_widget.py b/src/openmolar/qt4gui/diary_widget.py
index 89aa083..418d3c0 100644
--- a/src/openmolar/qt4gui/diary_widget.py
+++ b/src/openmolar/qt4gui/diary_widget.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import datetime
import logging
@@ -65,6 +67,7 @@ from openmolar.qt4gui.dialogs import appointment_card_dialog
LOGGER = logging.getLogger("openmolar")
+
class DiaryWidget(QtGui.QWidget):
VIEW_MODE = 0
SCHEDULING_MODE = 1
@@ -81,7 +84,7 @@ class DiaryWidget(QtGui.QWidget):
bring_to_front = QtCore.pyqtSignal()
print_mh_signal = QtCore.pyqtSignal(object)
- alterAday_clipboard = [] #clipboard used by the alterAday dialog
+ alterAday_clipboard = [] # clipboard used by the alterAday dialog
alterAday_clipboard_date = None
message_alert = None
@@ -95,8 +98,8 @@ class DiaryWidget(QtGui.QWidget):
self.schedule_controller = DiaryScheduleController(self)
self.view_controller = DiaryViewController(self)
- #keep a pointer to this layout as the layout is moved between
- #dayview and weekview
+ # keep a pointer to this layout as the layout is moved between
+ # dayview and weekview
self.appt_mode_layout = QtGui.QVBoxLayout(
self.ui.day_view_control_frame)
self.appt_mode_layout.setMargin(0)
@@ -106,10 +109,10 @@ class DiaryWidget(QtGui.QWidget):
self.appt_mode_layout.addWidget(self.view_controller)
self.day_scroll_bar = None
- self.apptBookWidgets=[]
+ self.apptBookWidgets = []
#-appointment OVerview widget
- self.ui.apptoverviews=[]
+ self.ui.apptoverviews = []
for day in range(7):
bw = AppointmentOverviewWidget("0820", "1910", 10, 3, self)
@@ -117,26 +120,26 @@ class DiaryWidget(QtGui.QWidget):
i = 0
for frame in (self.ui.appt_OV_Frame1,
- self.ui.appt_OV_Frame2, self.ui.appt_OV_Frame3,
- self.ui.appt_OV_Frame4, self.ui.appt_OV_Frame5,
- self.ui.appt_OV_Frame6, self.ui.appt_OV_Frame7):
- hlayout=QtGui.QHBoxLayout(frame)
+ self.ui.appt_OV_Frame2, self.ui.appt_OV_Frame3,
+ self.ui.appt_OV_Frame4, self.ui.appt_OV_Frame5,
+ self.ui.appt_OV_Frame6, self.ui.appt_OV_Frame7):
+ hlayout = QtGui.QHBoxLayout(frame)
hlayout.setMargin(2)
hlayout.addWidget(self.ui.apptoverviews[i])
i += 1
- self.ui.apptoverviewControls=[]
+ self.ui.apptoverviewControls = []
for widg in (self.ui.day1_frame, self.ui.day2_frame,
- self.ui.day3_frame, self.ui.day4_frame, self.ui.day5_frame,
- self.ui.day6_frame, self.ui.day7_frame):
+ self.ui.day3_frame, self.ui.day4_frame, self.ui.day5_frame,
+ self.ui.day6_frame, self.ui.day7_frame):
hlayout = QtGui.QHBoxLayout(widg)
hlayout.setMargin(0)
control = aptOVcontrol.control()
self.ui.apptoverviewControls.append(control)
hlayout.addWidget(control)
- self.ui.weekView_splitter.setSizes([600,10])
+ self.ui.weekView_splitter.setSizes([600, 10])
self.appt_clinician_selector = dent_hyg_selector.dentHygSelector(
localsettings.activedents, localsettings.activehygs)
@@ -157,13 +160,13 @@ class DiaryWidget(QtGui.QWidget):
#--add a month view
self.ui.monthView = calendars.monthCalendar()
- #hlayout=QtGui.QHBoxLayout(self.ui.monthView_frame)
- #hlayout.setMargin(0)
- #hlayout.addWidget(self.ui.monthView)
+ # hlayout=QtGui.QHBoxLayout(self.ui.monthView_frame)
+ # hlayout.setMargin(0)
+ # hlayout.addWidget(self.ui.monthView)
self.ui.monthView_scrollArea.setWidget(self.ui.monthView)
#--add a year view
self.ui.yearView = calendars.yearCalendar()
- hlayout=QtGui.QHBoxLayout(self.ui.yearView_frame)
+ hlayout = QtGui.QHBoxLayout(self.ui.yearView_frame)
hlayout.setMargin(0)
hlayout.addWidget(self.ui.yearView)
@@ -175,13 +178,12 @@ class DiaryWidget(QtGui.QWidget):
self.init_signals()
self.ticker = QtCore.QTimer()
- self.ticker.start(30000) #fire every 30 seconds
+ self.ticker.start(30000) # fire every 30 seconds
self.ticker.timeout.connect(self.triangles)
-
def showEvent(self, event):
LOGGER.debug("DiaryWidget.showEvent called")
- #QtCore.QTimer.singleShot(10, self.layout_diary)
+ # QtCore.QTimer.singleShot(10, self.layout_diary)
def advise(self, arg, warning_level=0):
'''
@@ -198,22 +200,23 @@ class DiaryWidget(QtGui.QWidget):
accept()
else:
self.message_alert = QtGui.QMessageBox(self)
- self.message_alert.setStandardButtons(QtGui.QMessageBox.NoButton)
+ self.message_alert.setStandardButtons(
+ QtGui.QMessageBox.NoButton)
self.message_alert.setWindowTitle(_("advisory"))
self.message_alert.setModal(False)
self.message_alert.setText(arg)
- QtCore.QTimer.singleShot(3*1000, accept)
+ QtCore.QTimer.singleShot(3 * 1000, accept)
self.message_alert.show()
elif warning_level == 1:
QtGui.QMessageBox.information(self, _("Advisory"), arg)
elif warning_level == 2:
- now=QtCore.QTime.currentTime()
+ now = QtCore.QTime.currentTime()
QtGui.QMessageBox.warning(self, _("Error"), arg)
#--for logging purposes
- LOGGER.warning("%d:%02d ERROR MESSAGE %s"%(
+ LOGGER.warning("%d:%02d ERROR MESSAGE %s" % (
now.hour(), now.minute(), arg))
def reset(self):
@@ -270,12 +273,12 @@ class DiaryWidget(QtGui.QWidget):
apptix = localsettings.apptix[dentist]
if self.appointmentData.getMemo(apptix) != memo:
appointments.setMemos(
- self.selected_date().toPyDate(),
- ((apptix, memo),))
- self.advise("adding day memo - %s %s"% (dentist, memo))
+ self.selected_date().toPyDate(),
+ ((apptix, memo),))
+ self.advise("adding day memo - %s %s" % (dentist, memo))
def load_patient(self, patient, update=True):
- LOGGER.debug("DiaryWidget.load_patient, update=%s"% update)
+ LOGGER.debug("DiaryWidget.load_patient, update=%s" % update)
self.pt = patient
if self.schedule_controller.pt != patient:
@@ -326,7 +329,7 @@ class DiaryWidget(QtGui.QWidget):
page = self.ui.appt_notes_webView.page()
page.setLinkDelegationPolicy(page.DelegateAllLinks)
- #this next bit is useful in showing "double appointments"
+ # this next bit is useful in showing "double appointments"
if self.appt_mode not in (self.SCHEDULING_MODE, self.BLOCKING_MODE):
for book in self.apptBookWidgets:
book.selected_serialno = serialno
@@ -336,7 +339,7 @@ class DiaryWidget(QtGui.QWidget):
dt = datetime.datetime.combine(self.appointmentData.date, time)
slot = appointments.FreeSlot(dt, dent, length)
self.makeAppt(self.schedule_controller.appointment_model.currentAppt,
- slot)
+ slot)
def manage_month_and_year_View_clinicians(self):
'''
@@ -365,7 +368,7 @@ class DiaryWidget(QtGui.QWidget):
the argument provides the required details
'''
self.makeAppt(self.schedule_controller.appointment_model.currentAppt,
- slot)
+ slot)
def begin_makeAppt(self):
'''
@@ -385,8 +388,8 @@ class DiaryWidget(QtGui.QWidget):
return
if not appt.unscheduled:
self.layout_diary()
- self.advise(_("appointment already scheduled for") + " %s"%(
- localsettings.readableDate(appt.date)), 1)
+ self.advise(_("appointment already scheduled for") + " %s" % (
+ localsettings.readableDate(appt.date)), 1)
return
begin_make_appt_dialog.WEEK_VIEW = self.viewing_week
@@ -398,18 +401,17 @@ class DiaryWidget(QtGui.QWidget):
dl = begin_make_appt_dialog.BeginMakeApptDialog(self.pt, appt, self)
if (hyg_appt_selected or
- self.schedule_controller.min_hyg_slot_length is None):
+ self.schedule_controller.min_hyg_slot_length is None):
dl.joint_appt_checkbox.setEnabled(False)
-
if not dl.exec_():
self.schedule_controller.reset()
self.finding_next_slot = 0
self.layout_diary()
return
- ## uncomment this line for debugging.
- #self.advise(dl.message, 1)
+ # uncomment this line for debugging.
+ # self.advise(dl.message, 1)
# apply dialog settings
self.schedule_controller.set_selection_mode(
@@ -457,20 +459,20 @@ class DiaryWidget(QtGui.QWidget):
if seldate.toPyDate() > localsettings.bookEnd:
message = (_("Reached") +
- ' %s <br />'% localsettings.longDate(localsettings.bookEnd)+
- _("which is specified as the book end point"))
+ ' %s <br />' % localsettings.longDate(localsettings.bookEnd) +
+ _("which is specified as the book end point"))
return (False, message, ())
dayno = seldate.dayOfWeek()
weekdates = []
for day in range(1, 8):
- weekdates.append(seldate.addDays(day-dayno))
+ weekdates.append(seldate.addDays(day - dayno))
today = QtCore.QDate.currentDate()
if today in weekdates:
startday = today
else:
- startday = weekdates[0] #--monday
- sunday = weekdates[6] #--sunday
+ startday = weekdates[0] # --monday
+ sunday = weekdates[6] # --sunday
message = ""
@@ -485,17 +487,17 @@ class DiaryWidget(QtGui.QWidget):
if get_hyg_slots:
hyg_slots = appointments.future_slots(
- startday.toPyDate(),
- sunday.toPyDate(),
- localsettings.activehyg_ixs,
- self.schedule_controller.ignore_emergency_spaces)
+ startday.toPyDate(),
+ sunday.toPyDate(),
+ localsettings.activehyg_ixs,
+ self.schedule_controller.ignore_emergency_spaces)
else:
hyg_slots = ()
dent_slots = appointments.getLengthySlots(slots,
- self.schedule_controller.min_slot_length)
+ self.schedule_controller.min_slot_length)
hyg_slots = appointments.getLengthySlots(hyg_slots,
- self.schedule_controller.min_hyg_slot_length)
+ self.schedule_controller.min_hyg_slot_length)
return (dent_slots, hyg_slots)
@@ -507,11 +509,11 @@ class DiaryWidget(QtGui.QWidget):
if not appt:
self.advise(
- _("Please select an appointment to place here"), 1)
+ _("Please select an appointment to place here"), 1)
return
if appt.date:
self.advise(
- _("Please choose another appointment - this one is made already!"), 1)
+ _("Please choose another appointment - this one is made already!"), 1)
return
appointment_made = False
@@ -521,27 +523,27 @@ class DiaryWidget(QtGui.QWidget):
if appt.dent and selectedDent != appt.dent:
#--the user has selected a slot with a different dentist
#--raise a dialog to check this was intentional!!
- message = _('You have chosen an appointment with') + " %s<br />"% (
- localsettings.apptix_reverse[selectedDent])
+ message = _('You have chosen an appointment with') + " %s<br />" % (
+ localsettings.apptix_reverse[selectedDent])
message += _("Is this correct?")
result = QtGui.QMessageBox.question(self, "Confirm", message,
- QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
+ QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
if result == QtGui.QMessageBox.No:
- #dialog rejected
+ # dialog rejected
return
if slotlength > appt.length:
#--the slot selected is bigger than the appointment length so
#--fire up a dialog to allow for fine tuning
dl = finalise_appt_time.ftDialog(slot.time(), slotlength,
- appt.length, self)
+ appt.length, self)
if dl.exec_():
#--dialog accepted
selectedtime = localsettings.pyTimetoWystime(dl.selectedTime)
- slotlength = appt.length #satisfies the next conditional code
+ slotlength = appt.length # satisfies the next conditional code
else:
#--dialog cancelled
return
@@ -549,19 +551,19 @@ class DiaryWidget(QtGui.QWidget):
if slotlength == appt.length:
#--ok... suitable appointment found
message = '''<center>%s<br />%s<br /><b>%s<br />%s
- <br />%s</b></center>'''% (
- _("Confirm Make appointment for"),
- appt.name,
- localsettings.wystimeToHumanTime(selectedtime),
- localsettings.readableDate(slot.date()),
- localsettings.apptix_reverse.get(selectedDent,"??"))
+ <br />%s</b></center>''' % (
+ _("Confirm Make appointment for"),
+ appt.name,
+ localsettings.wystimeToHumanTime(selectedtime),
+ localsettings.readableDate(slot.date()),
+ localsettings.apptix_reverse.get(selectedDent, "??"))
#--get final confirmation
result = QtGui.QMessageBox.question(self, "Confirm", message,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.No:
- #dialog rejected
+ # dialog rejected
for widg in self.ui.apptoverviews:
widg.update()
return
@@ -581,7 +583,6 @@ class DiaryWidget(QtGui.QWidget):
endtime = localsettings.minutesPastMidnighttoWystime(
localsettings.minutesPastMidnight(selectedtime) + appt.length)
-
if self.schedule_controller.ignore_emergency_spaces:
appointments.cancel_emergency_slot(
slot.date(), selectedDent, selectedtime, endtime)
@@ -590,15 +591,15 @@ class DiaryWidget(QtGui.QWidget):
if appointments.make_appt(
slot.date(), selectedDent, selectedtime, endtime,
appt.name[:30], appt.serialno, appt.trt1,
- appt.trt2, appt.trt3, appt.memo, appt.flag, cst, 0, 0):
+ appt.trt2, appt.trt3, appt.memo, appt.flag, cst, 0, 0):
- if appt.serialno !=0:
+ if appt.serialno != 0:
if not appointments.pt_appt_made(
- appt.serialno, appt.aprix, slot.date(),
- selectedtime, selectedDent):
+ appt.serialno, appt.aprix, slot.date(),
+ selectedtime, selectedDent):
self.advise(
- _("Error putting appointment back into patient diary"))
+ _("Error putting appointment back into patient diary"))
self.schedule_controller.get_data()
self.schedule_controller.set_chosen_appointment(None)
@@ -612,16 +613,17 @@ class DiaryWidget(QtGui.QWidget):
self.set_appt_mode(self.VIEW_MODE)
else:
- self.advise(u"<b>%s</b><hr /><em>%s<br />%s</em>"% (
- _("Error making appointment - sorry!"),
- _("It is most likely that another user utilised this space."),
- _("Please try again.")
- ), 2)
+ self.advise(u"<b>%s</b><hr /><em>%s<br />%s</em>" % (
+ _("Error making appointment - sorry!"),
+ _(
+ "It is most likely that another user utilised this space."),
+ _("Please try again.")
+ ), 2)
else:
- #Hopefully this should never happen!!!!
+ # Hopefully this should never happen!!!!
self.advise(
- "error - the appointment doesn't fit there.. slotlength "+
- "is %d and we need %d"% (slotlength, appt.length), 2)
+ "error - the appointment doesn't fit there.. slotlength " +
+ "is %d and we need %d" % (slotlength, appt.length), 2)
self.layout_diary()
@@ -630,16 +632,16 @@ class DiaryWidget(QtGui.QWidget):
a click on the dentist portion of the appointment overview widget
'''
- ##TODO should I abandon this?
+ # TODO should I abandon this?
apptix, adate = arg
- self.advise("week header clicked %s %s"% (apptix, adate), 1)
+ self.advise("week header clicked %s %s" % (apptix, adate), 1)
def offer_appointment_card(self):
result = QtGui.QMessageBox.question(self,
- "Confirm",
- "Print Appointment Card?",
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ "Confirm",
+ "Print Appointment Card?",
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
dl = appointment_card_dialog.AppointmentCardDialog(self.pt, self)
dl.exec_()
@@ -649,8 +651,10 @@ class DiaryWidget(QtGui.QWidget):
this moves a red line down the appointment books
called by A Qtimer, or programmatically when adding data
'''
- if self.ui.diary_tabWidget.currentIndex()==0:
- currenttime = "%02d%02d"%(time.localtime()[3], time.localtime()[4])
+ if self.ui.diary_tabWidget.currentIndex() == 0:
+ currenttime = "%02d%02d" % (
+ time.localtime()[3],
+ time.localtime()[4])
d = self.selected_date()
if d == QtCore.QDate.currentDate():
for book in self.apptBookWidgets:
@@ -720,12 +724,12 @@ class DiaryWidget(QtGui.QWidget):
'''
#-- raise a dialog to check
result = QtGui.QMessageBox.question(self, "Confirm",
- "Clear today's emergency slots?",
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ "Clear today's emergency slots?",
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
number_cleared = appointments.clearEms(localsettings.currentDay())
- self.advise("Cleared %d emergency slots"% number_cleared, 1)
+ self.advise("Cleared %d emergency slots" % number_cleared, 1)
self.layout_diary()
def updateDayMemos(self, memos):
@@ -796,43 +800,42 @@ class DiaryWidget(QtGui.QWidget):
i = self.ui.diary_tabWidget.currentIndex()
- if i==0:
+ if i == 0:
self.layout_dayView()
- elif i==1:
+ elif i == 1:
self.layout_weekView()
- elif i==2:
+ elif i == 2:
self.layout_month()
- elif i==3:
+ elif i == 3:
self.layout_year()
self.layout_yearHeader()
- elif i==4:
+ elif i == 4:
self.layout_agenda()
if self.appt_mode == self.SCHEDULING_MODE:
if date_ > localsettings.bookEnd:
self.advise(u'''<b>%s<br />%s %s</b><hr /><em>(%s)</em>
- <ul><li>%s</li><li>%s</li><li>%s</li></ul>'''% (
- _("This date is beyond the diary limit."),
- _("If the appointment wizard has brought you here"),
- _("you should search again with different criteria."),
- _("for instance..."),
- _("no excluded days"),
- _("ignore emergencies"),
- _("add or view more clinicians."))
- ,1)
+ <ul><li>%s</li><li>%s</li><li>%s</li></ul>''' % (
+ _("This date is beyond the diary limit."),
+ _(
+ "If the appointment wizard has brought you here"),
+ _(
+ "you should search again with different criteria."),
+ _("for instance..."),
+ _("no excluded days"),
+ _("ignore emergencies"),
+ _("add or view more clinicians.")), 1)
elif date_ < localsettings.currentDay():
self.advise(
- _("You can't schedule an appointment in the past"),
- 1)
+ _("You can't schedule an appointment in the past"),
+ 1)
self.set_date(localsettings.currentDay())
- elif (i in (0,1) and self.schedule_controller.is_searching
- and self.schedule_controller.chosen_slot is None):
+ elif (i in (0, 1) and self.schedule_controller.is_searching
+ and self.schedule_controller.chosen_slot is None):
self.advise(_("No matching appointments found"))
-
-
def layout_year(self):
'''
grab year memos
@@ -841,7 +844,7 @@ class DiaryWidget(QtGui.QWidget):
year = self.selected_date().year()
startdate = datetime.date(year, 1, 1)
- enddate = datetime.date(year+1, 1, 1)
+ enddate = datetime.date(year + 1, 1, 1)
dents = self.getUserCheckedClinicians()
self.ui.yearView.setDents(dents)
@@ -859,28 +862,28 @@ class DiaryWidget(QtGui.QWidget):
put dayname, bank hol info, and any memos into the year header textBrowser
'''
dayData = self.ui.yearView.getDayData()
- #print dayData.dayName, dayData.publicHoliday, dayData.memos
+ # print dayData.dayName, dayData.publicHoliday, dayData.memos
headerText = '''<html><head><link rel="stylesheet"
href="%s" type="text/css"></head><body><div class="center">
<table width="100%%">
- <tr><td colspan="3" class="yearheader">%s</td></tr>'''% (
- localsettings.stylesheet, dayData.dayName)
+ <tr><td colspan="3" class="yearheader">%s</td></tr>''' % (
+ localsettings.stylesheet, dayData.dayName)
if dayData.publicHoliday != "":
headerText += '''<tr><td colspan="3" class="bankholiday">%s</td>
- </tr>'''% dayData.publicHoliday
+ </tr>''' % dayData.publicHoliday
for dentix in dayData.dents.keys():
dent = dayData.dents[dentix]
- if dentix==0:
+ if dentix == 0:
headerText += '''<tr><td class="yearops" colspan="2">ALL</td>
<td class="yearmemo">%s</td></tr>''' % dent.memo
else:
times = ""
if dent.flag:
- times = "%s - %s"%(
- localsettings.wystimeToHumanTime(dent.start),
- localsettings.wystimeToHumanTime(dent.end))
+ times = "%s - %s" % (
+ localsettings.wystimeToHumanTime(dent.start),
+ localsettings.wystimeToHumanTime(dent.end))
headerText += '''<tr><td class="yearops">%s</td>
<td class="yearops">%s</td>
@@ -940,7 +943,7 @@ class DiaryWidget(QtGui.QWidget):
pydate = weekday.toPyDate()
memo = appointments.getBankHol(pydate)
gm = appointments.getGlobalMemo(pydate)
- if memo !="" and gm != "":
+ if memo != "" and gm != "":
memo += "<br />"
memo += gm
header.setMemo(memo)
@@ -966,17 +969,16 @@ class DiaryWidget(QtGui.QWidget):
ov.setMemo(dent)
ov.setFlags(dent)
-
if self.appt_mode == self.SCHEDULING_MODE:
- if date_ < QtCore.QDate.currentDate(): #and not thisWeek):
+ if date_ < QtCore.QDate.currentDate(): # and not thisWeek):
self.advise(
_("You can't schedule an appointment in the past"))
- #stop looking backwards
+ # stop looking backwards
self.finding_next_slot = 0
- #self.set_date(localsettings.currentDay())
- #return
+ # self.set_date(localsettings.currentDay())
+ # return
if date_ > localsettings.bookEnd:
- #self.advise(_("You are beyond scheduling range"),1)
+ # self.advise(_("You are beyond scheduling range"),1)
self.finding_next_slot = 0
available_slots = []
self.schedule_controller.set_available_slots([])
@@ -989,7 +991,7 @@ class DiaryWidget(QtGui.QWidget):
dent_slots, hyg_slots)
if (self.finding_next_slot != 0 and
- self.schedule_controller.search_again):
+ self.schedule_controller.search_again):
self.step_date(self.finding_next_slot != -1)
return
@@ -1002,7 +1004,7 @@ class DiaryWidget(QtGui.QWidget):
self.schedule_controller.set_available_slots(dent_slots)
if (self.finding_next_slot != 0 and
- self.schedule_controller.search_again):
+ self.schedule_controller.search_again):
self.step_date(self.finding_next_slot != -1)
return
@@ -1024,8 +1026,8 @@ class DiaryWidget(QtGui.QWidget):
ov.set_active_slots(
(self.schedule_controller.chosen_slot,
- self.schedule_controller.chosen_hyg_slot)
- )
+ self.schedule_controller.chosen_hyg_slot)
+ )
elif self.appt_mode == self.BLOCKING_MODE:
available_slots, hyg_slots = self.weekViewAvailableSlots()
@@ -1041,7 +1043,7 @@ class DiaryWidget(QtGui.QWidget):
for dent in ov.dents:
ov.appts[dent.ix] = appointments.day_summary(date_, dent.ix)
- #add lunches and blocks
+ # add lunches and blocks
for ov in self.ui.apptoverviews:
date_ = ov.date.toPyDate()
for dent in ov.dents:
@@ -1051,19 +1053,18 @@ class DiaryWidget(QtGui.QWidget):
for ov in self.ui.apptoverviews:
ov.update()
- #needed to sync agenda and dayview
+ # needed to sync agenda and dayview
if self.schedule_controller.chosen_slot:
sync_date = QtCore.QDate(
self.schedule_controller.chosen_slot.date())
- LOGGER.debug("sync date%s"% sync_date)
+ LOGGER.debug("sync date%s" % sync_date)
if (sync_date.weekNumber() ==
- self.ui.weekCalendar.selectedDate().weekNumber()):
+ self.ui.weekCalendar.selectedDate().weekNumber()):
self.signals_calendar(False)
self.ui.weekCalendar.setSelectedDate(sync_date)
self.set_date(sync_date)
self.signals_calendar()
-
def layout_dayView(self):
'''
this populates the appointment book widgets (on maintab, pageindex 1)
@@ -1083,7 +1084,7 @@ class DiaryWidget(QtGui.QWidget):
date_ = self.selected_date().toPyDate()
- ##choose dentists to show.
+ # choose dentists to show.
dents = self.view_controller.clinician_list(date_)
self.appointmentData.setDate(date_)
@@ -1091,7 +1092,7 @@ class DiaryWidget(QtGui.QWidget):
if self.appt_mode == self.SCHEDULING_MODE:
if (date_ < localsettings.currentDay() or
- date_ > localsettings.bookEnd):
+ date_ > localsettings.bookEnd):
self.finding_next_slot = 0
available_slots = []
self.schedule_controller.set_available_slots([])
@@ -1106,23 +1107,23 @@ class DiaryWidget(QtGui.QWidget):
self.schedule_controller.min_slot_length,
self.schedule_controller.ignore_emergency_spaces,
dentists
- )
+ )
hyg_slots = self.appointmentData.slots(
self.schedule_controller.min_hyg_slot_length,
self.schedule_controller.ignore_emergency_spaces,
localsettings.activehyg_ixs
- )
+ )
self.schedule_controller.set_joint_slots(
dent_slots, hyg_slots)
if self.finding_next_slot == -1:
self.schedule_controller.use_last_slot = True
- #self.finding_next_slot = 1
+ # self.finding_next_slot = 1
if (self.finding_next_slot != 0 and
- self.schedule_controller.search_again):
+ self.schedule_controller.search_again):
self.step_date(self.finding_next_slot != -1)
return
@@ -1132,19 +1133,18 @@ class DiaryWidget(QtGui.QWidget):
available_slots = self.appointmentData.slots(
minlength,
self.schedule_controller.ignore_emergency_spaces
- )
+ )
self.schedule_controller.set_available_slots(available_slots)
if self.finding_next_slot == -1:
self.schedule_controller.use_last_slot = True
- #self.finding_next_slot = 1
+ # self.finding_next_slot = 1
if (self.finding_next_slot != 0 and
- self.schedule_controller.search_again):
+ self.schedule_controller.search_again):
self.step_date(self.finding_next_slot != -1)
return
-
self.ui.daymemo_label.setText(self.appointmentData.memo)
workingDents = self.appointmentData.workingDents
@@ -1192,23 +1192,23 @@ class DiaryWidget(QtGui.QWidget):
for app in apps:
book.setAppointment(app)
- ## if scheduling.. add slots to the widgets
+ # if scheduling.. add slots to the widgets
if (self.appt_mode == self.SCHEDULING_MODE
- and self.schedule_controller.is_searching):
+ and self.schedule_controller.is_searching):
for slot in self.schedule_controller.available_slots:
book.addSlot(slot)
- ##NEW CODE
+ # NEW CODE
for slot in self.schedule_controller.hygienist_slots:
book.addSlot(slot)
if not book.set_active_slot(
- self.schedule_controller.chosen_slot):
+ self.schedule_controller.chosen_slot):
book.set_active_slot(
self.schedule_controller.chosen_hyg_slot)
- ##NEW CODE ENDS
+ # NEW CODE ENDS
book.enable_slots(
book.apptix in
self.schedule_controller.selectedClinicians)
@@ -1219,7 +1219,7 @@ class DiaryWidget(QtGui.QWidget):
book_list = []
for book in self.apptBookWidgets:
- if book.dentist == None:
+ if book.dentist is None:
#--book has no data
book.hide()
book_list.append(0)
@@ -1228,7 +1228,6 @@ class DiaryWidget(QtGui.QWidget):
book.show()
book.update()
-
# make sure the splitter is reset (user could have hidden a widget they
# now need)
self.ui.dayView_splitter.setSizes(book_list)
@@ -1236,7 +1235,7 @@ class DiaryWidget(QtGui.QWidget):
if i == 0:
t = self.ui.daymemo_label.text() + " - " + _("No books to show!")
self.ui.daymemo_label.setText(t)
- #self.advise("all off today")
+ # self.advise("all off today")
else:
if self.apptBookWidgets[-1].outofoffice:
esb = self.ui.emergency_dayview_scroll_bar
@@ -1269,13 +1268,12 @@ class DiaryWidget(QtGui.QWidget):
if chosen_slot:
sync_date = QtCore.QDate(chosen_slot.date())
- LOGGER.debug("chosen_slot sync date %s"% sync_date)
+ LOGGER.debug("chosen_slot sync date %s" % sync_date)
self.signals_calendar(False)
self.ui.weekCalendar.setSelectedDate(sync_date)
self.set_date(sync_date)
self.signals_calendar()
-
def layout_agenda(self):
'''
this populates the diary agenda
@@ -1294,11 +1292,11 @@ class DiaryWidget(QtGui.QWidget):
if self.appt_mode == self.SCHEDULING_MODE:
if d < localsettings.currentDay():
- #self.advise(_("You can't schedule an appointment in the past"))
- #stop looking backwards
+ # self.advise(_("You can't schedule an appointment in the past"))
+ # stop looking backwards
self.finding_next_slot = 0
- #self.set_date(localsettings.currentDay())
- #return
+ # self.set_date(localsettings.currentDay())
+ # return
minlength = self.schedule_controller.min_slot_length
available_slots = self.appointmentData.slots(minlength)
self.schedule_controller.set_available_slots(available_slots)
@@ -1316,7 +1314,7 @@ class DiaryWidget(QtGui.QWidget):
agenda_data.add_slot(slot)
if (self.appt_mode == self.SCHEDULING_MODE
- and self.schedule_controller.appointment_model.currentAppt):
+ and self.schedule_controller.appointment_model.currentAppt):
if self.finding_next_slot == -1:
self.schedule_controller.use_last_slot = True
@@ -1345,7 +1343,7 @@ class DiaryWidget(QtGui.QWidget):
dl.exec_()
sno = dl.chosen_sno
- if sno != None:
+ if sno is not None:
serialno = int(sno)
self.patient_card_request.emit(serialno)
@@ -1356,13 +1354,13 @@ class DiaryWidget(QtGui.QWidget):
return
sno = list_of_snos[0]
adate = self.selected_date().toPyDate()
- atime = int(start.replace(":",""))
+ atime = int(start.replace(":", ""))
note, result = appointments.get_appt_note(sno, adate, atime, dentist)
if not result:
self.advise("unable to locate appointment memo, sorry", 2)
else:
new_note, result = QtGui.QInputDialog.getText(self,
- "New Memo", "Please enter Memo for this appointment", text=note)
+ "New Memo", "Please enter Memo for this appointment", text=note)
if result and new_note != note:
appointments.set_appt_note(
sno, adate, atime, dentist, new_note)
@@ -1382,15 +1380,15 @@ class DiaryWidget(QtGui.QWidget):
dent_inits = localsettings.apptix_reverse.get(dentist)
message = _("Confirm Delete appointment at")
- message += " %s %s "% (start, localsettings.readableDate(adate))
- message += _("with") + " %s?"% dent_inits
+ message += " %s %s " % (start, localsettings.readableDate(adate))
+ message += _("with") + " %s?" % dent_inits
if QtGui.QMessageBox.question(self, _("Confirm"), message,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
appt = appointments.APR_Appointment()
- appt.atime = int(start.replace(":",""))
+ appt.atime = int(start.replace(":", ""))
appt.dent = dentist
appt.date = adate
appt.serialno = serialno
@@ -1406,19 +1404,20 @@ class DiaryWidget(QtGui.QWidget):
#--keep in the patient's diary?
if QtGui.QMessageBox.question(self, _("Question"),
- _("Removed from appointment book - keep for rescheduling?"),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.No ) == QtGui.QMessageBox.No:
- #remove from the patients diary
+ _(
+ "Removed from appointment book - keep for rescheduling?"),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
+ # remove from the patients diary
if appointments.delete_appt_from_apr(appt):
self.advise(_("Sucessfully removed appointment"))
self.schedule_controller.get_data()
else:
- self.advise(_("Error removing from patient diary"),2)
+ self.advise(_("Error removing from patient diary"), 2)
else:
#--aslot proc has returned False!
- #let the user know, and go no further
+ # let the user know, and go no further
self.advise(_("Error Removing from Appointment Book"), 2)
self.layout_dayView()
@@ -1433,13 +1432,13 @@ class DiaryWidget(QtGui.QWidget):
'''
adate = self.selected_date().toPyDate()
message = _("Do you want to unblock the selected slot?")
- message += "<br />%s - %s <br />"% (arg[0], arg[1])
- message += "%s<br />"% localsettings.readableDate(adate)
- message += "with %s?"% localsettings.ops.get(arg[2])
+ message += "<br />%s - %s <br />" % (arg[0], arg[1])
+ message += "%s<br />" % localsettings.readableDate(adate)
+ message += "with %s?" % localsettings.ops.get(arg[2])
if QtGui.QMessageBox.question(self, "Confirm", message,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
appt = appointments.APR_Appointment()
appt.atime = localsettings.humanTimetoWystime(arg[0])
appt.date = adate
@@ -1459,9 +1458,9 @@ class DiaryWidget(QtGui.QWidget):
dent = tup[4]
reason = tup[5]
if not appointments.block_appt(adate, dent, start, end,
- adjstart, adjend, reason):
+ adjstart, adjend, reason):
self.advise(
- _("unable to block - has the book been altered elsewhere?"), 1)
+ _("unable to block - has the book been altered elsewhere?"), 1)
self.layout_dayView()
def fillEmptySlot(self, tup):
@@ -1477,10 +1476,10 @@ class DiaryWidget(QtGui.QWidget):
dent = tup[4]
reason = tup[5]
if not appointments.fill_appt(adate, dent, start, end,
- adjstart, adjend, reason, pt):
+ adjstart, adjend, reason, pt):
self.advise(
- _("unable to make appointment - has the book been altered elsewhere?")
- ,1)
+ _(
+ "unable to make appointment - has the book been altered elsewhere?"), 1)
self.layout_dayView()
self.pt_diary_changed.emit(pt.serialno)
@@ -1496,7 +1495,7 @@ class DiaryWidget(QtGui.QWidget):
self.selected_date().toPyDate(),
droptime)
- LOGGER.debug("appt dropped %s %s %s"% (date_time, dent, appt.length))
+ LOGGER.debug("appt dropped %s %s %s" % (date_time, dent, appt.length))
slot = appointments.FreeSlot(date_time, dent, appt.length)
self.makeAppt(appt, slot)
@@ -1510,7 +1509,7 @@ class DiaryWidget(QtGui.QWidget):
self.begin_makeAppt()
def find_appt(self, appt):
- LOGGER.debug("DiaryWidgetfind_appt %s"% appt)
+ LOGGER.debug("DiaryWidgetfind_appt %s" % appt)
pt = BriefPatient(appt.serialno)
self.load_patient(pt)
self.set_appt_mode(self.VIEW_MODE)
@@ -1556,12 +1555,12 @@ class DiaryWidget(QtGui.QWidget):
def step_date(self, forwards=True):
date_ = self.selected_date()
- LOGGER.debug("step date called current=%s, forwards=%s"% (
+ LOGGER.debug("step date called current=%s, forwards=%s" % (
date_, forwards))
if forwards:
if self.viewing_week:
- #goto 1st day of next week
+ # goto 1st day of next week
date_ = date_.addDays(1)
while date_.dayOfWeek() != 1:
date_ = date_.addDays(1)
@@ -1572,7 +1571,7 @@ class DiaryWidget(QtGui.QWidget):
else:
if self.viewing_week:
- #goto last day of next week
+ # goto last day of next week
date_ = date_.addDays(-1)
while date_.dayOfWeek() != 7:
date_ = date_.addDays(-1)
@@ -1621,7 +1620,6 @@ class DiaryWidget(QtGui.QWidget):
'''
return self.ui.diary_tabWidget.currentIndex() == 4
-
def init_signals(self):
self.ui.diary_tabWidget.currentChanged.connect(
self.diary_tabWidget_nav)
@@ -1662,34 +1660,34 @@ class DiaryWidget(QtGui.QWidget):
def signals_apptWidgets(self, book):
book.connect(book, QtCore.SIGNAL("print_me"),
- self.appointment_book_print)
+ self.appointment_book_print)
book.connect(book, QtCore.SIGNAL("new_memo"),
- self.bookmemo_Edited)
+ self.bookmemo_Edited)
book.connect(book, QtCore.SIGNAL("PatientClicked"),
- self.highlight_serialno)
+ self.highlight_serialno)
book.connect(book, QtCore.SIGNAL("AppointmentClicked"),
- self.appointment_clicked)
+ self.appointment_clicked)
book.connect(book, QtCore.SIGNAL("EditAppointmentMemo"),
- self.edit_appointment_memo_clicked)
+ self.edit_appointment_memo_clicked)
book.connect(book, QtCore.SIGNAL("AppointmentCancel"),
- self.appointment_cancel)
+ self.appointment_cancel)
book.connect(book, QtCore.SIGNAL("ClearEmergencySlot"),
- self.clearEmergencySlot)
+ self.clearEmergencySlot)
book.connect(book, QtCore.SIGNAL("BlockEmptySlot"),
- self.blockEmptySlot)
+ self.blockEmptySlot)
book.connect(book, QtCore.SIGNAL("Appointment_into_EmptySlot"),
- self.fillEmptySlot)
+ self.fillEmptySlot)
book.connect(book.canvas, QtCore.SIGNAL("ApptDropped"),
- self.appt_dropped_onto_daywidget)
+ self.appt_dropped_onto_daywidget)
book.slotClicked.connect(self.apptBook_slot_clicked)
book.print_mh_signal.connect(self.print_mh_signal.emit)
@@ -1706,16 +1704,16 @@ class DiaryWidget(QtGui.QWidget):
self.signals_calendar()
QtCore.QObject.connect(self.ui.weekCalendar,
- QtCore.SIGNAL("weekChanged"), self.ui.dayCalendar.setSelectedDate)
+ QtCore.SIGNAL("weekChanged"), self.ui.dayCalendar.setSelectedDate)
for cal in (self.ui.yearView, self.ui.monthView):
QtCore.QObject.connect(cal, QtCore.SIGNAL("selectedDate"),
- self.ui.dayCalendar.setSelectedDate)
+ self.ui.dayCalendar.setSelectedDate)
QtCore.QObject.connect(cal, QtCore.SIGNAL("add_memo"),
- self.updateDayMemos)
+ self.updateDayMemos)
QtCore.QObject.connect(self.ui.yearView,
- QtCore.SIGNAL("add_pub_hol"), self.addpubHol)
+ QtCore.SIGNAL("add_pub_hol"), self.addpubHol)
self.ui.aptOVprevmonth.clicked.connect(self.aptOV_monthBack)
self.ui.aptOVnextmonth.clicked.connect(self.aptOV_monthForward)
@@ -1732,22 +1730,24 @@ class DiaryWidget(QtGui.QWidget):
for widg in self.ui.apptoverviews:
widg.connect(widg, QtCore.SIGNAL("SlotClicked"),
- self.aptOVwidget_userHasChosen_slot)
+ self.aptOVwidget_userHasChosen_slot)
widg.connect(widg, QtCore.SIGNAL("ApptDropped"),
- self.makeAppt)
+ self.makeAppt)
widg.connect(widg, QtCore.SIGNAL("DentistHeading"),
- self.apptOVheaderclick)
+ self.apptOVheaderclick)
for control in self.ui.apptoverviewControls:
self.connect(control,
- QtCore.SIGNAL("clicked"), self.aptOVlabelClicked)
+ QtCore.SIGNAL("clicked"), self.aptOVlabelClicked)
self.connect(control,
- QtCore.SIGNAL("right-clicked"), self.aptOVlabelRightClicked)
+ QtCore.SIGNAL("right-clicked"), self.aptOVlabelRightClicked)
+
class _testDiary(QtGui.QMainWindow):
+
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
@@ -1778,6 +1778,3 @@ if __name__ == "__main__":
mw.show()
app.exec_()
-
-
-
diff --git a/src/openmolar/qt4gui/fees/__init__.py b/src/openmolar/qt4gui/fees/__init__.py
index e69de29..c701215 100755
--- a/src/openmolar/qt4gui/fees/__init__.py
+++ b/src/openmolar/qt4gui/fees/__init__.py
@@ -0,0 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/openmolar/qt4gui/fees/cashbook_module.py b/src/openmolar/qt4gui/fees/cashbook_module.py
index 6abfdff..d3c1a1e 100644
--- a/src/openmolar/qt4gui/fees/cashbook_module.py
+++ b/src/openmolar/qt4gui/fees/cashbook_module.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
cashbook is an html table implementation currently.
@@ -18,22 +34,24 @@ from openmolar.qt4gui.printing import bookprint
from openmolar.qt4gui.dialogs import permissions
from openmolar.qt4gui.dialogs.alter_cashbook_dialog import AlterCashbookDialog
+
class CashBookBrowser(QtGui.QTextBrowser):
+
def __init__(self, parent=None):
self.om_gui = parent
QtGui.QTextBrowser.__init__(self, parent)
-
+
def setSource(self, url):
'''
A function to re-implement QTextBrowser.setUrl
this will catch "edit links"
'''
- id = re.search("(\d+)",str(url.toString().toAscii())).groups()[0]
-
+ id = re.search("(\d+)", str(url.toString().toAscii())).groups()[0]
+
dl = AlterCashbookDialog(int(id), self)
if dl.exec_():
show_cashbook(self.om_gui)
-
+
def allow_full_edit(self, value):
if value:
cashbook.full_edit = permissions.granted(self.om_gui)
@@ -41,13 +59,13 @@ class CashBookBrowser(QtGui.QTextBrowser):
cashbook.full_edit = False
self.om_gui.ui.actionAllow_Full_Edit.setChecked(cashbook.full_edit)
show_cashbook(self.om_gui)
-
-def show_cashbook(om_gui, print_ = False):
+
+def show_cashbook(om_gui, print_=False):
dent1 = om_gui.ui.cashbookDentComboBox.currentText()
sdate = om_gui.ui.cashbookStartDateEdit.date()
edate = om_gui.ui.cashbookEndDateEdit.date()
-
+
sundries_only = om_gui.ui.sundries_only_radioButton.isChecked()
treatment_only = om_gui.ui.treatment_only_radioButton.isChecked()
@@ -57,8 +75,8 @@ def show_cashbook(om_gui, print_ = False):
html = cashbook.details(dent1, sdate, edate, treatment_only, sundries_only)
om_gui.ui.cashbookTextBrowser.setHtml(
- '<html><body>'+html+"</body></html>")
-
+ '<html><body>' + html + "</body></html>")
+
if print_:
- myclass = bookprint.printBook('<html><body>'+html+"</body></html>")
+ myclass = bookprint.printBook('<html><body>' + html + "</body></html>")
myclass.printpage()
diff --git a/src/openmolar/qt4gui/fees/course_module.py b/src/openmolar/qt4gui/fees/course_module.py
index 704637e..266ca9a 100644
--- a/src/openmolar/qt4gui/fees/course_module.py
+++ b/src/openmolar/qt4gui/fees/course_module.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
functions to open a course, close a course, or check if one is needed.
@@ -24,6 +40,7 @@ from openmolar.qt4gui.printing.gp17.gp17_printer import GP17Printer
LOGGER = logging.getLogger("openmolar")
+
def newCourseNeeded(om_gui):
'''
checks to see if the patient is under treatment.
@@ -33,41 +50,42 @@ def newCourseNeeded(om_gui):
return False
if om_gui.pt.treatment_course.cmpd != om_gui.pt.dbstate.treatment_course.cmpd:
om_gui.advise(
- _("Please save the old course changes before continuing"), 1)
+ _("Please save the old course changes before continuing"), 1)
return True
- ## before starting a new course.. check to see if one has been started
- ## by another client.
+ # before starting a new course.. check to see if one has been started
+ # by another client.
if om_gui.pt.newer_course_found:
om_gui.ui.actionFix_Locked_New_Course_of_Treatment.setEnabled(True)
- om_gui.advise(u"<p>%s<br />%s</p><hr /><em>%s</em>"%(
- _("It looks as if another user is starting a course of treatment"),
- _("Please allow this other user to commit their changes"
- " then reload this record before continuing."),
- _("If you are seeing this message and are sure no other user is"
- " using this record, use menu->tools->"
- "Fix Locked New Course of Treatment"))
- , 1)
+ om_gui.advise(u"<p>%s<br />%s</p><hr /><em>%s</em>" % (
+ _(
+ "It looks as if another user is starting a course of treatment"),
+ _("Please allow this other user to commit their changes"
+ " then reload this record before continuing."),
+ _("If you are seeing this message and are sure no other user is"
+ " using this record, use menu->tools->"
+ "Fix Locked New Course of Treatment")), 1)
elif setupNewCourse(om_gui):
- LOGGER.info("new course started with accd of '%s'"%
- om_gui.pt.treatment_course.accd)
+ LOGGER.info("new course started with accd of '%s'" %
+ om_gui.pt.treatment_course.accd)
return False
else:
- om_gui.advise(u"<p>%s</p>"% _(
- "unable to plan or perform treatment if"
- " the patient does not have an active course"), 1)
+ om_gui.advise(u"<p>%s</p>" % _(
+ "unable to plan or perform treatment if"
+ " the patient does not have an active course"), 1)
return True
+
def setupNewCourse(om_gui):
'''
set up a new course of treatment
'''
if localsettings.clinicianNo != 0 and \
- localsettings.clinicianInits in localsettings.activedents:
+ localsettings.clinicianInits in localsettings.activedents:
#-- clinician could be a hygenist!
cdnt = localsettings.clinicianNo
elif om_gui.pt.dnt2 == 0:
@@ -78,9 +96,9 @@ def setupNewCourse(om_gui):
dialog = QtGui.QDialog(om_gui)
dl = newCourse.NewCourseDialog(dialog,
- localsettings.ops.get(om_gui.pt.dnt1),
- localsettings.ops.get(cdnt),
- om_gui.pt.cset)
+ localsettings.ops.get(om_gui.pt.dnt1),
+ localsettings.ops.get(cdnt),
+ om_gui.pt.cset)
result, atts = dl.getInput()
@@ -101,9 +119,10 @@ def setupNewCourse(om_gui):
new_courseno = writeNewCourse.write(om_gui.pt.serialno, accd)
return apply_new_courseno(om_gui, new_courseno, accd)
+
def apply_new_courseno(om_gui, new_courseno, accd=None):
new_course = om_gui.pt.new_tx_course(new_courseno)
- #om_gui.pt.dbstate.treatment_course = new_course
+ # om_gui.pt.dbstate.treatment_course = new_course
om_gui.pt.treatment_course.setAccd(accd)
# force a recheck for the new course date
om_gui.pt.forget_fee_table()
@@ -116,9 +135,15 @@ def apply_new_courseno(om_gui, new_courseno, accd=None):
om_gui.load_receptionSummaryPage()
om_gui.pt.addHiddenNote("open_course")
om_gui.updateHiddenNotesLabel()
- om_gui.advise(_("Sucessfully started new course of treatment"))
+ message = "%s<hr />%s <em>%s</em>" % (
+ _("Sucessfully started new course of treatment"),
+ _("Using Feescale"),
+ om_gui.pt.fee_table.briefName
+ )
+ om_gui.advise(message, 1)
return True
+
def prompt_close_course(om_gui):
'''
pt is marked as under treatment.....
@@ -128,6 +153,7 @@ def prompt_close_course(om_gui):
if not om_gui.pt.treatmentOutstanding():
closeCourse(om_gui, True)
+
def delete_new_course(om_gui):
'''
user is discarding all changes to a record.
@@ -138,6 +164,7 @@ def delete_new_course(om_gui):
writeNewCourse.delete(
om_gui.pt.serialno, om_gui.pt.treatment_course.courseno)
+
def closeCourse(om_gui, leaving=False):
'''
allow the user to add a completion Date to a course of treatment
@@ -145,22 +172,23 @@ def closeCourse(om_gui, leaving=False):
Dialog = QtGui.QDialog(om_gui)
my_dialog = Ui_completionDate.Ui_Dialog()
my_dialog.setupUi(Dialog)
- my_dialog.pt_label.setText("%s %s - (%s)"% (om_gui.pt.fname,
- om_gui.pt.sname, om_gui.pt.serialno))
+ my_dialog.pt_label.setText("%s %s - (%s)" % (om_gui.pt.fname,
+ om_gui.pt.sname, om_gui.pt.serialno))
if not leaving:
my_dialog.autoComplete_label.hide()
my_dialog.dateEdit.setMinimumDate(om_gui.pt.treatment_course.accd)
my_dialog.dateEdit.setMaximumDate(QtCore.QDate().currentDate())
my_dialog.dateEdit.setDate(QtCore.QDate().currentDate())
- ##focus the "yes" button
+ # focus the "yes" button
my_dialog.buttonBox.buttons()[0].setFocus()
if (Dialog.exec_() and
- QtGui.QMessageBox.question(om_gui, _("Confirm"),
- _("are you sure you wish to close this course of treatment?"),
- QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
- QtGui.QMessageBox.Ok) == QtGui.QMessageBox.Ok):
+ QtGui.QMessageBox.question(om_gui, _("Confirm"),
+ _(
+ "are you sure you wish to close this course of treatment?"),
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Ok) == QtGui.QMessageBox.Ok):
cmpd = my_dialog.dateEdit.date().toPyDate()
om_gui.pt.treatment_course.setCmpd(cmpd)
@@ -183,14 +211,15 @@ def offerFinalPaperWork(om_gui):
form_printer = GP17Printer(om_gui)
form_printer.print_(final_paperwork=True)
+
def resumeCourse(om_gui):
'''
resume the previous treatment course
'''
message = _("Resume the previous course of treatment?")
result = QtGui.QMessageBox.question(om_gui, "Confirm", message,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
om_gui.pt.treatment_course.cmpd = None
@@ -200,6 +229,7 @@ def resumeCourse(om_gui):
return True
+
def fix_zombied_course(om_gui):
'''
a situation COULD arise where a new course was started and the client
@@ -207,18 +237,17 @@ def fix_zombied_course(om_gui):
this functionality retrieves this.
'''
if not om_gui.pt and om_gui.pt.newer_course_found:
- om_gui.advise(_("no zombied course found"),1)
+ om_gui.advise(_("no zombied course found"), 1)
return
message = _("a situation COULD arise where a new course was started"
- " but the client lost connectivity crashed"
- " (without cleaning up the temporary row in the currtrtmt2 table)")
+ " but the client lost connectivity crashed"
+ " (without cleaning up the temporary row in the currtrtmt2 table)")
question = _("Do you wish to recover this row now?")
if QtGui.QMessageBox.question(om_gui, _("question"),
- u"%s<hr /><b>%s</b>" %(message, question),
- QtGui.QMessageBox.Yes|QtGui.QMessageBox.No,
- QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
+ u"%s<hr /><b>%s</b>" % (message, question),
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+ QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
cno = om_gui.pt.max_tx_courseno
apply_new_courseno(om_gui, cno)
-
diff --git a/src/openmolar/qt4gui/fees/daybook_module.py b/src/openmolar/qt4gui/fees/daybook_module.py
index df544c0..e2b5ec1 100644
--- a/src/openmolar/qt4gui/fees/daybook_module.py
+++ b/src/openmolar/qt4gui/fees/daybook_module.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
update perio dates, xray dates, and write items to the daybook
@@ -22,6 +38,7 @@ from openmolar.qt4gui.printing import bookprint
LOGGER = logging.getLogger("openmolar")
+
def perioDates(om_gui, arg):
'''
update the patient's "last scale/polish" date
@@ -29,6 +46,7 @@ def perioDates(om_gui, arg):
if "SP" in arg:
om_gui.pt.pd10 = localsettings.currentDay()
+
def xrayDates(om_gui, arg):
'''
update the patient's "last xray" dates
@@ -38,24 +56,25 @@ def xrayDates(om_gui, arg):
if "P" in arg:
om_gui.pt.pd8 = localsettings.currentDay()
+
def updateDaybook(om_gui):
'''
looks for newly completed treatments when a record is closed
'''
daybookdict = {
- "diagn" : "",
- "perio" : "",
- "anaes" : "",
- "misc" : "",
- "ndu" : "",
- "ndl" : "",
- "odu" : "",
- "odl" : "",
- "other" : "",
- "chart" : ""
+ "diagn": "",
+ "perio": "",
+ "anaes": "",
+ "misc": "",
+ "ndu": "",
+ "ndl": "",
+ "odu": "",
+ "odl": "",
+ "other": "",
+ "chart": ""
}
- feesa = 0 #fee
- feesb = 0 #ptfee
+ feesa = 0 # fee
+ feesb = 0 # ptfee
hashes = []
courseno = om_gui.pt.treatment_course.courseno
@@ -64,8 +83,8 @@ def updateDaybook(om_gui):
for tx_hash in om_gui.pt.completed_tx_hash_tups:
if not_new_course and tx_hash in om_gui.pt.dbstate.completed_tx_hash_tups:
- continue #already written to daybook.
- LOGGER.debug("write to daybook %s %s %s"% tx_hash)
+ continue # already written to daybook.
+ LOGGER.debug("write to daybook %s %s %s" % tx_hash)
hash_, att, treatment = tx_hash
@@ -75,14 +94,14 @@ def updateDaybook(om_gui):
key = re.sub("cmp$", "", att)
if key in daybookdict.keys():
- daybookdict[key] += "%s"% treatment
+ daybookdict[key] += "%s" % treatment
elif key in ("xray", "exam"):
- daybookdict["diagn"] += "%s"% treatment
+ daybookdict["diagn"] += "%s" % treatment
elif key == "custom":
- daybookdict["other"] += "CUSTOM:%s"% treatment
+ daybookdict["other"] += "CUSTOM:%s" % treatment
else:
#--tooth include the key ie ul7 etc...
- daybookdict["chart"] += "%s %s "% (key.upper(), treatment)
+ daybookdict["chart"] += "%s %s " % (key.upper(), treatment)
hashes.append(hash_)
@@ -93,7 +112,7 @@ def updateDaybook(om_gui):
feesb += fees[1]
else:
LOGGER.warning(
- "daybook module - no fees for '%s' '%s' '%s'"% tx_hash)
+ "daybook module - no fees for '%s' '%s' '%s'" % tx_hash)
if hashes != []:
if om_gui.pt.dnt2 != 0 and om_gui.pt.cset != "I":
@@ -103,23 +122,38 @@ def updateDaybook(om_gui):
trtid = localsettings.clinicianNo
daybook.add(om_gui.pt.serialno, om_gui.pt.cset, dent, trtid,
- daybookdict, feesa, feesb, hashes)
+ daybookdict, feesa, feesb, hashes)
LOGGER.debug("daybook_module - updating pd4")
om_gui.pt.pd4 = localsettings.currentDay()
-def daybookView(om_gui, print_ = False):
+
+def daybookView(om_gui, print_=False):
dent1 = str(om_gui.ui.daybookDent1ComboBox.currentText())
dent2 = str(om_gui.ui.daybookDent2ComboBox.currentText())
sdate = om_gui.ui.daybookStartDateEdit.date()
edate = om_gui.ui.daybookEndDateEdit.date()
if sdate > edate:
- om_gui.advise(_("bad date sequence"),1)
+ om_gui.advise(_("bad date sequence"), 1)
return False
- html = daybook.details(dent1, dent2, sdate, edate)
+ filters = str(om_gui.ui.daybook_filters_lineEdit.text().toAscii())
+ if filters:
+ filters = "AND %s" % filters.replace("%", "%%")
+ om_gui.wait()
+ om_gui.ui.daybookTextBrowser.setHtml(_("polling database..."))
+ try:
+ html = daybook.details(dent1, dent2, sdate, edate, filters)
+ except daybook.connect.ProgrammingError as exc:
+ LOGGER.exception("Bad Query")
+ html = "<h1>%s</h1><pre>%s</pre>" % (_("Bad Query"), str(exc))
+ except daybook.connect.OperationalError as exc:
+ LOGGER.exception("Bad Query")
+ html = "<h1>%s</h1><pre>%s</pre>" % (_("Bad Query"), str(exc))
+ except Exception as exc:
+ LOGGER.exception("Unknown Error")
+ html = "<h1>%s</h1><pre>%s</pre>" % (_("Unknown Error"), str(exc))
om_gui.ui.daybookTextBrowser.setHtml(html)
if print_:
myclass = bookprint.printBook(html)
myclass.printpage()
-
-
+ om_gui.wait(False)
diff --git a/src/openmolar/qt4gui/fees/fee_table_model.py b/src/openmolar/qt4gui/fees/fee_table_model.py
index ce279e0..1ca0f22 100644
--- a/src/openmolar/qt4gui/fees/fee_table_model.py
+++ b/src/openmolar/qt4gui/fees/fee_table_model.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module provides a model class so that feescales can be displayed
@@ -18,16 +34,18 @@ import logging
from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings
-HIDE_RARE_CODES = 0 # fee items have an "obscurity" level of 0-2
+HIDE_RARE_CODES = 0 # fee items have an "obscurity" level of 0-2
-#new for version 0.5 - categories come from the feescale XML
+# new for version 0.5 - categories come from the feescale XML
-#CATEGORIES = ("", "Examinations", "Diagnosis", "Perio", "Chart",
+# CATEGORIES = ("", "Examinations", "Diagnosis", "Perio", "Chart",
#"Prosthetics", "Ortho", "Misc", "Emergency", "Other", "Custom", "Occasional")
LOGGER = logging.getLogger("openmolar")
+
class TreeItem(object):
+
def __init__(self, table, key, data, parent=None, index=0):
self.table = table
self.parentItem = parent
@@ -64,7 +82,7 @@ class TreeItem(object):
if uc == self.parentItem.itemData.usercode:
uc = ""
if self.itemData.has_fee_shortcuts:
- uc = self.itemData.fee_shortcut_for_display(self.row()+1)
+ uc = self.itemData.fee_shortcut_for_display(self.row() + 1)
except AttributeError:
pass
return uc
@@ -80,7 +98,7 @@ class TreeItem(object):
elif column == 4:
return localsettings.formatMoney(self.itemData.fees[self.myindex])
elif column == 5:
- #if self.table.hasPtCols:
+ # if self.table.hasPtCols:
try:
return localsettings.formatMoney(
self.itemData.ptFees[self.myindex])
@@ -97,10 +115,13 @@ class TreeItem(object):
return self.parentItem.childItems.index(self)
return 0
+
class treeModel(QtCore.QAbstractItemModel):
+
'''
a model to display a feetables data
'''
+
def __init__(self, table):
super(QtCore.QAbstractItemModel, self).__init__()
self.table = table
@@ -134,8 +155,8 @@ class treeModel(QtCore.QAbstractItemModel):
if index.column() > 3:
return QtCore.QVariant(QtCore.Qt.AlignRight)
if role == QtCore.Qt.UserRole:
- ## a user role which simply returns the python object
- ## in this case a FeeItem
+ # a user role which simply returns the python object
+ # in this case a FeeItem
return (item.itemData, item.myindex)
return QtCore.QVariant()
@@ -148,17 +169,17 @@ class treeModel(QtCore.QAbstractItemModel):
def headerData(self, column, orientation, role):
if (orientation == QtCore.Qt.Horizontal and
- role == QtCore.Qt.DisplayRole):
+ role == QtCore.Qt.DisplayRole):
- if column==1:
+ if column == 1:
return _("Usercode")
- elif column==2:
+ elif column == 2:
return _("Description")
- elif column==3:
+ elif column == 3:
return _("brief description")
- elif column==4:
+ elif column == 4:
return _("Gross Fee")
- elif column==5:
+ elif column == 5:
return _("Charge to Patient")
return QtCore.QVariant()
@@ -205,7 +226,7 @@ class treeModel(QtCore.QAbstractItemModel):
return parentItem.childCount()
def setupModelData(self):
- parents = {0:self.rootItem}
+ parents = {0: self.rootItem}
current_cat = 0
for key in sorted(self.table.feesDict.keys()):
@@ -213,22 +234,22 @@ class treeModel(QtCore.QAbstractItemModel):
if feeItem.obscurity > HIDE_RARE_CODES:
continue
section = feeItem.section
- if not parents.has_key(section) :
+ if section not in parents:
try:
header = self.table.headers[section]
except KeyError:
- header = "Unknown Section - '%s'"% section
+ header = "Unknown Section - '%s'" % section
head = TreeItem(self.table, header, None, self.rootItem)
parents[section] = head
self.rootItem.appendChild(head)
number_in_group = len(feeItem.brief_descriptions)
- branch = TreeItem(self.table, key,feeItem, parents[section])
+ branch = TreeItem(self.table, key, feeItem, parents[section])
parents[section].appendChild(branch)
for row in range(1, number_in_group):
branch.appendChild(
- TreeItem(self.table, key, feeItem, branch, row))
+ TreeItem(self.table, key, feeItem, branch, row))
def searchNode(self, node, columns=()):
'''
@@ -236,12 +257,12 @@ class treeModel(QtCore.QAbstractItemModel):
'''
matchflags = QtCore.Qt.MatchFlags(QtCore.Qt.MatchContains)
child = node.childItems[0]
- #columns = range(child.columnCount()) ## <-- would search entire model
+ # columns = range(child.columnCount()) ## <-- would search entire model
for column in columns:
start_index = self.createIndex(0, column, child)
indexes = self.match(start_index, QtCore.Qt.DisplayRole,
- QtCore.QVariant(self.search_phrase), -1, matchflags)
+ QtCore.QVariant(self.search_phrase), -1, matchflags)
for index in indexes:
self.foundItems.append(index)
@@ -250,7 +271,6 @@ class treeModel(QtCore.QAbstractItemModel):
if child.childCount():
self.searchNode(child, columns)
-
def search(self, search_phrase, columns=()):
self.foundItems = []
self.search_phrase = search_phrase
@@ -274,7 +294,7 @@ if __name__ == "__main__":
dialog = QtGui.QDialog()
- dialog.setMinimumSize(800,300)
+ dialog.setMinimumSize(800, 300)
layout = QtGui.QHBoxLayout(dialog)
tv = QtGui.QTreeView(dialog)
@@ -287,4 +307,4 @@ if __name__ == "__main__":
dialog.exec_()
- app.closeAllWindows()
\ No newline at end of file
+ app.closeAllWindows()
diff --git a/src/openmolar/qt4gui/fees/fees_module.py b/src/openmolar/qt4gui/fees/fees_module.py
index a7f4789..acdf846 100644
--- a/src/openmolar/qt4gui/fees/fees_module.py
+++ b/src/openmolar/qt4gui/fees/fees_module.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module contains functions which were originally part of the maingui.py
@@ -36,25 +52,33 @@ from openmolar.qt4gui.dialogs.payment_dialog import PaymentDialog
LOGGER = logging.getLogger("openmolar")
+
def getFeesFromEst(om_gui, hash_):
'''
iterate through the ests... find this item
'''
- LOGGER.debug("getting a daybook fee for treatment id %s"% hash_)
+ LOGGER.debug("getting a daybook fee for treatment id %s" % hash_)
+ fee, ptfee = 0, 0
+ found = False
for est in om_gui.pt.estimates:
for tx_hash in est.tx_hashes:
if hash_ == tx_hash.hash:
- return (est.interim_fee, est.interim_pt_fee)
- LOGGER.debug("NO MATCH!")
- return None
+ found = True
+ fee += est.interim_fee
+ ptfee += est.interim_pt_fee
+ if not found:
+ LOGGER.debug("NO MATCH!")
+ return None
+ return fee, ptfee
+
def takePayment(om_gui):
'''
raise a dialog, and take some money
'''
if om_gui.pt.serialno == 0:
- om_gui.advise("No patient Selected <br />Monies will be "+ \
- "allocated to Other Payments, and no receipt offered")
+ om_gui.advise("No patient Selected <br />Monies will be " +
+ "allocated to Other Payments, and no receipt offered")
dl = PaymentDialog(om_gui)
dl.set_treatment_default_amount(om_gui.pt.fees)
dl.hide_treatment(om_gui.pt.serialno == 0)
@@ -64,33 +88,35 @@ def takePayment(om_gui):
else:
paymentPt = om_gui.pt
- name = "%s %s"% (paymentPt.sname, paymentPt.fname[:1])
+ name = "%s %s" % (paymentPt.sname, paymentPt.fname[:1])
if paymentPt.dnt2 != 0:
dent = paymentPt.dnt2
else:
dent = paymentPt.dnt1
- LOGGER.debug("TAKING PAYMENT for patient %s"% paymentPt.serialno)
+ LOGGER.debug("TAKING PAYMENT for patient %s" % paymentPt.serialno)
- if cashbook.paymenttaken(paymentPt.serialno, name, dent,paymentPt.cset,
- dl.tx_cash, dl.tx_cheque, dl.tx_card,
- dl.sundry_cash, dl.sundry_cheque, dl.sundry_card,
- dl.hdp, dl.other, dl.refund):
+ if cashbook.paymenttaken(
+ paymentPt.serialno, name, dent, paymentPt.cset,
+ dl.tx_cash, dl.tx_cheque, dl.tx_card,
+ dl.sundry_cash, dl.sundry_cheque, dl.sundry_card,
+ dl.hdp, dl.other, dl.refund):
paymentPt.addHiddenNote("payment",
- " treatment %s sundries %s"% (
- dl.tx_total_text, dl.sundry_total_text))
+ " treatment %s sundries %s" % (
+ dl.tx_total_text, dl.sundry_total_text))
om_gui.updateHiddenNotesLabel()
if om_gui.pt.serialno != 0:
LOGGER.debug("loaded patient == payment patient")
- om_printing.printReceipt(om_gui,{
- "Treatments and Services" : dl.tx_total_text,
- "Sundry Items" : dl.sundry_total_text,
- "Unspecified Items" : dl.other_text,
- "REFUND" : dl.refund_text},
- total=dl.grand_total_text)
+ om_printing.printReceipt(om_gui, {
+ "Treatments and Services":
+ dl.tx_total_text,
+ "Sundry Items": dl.sundry_total_text,
+ "Unspecified Items": dl.other_text,
+ "REFUND": dl.refund_text},
+ total=dl.grand_total_text)
#-- always refer to money in terms of pence
print "adjusting money"
@@ -102,14 +128,14 @@ def takePayment(om_gui):
else:
LOGGER.debug(
- "Payment patient is not loaded. skipping receipt offer.")
+ "Payment patient is not loaded. skipping receipt offer.")
patient_write_changes.toNotes(paymentPt.serialno,
paymentPt.HIDDENNOTES)
LOGGER.debug("writing payment notes")
if patient_write_changes.discreet_changes(paymentPt,
- ("money2", "money3", "money11")) and om_gui.pt.serialno != 0:
+ ("money2", "money3", "money11")) and om_gui.pt.serialno != 0:
LOGGER.debug("updating patient's stored money values")
om_gui.pt.dbstate.money2 = om_gui.pt.money2
om_gui.pt.dbstate.money3 = om_gui.pt.money3
@@ -121,12 +147,13 @@ def takePayment(om_gui):
LOGGER.info("PAYMENT ALL DONE!")
else:
LOGGER.warning("payment failed to write to database!")
- message = "%s<br />%s"% (
+ message = "%s<br />%s" % (
_("error applying payment.... sorry!"),
_("This shouldn't happen - please report as an urgent bug")
- )
+ )
om_gui.advise(message, 2)
+
def loadFeesTable(om_gui):
'''
loads the fee table
@@ -140,8 +167,7 @@ def loadFeesTable(om_gui):
om_gui.feestableLoaded = True
i = om_gui.ui.chooseFeescale_comboBox.currentIndex()
- tableKeys = localsettings.FEETABLES.tables.keys()
- tableKeys.sort()
+ tableKeys = sorted(localsettings.FEETABLES.tables.keys())
om_gui.fee_models = []
om_gui.ui.chooseFeescale_comboBox.clear()
@@ -151,7 +177,7 @@ def loadFeesTable(om_gui):
om_gui.fee_models.append(model)
om_gui.ui.chooseFeescale_comboBox.addItem(table.briefName)
- text = u"%d %s"%(len(om_gui.fee_models), _("Fee Scales Available"))
+ text = u"%d %s" % (len(om_gui.fee_models), _("Fee Scales Available"))
om_gui.ui.feescales_available_label.setText(text)
if i != -1:
@@ -166,7 +192,7 @@ def feetester(om_gui):
dl = FeescaleTestingDialog()
dl.lineEdit.setText("MOD")
QtCore.QObject.connect(om_gui.ui.chooseFeescale_comboBox,
- QtCore.SIGNAL("currentIndexChanged (int)"), dl.change_table)
+ QtCore.SIGNAL("currentIndexChanged (int)"), dl.change_table)
i = om_gui.ui.chooseFeescale_comboBox.currentIndex()
dl.comboBox.setCurrentIndex(i)
@@ -191,6 +217,7 @@ def showTableXML(om_gui):
om_gui.fee_table_editor.show()
om_gui.fee_table_editor.closed_signal.connect(editor_closed)
+
def table_clicked(om_gui, index):
'''
user has clicked an item on the feetable.
@@ -198,7 +225,7 @@ def table_clicked(om_gui, index):
loaded for edit, or are in feetable adjust mode etc....
'''
fee_item, sub_index = om_gui.ui.feeScales_treeView.model().data(index,
- QtCore.Qt.UserRole)
+ QtCore.Qt.UserRole)
if not fee_item:
# this will be the case if a header item was clicked
@@ -216,8 +243,8 @@ def table_clicked(om_gui, index):
menu = QtGui.QMenu(om_gui)
ptno = om_gui.pt.serialno
if ptno != 0:
- menu.addAction(_("Add to tx plan of patient")+" %d"% ptno)
- #menu.addSeparator()
+ menu.addAction(_("Add to tx plan of patient") + " %d" % ptno)
+ # menu.addSeparator()
if not menu.isEmpty():
menu.setDefaultAction(menu.actions()[0])
@@ -225,6 +252,7 @@ def table_clicked(om_gui, index):
if choice:
apply(choice)
+
def feeSearch(om_gui):
'''
user has finished editing the
@@ -234,18 +262,18 @@ def feeSearch(om_gui):
''' expand all parents of a found leaf'''
parentIndex = model.parent(index)
om_gui.ui.feeScales_treeView.setExpanded(parentIndex, True)
- if parentIndex.internalPointer() != None:
+ if parentIndex.internalPointer() is not None:
ensureVisible(parentIndex)
search_phrase = om_gui.ui.feeSearch_lineEdit.text()
if search_phrase == "":
return
model = om_gui.fee_models[
- om_gui.ui.chooseFeescale_comboBox.currentIndex()]
+ om_gui.ui.chooseFeescale_comboBox.currentIndex()]
if om_gui.ui.search_itemcodes_radioButton.isChecked():
columns = [0]
- else: # om_gui.ui.search_descriptions_radioButton.isChecked():
+ else: # om_gui.ui.search_descriptions_radioButton.isChecked():
columns = [2, 3]
om_gui.wait(True)
@@ -254,7 +282,7 @@ def feeSearch(om_gui):
indexes = model.foundItems
om_gui.ui.feesearch_results_label.setText(
- "%d %s %s"%(len(indexes), _("Items containing"), search_phrase))
+ "%d %s %s" % (len(indexes), _("Items containing"), search_phrase))
for index in indexes:
ensureVisible(index)
om_gui.wait(False)
@@ -267,6 +295,7 @@ def feeSearch(om_gui):
message += " " + _("usercodes or descriptions")
om_gui.advise(message, 1)
+
def chooseFeescale(om_gui, i):
'''
receives signals from the choose feescale combobox
@@ -276,13 +305,13 @@ def chooseFeescale(om_gui, i):
if i == -1:
return
table = localsettings.FEETABLES.tables[i]
- if table.endDate == None:
+ if table.endDate is None:
end = _("IN CURRENT USE")
else:
end = localsettings.formatDate(table.endDate)
- om_gui.ui.feeScale_label.setText("<b>%s</b> %s - %s"% (
- table.description,
- localsettings.formatDate(table.startDate), end))
+ om_gui.ui.feeScale_label.setText("<b>%s</b> %s - %s" % (
+ table.description,
+ localsettings.formatDate(table.startDate), end))
om_gui.ui.feesearch_results_label.setText("")
@@ -290,15 +319,17 @@ def chooseFeescale(om_gui, i):
om_gui.ui.feeScales_treeView.setModel(om_gui.fee_models[i])
except IndexError:
print i, len(om_gui.fee_models)
- om_gui.advise(_("fee table error"),2)
+ om_gui.advise(_("fee table error"), 2)
+
def adjustTable(om_gui, index):
tv = om_gui.ui.feeScales_treeView
for col in range(tv.model().columnCount(index)):
tv.resizeColumnToContents(col)
- #usercolumn is unmanageably wide now
+ # usercolumn is unmanageably wide now
tv.setColumnWidth(1, 80)
+
def expandFees(om_gui):
'''
expands/contracts the fees treewidget
@@ -309,14 +340,15 @@ def expandFees(om_gui):
else:
om_gui.ui.feeScales_treeView.collapseAll()
+
def makeBadDebt(om_gui):
'''
write off the debt (stops cluttering up the accounts table)
'''
result = QtGui.QMessageBox.question(om_gui, "Confirm",
- "Move this patient to Bad Debt Status?",
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ "Move this patient to Bad Debt Status?",
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
#--what is owed
om_gui.pt.money11 = om_gui.pt.fees
@@ -324,19 +356,20 @@ def makeBadDebt(om_gui):
om_gui.pt.status = "BAD DEBT"
om_gui.ui.notesEnter_textEdit.setText(
_("changed patients status to BAD DEBT")
- )
+ )
om_gui.updateStatus()
om_gui.updateDetails()
+
def populateAccountsTable(om_gui):
rows = accounts.details()
om_gui.ui.accounts_tableWidget.clear()
om_gui.ui.accounts_tableWidget.setSortingEnabled(False)
om_gui.ui.accounts_tableWidget.setRowCount(len(rows))
headers = ("Dent", "Serialno", "", "First", "Last", "DOB", "Memo",
- "Last Appt", "Last Bill", "Type", "Number", "T/C", "Fees", "A", "B",
- "C")
+ "Last Appt", "Last Bill", "Type", "Number", "T/C", "Fees", "A", "B",
+ "C")
om_gui.ui.accounts_tableWidget.setColumnCount(len(headers))
om_gui.ui.accounts_tableWidget.setHorizontalHeaderLabels(headers)
@@ -346,24 +379,24 @@ def populateAccountsTable(om_gui):
for row in rows:
for col in range(len(row)):
d = row[col]
- if d != None or col == 11:
+ if d is not None or col == 11:
item = QtGui.QTableWidgetItem()
if col == 0:
item.setText(localsettings.ops.get(d))
elif col in (5, 7, 8):
item.setData(QtCore.Qt.DisplayRole,
- QtCore.QVariant(QtCore.QDate(d)))
+ QtCore.QVariant(QtCore.QDate(d)))
elif col == 12:
total += d
#--jump through hoops to make the string sortable!
- money = QtCore.QVariant(QtCore.QString("%L1").\
- arg(float(d/100), 8, "f", 2))
+ money = QtCore.QVariant(QtCore.QString("%L1").
+ arg(float(d / 100), 8, "f", 2))
item.setData(QtCore.Qt.DisplayRole, money)
item.setTextAlignment(
- QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)
+ QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
- #item.setText(localsettings.formatMoney(d))
+ # item.setText(localsettings.formatMoney(d))
elif col == 11:
if d > 0:
@@ -380,8 +413,7 @@ def populateAccountsTable(om_gui):
rowno += 1
om_gui.ui.accounts_tableWidget.sortItems(7, QtCore.Qt.DescendingOrder)
om_gui.ui.accounts_tableWidget.setSortingEnabled(True)
- #om_gui.ui.accounts_tableWidget.update()
+ # om_gui.ui.accounts_tableWidget.update()
for i in range(om_gui.ui.accounts_tableWidget.columnCount()):
om_gui.ui.accounts_tableWidget.resizeColumnToContents(i)
om_gui.ui.accountsTotal_doubleSpinBox.setValue(total / 100)
-
diff --git a/src/openmolar/qt4gui/fees/feescale_tester.py b/src/openmolar/qt4gui/fees/feescale_tester.py
index ee8e776..043ff73 100644
--- a/src/openmolar/qt4gui/fees/feescale_tester.py
+++ b/src/openmolar/qt4gui/fees/feescale_tester.py
@@ -1,12 +1,29 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
-
-import re, sys
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+import re
+import sys
from xml.dom import minidom
from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings
@@ -25,7 +42,9 @@ ADULTMOUTH = []
for tooth in mouth:
ADULTMOUTH.append(tooth)
+
class DeciduousAttributeModel(QtCore.QAbstractTableModel):
+
def __init__(self, table, parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self.attributes = DECIDMOUTH
@@ -43,13 +62,13 @@ class DeciduousAttributeModel(QtCore.QAbstractTableModel):
def rowCount(self, index):
if self._rowcount is None:
- self._rowcount = len(self.attributes)//2
+ self._rowcount = len(self.attributes) // 2
return self._rowcount
def columnCount(self, index):
return 4
- def data(self, index,role):
+ def data(self, index, role):
if role != QtCore.Qt.DisplayRole:
return QtCore.QVariant()
@@ -64,11 +83,14 @@ class DeciduousAttributeModel(QtCore.QAbstractTableModel):
class AdultAttributeModel(DeciduousAttributeModel):
+
def __init__(self, table, parent=None):
DeciduousAttributeModel.__init__(self, table, parent)
self.attributes = ADULTMOUTH
+
class FeescaleTestingDialog(Ui_codeChecker.Ui_Dialog, QtGui.QDialog):
+
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
@@ -88,7 +110,7 @@ class FeescaleTestingDialog(Ui_codeChecker.Ui_Dialog, QtGui.QDialog):
self.setWindowTitle(_("Shortcut tester"))
self.connect(self.comboBox, QtCore.SIGNAL("currentIndexChanged (int)"),
- self.change_table)
+ self.change_table)
self.pushButton.clicked.connect(self.check_codes)
@@ -115,6 +137,7 @@ class FeescaleTestingDialog(Ui_codeChecker.Ui_Dialog, QtGui.QDialog):
for table in localsettings.FEETABLES.tables.values():
self.table_list.append(table)
self.tablenames.append(table.briefName)
+ self.comboBox.clear()
self.comboBox.addItems(self.tablenames)
def check_codes(self):
@@ -126,14 +149,14 @@ class FeescaleTestingDialog(Ui_codeChecker.Ui_Dialog, QtGui.QDialog):
if complex_shortcut.matches(att, tx):
complex_matches.append(att)
- usercode = "%s %s"% (att, tx)
+ usercode = "%s %s" % (att, tx)
code = self.current_table.getItemCodeFromUserCode(usercode)
if code == "-----":
self.line_edits[att].setText("")
else:
description = self.current_table.getItemDescription(
- code, usercode)
- self.line_edits[att].setText("%s %s"%(code, description))
+ code, usercode)
+ self.line_edits[att].setText("%s %s" % (code, description))
for model in (self.model2, self.model3):
model.code = tx
model.reset()
@@ -144,10 +167,11 @@ class FeescaleTestingDialog(Ui_codeChecker.Ui_Dialog, QtGui.QDialog):
if complex_matches != []:
QtGui.QMessageBox.information(self, _("Information"),
- "%s '%s' %s<hr />%s"% (
- _("This feescale handles"), tx,
- _("as a complex code for the following attributes."),
- complex_matches))
+ "%s '%s' %s<hr />%s" % (
+ _("This feescale handles"), tx,
+ _(
+ "as a complex code for the following attributes."),
+ complex_matches))
@property
def current_table(self):
diff --git a/src/openmolar/qt4gui/fees/manipulate_plan.py b/src/openmolar/qt4gui/fees/manipulate_plan.py
index 944e568..97051a8 100644
--- a/src/openmolar/qt4gui/fees/manipulate_plan.py
+++ b/src/openmolar/qt4gui/fees/manipulate_plan.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
provides code to add Xrays, perio items......etc
@@ -40,6 +56,7 @@ FULLY_HANDLED = 2
PARTIALLY_HANDLED = 1
NOT_HANDLED = 0
+
def offerTreatmentItems(om_gui, tx_list, completing=False):
'''
tx_list should be an iterable in the form ((att, shortcut),(att, shortcut))
@@ -48,11 +65,12 @@ def offerTreatmentItems(om_gui, tx_list, completing=False):
the return value is an iterable in the same form.
'''
dl = AddTreatmentDialog(tx_list, om_gui.pt, om_gui)
- if completing: #we are adding to the completed treatments, not plan
+ if completing: # we are adding to the completed treatments, not plan
dl.use_completed_messages()
result = dl.getInput()
return result
+
def add_treatments_to_plan(om_gui, treatments, completed=False):
LOGGER.debug(treatments)
if course_module.newCourseNeeded(om_gui):
@@ -60,28 +78,28 @@ def add_treatments_to_plan(om_gui, treatments, completed=False):
pt = om_gui.pt
for att, shortcut in treatments:
- LOGGER.debug("adding %s %s to treatment plan"% (att, shortcut))
- existing_txs = "%s %s"% (pt.treatment_course.__dict__["%scmp"% att] ,
- pt.treatment_course.__dict__["%spl"% att]
- )
+ LOGGER.debug("adding %s %s to treatment plan" % (att, shortcut))
+ existing_txs = "%s %s" % (pt.treatment_course.__dict__["%scmp" % att],
+ pt.treatment_course.__dict__["%spl" % att]
+ )
# count the existing number and add 1 for the new shortcut
n_txs = existing_txs.split(" ").count(shortcut) + 1
courseno = pt.treatment_course.courseno
hash_ = localsettings.hash_func(
- "%s%s%s%s"% (courseno, att, n_txs, shortcut))
+ "%s%s%s%s" % (courseno, att, n_txs, shortcut))
tx_hash = TXHash(hash_)
dentid = pt.course_dentist
- pt.treatment_course.__dict__["%spl"% att] += "%s "% shortcut
+ pt.treatment_course.__dict__["%spl" % att] += "%s " % shortcut
- #check for deciduous tooth.
+ # check for deciduous tooth.
if re.match("[ul][lr][1-8]", att):
n_txs = None
tooth_name = pt.chartgrid.get(att)
if tooth_name != att:
- LOGGER.debug("Deciduous tooth treatment! on %s"% tooth_name)
- att = "%s%s"% (att[:2], tooth_name[2])
+ LOGGER.debug("Deciduous tooth treatment! on %s" % tooth_name)
+ att = "%s%s" % (att[:2], tooth_name[2])
complex_addition_handled, shortcut = complex_shortcut_addition(
om_gui, att, shortcut, n_txs, tx_hash)
@@ -100,9 +118,10 @@ def add_treatments_to_plan(om_gui, treatments, completed=False):
om_gui.update_plan_est()
+
def add_treatment_to_estimate(om_gui, att, shortcut, dentid, tx_hashes,
- itemcode=None, csetype=None, descr=None,
- fee=None, ptfee=None, chosen_feescale=None):
+ itemcode=None, csetype=None, descr=None,
+ fee=None, ptfee=None, chosen_feescale=None):
'''
add an item to the patient's estimate
usercode unnecessary if itemcode is provided.
@@ -111,21 +130,23 @@ def add_treatment_to_estimate(om_gui, att, shortcut, dentid, tx_hashes,
itemcode = table.getToothCode(att, shortcut)
if itemcode != "-----":
return itemcode, table
- LOGGER.debug("%s %s not matched by %s"% (att, shortcut, table))
+ LOGGER.debug("%s %s not matched by %s" % (att, shortcut, table))
for alt_table in localsettings.FEETABLES.tables.itervalues():
if alt_table == table:
continue
alt_code = alt_table.getToothCode(att, shortcut)
if alt_code != "-----":
if QtGui.QMessageBox.question(om_gui, _("Confirm"),
- u"<p><b>%s %s</b> %s.</p><p>%s <em>%s</em></p><hr />%s" %(
- att, shortcut,
- _("was not found in the patient's default feescale"),
- _("It is matched in another feescale -"),
- alt_table.briefName,
- _("Shall we add this item from this feescale?")),
- QtGui.QMessageBox.Yes|QtGui.QMessageBox.No,
- QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+ u"<p><b>%s %s</b> %s.</p><p>%s <em>%s</em></p><hr />%s" % (
+ att, shortcut,
+ _(
+ "was not found in the patient's default feescale"),
+ _(
+ "It is matched in another feescale -"),
+ alt_table.briefName,
+ _("Shall we add this item from this feescale?")),
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
return alt_code, alt_table
return itemcode, table
@@ -134,42 +155,44 @@ def add_treatment_to_estimate(om_gui, att, shortcut, dentid, tx_hashes,
itemcode = table.getItemCodeFromUserCode(usercode)
if itemcode != "-----":
return itemcode, table
- LOGGER.debug("%s not matched by %s"% (usercode, table))
+ LOGGER.debug("%s not matched by %s" % (usercode, table))
for alt_table in localsettings.FEETABLES.tables.itervalues():
if alt_table == table:
continue
alt_code = alt_table.getItemCodeFromUserCode(usercode)
if alt_code != "-----":
if QtGui.QMessageBox.question(om_gui, _("Confirm"),
- u"<p><b>%s</b> %s.</p><p>%s <em>%s</em></p><hr />%s" %(
- usercode,
- _("was not found in the patient's default feescale"),
- _("It is matched in another feescale -"),
- alt_table.briefName,
- _("Shall we add this item from this feescale?")),
- QtGui.QMessageBox.Yes|QtGui.QMessageBox.No,
- QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+ u"<p><b>%s</b> %s.</p><p>%s <em>%s</em></p><hr />%s" % (
+ usercode,
+ _(
+ "was not found in the patient's default feescale"),
+ _(
+ "It is matched in another feescale -"),
+ alt_table.briefName,
+ _("Shall we add this item from this feescale?")),
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
return alt_code, alt_table
return itemcode, table
- usercode = ("%s %s"% (att, shortcut))
- LOGGER.debug("%s %s %s %s %s %s %s %s %s"%(
+ usercode = ("%s %s" % (att, shortcut))
+ LOGGER.debug("%s %s %s %s %s %s %s %s %s" % (
usercode, dentid, tx_hashes,
itemcode, csetype, descr,
fee, ptfee, chosen_feescale)
- )
+ )
for tx_hash in tx_hashes:
- assert type(tx_hash) == TXHash, "bad form Neil"
+ assert isinstance(tx_hash, TXHash), "bad form Neil"
pt = om_gui.pt
est = Estimate()
- est.ix = None #-- this will be generated by autoincrement on commit
+ est.ix = None # -- this will be generated by autoincrement on commit
est.serialno = pt.serialno
est.courseno = pt.courseno0
- if chosen_feescale == None:
+ if chosen_feescale is None:
table = pt.fee_table
else:
table = chosen_feescale
@@ -180,7 +203,7 @@ def add_treatment_to_estimate(om_gui, att, shortcut, dentid, tx_hashes,
if descr is None:
tooth_name = att.upper()
descr = table.getItemDescription(itemcode, usercode)
- descr = descr.replace("*", " %s"% tooth_name)
+ descr = descr.replace("*", " %s" % tooth_name)
else:
if itemcode is None:
itemcode, table = _user_code_search(usercode)
@@ -192,7 +215,7 @@ def add_treatment_to_estimate(om_gui, att, shortcut, dentid, tx_hashes,
est.csetype = table.categories[0]
if fee is None and ptfee is None:
- #look up the fee here
+ # look up the fee here
est.fee, est.ptfee = table.getFees(itemcode, pt, est.csetype, shortcut)
else:
est.fee, est.ptfee = fee, ptfee
@@ -204,14 +227,15 @@ def add_treatment_to_estimate(om_gui, att, shortcut, dentid, tx_hashes,
pt.estimates.append(est)
if itemcode == "-----":
- om_gui.advise(u"%s - %s <b>%s</b><br />%s.<hr />%s"% (
- _("WARNING"),
- _("treatment"),
- usercode,
- _("has not been succesfully priced"),
- _("Please edit the estimate manually")), 1)
+ om_gui.advise(u"%s - %s <b>%s</b><br />%s.<hr />%s" % (
+ _("WARNING"),
+ _("treatment"),
+ usercode,
+ _("has not been succesfully priced"),
+ _("Please edit the estimate manually")), 1)
return True
+
def perioAdd(om_gui):
'''
add perio items
@@ -220,18 +244,19 @@ def perioAdd(om_gui):
if "N" in pt.cset:
mylist = (
- ("perio", "SP"),
+ ("perio", "SP"),
)
else:
mylist = (
- ("perio", "SP-"),
- ("perio", "SP"),
- ("perio", "SP+"),
+ ("perio", "SP-"),
+ ("perio", "SP"),
+ ("perio", "SP+"),
)
chosen_treatments = offerTreatmentItems(om_gui, mylist)
add_treatments_to_plan(om_gui, chosen_treatments)
+
def xrayAdd(om_gui, complete=False):
'''
add xray items
@@ -240,9 +265,9 @@ def xrayAdd(om_gui, complete=False):
("xray", "S"),
("xray", "M"),
("xray", "P"),
- )
- #offerTreatmentItems is a generator, so the list conversion here
- #is so that the dialog get raised before the
+ )
+ # offerTreatmentItems is a generator, so the list conversion here
+ # is so that the dialog get raised before the
#"were these xrays taken today question
chosen_treatments = list(offerTreatmentItems(om_gui, mylist, complete))
@@ -251,21 +276,23 @@ def xrayAdd(om_gui, complete=False):
if not complete:
input = QtGui.QMessageBox.question(om_gui, _("question"),
- _("Were these xrays taken today?"),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.No )
+ _("Were these xrays taken today?"),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No)
if input == QtGui.QMessageBox.Yes:
complete = True
add_treatments_to_plan(om_gui, chosen_treatments, complete)
- if om_gui.ui.tabWidget.currentIndex() == 4: #clinical summary
+ if om_gui.ui.tabWidget.currentIndex() == 4: # clinical summary
om_gui.load_clinicalSummaryPage()
+
def denture_add(om_gui):
dl = DentureDialog(om_gui)
if dl.exec_():
add_treatments_to_plan(om_gui, dl.chosen_treatments)
+
def otherAdd(om_gui):
'''
add 'other' items
@@ -274,7 +301,8 @@ def otherAdd(om_gui):
chosen_treatments = offerTreatmentItems(om_gui, item_list)
if chosen_treatments:
- add_treatments_to_plan(om_gui, chosen_treatments)
+ add_treatments_to_plan(om_gui, chosen_treatments)
+
def customAdd(om_gui, description=None):
'''
@@ -296,26 +324,29 @@ def customAdd(om_gui, description=None):
if descr == "":
descr = "??"
- usercode = str (descr.replace(" ", "_"))[:20].upper()
+ usercode = str(descr.replace(" ", "_"))[:20].upper()
fee = int(dl.fee_doubleSpinBox.value() * 100)
for i in range(no):
- pt.treatment_course.custompl += "%s "% usercode
+ pt.treatment_course.custompl += "%s " % usercode
- custom_txs = "%s %s"%(
+ custom_txs = "%s %s" % (
pt.treatment_course.customcmp, pt.treatment_course.custompl)
n = custom_txs.split(" ").count(usercode)
- hash_ = localsettings.hash_func("%scustom%s%s"% (courseno, n, usercode))
+ hash_ = localsettings.hash_func(
+ "%scustom%s%s" %
+ (courseno, n, usercode))
tx_hash = TXHash(hash_)
dentid = om_gui.pt.course_dentist
add_treatment_to_estimate(om_gui, "custom", usercode, dentid,
- [tx_hash], itemcode="CUSTO", csetype="P",
- descr=descr, fee=fee, ptfee=fee)
+ [tx_hash], itemcode="CUSTO", csetype="P",
+ descr=descr, fee=fee, ptfee=fee)
om_gui.update_plan_est()
+
def plan_viewer_context_menu(om_gui, att, values, point):
'''
provides and handles a context menu for the ui.plan_listView and
@@ -333,18 +364,18 @@ def plan_viewer_context_menu(om_gui, att, values, point):
qmenu = QtGui.QMenu(om_gui)
value = values[0]
- message = "%s %s %s"% (_("Complete"), att, value)
+ message = "%s %s %s" % (_("Complete"), att, value)
complete_action = QtGui.QAction(message, om_gui)
complete_action.triggered.connect(
partial(complete_txs, om_gui, ((att, value),)))
- message = "%s %s %s"% (_("Delete"), att, value)
+ message = "%s %s %s" % (_("Delete"), att, value)
delete_action = QtGui.QAction(message, om_gui)
delete_action.triggered.connect(
partial(remove_treatments_from_plan_and_est, om_gui, ((att, value),)))
cancel_action = QtGui.QAction(_("Cancel"), om_gui)
- #not connected to anything.. f clicked menu will simply die!
+ # not connected to anything.. f clicked menu will simply die!
qmenu.addAction(complete_action)
qmenu.addSeparator()
@@ -354,6 +385,7 @@ def plan_viewer_context_menu(om_gui, att, values, point):
qmenu.setDefaultAction(complete_action)
qmenu.exec_(point)
+
def cmp_viewer_context_menu(om_gui, att, values, point):
'''
provides and handles a context menu for the ui.completed_listView and
@@ -373,24 +405,24 @@ def cmp_viewer_context_menu(om_gui, att, values, point):
value = values[0]
if att == "exam":
- hash = localsettings.hash_func("%sexam1%s"% (
+ hash = localsettings.hash_func("%sexam1%s" % (
om_gui.pt.treatment_course.courseno,
om_gui.pt.treatment_course.examt))
- tx_hash = TXHash(hash_ , True)
+ tx_hash = TXHash(hash_, True)
rev_func = partial(tx_hash_reverse, om_gui, tx_hash)
else:
rev_func = partial(reverse_txs, om_gui, ((att, value),))
- message = "%s %s %s"% (_("Reverse and Delete"), att, value)
+ message = "%s %s %s" % (_("Reverse and Delete"), att, value)
delete_action = QtGui.QAction(message, qmenu)
delete_action.triggered.connect(partial(
remove_treatments_from_plan_and_est, om_gui, ((att, value), ), True))
- message = "%s %s %s"% (_("Reverse"), att, value)
+ message = "%s %s %s" % (_("Reverse"), att, value)
reverse_action = QtGui.QAction(message, qmenu)
reverse_action.triggered.connect(rev_func)
cancel_action = QtGui.QAction(_("Cancel"), qmenu)
- #not connected to anything.. f clicked menu will simply die!
+ # not connected to anything.. f clicked menu will simply die!
qmenu.addAction(reverse_action)
qmenu.addSeparator()
@@ -401,6 +433,7 @@ def cmp_viewer_context_menu(om_gui, att, values, point):
qmenu.setDefaultAction(qmenu.actions()[0])
qmenu.exec_(point)
+
def plan_listview_2xclick(om_gui, index):
model = om_gui.ui.plan_listView.model()
att, values = model.att_vals(index)
@@ -412,9 +445,10 @@ def plan_listview_2xclick(om_gui, index):
model.endResetModel()
om_gui.ui.completed_listView.model().reset()
+
def plan_list_right_click(om_gui, point):
index = om_gui.ui.plan_listView.indexAt(point)
- LOGGER.debug("%s right clicked"% index)
+ LOGGER.debug("%s right clicked" % index)
if not index.isValid():
return
model = om_gui.ui.plan_listView.model()
@@ -426,6 +460,7 @@ def plan_list_right_click(om_gui, point):
model.reset()
om_gui.ui.completed_listView.model().reset()
+
def completed_listview_2xclick(om_gui, index):
model = om_gui.ui.completed_listView.model()
att, values = model.att_vals(index)
@@ -442,9 +477,10 @@ def completed_listview_2xclick(om_gui, index):
model.endResetModel()
om_gui.ui.plan_listView.model().reset()
+
def cmp_list_right_click(om_gui, point):
index = om_gui.ui.completed_listView.indexAt(point)
- LOGGER.debug("%s right clicked"% index)
+ LOGGER.debug("%s right clicked" % index)
if not index.isValid():
return
model = om_gui.ui.completed_listView.model()
@@ -456,6 +492,7 @@ def cmp_list_right_click(om_gui, point):
model.reset()
om_gui.ui.plan_listView.model().reset()
+
def fromFeeTable(om_gui, fee_item, sub_index):
'''
add an item which has been selected from the fee table itself
@@ -464,12 +501,12 @@ def fromFeeTable(om_gui, fee_item, sub_index):
def show_help():
message = '''%s<ul>
<li>%s %s %s %s <b>%s</b></li><li>%s %s</li><li>%s</li>
- </ul>'''% (
- _("Choose"),
- _("OK to add"), att_, _("to patient attribute"), shortcut,
- _("Recommended"),
- _("Use Feescale Method"), _("to overide this behaviour"),
- _("Cancel to abandon this addition entirely"))
+ </ul>''' % (
+ _("Choose"),
+ _("OK to add"), att_, _("to patient attribute"), shortcut,
+ _("Recommended"),
+ _("Use Feescale Method"), _("to overide this behaviour"),
+ _("Cancel to abandon this addition entirely"))
QtGui.QMessageBox.information(mb, _("Help"), message)
@@ -482,18 +519,18 @@ def fromFeeTable(om_gui, fee_item, sub_index):
if fee_item.table == table:
return table
- message = '%s<br /><b>%s</b>%s<hr />%s<br />%s' %(
+ message = '%s<br /><b>%s</b>%s<hr />%s<br />%s' % (
_("Confirm you wish to use feescale"),
fee_item.table.briefName,
_("for this item"),
_("The patient's default table is"),
table.briefName)
if QtGui.QMessageBox.question(om_gui, _("Confirm"), message,
- QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
- QtGui.QMessageBox.Ok ) == QtGui.QMessageBox.Ok:
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Ok) == QtGui.QMessageBox.Ok:
return fee_item.table
- LOGGER.debug("fee_item %s, sub_index %s"% (fee_item, sub_index))
+ LOGGER.debug("fee_item %s, sub_index %s" % (fee_item, sub_index))
if course_module.newCourseNeeded(om_gui):
return
@@ -518,11 +555,11 @@ def fromFeeTable(om_gui, fee_item, sub_index):
shortcut = fee_item.shortcut
if table == pt.fee_table and shortcut != "!FEE" and att_ != "exam":
- message = "%s %s<hr />%s"%(
- _("You appear to be adding a relatively straightforward code to the"
- " ""patient's treatment plan using their default feescale"),
- _("It is normally advisable to add this code conventionally."),
- _("Would you like to do this now?"))
+ message = "%s %s<hr />%s" % (
+ _("You appear to be adding a relatively straightforward code to the"
+ " ""patient's treatment plan using their default feescale"),
+ _("It is normally advisable to add this code conventionally."),
+ _("Would you like to do this now?"))
mb = QtGui.QMessageBox(None)
mb.setWindowTitle(_("Confirm"))
@@ -543,10 +580,10 @@ def fromFeeTable(om_gui, fee_item, sub_index):
message = ""
for att in atts:
txs.append((att, shortcut))
- message += "<li>%s %s</li>"% (att, shortcut)
+ message += "<li>%s %s</li>" % (att, shortcut)
add_treatments_to_plan(om_gui, txs)
- om_gui.advise("%s <ul>%s</ul>%s"% (_("Treatments"), message,
- _("were added conventionally")), 1)
+ om_gui.advise("%s <ul>%s</ul>%s" % (_("Treatments"), message,
+ _("were added conventionally")), 1)
return
elif result == mb.Cancel:
LOGGER.info("Feescale addition abandoned by user")
@@ -557,9 +594,9 @@ def fromFeeTable(om_gui, fee_item, sub_index):
reason = _("Exam items can never be added this way")
else:
reason = fee_item.forbid_reason
- message = "%s<hr /><em>%s</em>"% (_(
- "This item can not be added to the treatment plan "
- "using the feescale method, sorry"), reason)
+ message = "%s<hr /><em>%s</em>" % (_(
+ "This item can not be added to the treatment plan "
+ "using the feescale method, sorry"), reason)
om_gui.advise(message, 1)
return
@@ -574,44 +611,46 @@ def fromFeeTable(om_gui, fee_item, sub_index):
cset = table.categories[0]
for att in atts:
- if not pt.treatment_course.__dict__.has_key("%spl"% att):
+ if "%spl" % att not in pt.treatment_course.__dict__:
att = "other"
- pt.treatment_course.__dict__[att+"pl"] += "%s "% shortcut
- new_plan = pt.treatment_course.__dict__[att+"pl"]
+ pt.treatment_course.__dict__[att + "pl"] += "%s " % shortcut
+ new_plan = pt.treatment_course.__dict__[att + "pl"]
descr = fee_item.description
if re.match("[ul][lr][1-8]", att):
om_gui.ui.planChartWidget.setToothProps(att, new_plan)
tooth_name = pt.chartgrid.get(att).upper()
- descr = descr.replace("*", " %s"% tooth_name)
+ descr = descr.replace("*", " %s" % tooth_name)
- existing_txs = "%s %s"% (
- pt.treatment_course.__dict__["%scmp"% att] , new_plan)
+ existing_txs = "%s %s" % (
+ pt.treatment_course.__dict__["%scmp" % att], new_plan)
n_txs = existing_txs.split(" ").count(shortcut)
courseno = pt.treatment_course.courseno
- hash_ = localsettings.hash_func("%s%s%s%s"% (courseno, att, n_txs, shortcut))
+ hash_ = localsettings.hash_func(
+ "%s%s%s%s" %
+ (courseno, att, n_txs, shortcut))
tx_hash = TXHash(hash_)
add_treatment_to_estimate(om_gui, att, shortcut, dentid, [tx_hash],
- fee_item.itemcode, cset, descr, fee, pt_fee, table)
+ fee_item.itemcode, cset, descr, fee, pt_fee, table)
- om_gui.advise(u"<b>%s</b> %s (%s)"% (
- fee_item.description, _("added to estimate"), _("from feescale"))
- ,1)
+ om_gui.advise(u"<b>%s</b> %s (%s)" % (
+ fee_item.description, _("added to estimate"), _("from feescale")), 1)
om_gui.update_plan_est()
+
def complex_shortcut_addition(om_gui, att, shortcut, n_txs, tx_hash,
-recalculating=False):
+ recalculating=False):
def number_of_chart_matches(filter="[ul][lr][1-8A-E]"):
'''
suppose a veneer is passed - is it the only veneer?
'''
if recalculating:
LOGGER.debug(
- "recalculating estimate, so not using pt.tx_hash_tups")
+ "recalculating estimate, so not using pt.tx_hash_tups")
pt.new_hash_tups.append((tx_hash, att, shortcut))
iterable_ = pt.new_hash_tups
else:
@@ -619,22 +658,22 @@ recalculating=False):
n = 0
for hash_, att_, s_cut in iterable_:
if (re.match(filter, att_) and
- complex_shortcut.matches(att_, s_cut.strip(" "))):
+ complex_shortcut.matches(att_, s_cut.strip(" "))):
n += 1
- LOGGER.debug("number_of_chart_matches = %d"% n)
+ LOGGER.debug("number_of_chart_matches = %d" % n)
return n
LOGGER.debug(
- "checking %s %s n_txs=%s %s"% (att, shortcut, n_txs, tx_hash))
+ "checking %s %s n_txs=%s %s" % (att, shortcut, n_txs, tx_hash))
pt = om_gui.pt
fee_table = pt.fee_table
dentid = pt.course_dentist
- LOGGER.debug("Feetable being checked = %s"% fee_table)
+ LOGGER.debug("Feetable being checked = %s" % fee_table)
handled = NOT_HANDLED
for complex_shortcut in fee_table.complex_shortcuts:
if complex_shortcut.matches(att, shortcut):
- LOGGER.debug("%s %s matches complex shortcut %s"% (
- att, shortcut, complex_shortcut))
+ LOGGER.debug("%s %s matches complex shortcut %s" % (
+ att, shortcut, complex_shortcut))
for case in complex_shortcut.addition_cases:
m = re.match("n_txs=(\d+)", case.condition)
m2 = re.match("n_txs>(\d+)", case.condition)
@@ -643,38 +682,38 @@ recalculating=False):
if (m or m2 or m3) and n_txs is None:
n_txs = number_of_chart_matches()
if not (
- case.condition == "True" or
- (m and int(m.groups()[0]) == n_txs) or
- (m2 and n_txs > int(m2.groups()[0])) or
- (m3 and int(m3.groups()[0]) < n_txs < int(m3.groups()[1]))
+ case.condition == "True" or
+ (m and int(m.groups()[0]) == n_txs) or
+ (m2 and n_txs > int(m2.groups()[0])) or
+ (m3 and int(m3.groups()[0]) < n_txs < int(m3.groups()[1]))
):
continue
- LOGGER.debug("condition met %s"% case.condition)
+ LOGGER.debug("condition met %s" % case.condition)
tx_hashes = [tx_hash]
for item_code in case.removals:
for est in pt.estimates:
if est.itemcode == item_code:
- LOGGER.debug("removing estimate %s"% est)
+ LOGGER.debug("removing estimate %s" % est)
pt.estimates.remove(est)
tx_hashes += est.tx_hashes
for item_code in case.additions:
- LOGGER.debug("adding additional code %s"% item_code)
+ LOGGER.debug("adding additional code %s" % item_code)
add_treatment_to_estimate(om_gui,
- att, shortcut, dentid, list(tx_hashes), item_code)
+ att, shortcut, dentid, list(tx_hashes), item_code)
for item_code in case.alterations:
- #instead of adding a new estimate item
- #add this treatment hash to existing item
- LOGGER.debug("altering code %s"% item_code)
+ # instead of adding a new estimate item
+ # add this treatment hash to existing item
+ LOGGER.debug("altering code %s" % item_code)
for est in pt.estimates:
if est.itemcode == item_code:
est.tx_hashes += tx_hashes
est.fee, est.ptfee = fee_table.recalc_fee(
pt, item_code, n_txs)
- LOGGER.debug("est altered %s"% est)
+ LOGGER.debug("est altered %s" % est)
if case.message != "":
message = case.message.replace("SHORTCUT", shortcut)
@@ -684,18 +723,19 @@ recalculating=False):
if case.shortcut_substitution is not None:
find_, replace = case.shortcut_substitution
shortcut = re.sub(find_, replace, shortcut)
- LOGGER.info("modded shortcut to '%s'"% shortcut)
+ LOGGER.info("modded shortcut to '%s'" % shortcut)
handled = case.is_handled
break
if handled == FULLY_HANDLED:
- LOGGER.info("%s %s was handled by as a complex shortcut"% (
- att, shortcut))
+ LOGGER.info("%s %s was handled by as a complex shortcut" % (
+ att, shortcut))
return handled, shortcut
return handled, shortcut
+
def complex_shortcut_removal_handled(om_gui, att, shortcut, n_txs, tx_hash):
def number_of_chart_matches(filter="[ul][lr][1-8A-E]"):
'''
@@ -704,21 +744,21 @@ def complex_shortcut_removal_handled(om_gui, att, shortcut, n_txs, tx_hash):
n = 0
for hash_, att_, s_cut in pt.tx_hash_tups:
if (re.match(filter, att_) and
- complex_shortcut.matches(att_, s_cut.strip(" "))):
+ complex_shortcut.matches(att_, s_cut.strip(" "))):
n += 1
- LOGGER.debug("number_of_chart_matches = %d"% n)
+ LOGGER.debug("number_of_chart_matches = %d" % n)
return n
LOGGER.debug((att, shortcut, n_txs, tx_hash))
pt = om_gui.pt
dentid = pt.course_dentist
fee_table = pt.fee_table
- LOGGER.debug("Feetable being checked = %s"% fee_table)
+ LOGGER.debug("Feetable being checked = %s" % fee_table)
for complex_shortcut in fee_table.complex_shortcuts:
if complex_shortcut.matches(att, shortcut):
LOGGER.debug(
- "%s %s is a complex shortcut with %d removal_cases"% (
- att, shortcut, len(complex_shortcut.removal_cases)))
+ "%s %s is a complex shortcut with %d removal_cases" % (
+ att, shortcut, len(complex_shortcut.removal_cases)))
handled = False
for case in complex_shortcut.removal_cases:
m = re.match("n_txs=(\d+)", case.condition)
@@ -729,30 +769,31 @@ def complex_shortcut_removal_handled(om_gui, att, shortcut, n_txs, tx_hash):
n_txs = number_of_chart_matches()
if not (case.condition == "True" or
- (m and int(m.groups()[0]) == n_txs) or
- (m2 and n_txs > int(m2.groups()[0])) or
- (m3 and int(m3.groups()[0]) < n_txs < int(m3.groups()[1]))
- ):
+ (m and int(m.groups()[0]) == n_txs) or
+ (m2 and n_txs > int(m2.groups()[0])) or
+ (m3 and int(m3.groups()[0]) < n_txs < int(
+ m3.groups()[1]))
+ ):
continue
- LOGGER.debug("condition met %s"% case.condition)
+ LOGGER.debug("condition met %s" % case.condition)
tx_hashes = [tx_hash]
for item_code in case.removals:
for est in pt.estimates:
if est.itemcode == item_code:
- LOGGER.debug("removing estimate %s"% est)
+ LOGGER.debug("removing estimate %s" % est)
pt.estimates.remove(est)
tx_hashes += est.tx_hashes
for item_code in case.additions:
- LOGGER.debug("adding additional code %s"% item_code)
+ LOGGER.debug("adding additional code %s" % item_code)
add_treatment_to_estimate(om_gui,
- att, shortcut, dentid, tx_hashes, item_code)
+ att, shortcut, dentid, tx_hashes, item_code)
for item_code in case.alterations:
- #instead of adding a new estimate item
- #add this treatment hash to existing item
- LOGGER.debug("altering code %s"% item_code)
+ # instead of adding a new estimate item
+ # add this treatment hash to existing item
+ LOGGER.debug("altering code %s" % item_code)
for est in pt.estimates:
if est.itemcode == item_code:
for hash_ in tx_hashes:
@@ -761,8 +802,7 @@ def complex_shortcut_removal_handled(om_gui, att, shortcut, n_txs, tx_hash):
est.fee, est.ptfee = fee_table.recalc_fee(
pt, item_code, n_txs)
- LOGGER.debug("est altered %s"% est)
-
+ LOGGER.debug("est altered %s" % est)
if case.message != "":
message = case.message.replace("SHORTCUT", shortcut)
@@ -770,21 +810,22 @@ def complex_shortcut_removal_handled(om_gui, att, shortcut, n_txs, tx_hash):
LOGGER.info(message)
LOGGER.debug("removing all references to this treatment in "
- "from the patient's estimate")
+ "from the patient's estimate")
for hash_ in tx_hashes:
for est in list(pt.ests_from_hash(hash_)):
LOGGER.debug(
- "removing reference to %s in estimate %s"% (
- hash_, est))
+ "removing reference to %s in estimate %s" % (
+ hash_, est))
est.tx_hashes.remove(hash_)
if est.tx_hashes == []:
pt.estimates.remove(est)
return True
- LOGGER.debug("%s NOT handled as a complex shortcut"% shortcut)
+ LOGGER.debug("%s NOT handled as a complex shortcut" % shortcut)
return False
+
def remove_treatments_from_plan_and_est(om_gui, treatments, completed=False):
'''
remove treatments from the treatment plan and estimate.
@@ -795,42 +836,42 @@ def remove_treatments_from_plan_and_est(om_gui, treatments, completed=False):
courseno = pt.treatment_course.courseno
for att, shortcut in treatments:
if completed:
- txs = pt.treatment_course.__dict__["%scmp"% att]
+ txs = pt.treatment_course.__dict__["%scmp" % att]
n_txs = txs.split(" ").count(shortcut)
hash_ = localsettings.hash_func(
- "%s%s%s%s"% (courseno, att, n_txs, shortcut))
+ "%s%s%s%s" % (courseno, att, n_txs, shortcut))
tx_hash = TXHash(hash_, completed)
tx_hash_reverse(om_gui, tx_hash)
- txs = "%s %s"% (
- pt.treatment_course.__dict__["%scmp"% att],
- pt.treatment_course.__dict__["%spl"% att]
- )
+ txs = "%s %s" % (
+ pt.treatment_course.__dict__["%scmp" % att],
+ pt.treatment_course.__dict__["%spl" % att]
+ )
n_txs = txs.split(" ").count(shortcut)
hash_ = localsettings.hash_func(
- "%s%s%s%s"% (courseno, att, n_txs, shortcut))
+ "%s%s%s%s" % (courseno, att, n_txs, shortcut))
tx_hash = TXHash(hash_, completed=False)
- p_att = "%spl"% att
+ p_att = "%spl" % att
val = pt.treatment_course.__dict__[p_att]
- new_val = val.replace("%s "% shortcut, "", 1)
+ new_val = val.replace("%s " % shortcut, "", 1)
if re.match("[ul][lr][1-8]", att):
- n_txs=None
+ n_txs = None
if not complex_shortcut_removal_handled(om_gui, att, shortcut,
- n_txs, tx_hash):
+ n_txs, tx_hash):
affected_ests = list(om_gui.pt.ests_from_hash(tx_hash))
if not affected_ests:
- om_gui.advise(u"%s '%s' %s<hr />%s"% (
- _("Couldn't find"),
- "%s%s%s%s"% (courseno, att, n_txs, shortcut),
- _("in the patient's estimate"),
- _("This Shouldn't Happen!")), 2)
+ om_gui.advise(u"%s '%s' %s<hr />%s" % (
+ _("Couldn't find"),
+ "%s%s%s%s" % (courseno, att, n_txs, shortcut),
+ _("in the patient's estimate"),
+ _("This Shouldn't Happen!")), 2)
for est in affected_ests:
- LOGGER.debug("removing reference to %s in estimate %s"% (
+ LOGGER.debug("removing reference to %s in estimate %s" % (
tx_hash, est))
est.tx_hashes.remove(tx_hash)
if est.tx_hashes == []:
@@ -839,31 +880,32 @@ def remove_treatments_from_plan_and_est(om_gui, treatments, completed=False):
pt.treatment_course.__dict__[p_att] = new_val
if re.match("[ul][lr[1-8]", att):
- plan = pt.treatment_course.__dict__["%spl"% att]
- cmp = pt.treatment_course.__dict__["%scmp"% att]
+ plan = pt.treatment_course.__dict__["%spl" % att]
+ cmp = pt.treatment_course.__dict__["%scmp" % att]
charts_gui.updateChartsAfterTreatment(om_gui, att, plan, cmp)
om_gui.updateDetails()
+
def remove_estimate_item(om_gui, est_item):
'''
the estimate_item has been deleted...
remove from the plan or completed also?
'''
- LOGGER.debug("Deleting estimate item %s"% est_item)
+ LOGGER.debug("Deleting estimate item %s" % est_item)
pt = om_gui.pt
found = False
for i, tx_hash in enumerate(est_item.tx_hashes):
- LOGGER.debug("est_item.tx_hash %d = %s" %(i, tx_hash))
+ LOGGER.debug("est_item.tx_hash %d = %s" % (i, tx_hash))
for hash_, att, treat_code in pt.tx_hash_tups:
- #LOGGER.debug("comparing %s with %s"% (hash_, tx_hash))
+ # LOGGER.debug("comparing %s with %s"% (hash_, tx_hash))
if hash_ == tx_hash.hash:
found = True
LOGGER.debug(
- " MATCHING hash Found! removing....'%s' '%s'"% (
- att, treat_code))
+ " MATCHING hash Found! removing....'%s' '%s'" % (
+ att, treat_code))
att = localsettings.convert_deciduous(att)
@@ -883,13 +925,13 @@ def remove_estimate_item(om_gui, est_item):
else:
LOGGER.debug("not a special case")
remove_treatments_from_plan_and_est(om_gui,
- ((att, treat_code.strip(" ")),), tx_hash.completed)
+ ((att, treat_code.strip(" ")),), tx_hash.completed)
if not found:
LOGGER.debug("NO MATCHING hash FOUND!")
- om_gui.advise (u"%s - %s"%(
- _("couldn't pass on delete message for"), est_item.description)
- , 1)
+ om_gui.advise(u"%s - %s" % (
+ _("couldn't pass on delete message for"), est_item.description), 1)
+
def recalculate_estimate(om_gui):
'''
@@ -899,10 +941,10 @@ def recalculate_estimate(om_gui):
pt = om_gui.pt
dentid = pt.course_dentist
- LOGGER.info("USER IS RECALCULATING ESTIMATE FOR PATIENT %s"% pt.serialno)
+ LOGGER.info("USER IS RECALCULATING ESTIMATE FOR PATIENT %s" % pt.serialno)
- #drop all existing estimates except custom items.
- #and reverse fee for completed items.
+ # drop all existing estimates except custom items.
+ # and reverse fee for completed items.
cust_ests = []
for estimate in pt.estimates:
if estimate.is_custom:
@@ -933,11 +975,11 @@ def recalculate_estimate(om_gui):
if re.match("[ul][lr][1-8A-E]", att):
n_txs = None
else:
- duplicate_txs.append("%s%s"%(att, shortcut))
- n_txs = duplicate_txs.count("%s%s"%(att, shortcut))
+ duplicate_txs.append("%s%s" % (att, shortcut))
+ n_txs = duplicate_txs.count("%s%s" % (att, shortcut))
complex_addition_handled, shortcut = complex_shortcut_addition(
- om_gui, att, shortcut, n_txs, tx_hash, recalculating=True)
+ om_gui, att, shortcut, n_txs, tx_hash, recalculating=True)
if complex_addition_handled == FULLY_HANDLED:
LOGGER.debug("complex addition handled the estimate in entirety")
@@ -978,13 +1020,15 @@ def reverse_txs(om_gui, treatments, confirm_multiples=True):
deleted_treatments = []
for att, treatment in treatments:
- completed = pt.treatment_course.__dict__["%scmp"% att]
+ completed = pt.treatment_course.__dict__["%scmp" % att]
treat = treatment.strip(" ")
count = completed.split(" ").count(treat)
LOGGER.debug(
- "creating tx_hash using %s %s %s"% (att, count, treat))
- hash_ = localsettings.hash_func("%s%s%s%s"%(courseno, att, count, treat))
+ "creating tx_hash using %s %s %s" % (att, count, treat))
+ hash_ = localsettings.hash_func(
+ "%s%s%s%s" %
+ (courseno, att, count, treat))
tx_hash = TXHash(hash_)
tx_hash_reverse(om_gui, tx_hash)
@@ -993,6 +1037,7 @@ def reverse_txs(om_gui, treatments, confirm_multiples=True):
remove_treatments_from_plan_and_est(
om_gui, ((att, treat.strip(" ")),), completed)
+
def complete_txs(om_gui, treatments, confirm_multiples=True):
'''
complete tooth treatment
@@ -1018,14 +1063,16 @@ def complete_txs(om_gui, treatments, confirm_multiples=True):
deleted_treatments = []
for att, treatment in treatments:
- existingcompleted = pt.treatment_course.__dict__["%scmp"% att]
+ existingcompleted = pt.treatment_course.__dict__["%scmp" % att]
newcompleted = existingcompleted + treatment
treat = treatment.strip(" ")
count = newcompleted.split(" ").count(treat)
LOGGER.debug(
- "creating tx_hash using %s %s %s"% (att, count, treat))
- hash_ = localsettings.hash_func("%s%s%s%s"%(courseno, att, count, treat))
+ "creating tx_hash using %s %s %s" % (att, count, treat))
+ hash_ = localsettings.hash_func(
+ "%s%s%s%s" %
+ (courseno, att, count, treat))
tx_hash = TXHash(hash_)
tx_hash_complete(om_gui, tx_hash)
@@ -1034,6 +1081,7 @@ def complete_txs(om_gui, treatments, confirm_multiples=True):
remove_treatments_from_plan_and_est(
om_gui, ((att, treat.strip(" ")),), completed)
+
def tx_hash_complete(om_gui, tx_hash):
'''
reponds to a signal when the user completes an item of treatment by
@@ -1044,11 +1092,11 @@ def tx_hash_complete(om_gui, tx_hash):
pt = om_gui.pt
found = False
for hash_, att, treat_code in pt.tx_hash_tups:
- #print "comparing %s with %s"% (hash_, tx_hash)
+ # print "comparing %s with %s"% (hash_, tx_hash)
if hash_ == tx_hash:
found = True
- #convert back from deciduous here
+ # convert back from deciduous here
att = localsettings.convert_deciduous(att)
plan = pt.treatment_course.__dict__[att + "pl"].replace(
treat_code, "", 1)
@@ -1064,10 +1112,10 @@ def tx_hash_complete(om_gui, tx_hash):
toothName = pt.chartgrid.get(att, "").upper()
pt.addHiddenNote(
- "chart_treatment", "%s %s"% (toothName, treat_code))
+ "chart_treatment", "%s %s" % (toothName, treat_code))
elif att in ("xray", "perio"):
- pt.addHiddenNote("%s_treatment"%att, treat_code)
+ pt.addHiddenNote("%s_treatment" % att, treat_code)
else:
pt.addHiddenNote("treatment", treat_code)
@@ -1075,8 +1123,8 @@ def tx_hash_complete(om_gui, tx_hash):
break
if not found:
- msg = "Error moving %s from plan to completed"% tx_hash
- om_gui.advise("<p>%s</p><hr />This shouldn't happen!"% msg, 2)
+ msg = "Error moving %s from plan to completed" % tx_hash
+ om_gui.advise("<p>%s</p><hr />This shouldn't happen!" % msg, 2)
return
found = False
@@ -1087,11 +1135,11 @@ def tx_hash_complete(om_gui, tx_hash):
est_tx_hash.completed = True
if treat_code.strip(" ") == "!FEE":
om_gui.addNewNote(
- "%s %s\n"% (_("Completed"), estimate.description))
+ "%s %s\n" % (_("Completed"), estimate.description))
if not found:
- msg = "This item '%s' was not found in the patient's estimate"% tx_hash
- om_gui.advise("<p>%s</p><hr />This shouldn't happen!"% msg, 2)
+ msg = "This item '%s' was not found in the patient's estimate" % tx_hash
+ om_gui.advise("<p>%s</p><hr />This shouldn't happen!" % msg, 2)
return
om_gui.ui.toothPropsWidget.setTooth(
@@ -1101,6 +1149,7 @@ def tx_hash_complete(om_gui, tx_hash):
om_gui.ui.estWidget.resetEstimate()
om_gui.updateDetails()
+
def tx_hash_reverse(om_gui, tx_hash):
'''
reponds to a signal when the user completes an item of treatment by
@@ -1111,7 +1160,7 @@ def tx_hash_reverse(om_gui, tx_hash):
pt = om_gui.pt
found = False
for hash_, att, treat_code in pt.tx_hash_tups:
- LOGGER.debug("comparing %s with %s"% (hash_, tx_hash))
+ LOGGER.debug("comparing %s with %s" % (hash_, tx_hash))
if hash_ == tx_hash:
found = True
@@ -1128,7 +1177,7 @@ def tx_hash_reverse(om_gui, tx_hash):
break
break
- #convert back from deciduous here
+ # convert back from deciduous here
att = localsettings.convert_deciduous(att)
old_completed = pt.treatment_course.__dict__[att + "cmp"]
@@ -1136,30 +1185,30 @@ def tx_hash_reverse(om_gui, tx_hash):
pt.treatment_course.__dict__[att + "cmp"] = new_completed
old_plan = pt.treatment_course.__dict__[att + "pl"]
- #doubly cautious here to ensure single space separation
- new_plan = "%s %s "% (old_plan.strip(" "), treat_code.strip(" "))
+ # doubly cautious here to ensure single space separation
+ new_plan = "%s %s " % (old_plan.strip(" "), treat_code.strip(" "))
pt.treatment_course.__dict__[att + "pl"] = new_plan
if re.findall("[ul][lr][1-8]", att):
charts_gui.updateChartsAfterTreatment(
om_gui, att, new_plan, new_completed)
- toothName = pt.chartgrid.get(att,"").upper()
+ toothName = pt.chartgrid.get(att, "").upper()
pt.addHiddenNote(
- "chart_treatment", "%s %s"% (toothName, treat_code),
+ "chart_treatment", "%s %s" % (toothName, treat_code),
attempt_delete=True)
elif att in ("xray", "perio"):
- pt.addHiddenNote("%s_treatment"%att, treat_code,
- attempt_delete=True)
+ pt.addHiddenNote("%s_treatment" % att, treat_code,
+ attempt_delete=True)
else:
pt.addHiddenNote("treatment", treat_code,
- attempt_delete=True)
+ attempt_delete=True)
break
if not found:
- msg = "Error moving %s from completed to plan"% tx_hash
- om_gui.advise("<p>%s</p><p>This shouldn't happen</p>"% msg, 1)
+ msg = "Error moving %s from completed to plan" % tx_hash
+ om_gui.advise("<p>%s</p><p>This shouldn't happen</p>" % msg, 1)
for estimate in pt.estimates:
for est_tx_hash in estimate.tx_hashes:
@@ -1179,7 +1228,7 @@ if __name__ == "__main__":
localsettings.initiate()
localsettings.loadFeeTables()
- localsettings.station="reception"
+ localsettings.station = "reception"
from openmolar.qt4gui import maingui
from openmolar.dbtools import patient_class
@@ -1188,8 +1237,8 @@ if __name__ == "__main__":
app = QtGui.QApplication([])
mw = maingui.OpenmolarGui()
mw.getrecord(11956)
- #disable the functions called
- mw.load_newEstPage = lambda : None
+ # disable the functions called
+ mw.load_newEstPage = lambda: None
xrayAdd(mw)
perioAdd(mw)
diff --git a/src/openmolar/qt4gui/fees/treatment_list_models.py b/src/openmolar/qt4gui/fees/treatment_list_models.py
index 2e1876b..6c0d8c4 100644
--- a/src/openmolar/qt4gui/fees/treatment_list_models.py
+++ b/src/openmolar/qt4gui/fees/treatment_list_models.py
@@ -1,52 +1,57 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import re
from PyQt4 import QtGui, QtCore
+
class TreatmentListModel(QtCore.QAbstractListModel):
+
'''
A simple model used to populate a combobox to select how the
appointment books are managed.
'''
+
def __init__(self, parent=None):
QtCore.QAbstractListModel.__init__(self, parent)
self.om_gui = parent
- def rowCount(self, parent = QtCore.QModelIndex()):
+ def rowCount(self, parent=QtCore.QModelIndex()):
return len(self._list)
@property
def _list(self):
return (["please", "overwrite", "TreatmentListModel._list",
- "when", "subclassing!"])
+ "when", "subclassing!"])
def data(self, index, role):
if not index.isValid():
pass
elif role == QtCore.Qt.DisplayRole:
att, tx = self._list[index.row()]
- return "%s %s"% (att.ljust(8), tx)
+ return "%s %s" % (att.ljust(8), tx)
return QtCore.QVariant()
def att_vals(self, index):
@@ -64,20 +69,24 @@ class TreatmentListModel(QtCore.QAbstractListModel):
return att, values
+
class PlannedTreatmentListModel(TreatmentListModel):
+
@property
def _list(self):
- #if self.om_gui is None or self.om_gui.pt is None:
+ # if self.om_gui is None or self.om_gui.pt is None:
# return []
try:
return self.om_gui.pt.treatment_course.non_tooth_plan_items
except AttributeError:
return []
+
class CompletedTreatmentListModel(TreatmentListModel):
+
@property
def _list(self):
- #if self.om_gui is None or self.om_gui.pt is None:
+ # if self.om_gui is None or self.om_gui.pt is None:
# return []
try:
return self.om_gui.pt.treatment_course.non_tooth_cmp_items
diff --git a/src/openmolar/qt4gui/feescale_editor/__init__.py b/src/openmolar/qt4gui/feescale_editor/__init__.py
index ce39028..6aede23 100644
--- a/src/openmolar/qt4gui/feescale_editor/__init__.py
+++ b/src/openmolar/qt4gui/feescale_editor/__init__.py
@@ -1 +1,25 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
from feescale_editor import FeescaleEditor
diff --git a/src/openmolar/qt4gui/feescale_editor/feescale_choice_dialog.py b/src/openmolar/qt4gui/feescale_editor/feescale_choice_dialog.py
index ee06db9..1718958 100644
--- a/src/openmolar/qt4gui/feescale_editor/feescale_choice_dialog.py
+++ b/src/openmolar/qt4gui/feescale_editor/feescale_choice_dialog.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from functools import partial
@@ -26,7 +28,9 @@ from PyQt4 import QtCore, QtGui
from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
class ChoiceDialog(BaseDialog):
+
def __init__(self, message, list_, parent=None):
BaseDialog.__init__(self, parent, remove_stretch=True)
self.setWindowTitle(_("Feescale Choice Dialog"))
@@ -66,4 +70,4 @@ if __name__ == "__main__":
app = QtGui.QApplication([])
dl = ChoiceDialog("Make a choice", ["A", "B", "C"])
if dl.exec_():
- print dl.chosen_index
\ No newline at end of file
+ print dl.chosen_index
diff --git a/src/openmolar/qt4gui/feescale_editor/feescale_compare_items_dockwidget.py b/src/openmolar/qt4gui/feescale_editor/feescale_compare_items_dockwidget.py
index 99785e9..c9a4cfd 100644
--- a/src/openmolar/qt4gui/feescale_editor/feescale_compare_items_dockwidget.py
+++ b/src/openmolar/qt4gui/feescale_editor/feescale_compare_items_dockwidget.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import re
@@ -29,7 +31,9 @@ from PyQt4 import QtCore, QtGui
from openmolar.qt4gui.feescale_editor.feescale_xml_editor import XMLEditor
LOGGER = logging.getLogger("openmolar")
+
class CompareWidget(QtGui.QWidget):
+
def __init__(self, parser, parent=None):
QtGui.QWidget.__init__(self, parent)
self.parser = parser
@@ -47,7 +51,9 @@ class CompareWidget(QtGui.QWidget):
else:
self.xml_editor.setText(_("No Match Found"))
+
class CompareItemsDockWidget(QtGui.QDockWidget):
+
def __init__(self, parsers, parent=None):
QtGui.QDockWidget.__init__(self, parent)
@@ -70,18 +76,19 @@ class CompareItemsDockWidget(QtGui.QDockWidget):
if __name__ == "__main__":
class _MockNode(object):
+
def toxml(self):
return "Mock Node"
class _MockParser(object):
label_text = "Mock"
+
def itemnode_from_id(self, id, ignore_prefix):
return _MockNode()
-
mp1, mp2 = _MockParser(), _MockParser()
LOGGER.setLevel(logging.DEBUG)
app = QtGui.QApplication(sys.argv)
cidw = CompareItemsDockWidget([mp1, mp2])
cidw.show()
- app.exec_()
\ No newline at end of file
+ app.exec_()
diff --git a/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py b/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py
index b5a33ab..4d950de 100644
--- a/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py
+++ b/src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import difflib
import logging
@@ -35,7 +37,9 @@ LOGGER = logging.getLogger("openmolar")
from feescale_xml_editor import XMLEditor
+
class DiffDialog(BaseDialog):
+
def __init__(self, text1, text2, parent=None):
BaseDialog.__init__(self, parent, remove_stretch=True)
self.text1 = text1
@@ -79,7 +83,7 @@ class DiffDialog(BaseDialog):
splitter = QtGui.QSplitter()
splitter.addWidget(self.xml_editor1)
splitter.addWidget(self.xml_editor2)
- #splitter.setSizes([150, 650])
+ # splitter.setSizes([150, 650])
self.insertWidget(self.main_toolbar)
self.insertWidget(splitter)
@@ -91,7 +95,7 @@ class DiffDialog(BaseDialog):
self.load_diffs()
def sizeHint(self):
- return QtCore.QSize(800,500)
+ return QtCore.QSize(800, 500)
def text_editors_to_unidiff_mode(self, unidiff_mode=True):
for editor in (self.xml_editor1, self.xml_editor2):
@@ -111,7 +115,7 @@ class DiffDialog(BaseDialog):
diffs = difflib.unified_diff(
self.text1.splitlines(True),
self.text2.splitlines(True), n=PADDING
- )
+ )
for line_ in diffs:
if line_.strip() in ("---", "+++"):
@@ -120,13 +124,13 @@ class DiffDialog(BaseDialog):
LOGGER.debug(line_.strip())
m = re.match("@@ \-(\d+),?(\d+)? \+(\d+),?(\d+)? @@", line_)
if m:
- LOGGER.debug("match! %s"% str(m.groups()))
+ LOGGER.debug("match! %s" % str(m.groups()))
if (line_no1 + line_no2) != 0:
text1 += "\n\n"
text2 += "\n\n"
line_no1 += 2
line_no2 += 2
- #create tuple start, end, mapping
+ # create tuple start, end, mapping
start_ = int(m.groups()[0])
try:
end_ = start_ + int(m.groups()[1])
@@ -150,7 +154,7 @@ class DiffDialog(BaseDialog):
formatted_line = (line_)[1:]
line_no1 += 1
else:
- formatted_line =line_
+ formatted_line = line_
line_no1 += 1
line_no2 += 1
@@ -160,22 +164,22 @@ class DiffDialog(BaseDialog):
text1 += formatted_line
pad_lines = len(text1.splitlines()) - len(text2.splitlines())
- pad1 = pad_lines if pad_lines >0 else 0
- pad2 = -pad_lines if pad_lines <0 else 0
+ pad1 = pad_lines if pad_lines > 0 else 0
+ pad2 = -pad_lines if pad_lines < 0 else 0
self.xml_editor1.setText(text1 + ("\n" * pad1))
self.xml_editor2.setText(text2 + ("\n" * pad2))
for lineno_start, lineno_end, offset in highlights1:
for i, line_no in enumerate(range(lineno_start, lineno_end)):
- self.xml_editor1.setMarginText(offset+i, "%d"%(line_no), 0)
+ self.xml_editor1.setMarginText(offset + i, "%d" % (line_no), 0)
for lineno in arrows1:
self.xml_editor1.highlight_line(lineno)
for lineno_start, lineno_end, offset in highlights2:
for i, line_no in enumerate(range(lineno_start, lineno_end)):
- self.xml_editor2.setMarginText(offset+i, "%d"%(line_no), 0)
+ self.xml_editor2.setMarginText(offset + i, "%d" % (line_no), 0)
for lineno in arrows2:
self.xml_editor2.highlight_line(lineno)
@@ -189,14 +193,14 @@ class DiffDialog(BaseDialog):
PADDING = 4
lines1 = self.text1.splitlines(True)
lines2 = self.text2.splitlines(True)
- diffs = difflib.unified_diff(lines1, lines2 , n=PADDING)
+ diffs = difflib.unified_diff(lines1, lines2, n=PADDING)
for line_ in diffs:
if line_.strip() in ("---", "+++"):
continue
m = re.match("@@ \-(\d+),?(\d+)? \+(\d+),?(\d+)? @@", line_)
if m:
- #create tuple start, end
+ # create tuple start, end
text1_start = int(m.groups()[0])
try:
text1_end = text1_start + int(m.groups()[1])
@@ -224,30 +228,29 @@ class DiffDialog(BaseDialog):
offset2 += 1
pad_lines = len(lines2) - len(lines1)
- pad1 = pad_lines if pad_lines >0 else 0
- pad2 = -pad_lines if pad_lines <0 else 0
+ pad1 = pad_lines if pad_lines > 0 else 0
+ pad2 = -pad_lines if pad_lines < 0 else 0
self.xml_editor1.setText(self.text1 + ("\n" * pad1))
self.xml_editor2.setText(self.text2 + ("\n" * pad2))
- for lineno_start, lineno_end in highlights1:
+ for lineno_start, lineno_end in highlights1:
for line_no in range(lineno_start, lineno_end):
- self.xml_editor1.setMarginText(line_no, "%d"%(line_no), 0)
+ self.xml_editor1.setMarginText(line_no, "%d" % (line_no), 0)
for lineno in arrows1:
self.xml_editor1.highlight_line(lineno)
- for lineno_start, lineno_end in highlights2:
+ for lineno_start, lineno_end in highlights2:
for line_no in range(lineno_start, lineno_end):
- self.xml_editor2.setMarginText(line_no, "%d"%(line_no), 0)
+ self.xml_editor2.setMarginText(line_no, "%d" % (line_no), 0)
for lineno in arrows2:
self.xml_editor2.highlight_line(lineno)
-
def files_are_identical(self):
if (self.xml_editor1.text_object.text ==
- self.xml_editor2.text_object.text):
+ self.xml_editor2.text_object.text):
QtGui.QMessageBox.information(self, _("Information"),
- _("Files are identical"))
+ _("Files are identical"))
return True
def exec_(self):
@@ -261,7 +264,7 @@ if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
test_node = "<node>\n hello\n</node>\n"
orig = test_node * 10
- new = test_node * 4
+ new = test_node * 4
new += "<node>\n world\n</node>\n"
new += test_node * 2
new += "<node>\n <subnode>\n hello\n <subnode>\n</node>\n"
diff --git a/src/openmolar/qt4gui/feescale_editor/feescale_editor.py b/src/openmolar/qt4gui/feescale_editor/feescale_editor.py
index cfddefd..0b5fb23 100755
--- a/src/openmolar/qt4gui/feescale_editor/feescale_editor.py
+++ b/src/openmolar/qt4gui/feescale_editor/feescale_editor.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from functools import partial
import logging
@@ -35,7 +37,7 @@ LOGGER = logging.getLogger("openmolar")
try:
from collections import OrderedDict
except ImportError:
- #OrderedDict only came in python 2.7
+ # OrderedDict only came in python 2.7
LOGGER.warning("using openmolar.backports for OrderedDict")
from openmolar.backports import OrderedDict
@@ -49,10 +51,12 @@ from feescale_choice_dialog import ChoiceDialog
from openmolar.dbtools.feescales import feescale_handler, FEESCALE_DIR
+
class ControlPanel(QtGui.QTabWidget):
item_selected = QtCore.pyqtSignal(object)
shortcut_selected = QtCore.pyqtSignal(object)
compare_item_signal = QtCore.pyqtSignal(object)
+
def __init__(self, parent=None):
QtGui.QTabWidget.__init__(self, parent)
self.items_list_view = QtGui.QListView()
@@ -72,7 +76,7 @@ class ControlPanel(QtGui.QTabWidget):
list_model = ComplexShortcutsListModel(parser)
self.complex_shortcuts_list_view.setModel(list_model)
self.complex_shortcuts_list_view.selectionModel(
- ).currentRowChanged.connect(self._shortcut_selected)
+ ).currentRowChanged.connect(self._shortcut_selected)
def _item_selected(self, new_index, old_index):
self.item_selected.emit(new_index)
@@ -84,10 +88,10 @@ class ControlPanel(QtGui.QTabWidget):
id = self.items_list_view.model().id_from_index(index)
qmenu = QtGui.QMenu(self)
- compare_action = QtGui.QAction("%s %s %s"%(_("Compare"),
- id, _("with similar ids in other feescales")), self)
+ compare_action = QtGui.QAction("%s %s %s" % (_("Compare"),
+ id, _("with similar ids in other feescales")), self)
cancel_action = QtGui.QAction(_("Cancel"), self)
- #not connected to anything.. f clicked menu will simply die!
+ # not connected to anything.. f clicked menu will simply die!
compare_action.triggered.connect(
partial(self.compare_item_signal.emit, id))
@@ -163,7 +167,7 @@ class FeescaleEditor(QtGui.QMainWindow):
icon = QtGui.QIcon(":database.png")
action_pull = QtGui.QAction(icon, _("Pull"), self)
action_pull.setToolTip(
- _("generate local files containing the database feescales"))
+ _("generate local files containing the database feescales"))
icon = QtGui.QIcon(":database.png")
action_commit = QtGui.QAction(icon, _("Commit"), self)
@@ -190,7 +194,7 @@ class FeescaleEditor(QtGui.QMainWindow):
action_find = QtGui.QAction(icon, _("Find"), self)
action_find.setShortcut("Ctrl+F")
action_find.setToolTip(
- _("Search current file for first forward match of entered text"))
+ _("Search current file for first forward match of entered text"))
action_find_again = QtGui.QAction(icon, _("Find Again"), self)
action_find_again.setShortcut("Ctrl+G")
@@ -216,12 +220,12 @@ class FeescaleEditor(QtGui.QMainWindow):
action_diff = QtGui.QAction(_("Show Database Diff"), self)
action_diff.setToolTip(
- _("Show the diff between the current file and the "
+ _("Show the diff between the current file and the "
"corresponding file stored in the database"))
action_compare = QtGui.QAction(_("Compare 2 Feescales"), self)
action_compare.setToolTip(
- _("Show the diff between the current file and a selected other"))
+ _("Show the diff between the current file and a selected other"))
self.main_toolbar.addAction(action_pull)
self.main_toolbar.addAction(action_commit)
@@ -260,7 +264,8 @@ class FeescaleEditor(QtGui.QMainWindow):
self.action_refactor = QtGui.QAction(_("XML tidy"), self)
self.action_refactor.triggered.connect(self.refactor)
- self.action_check_parseable = QtGui.QAction(_("Check Well Formed"), self)
+ self.action_check_parseable = QtGui.QAction(
+ _("Check Well Formed"), self)
self.action_check_parseable.triggered.connect(self.check_parseable)
self.action_check_validity = QtGui.QAction(_("Check Validity"), self)
@@ -323,7 +328,7 @@ class FeescaleEditor(QtGui.QMainWindow):
m.setStandardButtons(QtGui.QMessageBox.NoButton)
m.setWindowTitle(_("advisory"))
m.setModal(False)
- QtCore.QTimer.singleShot(3*1000, m.accept)
+ QtCore.QTimer.singleShot(3 * 1000, m.accept)
m.show()
elif importance == 1:
LOGGER.info(message)
@@ -333,20 +338,20 @@ class FeescaleEditor(QtGui.QMainWindow):
QtGui.QMessageBox.warning(self, _("Error"), message)
def sizeHint(self):
- return QtCore.QSize(800,500)
+ return QtCore.QSize(800, 500)
def closeEvent(self, event=None):
'''
called when application closes.
'''
if self.is_dirty:
- message = u"<b>%s</b><hr />%s"%(
+ message = u"<b>%s</b><hr />%s" % (
_("WARNING - you have unsaved changes!"),
_("Are you sure you want to quit?"))
if QtGui.QMessageBox.question(self, _("Confirm"),
message,
- QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Cancel:
event.ignore()
return
@@ -364,12 +369,12 @@ class FeescaleEditor(QtGui.QMainWindow):
if parser in self._known_deleted_parsers:
pass
elif parser.is_deleted:
- message = u"%s<br />%s<hr />%s"% (parser.filepath,
+ message = u"%s<br />%s<hr />%s" % (parser.filepath,
_("has been deleted!"),
- _("Save now?") )
+ _("Save now?"))
if QtGui.QMessageBox.question(self, _("Question"),
message,
- QtGui.QMessageBox.Yes|QtGui.QMessageBox.No,
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
self.feescale_handler.save_xml(parser.ix, parser.text)
self.advise(_("File Saved"), 1)
@@ -377,17 +382,17 @@ class FeescaleEditor(QtGui.QMainWindow):
self._known_deleted_parsers.append(parser)
elif parser.is_externally_modified:
- message = u"%s<br />%s<hr />%s"% (parser.filepath,
+ message = u"%s<br />%s<hr />%s" % (parser.filepath,
_("has been modified!"),
- _("Do you want to reload now and lose current changes?") \
- if parser.is_dirty else _("Do you want to reload now?"))
+ _("Do you want to reload now and lose current changes?")
+ if parser.is_dirty else _("Do you want to reload now?"))
if QtGui.QMessageBox.question(self, _("Question"),
message,
- QtGui.QMessageBox.Yes|QtGui.QMessageBox.No,
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
LOGGER.debug(
- "reloading externally modified %s"% parser.filepath)
+ "reloading externally modified %s" % parser.filepath)
parser.refresh()
self.view_feescale(self.tab_widget.currentIndex())
@@ -409,7 +414,7 @@ class FeescaleEditor(QtGui.QMainWindow):
try:
fp.parse_file()
except:
- message = u"%s '%s'"% (_("unable to parse file"), filepath)
+ message = u"%s '%s'" % (_("unable to parse file"), filepath)
self.advise(message, 2)
LOGGER.exception(message)
@@ -435,7 +440,7 @@ class FeescaleEditor(QtGui.QMainWindow):
text = self.current_parser.text
self.text_editors[i].setText(text)
self.setWindowTitle(
- "%s - %s" %(self.window_title, self.current_parser.description))
+ "%s - %s" % (self.window_title, self.current_parser.description))
self.update_index()
else:
QtGui.QMessageBox.information(self, _("Information"),
@@ -446,7 +451,7 @@ class FeescaleEditor(QtGui.QMainWindow):
gets files from the database at startup
'''
unwritten, modified = \
- self.feescale_handler.non_existant_and_modified_local_files()
+ self.feescale_handler.non_existant_and_modified_local_files()
for xml_file in unwritten:
f = open(xml_file.filepath, "w")
@@ -456,10 +461,10 @@ class FeescaleEditor(QtGui.QMainWindow):
self._checking_files = True
for xml_file in modified:
- message = "%s '%s' %s<hr />%s"% (
- _("Local Feescale"), xml_file.filepath,
- _("differs from the database version"),
- _("Do you wish to overwrite it with the stored data?"))
+ message = "%s '%s' %s<hr />%s" % (
+ _("Local Feescale"), xml_file.filepath,
+ _("differs from the database version"),
+ _("Do you wish to overwrite it with the stored data?"))
mb = QtGui.QMessageBox(None)
mb.setWindowTitle(_("Confirm"))
@@ -473,7 +478,7 @@ class FeescaleEditor(QtGui.QMainWindow):
result = mb.exec_()
if result not in (mb.Ok, mb.Cancel):
- #show diff
+ # show diff
f = open(xml_file.filepath, "r")
local_data = f.read()
f.close()
@@ -512,7 +517,7 @@ class FeescaleEditor(QtGui.QMainWindow):
xml = re.sub(">[\s]*<", "><", xml)
dom = minidom.parseString(xml)
- #don't use setText here that updates orig_text and is_dirty won't work
+ # don't use setText here that updates orig_text and is_dirty won't work
self.text_edit.update_text(dom.toprettyxml())
def check_parseable(self, action=None, show_message=True):
@@ -523,7 +528,7 @@ class FeescaleEditor(QtGui.QMainWindow):
self.advise(_("feescale is well formed"), 1)
return True
except Exception as exc:
- self.advise(u"<b>%s</b><hr />%s"% (
+ self.advise(u"<b>%s</b><hr />%s" % (
_("feescale is not well formed"), exc.message), 2)
return False
@@ -533,15 +538,15 @@ class FeescaleEditor(QtGui.QMainWindow):
if result:
self.advise(_("feescale is valid"), 1)
else:
- self.advise(_(message), 1)
+ self.advise(message, 1)
def find_item(self, index):
item_count = 0
for lineno, line in enumerate(self.text_edit.text().split("\n")):
- if item_count == index.row()+1:
+ if item_count == index.row() + 1:
self.text_edit.setFocus(True)
- self.text_edit.setFirstVisibleLine(lineno-2)
- self.text_edit.setCursorPosition(lineno-1, 0)
+ self.text_edit.setFirstVisibleLine(lineno - 2)
+ self.text_edit.setCursorPosition(lineno - 1, 0)
self.text_edit.ensureCursorVisible()
break
@@ -559,7 +564,7 @@ class FeescaleEditor(QtGui.QMainWindow):
@property
def compare_items_dockwidget(self):
if self._compare_items_dockwidget is None:
- self._compare_items_dockwidget= CompareItemsDockWidget(
+ self._compare_items_dockwidget = CompareItemsDockWidget(
self.feescale_parsers.values(), self)
self.addDockWidget(QtCore.Qt.BottomDockWidgetArea,
self._compare_items_dockwidget)
@@ -568,9 +573,9 @@ class FeescaleEditor(QtGui.QMainWindow):
def find_shortcut(self, index):
count_ = 0
for lineno, line in enumerate(self.text_edit.text().split("\n")):
- if count_ == index.row()+1:
+ if count_ == index.row() + 1:
self.text_edit.setFocus(True)
- self.text_edit.setCursorPosition(lineno-1, 0)
+ self.text_edit.setCursorPosition(lineno - 1, 0)
self.text_edit.ensureCursorVisible()
break
@@ -587,8 +592,8 @@ class FeescaleEditor(QtGui.QMainWindow):
def find_again(self):
if not self.text_edit.findFirst(
- self.search_text, True, True, True, True):
- self.advise("'%s' %s"% (self.search_text, _("not found")))
+ self.search_text, True, True, True, True):
+ self.advise("'%s' %s" % (self.search_text, _("not found")))
def roundup_fees(self):
dl = RoundupFeesDialog(self)
@@ -623,15 +628,15 @@ class FeescaleEditor(QtGui.QMainWindow):
def zero_charges(self):
if QtGui.QMessageBox.question(self, _("Confirm"),
_("Zero all patient charges in the current feescale?"),
- QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel,
- QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Ok:
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Ok:
self.current_parser.zero_charges()
self.text_edit.setText(self.current_parser.text)
def save_files(self):
if QtGui.QMessageBox.question(self, _("confirm"),
_("Save all files?"),
- QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel
) == QtGui.QMessageBox.Cancel:
return
@@ -646,11 +651,11 @@ class FeescaleEditor(QtGui.QMainWindow):
parser.saved_xml = parser.text
parser.reset_orig_modified()
i += 1
- self.advise(u"%s %s"% (i, _("Files saved")), 1)
+ self.advise(u"%s %s" % (i, _("Files saved")), 1)
def save(self):
LOGGER.debug("save")
- self.save_as(filepath = self.current_parser.filepath)
+ self.save_as(filepath=self.current_parser.filepath)
def save_as(self, bool_=None, filepath=None):
'''
@@ -661,8 +666,8 @@ class FeescaleEditor(QtGui.QMainWindow):
try:
if filepath is None:
filepath = QtGui.QFileDialog.getSaveFileName(self,
- _("save as"),parser.filepath,
- "%s %s"% (_("xml_files"),"(*.xml)"))
+ _("save as"), parser.filepath,
+ "%s %s" % (_("xml_files"), "(*.xml)"))
if filepath == '':
return
if not re.match(".*\.xml$", filepath):
@@ -671,7 +676,7 @@ class FeescaleEditor(QtGui.QMainWindow):
f.write(parser.text)
f.close()
if filepath != parser.filepath:
- self.advise("%s %s"% (_("Copy saved to"), filepath), 1)
+ self.advise("%s %s" % (_("Copy saved to"), filepath), 1)
if os.path.dirname(filepath) == FEESCALE_DIR:
self.advise(_("Reload files to edit the new feescale"), 1)
else:
@@ -682,17 +687,17 @@ class FeescaleEditor(QtGui.QMainWindow):
self.advise(_("File Saved"), 1)
except Exception as exc:
LOGGER.exception("unable to save")
- self.advise(_("File not saved")+" - %s"% exc, 2)
+ self.advise(_("File not saved") + " - %s" % exc, 2)
def refresh_files(self):
if self.is_dirty and (
- QtGui.QMessageBox.question(self, _("confirm"),
- u"<b>%s</b><hr />%s"%(
- _("Warning - you have unsaved changes,"" "
+ QtGui.QMessageBox.question(self, _("confirm"),
+ u"<b>%s</b><hr />%s" % (
+ _("Warning - you have unsaved changes,"" "
"if you refresh now, these will be lost"),
_("Refresh anyway?")),
- QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel
- ) == QtGui.QMessageBox.Cancel):
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel
+ ) == QtGui.QMessageBox.Cancel):
return
for fp in self.feescale_parsers.values():
@@ -702,14 +707,14 @@ class FeescaleEditor(QtGui.QMainWindow):
def apply_changes(self):
if QtGui.QMessageBox.question(self, _("confirm"),
_("commit all local files to database?"),
- QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel
) == QtGui.QMessageBox.Ok:
message = self.feescale_handler.update_db_all()
LOGGER.info("message")
- self.advise("<pre>%s</pre>"% message, 1)
+ self.advise("<pre>%s</pre>" % message, 1)
def cursor_position_changed(self, row, col):
- self.cursor_pos_label.setText("Line %d, Column %d"% (row+1, col))
+ self.cursor_pos_label.setText("Line %d, Column %d" % (row + 1, col))
def text_changed(self):
new_text = self.text_edit.text()
@@ -741,12 +746,12 @@ class FeescaleEditor(QtGui.QMainWindow):
_("you have no other files available for comparison"))
return
- message = "%s<br /><b>%s (%s)</b><hr />%s"% (
- _("Which feescale would you like to compare "
+ message = "%s<br /><b>%s (%s)</b><hr />%s" % (
+ _("Which feescale would you like to compare "
"with the current feescale"),
- self.current_parser.ix,
- self.current_parser.description,
- _("Please make a choice"))
+ self.current_parser.ix,
+ self.current_parser.description,
+ _("Please make a choice"))
dl = ChoiceDialog(message, options, self)
if dl.exec_():
@@ -762,7 +767,7 @@ class FeescaleEditor(QtGui.QMainWindow):
try:
for parser in self.feescale_parsers.values():
if parser.is_dirty:
- LOGGER.debug("%s is dirty"% parser.filepath)
+ LOGGER.debug("%s is dirty" % parser.filepath)
return True
return False
except:
diff --git a/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py b/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py
index 90a3ad5..bec7ebf 100644
--- a/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py
+++ b/src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
from gettext import gettext as _
@@ -33,9 +35,11 @@ __all__ = [
"PercentageInputDialog",
"RoundupFeesDialog",
"ChargePercentageInputDialog"
- ]
+]
+
class _InputDialog(BaseDialog):
+
def __init__(self, parent=None):
BaseDialog.__init__(self, parent)
self.setWindowTitle(_("Input Required"))
@@ -61,7 +65,7 @@ class _InputDialog(BaseDialog):
return QtCore.QSize(300, 200)
def check_enable(self, value):
- self.enableApply(value!=0)
+ self.enableApply(value != 0)
@property
def value(self):
@@ -71,7 +75,9 @@ class _InputDialog(BaseDialog):
def alter_gross(self):
return not self.charge_radio_button.isChecked()
+
class PercentageInputDialog(_InputDialog):
+
def __init__(self, parent=None):
_InputDialog.__init__(self, parent)
self.label.setText(_("Please enter a percentage"))
@@ -88,17 +94,19 @@ class PercentageInputDialog(_InputDialog):
message = _("gross fees have been increased by")
else:
message = _("charges have been increased by")
- return "%s %.02f%%"% (message, self.percentage)
+ return "%s %.02f%%" % (message, self.percentage)
+
class RoundupFeesDialog(_InputDialog):
ROUND_UP = 0
ROUND_DOWN = 1
ROUND_NEAREST = 2
+
def __init__(self, parent=None):
_InputDialog.__init__(self, parent)
self.label.setText(_("Please enter the precision you require"))
self.spinbox.setPrefix(localsettings.formatMoney(0)[0])
- #self.spinbox.setValue(0.10)
+ # self.spinbox.setValue(0.10)
self.round_down_radio_button = QtGui.QRadioButton(_("round down"))
self.round_up_radio_button = QtGui.QRadioButton(_("round up"))
@@ -147,9 +155,11 @@ class RoundupFeesDialog(_InputDialog):
message2 = _("gross fees have been")
else:
message2 = _("charges have been")
- return "%s %s %.02f"% (message2, message1, self.value)
+ return "%s %s %.02f" % (message2, message1, self.value)
+
class ChargePercentageInputDialog(_InputDialog):
+
def __init__(self, parent=None):
_InputDialog.__init__(self, parent)
self.label.setText(_("Please enter a percentage"))
@@ -169,8 +179,8 @@ class ChargePercentageInputDialog(_InputDialog):
@property
def message(self):
- return "%s %s %s"% (
- _("charges set at"), self.percentage, _("of the fees"))
+ return "%s %s %s" % (
+ _("charges set at"), self.percentage, _("of the fees"))
@property
def leave_zero_charges_unchanged(self):
@@ -187,4 +197,4 @@ if __name__ == "__main__":
print dl.message
dl = ChargePercentageInputDialog()
if dl.exec_():
- print dl.message
\ No newline at end of file
+ print dl.message
diff --git a/src/openmolar/qt4gui/feescale_editor/feescale_list_model.py b/src/openmolar/qt4gui/feescale_editor/feescale_list_model.py
index cbe4b1c..ae0c889 100644
--- a/src/openmolar/qt4gui/feescale_editor/feescale_list_model.py
+++ b/src/openmolar/qt4gui/feescale_editor/feescale_list_model.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
@@ -26,7 +28,9 @@ from PyQt4 import QtCore
LOGGER = logging.getLogger("openmolar")
+
class ItemsListModel(QtCore.QAbstractListModel):
+
def __init__(self, feescale_parser):
QtCore.QAbstractListModel.__init__(self)
self.feescale_parser = feescale_parser
@@ -45,7 +49,9 @@ class ItemsListModel(QtCore.QAbstractListModel):
LOGGER.debug(index)
return self.feescale_parser.item_ids(index.row())
+
class ComplexShortcutsListModel(QtCore.QAbstractListModel):
+
def __init__(self, feescale_parser):
QtCore.QAbstractListModel.__init__(self)
self.feescale_parser = feescale_parser
@@ -59,4 +65,3 @@ class ComplexShortcutsListModel(QtCore.QAbstractListModel):
def data(self, index, role):
if role == QtCore.Qt.DisplayRole:
return self.feescale_parser.complex_shortcut_text(index.row())
-
diff --git a/src/openmolar/qt4gui/feescale_editor/feescale_parser.py b/src/openmolar/qt4gui/feescale_editor/feescale_parser.py
index 6504a39..816d0a3 100755
--- a/src/openmolar/qt4gui/feescale_editor/feescale_parser.py
+++ b/src/openmolar/qt4gui/feescale_editor/feescale_parser.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
import os
@@ -27,9 +29,9 @@ from xml.dom import minidom
from PyQt4 import QtCore
from PyQt4.QtXmlPatterns import (
- QXmlSchemaValidator,
- QXmlSchema,
- QAbstractMessageHandler)
+ QXmlSchemaValidator,
+ QXmlSchema,
+ QAbstractMessageHandler)
from openmolar.settings.localsettings import resources_location
@@ -38,32 +40,38 @@ LOGGER = logging.getLogger("openmolar")
STYLESHEET = os.path.join(
resources_location, "feescales", "feescale_schema.xsd")
+
class MessageHandler(QAbstractMessageHandler):
last_error = ""
+
def __init__(self, parent=None):
QAbstractMessageHandler.__init__(self, parent)
def handleMessage(self, type_, descr, id_, source):
- position = "line %s column %d"% (source.line(), source.column())
+ position = "line %s column %d" % (source.line(), source.column())
- LOGGER.debug("xml message - type = '%s'"% type_)
- LOGGER.debug("xml message - description = '%s'"% descr)
- LOGGER.debug("xml message - id = '%s'"% id_)
- LOGGER.debug("xml message - source = %s"% position)
+ LOGGER.debug("xml message - type = '%s'" % type_)
+ LOGGER.debug("xml message - description = '%s'" % descr)
+ LOGGER.debug("xml message - id = '%s'" % id_)
+ LOGGER.debug("xml message - source = %s" % position)
- self.last_error = descr.replace("</body>", "<p>%s</p></body>"% position)
+ self.last_error = descr.replace(
+ "</body>", "<p>%s</p></body>" %
+ position)
def reset(self):
self.last_error = ""
+
class FeescaleParser(object):
+
def __init__(self, filepath, ix):
self._edited_text = None
self._items = None
self._c_scuts = None
self.filepath = filepath
self.ix = ix
- LOGGER.info("parsing feescale %s"% filepath)
+ LOGGER.info("parsing feescale %s" % filepath)
self.orig_modified = self.last_modified
self.dom = minidom.Document()
self.dom.appendChild(self.dom.createElement("feescale"))
@@ -81,17 +89,16 @@ class FeescaleParser(object):
f = open(self.filepath, "r")
self._edited_text = f.read()
f.close()
- LOGGER.exception("unable to parse %s"% self.filepath)
+ LOGGER.exception("unable to parse %s" % self.filepath)
raise exc
@property
def label_text(self):
- return "%s %d"% (_("feescale"), self.ix)
+ return "%s %d" % (_("feescale"), self.ix)
@property
def detailed_label_text(self):
- return "%s %s"% (self.label_text, self.tablename)
-
+ return "%s %s" % (self.label_text, self.tablename)
@property
def is_externally_modified(self):
@@ -109,7 +116,7 @@ class FeescaleParser(object):
self.orig_modified = self.last_modified
def refresh(self):
- LOGGER.info("refreshing feescale %s"% self.filepath)
+ LOGGER.info("refreshing feescale %s" % self.filepath)
self._edited_text = None
self._items = None
self.dom = minidom.parse(self.filepath)
@@ -123,6 +130,8 @@ class FeescaleParser(object):
'''
self.message_handler.reset()
+ LOGGER.debug("checking phrasebook xml against %s"% STYLESHEET)
+
f = QtCore.QFile(STYLESHEET)
f.open(QtCore.QIODevice.ReadOnly)
schema = QXmlSchema()
@@ -133,22 +142,21 @@ class FeescaleParser(object):
result = validator.validate(xml)
if result:
- LOGGER.debug(
- "Feescale complies with stylesheet!")
+ LOGGER.debug("Feescale complies with stylesheet!")
else:
LOGGER.warning(
- "Feescale does not comply with stylesheet %s"% STYLESHEET)
+ "Feescale does not comply with stylesheet %s" % STYLESHEET)
return (result, self.message_handler.last_error)
def is_valid(self):
- LOGGER.debug("checking validity of %s"% self.dom)
+ LOGGER.debug("checking validity of %s" % self.dom)
return self.check_validity(self.text)
@property
def items(self):
if self._items is None:
self._items = self.dom.getElementsByTagName("item")
- LOGGER.debug("%d items"% len(self._items))
+ LOGGER.debug("%d items" % len(self._items))
return self._items
def item_ids(self, index):
@@ -167,7 +175,7 @@ class FeescaleParser(object):
return s.groups()[1]
if ignore_prefix:
id = re.sub("([^\d]*)(\d+)$", remove_prefix, id)
- LOGGER.debug("looking for %s"% id)
+ LOGGER.debug("looking for %s" % id)
for itemnode in self.items:
node_id = itemnode.getAttribute("id")
if ignore_prefix:
@@ -179,7 +187,7 @@ class FeescaleParser(object):
def complex_shortcuts(self):
if self._c_scuts is None:
self._c_scuts = self.dom.getElementsByTagName("complex_shortcut")
- LOGGER.debug("%d complex shortcuts"% len(self._c_scuts))
+ LOGGER.debug("%d complex shortcuts" % len(self._c_scuts))
return self._c_scuts
@property
@@ -193,16 +201,17 @@ class FeescaleParser(object):
def roundup_fees(self, precision, up=False, down=False, att="gross"):
LOGGER.debug((precision, up, down, att))
+
def round_to_value(pence, r_up=False, r_down=False):
- offset = pence%precision
+ offset = pence % precision
LOGGER.debug(offset)
if offset == 0:
return int(pence)
if r_up:
- return int(pence + (precision-offset))
+ return int(pence + (precision - offset))
if r_down:
return int(pence - offset)
- if offset < (precision+1)//2:
+ if offset < (precision + 1) // 2:
return round_to_value(pence, r_down=True)
else:
return round_to_value(pence, r_up=True)
@@ -210,8 +219,8 @@ class FeescaleParser(object):
for node in self.dom.getElementsByTagName(att):
fee = node.firstChild.data
new_fee = str(round_to_value(int(fee), up, down))
- message = "%s %s changed to %s"% (
- att.ljust(8, " "), fee.rjust(8," "), new_fee.rjust(8," "))
+ message = "%s %s changed to %s" % (
+ att.ljust(8, " "), fee.rjust(8, " "), new_fee.rjust(8, " "))
node.firstChild.replaceWholeText(new_fee)
self._edited_text = None
@@ -222,26 +231,26 @@ class FeescaleParser(object):
def increase_fees(self, percentage, att="gross"):
def increase(pence):
- return int((pence * mult)//100)
+ return int((pence * mult) // 100)
mult = 100 + percentage
for node in self.dom.getElementsByTagName(att):
fee = node.firstChild.data
new_fee = str(increase(int(fee)))
- message = "%s %s increased to %s"% (
- att.ljust(8, " "), fee.rjust(8," "), new_fee.rjust(8," "))
+ message = "%s %s increased to %s" % (
+ att.ljust(8, " "), fee.rjust(8, " "), new_fee.rjust(8, " "))
node.firstChild.replaceWholeText(new_fee)
LOGGER.debug(message)
self._edited_text = None
LOGGER.info(
- "%s %s fees increased by %s%%"% (self.description, att, percentage))
+ "%s %s fees increased by %s%%" % (self.description, att, percentage))
def relate_charges_to_gross_fees(self, percentage,
- leave_zeros_untouched=False):
+ leave_zeros_untouched=False):
def get_charge(pence):
- return int(pence*percentage//100)
+ return int(pence * percentage // 100)
for node in self.dom.getElementsByTagName("gross"):
charge_nodes = node.parentNode.getElementsByTagName("charge")
@@ -253,8 +262,8 @@ class FeescaleParser(object):
if charge == "0" and leave_zeros_untouched:
continue
new_charge = str(get_charge(int(fee)))
- message = "Fee %s has a charge of %s"% (
- fee.rjust(8," "), new_charge.rjust(8," "))
+ message = "Fee %s has a charge of %s" % (
+ fee.rjust(8, " "), new_charge.rjust(8, " "))
charge_node.firstChild.replaceWholeText(new_charge)
LOGGER.debug(message)
@@ -267,7 +276,7 @@ class FeescaleParser(object):
node.firstChild.replaceWholeText("0")
self._edited_text = None
- LOGGER.info("%s patient charges zeroed"% self.description)
+ LOGGER.info("%s patient charges zeroed" % self.description)
@property
def tablename(self):
@@ -282,7 +291,7 @@ class FeescaleParser(object):
def description(self):
try:
description_nodes = self.dom.getElementsByTagName(
- "feescale_description")
+ "feescale_description")
return description_nodes[0].childNodes[0].data
except:
LOGGER.exception("unable to get description from Feescale Parser")
@@ -296,14 +305,14 @@ class FeescaleParser(object):
"description")[0].firstChild.data
except AttributeError:
name = ""
- return "%s - %s"% (id_, name)
+ return "%s - %s" % (id_, name)
def complex_shortcut_text(self, index):
node = self.complex_shortcuts[index]
shortcut_node = node.getElementsByTagName("shortcut")[0]
att = shortcut_node.getAttribute("att")
shortcut = shortcut_node.firstChild.data
- return "%s - %s"% (att, shortcut)
+ return "%s - %s" % (att, shortcut)
def set_edited_text(self, text):
self._edited_text = unicode(text)
@@ -330,6 +339,7 @@ class FeescaleParser(object):
def is_dirty(self):
return self.text != self.saved_xml
+
def _test():
LOGGER.debug("running _test")
diff --git a/src/openmolar/qt4gui/feescale_editor/feescale_xml_editor.py b/src/openmolar/qt4gui/feescale_editor/feescale_xml_editor.py
index 92944d8..15c6746 100644
--- a/src/openmolar/qt4gui/feescale_editor/feescale_xml_editor.py
+++ b/src/openmolar/qt4gui/feescale_editor/feescale_xml_editor.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
from gettext import gettext as _
@@ -28,7 +30,9 @@ from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
LOGGER = logging.getLogger("openmolar")
+
class TextObject(object):
+
def __init__(self, text):
self.orig_text = text
self._text = None
@@ -50,14 +54,16 @@ class TextObject(object):
def is_dirty(self):
return self.text != self.orig_text
+
class XMLEditor(Qsci.QsciScintilla):
MARKER_COLUMN = 8
editing_finished = QtCore.pyqtSignal(object)
+
def __init__(self, parent=None):
Qsci.QsciScintilla.__init__(self, parent)
self.setLexer(Qsci.QsciLexerXML())
self.text_object = TextObject("")
- self.highlight_index = self.indicatorDefine(
+ self.highlight_index = self.indicatorDefine(
self.RoundBoxIndicator, -1)
self.setIndicatorDrawUnder(True, self.highlight_index)
self.setIndicatorForegroundColor(
@@ -74,7 +80,7 @@ class XMLEditor(Qsci.QsciScintilla):
self.setMarginLineNumbers(0, True)
self.setMarginWidth(0, "00000")
self.setFolding(self.CircledTreeFoldStyle)
- #self.setWhitespaceVisibility(True)
+ # self.setWhitespaceVisibility(True)
self.markerDefine(Qsci.QsciScintilla.RightArrow, self.MARKER_COLUMN)
self.setMarkerBackgroundColor(
QtGui.QColor("#ee1111"), self.MARKER_COLUMN)
@@ -92,7 +98,7 @@ class XMLEditor(Qsci.QsciScintilla):
Qsci.QsciScintilla.setText(self, text)
def highlight_line(self, lineno):
- #LOGGER.debug("highlight line %d"% lineno)
+ # LOGGER.debug("highlight line %d"% lineno)
self.markerAdd(lineno, self.MARKER_COLUMN)
self.fillIndicatorRange(lineno, 0, lineno + 1, 0, self.highlight_index)
@@ -109,4 +115,4 @@ if __name__ == "__main__":
widg.show()
widg.setText("hello world")
app.exec_()
- print "Text modified = %s"% widg.is_dirty
\ No newline at end of file
+ print "Text modified = %s" % widg.is_dirty
diff --git a/src/openmolar/qt4gui/forum_gui_module.py b/src/openmolar/qt4gui/forum_gui_module.py
index d983aa1..7c9ceb9 100644
--- a/src/openmolar/qt4gui/forum_gui_module.py
+++ b/src/openmolar/qt4gui/forum_gui_module.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
provides the logic to manipulate the forum.
@@ -18,12 +34,14 @@ from openmolar.settings import localsettings
from openmolar.dbtools import forum
from openmolar.qt4gui.compiled_uis import Ui_forumPost
+
def checkForNewForumPosts(om_gui):
'''
checks for new forum posts every few minutes
'''
om_gui.showForumActivity(forum.newPosts())
+
def loadForum(om_gui):
'''
loads the forum
@@ -43,7 +61,7 @@ def loadForum(om_gui):
else:
posts = forum.getPosts(None, show_closed)
- parentItems = {None : twidg}
+ parentItems = {None: twidg}
#--set a boolean for alternating row colours
highlighted = True
@@ -66,65 +84,66 @@ def loadForum(om_gui):
item.setText(5, post.comment)
item.setText(6, post.briefcomment)
- #item.setData(7, QtCore.Qt.DisplayRole, post.parent_ix)
+ # item.setData(7, QtCore.Qt.DisplayRole, post.parent_ix)
- #if parentItem == twidg:
+ # if parentItem == twidg:
# highlighted = not highlighted
# if highlighted:
# bcolour = twidg.palette().base()
# else:
# bcolour = twidg.palette().alternateBase()
- #else:
- # bcolour = QtGui.QColor("red")#parentItem.background(0)
+ # else:
+ # bcolour = QtGui.QColor("red")#parentItem.background(0)
if parentItem == twidg:
item.setIcon(0, om_gui.ui.forumNewTopic_pushButton.icon())
for i in range(item.columnCount()):
- #item.setBackground(i,bcolour)
- if i == 4: #date
+ # item.setBackground(i,bcolour)
+ if i == 4: # date
if post.date > (localsettings.currentTime() -
- datetime.timedelta(hours = 36)):
+ datetime.timedelta(hours=36)):
item.setIcon(i, om_gui.ui.forumNewTopic_pushButton.icon())
item.setTextColor(i, QtGui.QColor("orange"))
- ##TODO - put in some code to set the text for "today"
- ##or yesterday etc...
+ # TODO - put in some code to set the text for "today"
+ # or yesterday etc...
if GROUP_TOPICS:
parentItems[post.ix] = item
twidg.expandAll()
-
+
twidg.setSortingEnabled(True)
- #if GROUP_TOPICS:
+ # if GROUP_TOPICS:
# twidg.sortByColumn(7)
- #else:
+ # else:
twidg.sortByColumn(4, QtCore.Qt.AscendingOrder)
for i in range(twidg.columnCount()):
twidg.resizeColumnToContents(i)
twidg.setColumnWidth(1, 0)
twidg.setColumnWidth(5, 0)
- #twidg.setColumnWidth(7, 0)
-
+ # twidg.setColumnWidth(7, 0)
+
om_gui.ui.forumDelete_pushButton.setEnabled(False)
om_gui.ui.forumReply_pushButton.setEnabled(False)
om_gui.ui.forumParent_pushButton.setEnabled(False)
#-- turn the tab red.
+
def forumItemSelected(om_gui):
'''
user has selected an item in the forum
'''
item = om_gui.ui.forum_treeWidget.currentItem()
-
+
datetext = item.data(4,
- QtCore.Qt.DisplayRole).toDateTime().toString("ddd d MMM h:mm")
+ QtCore.Qt.DisplayRole).toDateTime().toString("ddd d MMM h:mm")
- heading = "<b>Subject:\t%s<br />"% item.text(0)
- heading += "From:\t%s<br />"% item.text(2)
- heading += "To:\t%s<br />"% item.text(3)
- heading += "Date:\t%s</b>"% datetext
+ heading = "<b>Subject:\t%s<br />" % item.text(0)
+ heading += "From:\t%s<br />" % item.text(2)
+ heading += "To:\t%s<br />" % item.text(3)
+ heading += "Date:\t%s</b>" % datetext
message = item.text(5)
om_gui.ui.forum_label.setText(heading)
om_gui.ui.forum_textBrowser.setPlainText(message)
@@ -134,12 +153,12 @@ def forumItemSelected(om_gui):
if om_gui.forum_parenting_mode[0]:
parentix = int(item.text(1))
- forum.setParent(om_gui.forum_parenting_mode[1], parentix)
+ forum.setParent(om_gui.forum_parenting_mode[1], parentix)
om_gui.forum_parenting_mode = (False, None)
om_gui.ui.forumParent_pushButton.setStyleSheet("")
loadForum(om_gui)
-
-
+
+
def forumNewTopic(om_gui):
'''
create a new post
@@ -148,7 +167,7 @@ def forumNewTopic(om_gui):
dl = Ui_forumPost.Ui_Dialog()
dl.setupUi(Dialog)
dl.from_comboBox.addItems([localsettings.operator, "Anon"] +
- localsettings.allowed_logins)
+ localsettings.allowed_logins)
dl.to_comboBox.addItems(["ALL"] + localsettings.allowed_logins)
@@ -165,7 +184,7 @@ def forumNewTopic(om_gui):
post.topic = dl.topic_lineEdit.text().toAscii()
post.comment = dl.comment_textEdit.toPlainText().toAscii()
post.inits = dl.from_comboBox.currentText()
- if dl.to_comboBox.currentIndex !=0:
+ if dl.to_comboBox.currentIndex != 0:
post.recipient = dl.to_comboBox.currentText()
forum.commitPost(post)
loadForum(om_gui)
@@ -177,11 +196,11 @@ def forumDeleteItem(om_gui):
'''
items = om_gui.ui.forum_treeWidget.selectedItems()
number = len(items)
- if number >1:
+ if number > 1:
result = QtGui.QMessageBox.question(om_gui, "Confirm",
- _("Delete %d Posts?")% number,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ _("Delete %d Posts?") % number,
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
for item in items:
ix = int(item.text(1))
@@ -191,15 +210,17 @@ def forumDeleteItem(om_gui):
heading = item.text(0)
result = QtGui.QMessageBox.question(om_gui, "Confirm",
- _("Delete selected Post?")+"<br />'%s'"% heading,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ _("Delete selected Post?") +
+ "<br />'%s'" % heading,
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
ix = int(item.text(1))
forum.deletePost(ix)
loadForum(om_gui)
+
def forumReply(om_gui):
'''
reply to an item
@@ -207,13 +228,13 @@ def forumReply(om_gui):
item = om_gui.ui.forum_treeWidget.currentItem()
heading = item.text(0)
if heading[:2] != "re":
- heading = "re. "+heading
+ heading = "re. " + heading
Dialog = QtGui.QDialog(om_gui)
dl = Ui_forumPost.Ui_Dialog()
dl.setupUi(Dialog)
dl.topic_lineEdit.setText(heading)
dl.from_comboBox.addItems([localsettings.operator, "Anon"] +
- localsettings.allowed_logins)
+ localsettings.allowed_logins)
dl.to_comboBox.addItems(["ALL"] + localsettings.allowed_logins)
if Dialog.exec_():
@@ -227,6 +248,7 @@ def forumReply(om_gui):
forum.commitPost(post)
loadForum(om_gui)
+
def forumParent(om_gui):
'''
set a parent for the current post
@@ -238,12 +260,12 @@ def forumParent(om_gui):
om_gui.advise(_("Parenting Cancelled"))
om_gui.ui.forumParent_pushButton.setStyleSheet("")
return
-
+
om_gui.ui.forumParent_pushButton.setStyleSheet("background-color: red")
om_gui.advise(_("Click on the Parent Item"))
om_gui.forum_parenting_mode = (True, ix)
-
+
+
def viewFilterChanged(om_gui, chosen):
- #print "viewFilterChanged", chosen
+ # print "viewFilterChanged", chosen
loadForum(om_gui)
-
diff --git a/src/openmolar/qt4gui/maingui.py b/src/openmolar/qt4gui/maingui.py
index f5500e8..118dcb2 100755
--- a/src/openmolar/qt4gui/maingui.py
+++ b/src/openmolar/qt4gui/maingui.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
provides the main class which is my gui
@@ -20,7 +36,7 @@ import pickle
import re
import sys
import traceback
-import webbrowser #for email
+import webbrowser # for email
from functools import partial
@@ -56,39 +72,17 @@ from openmolar.qt4gui.compiled_uis import Ui_showMemo
#--custom dialog modules
-from openmolar.qt4gui.dialogs.exam_wizard import ExamWizard
-from openmolar.qt4gui.dialogs.hygTreatWizard import HygTreatWizard
-from openmolar.qt4gui.dialogs import medNotes
-from openmolar.qt4gui.dialogs import saveDiscardCancel
-from openmolar.qt4gui.dialogs import newBPE
from openmolar.qt4gui.dialogs import saveMemo
from openmolar.qt4gui.dialogs import permissions
from openmolar.qt4gui.dialogs import select_language
-from openmolar.qt4gui.dialogs.choose_tooth_dialog import ChooseToothDialog
-from openmolar.qt4gui.dialogs import clinician_select_dialog
-from openmolar.qt4gui.dialogs import assistant_select_dialog
+
+from openmolar.qt4gui.dialogs import *
+
from openmolar.qt4gui.phrasebook.phrasebook_dialog import PhraseBookDialog
from openmolar.qt4gui.phrasebook.phrasebook_dialog import PHRASEBOOKS
from openmolar.qt4gui.phrasebook.phrasebook_editor import PhrasebookEditor
-from openmolar.qt4gui.dialogs.recall_dialog import RecallDialog
-from openmolar.qt4gui.dialogs.child_smile_dialog import ChildSmileDialog
-from openmolar.qt4gui.dialogs.alter_todays_notes \
- import AlterTodaysNotesDialog
-from openmolar.qt4gui.dialogs.find_patient_dialog import FindPatientDialog
-from openmolar.qt4gui.dialogs.family_manage_dialog import LoadRelativesDialog
-
-from openmolar.qt4gui.dialogs import duplicate_receipt_dialog
-from openmolar.qt4gui.dialogs.auto_address_dialog import AutoAddressDialog
-from openmolar.qt4gui.dialogs.family_manage_dialog import FamilyManageDialog
-
-from openmolar.qt4gui.dialogs.nhs_forms_config_dialog \
- import NHSFormsConfigDialog
-from openmolar.qt4gui.dialogs.advanced_tx_planning_dialog \
- import AdvancedTxPlanningDialog
-from openmolar.qt4gui.dialogs.document_dialog import DocumentDialog
-
-#secondary applications
-from openmolar.qt4gui.tools import new_setup
+
+# secondary applications
from openmolar.qt4gui.tools import recordtools
#--database modules
@@ -107,6 +101,7 @@ from openmolar.dbtools import paymentHistory
from openmolar.dbtools import courseHistory
from openmolar.dbtools import estimatesHistory
from openmolar.dbtools import est_logger
+from openmolar.dbtools import daybook
from openmolar.dbtools.distinct_statuses import DistinctStatuses
@@ -140,10 +135,13 @@ from openmolar.qt4gui.customwidgets.static_control_panel \
LOGGER = logging.getLogger("openmolar")
LOGGER.setLevel(logging.INFO)
+
class OpenmolarGui(QtGui.QMainWindow):
fee_table_editor = None
fee_table_tester = None
phrasebook_editor = None
+ entering_new_patient = False
+
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_main.Ui_MainWindow()
@@ -154,13 +152,13 @@ class OpenmolarGui(QtGui.QMainWindow):
self.pt_diary_widget = PtDiaryWidget(self)
self.ui.pt_diary_groupBox.layout().addWidget(self.pt_diary_widget)
- self.ui.splitter_patient.setSizes([80,20])
+ self.ui.splitter_patient.setSizes([80, 20])
#--initiate a blank version of the patient class this
#--is used to check for state.
#--make a deep copy to check for changes
self.pt = patient_class.patient(0)
- self.selectedChartWidget = "st" #other values are "pl" or "cmp"
+ self.selectedChartWidget = "st" # other values are "pl" or "cmp"
self.editPageVisited = False
self.forum_notified = False
self.fee_models = []
@@ -177,6 +175,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.loadDentistComboboxes()
self.feestableLoaded = False
self.forum_parenting_mode = (False, None)
+ self.ui.new_patient_frame.hide()
self.ui.plan_listView.setModel(PlannedTreatmentListModel(self))
self.ui.plan_listView.setContextMenuPolicy(
@@ -186,9 +185,14 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.completed_listView.setContextMenuPolicy(
QtCore.Qt.CustomContextMenu)
- self.setWindowTitle("OpenMolar - %s '%s'"% (
+ self.setWindowTitle("OpenMolar - %s '%s'" % (
_("connected to"), database_name()))
+ # reimplement these functions to catch "clicked links"
+ self.ui.daybook_filters_frame.setEnabled(False)
+ self.ui.debugBrowser.setSource = self.set_browser_source
+ self.ui.daybookTextBrowser.setSource = self.set_browser_source
+
QtCore.QTimer.singleShot(500, self.set_operator_label)
QtCore.QTimer.singleShot(500, self.load_pt_statuses)
QtCore.QTimer.singleShot(1000, self.load_todays_patients_combobox)
@@ -207,22 +211,22 @@ class OpenmolarGui(QtGui.QMainWindow):
m.setStandardButtons(QtGui.QMessageBox.NoButton)
m.setWindowTitle(_("advisory"))
m.setModal(False)
- QtCore.QTimer.singleShot(3*1000, m.accept)
+ QtCore.QTimer.singleShot(3 * 1000, m.accept)
m.show()
- self.ui.statusbar.showMessage(arg, 5000) #5000 milliseconds=5secs
+ self.ui.statusbar.showMessage(arg, 5000) # 5000 milliseconds=5secs
elif warning_level == 1:
QtGui.QMessageBox.information(self, _("Advisory"), arg)
elif warning_level == 2:
- now=QtCore.QTime.currentTime()
+ now = QtCore.QTime.currentTime()
QtGui.QMessageBox.warning(self, _("Error"), arg)
#--for logging purposes
- print "%d:%02d ERROR MESSAGE"%(now.hour(), now.minute())
+ print "%d:%02d ERROR MESSAGE" % (now.hour(), now.minute())
print arg
def wait(self, waiting=True):
if waiting:
QtGui.QApplication.instance().setOverrideCursor(
- QtCore.Qt.WaitCursor)
+ QtCore.Qt.WaitCursor)
else:
QtGui.QApplication.instance().restoreOverrideCursor()
@@ -270,8 +274,8 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
called by menu - help - about openmolar
'''
- self.advise('''<p>%s</p><p>%s</p>'''%(localsettings.about(),
- localsettings.license), 1)
+ self.advise('''<p>%s</p><p>%s</p>''' % (localsettings.about(),
+ localsettings.license), 1)
def addCustomWidgets(self):
'''
@@ -283,7 +287,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.operator_label = QtGui.QLabel()
self.loadedPatient_label = QtGui.QLabel()
self.loadedPatient_label.setMinimumWidth(450)
- #self.loadedPatient_label.setAlignment(QtCore.Qt.AlignCenter)
+ # self.loadedPatient_label.setAlignment(QtCore.Qt.AlignCenter)
self.sepline = QtGui.QFrame(self.statusbar_frame)
self.sepline.setFrameShape(QtGui.QFrame.VLine)
self.sepline.setFrameShadow(QtGui.QFrame.Sunken)
@@ -298,12 +302,12 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.summaryChartWidget = chartwidget.chartWidget()
self.ui.summaryChartWidget.setShowSelected(False)
self.ui.summaryChartWidget.setFocusPolicy(QtCore.Qt.StrongFocus)
- hlayout=QtGui.QHBoxLayout(self.ui.staticSummaryPanel)
+ hlayout = QtGui.QHBoxLayout(self.ui.staticSummaryPanel)
hlayout.addWidget(self.ui.summaryChartWidget)
#-perio chart
self.ui.perioChartWidget = chartwidget.chartWidget()
- hlayout=QtGui.QHBoxLayout(self.ui.perioChart_frame)
+ hlayout = QtGui.QHBoxLayout(self.ui.perioChart_frame)
hlayout.addWidget(self.ui.perioChartWidget)
#-static chart
@@ -329,7 +333,7 @@ class OpenmolarGui(QtGui.QMainWindow):
hlayout.addWidget(self.ui.completedChartWidget)
self.ui.completed_groupBox.setStyleSheet("border: 1px solid gray;")
- #static control panel
+ # static control panel
self.ui.static_control_panel = StaticControlPanel()
hlayout = QtGui.QHBoxLayout(self.ui.static_frame)
hlayout.setMargin(0)
@@ -352,12 +356,13 @@ class OpenmolarGui(QtGui.QMainWindow):
hlayout.setMargin(2)
for i in range(8):
gbtitle = (_("Recession"), _("Pocketing"), _("Plaque"),
- _("Bleeding"), _("Other"), _("Suppuration"), _("Furcation"),
- _("Mobility"))[i]
+ _("Bleeding"), _("Other"), _(
+ "Suppuration"), _("Furcation"),
+ _("Mobility"))[i]
periogb = QtGui.QGroupBox(gbtitle)
periogb.setCheckable(True)
periogb.setChecked(True)
- #periogb.setMinimumSize(0, 120)
+ # periogb.setMinimumSize(0, 120)
pchart = perioChartWidget.chartWidget()
pchart.type = gbtitle
gblayout = QtGui.QVBoxLayout(periogb)
@@ -365,21 +370,20 @@ class OpenmolarGui(QtGui.QMainWindow):
gblayout.addWidget(pchart)
hlayout.addWidget(periogb)
- #make these widgets accessible
+ # make these widgets accessible
self.ui.perioGroupBoxes.append(periogb)
self.ui.perioChartWidgets.append(pchart)
-
#--updates the current time in appointment books
self.ui.referralLettersComboBox.clear()
self.forum_timer = QtCore.QTimer()
- self.forum_timer.start(60000) #fire every minute
+ self.forum_timer.start(60000) # fire every minute
self.forum_timer.timeout.connect(self.checkForNewForumPosts)
self.enableEdit(False)
for desc in referral.getDescriptions():
- s=QtCore.QString(desc)
+ s = QtCore.QString(desc)
self.ui.referralLettersComboBox.addItem(s)
#-- add a header to the estimates page
@@ -392,11 +396,11 @@ class OpenmolarGui(QtGui.QMainWindow):
#--notification widget
self.ui.notificationWidget = \
- notification_widget.notificationWidget(self)
+ notification_widget.notificationWidget(self)
self.ui.details_frame.layout().addWidget(self.ui.notificationWidget)
- #cashbook browser
+ # cashbook browser
self.ui.cashbookTextBrowser = cashbook_module.CashBookBrowser(self)
layout = QtGui.QVBoxLayout(self.ui.cashbook_placeholder_widget)
@@ -404,20 +408,20 @@ class OpenmolarGui(QtGui.QMainWindow):
layout.addWidget(self.ui.cashbookTextBrowser)
def setClinician(self):
- result, selected = clinician_select_dialog.Dialog(self).result()
+ result, selected = ClinicianSelectDialog(self).result()
if result:
self.advise(_("changed clinician to") + " " + selected)
self.load_todays_patients_combobox()
self.set_operator_label()
def setAssistant(self):
- result, selected = assistant_select_dialog.Dialog(self).result()
+ result, selected = AssistantSelectDialog(self).result()
if result:
self.advise(_("changed assistant to") + " " + selected)
self.set_operator_label()
def saveButtonClicked(self):
- self.okToLeaveRecord(cont = True)
+ self.okToLeaveRecord(cont=True)
def bpe_table(self, arg):
'''
@@ -455,7 +459,7 @@ class OpenmolarGui(QtGui.QMainWindow):
called by the static or summary chartwidget
'''
charts_gui.checkPreviousEntry(self)
- self.selectedChartWidget="st"
+ self.selectedChartWidget = "st"
charts_gui.chartNavigation(self, signal)
def plan_chartNavigation(self, signal):
@@ -463,7 +467,7 @@ class OpenmolarGui(QtGui.QMainWindow):
called by the plan chartwidget
'''
charts_gui.checkPreviousEntry(self)
- self.selectedChartWidget="pl"
+ self.selectedChartWidget = "pl"
charts_gui.chartNavigation(self, signal)
def comp_chartNavigation(self, signal):
@@ -471,7 +475,7 @@ class OpenmolarGui(QtGui.QMainWindow):
called by the completed chartwidget
'''
charts_gui.checkPreviousEntry(self)
- self.selectedChartWidget="cmp"
+ self.selectedChartWidget = "cmp"
charts_gui.chartNavigation(self, signal)
def flipDeciduous(self):
@@ -485,7 +489,7 @@ class OpenmolarGui(QtGui.QMainWindow):
show history of the tooth
'''
history = tooth_history.getHistory(self.pt, tooth)
- self.advise(history,1)
+ self.advise(history, 1)
def tooth_delete_all(self):
'''
@@ -506,7 +510,7 @@ class OpenmolarGui(QtGui.QMainWindow):
user has clicked on the delete all option from a tooth's right click
menu
'''
- self.advise("add comments for tooth %s not working yet"% tooth)
+ self.advise("add comments for tooth %s not working yet" % tooth)
def chooseTooth(self):
'''
@@ -524,7 +528,7 @@ class OpenmolarGui(QtGui.QMainWindow):
#--a debug print statement
if not cont:
LOGGER.debug(
- "leaving record checking to see if save is required...")
+ "leaving record checking to see if save is required...")
course_module.prompt_close_course(self)
#--apply changes to patient details
@@ -534,26 +538,27 @@ class OpenmolarGui(QtGui.QMainWindow):
#--check pt against the original loaded state
#--this returns a LIST of changes ie [] if none.
- uc = self.unsavedChanges()
- if uc == []:
+ changes = self.unsavedChanges()
+ if changes == []:
LOGGER.debug(" okToLeaveRecord - no changes")
else:
#--raise a custom dialog to get user input
- Dialog = QtGui.QDialog(self)
- dl = saveDiscardCancel.sdcDialog(Dialog)
- dl.setPatient("%s %s (%s)"% (
- self.pt.fname, self.pt.sname, self.pt.serialno))
- dl.setChanges(uc)
- dl.allowDiscard(not cont)
- if Dialog.exec_():
- if dl.result == "discard":
- LOGGER.info(
- " okToLeaveRecord - user discarding changes")
- course_module.delete_new_course(self)
- elif dl.result == "save":
- LOGGER.debug(" okToLeaveRecord - user is saving")
- self.save_changes(False)
- else:
+ message = "%s<br />%s %s (%s)" % (
+ _("You have unsaved changes to the record of"),
+ self.pt.fname, self.pt.sname, self.pt.serialno)
+ dl = SaveDiscardCancelDialog(message, changes, self)
+ # dl.setPatient()
+ # dl.setChanges(uc)
+ dl.discard_but.setVisible(not cont)
+ dl.exec_()
+ if dl.result == dl.DISCARD:
+ LOGGER.info(
+ " okToLeaveRecord - user discarding changes")
+ course_module.delete_new_course(self)
+ elif dl.result == dl.SAVE:
+ LOGGER.debug(" okToLeaveRecord - user is saving")
+ self.save_changes(False)
+ else: # dl.result = dl.CANCEL
LOGGER.debug("okToLeaveRecord - continue editing")
return False
return True
@@ -565,13 +570,13 @@ class OpenmolarGui(QtGui.QMainWindow):
self.wait()
ci = self.ui.main_tabWidget.currentIndex()
- if ci ==1 : #--user is viewing appointment book
+ if ci == 1: # --user is viewing appointment book
self.diary_widget.reset_and_view(self.patient)
if ci == 6:
#--user is viewing the feetable
if not self.feestableLoaded:
fees_module.loadFeesTable(self)
- if self.pt.serialno !=0:
+ if self.pt.serialno != 0:
self.ui.chooseFeescale_comboBox.setCurrentIndex(
self.pt.fee_table.index)
@@ -591,11 +596,11 @@ class OpenmolarGui(QtGui.QMainWindow):
handles navigation of patient record
'''
self.wait()
- ci=self.ui.tabWidget.currentIndex()
+ ci = self.ui.tabWidget.currentIndex()
if ci != 6:
if self.ui.tabWidget.isTabEnabled(6) and \
- not charts_gui.checkPreviousEntry(self):
+ not charts_gui.checkPreviousEntry(self):
self.ui.tabWidget.setCurrentIndex(6)
if self.editPageVisited:
@@ -603,16 +608,16 @@ class OpenmolarGui(QtGui.QMainWindow):
if ci == 0:
self.ui.patientEdit_groupBox.setTitle(
- "Edit Patient %d"% self.pt.serialno)
+ "Edit Patient %d" % self.pt.serialno)
if self.load_editpage():
self.editPageVisited = True
elif ci == 1:
self.updateStatus()
- self.ui.badDebt_pushButton.setEnabled(self.pt.fees>0)
+ self.ui.badDebt_pushButton.setEnabled(self.pt.fees > 0)
contract_gui_module.handle_ContractTab(self)
- elif ci == 2: #-correspondence
+ elif ci == 2: # -correspondence
self.docsPrintedInit()
self.docsImportedInit()
@@ -622,28 +627,27 @@ class OpenmolarGui(QtGui.QMainWindow):
elif ci == 4:
self.load_clinicalSummaryPage()
- elif ci == 5: #-- full notes
+ elif ci == 5: # -- full notes
self.updateNotesPage()
- elif ci in (6, 7): #-- charts/plan or estimate
+ elif ci in (6, 7): # -- charts/plan or estimate
self.update_plan_est()
- elif ci == 8: #-- perio tab
+ elif ci == 8: # -- perio tab
charts_gui.periochart_dates(self)
- #load the periocharts (if the patient has data)
+ # load the periocharts (if the patient has data)
charts_gui.layoutPerioCharts(self)
self.wait(False)
def update_plan_est(self):
ci = self.ui.tabWidget.currentIndex()
- if ci == 7:
+ if ci == 7:
self.load_newEstPage()
elif ci == 6:
self.ui.plan_listView.model().reset()
self.ui.completed_listView.model().reset()
-
def home(self):
'''
User has clicked the homw push_button -
@@ -652,7 +656,7 @@ class OpenmolarGui(QtGui.QMainWindow):
if self.enteringNewPatient():
return
if not self.okToLeaveRecord():
- #print "not clearing record"
+ # print "not clearing record"
return
self.clearRecord()
#--disable much of the UI
@@ -669,13 +673,13 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
if self.pt.serialno != 0:
LOGGER.debug("updating last_address_details")
- localsettings.LAST_ADDRESS=(
+ localsettings.LAST_ADDRESS = (
self.pt.sname, self.pt.addr1, self.pt.addr2,
self.pt.addr3, self.pt.town, self.pt.county,
self.pt.pcde, self.pt.tel1)
- LOGGER.debug("details are %s"% str(localsettings.LAST_ADDRESS))
+ LOGGER.debug("details are %s" % str(localsettings.LAST_ADDRESS))
- #print "clearing record"
+ # print "clearing record"
self.ui.dobEdit.setDate(QtCore.QDate(1900, 1, 1))
self.ui.detailsBrowser.setText("")
self.ui.notes_webView.setHtml("")
@@ -687,15 +691,15 @@ class OpenmolarGui(QtGui.QMainWindow):
self.pt_diary_widget.clear()
#--restore the charts to full dentition
for chart in (self.ui.staticChartWidget, self.ui.planChartWidget,
- self.ui.completedChartWidget, self.ui.perioChartWidget,
- self.ui.summaryChartWidget):
+ self.ui.completedChartWidget, self.ui.perioChartWidget,
+ self.ui.summaryChartWidget):
chart.clear()
chart.update()
self.ui.notesSummary_webView.setHtml(localsettings.message)
self.ui.reception_textBrowser.setHtml(localsettings.message)
self.ui.recNotes_webView.setHtml("")
self.ui.chartsTableWidget.clear()
- #self.diary_widget.schedule_controller.clear()
+ # self.diary_widget.schedule_controller.clear()
self.ui.notesEnter_textEdit.setHtml("")
self.ui.medNotes_pushButton.setStyleSheet("")
@@ -705,11 +709,12 @@ class OpenmolarGui(QtGui.QMainWindow):
self.loadedPatient_label.setText("No Patient Loaded")
if self.editPageVisited:
- #print "blanking edit page fields"
+ # print "blanking edit page fields"
self.load_editpage()
self.editPageVisited = False
- self.update_family_label()
-
+ else:
+ self.pt.familyno = None
+ self.update_family_label()
def gotoDefaultTab(self):
'''
@@ -734,7 +739,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.reception_textBrowser.setText(html_)
self.pt_diary_widget.layout_ptDiary()
note = formatted_notes.rec_notes(self.pt.notes_dict,
- self.pt.treatment_course.accd)
+ self.pt.treatment_course.accd)
self.ui.recNotes_webView.setHtml(note)
def webviewloaded(self):
@@ -763,7 +768,7 @@ class OpenmolarGui(QtGui.QMainWindow):
if self.pt.dob:
self.ui.dobEdit.setDate(self.pt.dob)
else:
- self.ui.dobEdit.setDate(datetime.date(2000,1,1))
+ self.ui.dobEdit.setDate(datetime.date(2000, 1, 1))
self.ui.addr1Edit.setText(self.pt.addr1)
self.ui.addr2Edit.setText(self.pt.addr2)
self.ui.addr3Edit.setText(self.pt.addr3)
@@ -784,38 +789,38 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.occupationEdit.setText(self.pt.occup)
return True
- def load_dentComboBoxes(self, newpatient = False):
- #print "loading dnt comboboxes."
+ def load_dentComboBoxes(self, newpatient=False):
+ # print "loading dnt comboboxes."
inits = localsettings.ops.get(self.pt.dnt1, "")
if inits in localsettings.activedents:
self.ui.dnt1comboBox.setCurrentIndex(
- localsettings.activedents.index(inits))
+ localsettings.activedents.index(inits))
else:
self.ui.dnt1comboBox.setCurrentIndex(-1)
if not newpatient:
- print "dnt1 error - record %d"% self.pt.serialno
+ print "dnt1 error - record %d" % self.pt.serialno
if not inits in ("", "NONE"):
- message = "%s "% inits + _(
- "is no longer an active dentist in this practice")
+ message = "%s " % inits + _(
+ "is no longer an active dentist in this practice")
else:
print "unknown dentist number", self.pt.dnt1
message = _(
- "unknown contract dentist - please correct this")
+ "unknown contract dentist - please correct this")
self.advise(message, 2)
inits = localsettings.ops.get(self.pt.dnt2, "")
if inits in localsettings.activedents:
self.ui.dnt2comboBox.setCurrentIndex(
- localsettings.activedents.index(inits))
+ localsettings.activedents.index(inits))
else:
self.ui.dnt2comboBox.setCurrentIndex(-1)
if self.pt.dnt1 == self.pt.dnt2:
pass
elif not inits in ("", "NONE"):
- message = "%s "% inits + _(
- "is no longer an active dentist in this practice")
+ message = "%s " % inits + _(
+ "is no longer an active dentist in this practice")
self.advise(message, 2)
- elif inits == "":
+ elif inits == "":
print "unknown dentist number", self.pt.dnt2
message = _("unknown course dentist - please correct this")
self.advise(message, 2)
@@ -839,44 +844,11 @@ class OpenmolarGui(QtGui.QMainWindow):
and return True. otherwise, will return False.
'''
LOGGER.debug("enteringNewPatient")
- if not self.ui.newPatientPushButton.isEnabled():
+ if self.entering_new_patient:
self.ui.main_tabWidget.setCurrentIndex(0)
self.ui.tabWidget.setCurrentIndex(0)
return not new_patient_gui.abortNewPatientEntry(self)
- def changeSaveButtonforNewPatient(self):
- '''
- the save button is returned to normal after a new patient entry
- '''
- #--change the function of the save button
- QtCore.QObject.disconnect(self.ui.saveButton,
- QtCore.SIGNAL("clicked()"), self.save_changes)
-
- QtCore.QObject.connect(self.ui.saveButton,
- QtCore.SIGNAL("clicked()"), self.checkNewPatient)
-
- self.ui.saveButton.setEnabled(True)
- self.ui.saveButton.setText(_("SAVE NEW PATIENT"))
-
- def restoreSaveButtonAfterNewPatient(self):
- '''
- the save button is returned to normal after a new patient entry
- '''
- QtCore.QObject.disconnect(self.ui.saveButton,
- QtCore.SIGNAL("clicked()"), self.checkNewPatient)
-
- QtCore.QObject.connect(self.ui.saveButton,
- QtCore.SIGNAL("clicked()"), self.save_changes)
-
- self.ui.saveButton.setText(_("SAVE CHANGES"))
-
- def defaultNP(self):
- '''
- default NP has been pressed - so apply the address and surname
- from the previous patient
- '''
- new_patient_gui.defaultNP(self)
-
def docsPrintedInit(self):
'''
load the docsprinted listWidget
@@ -884,13 +856,13 @@ class OpenmolarGui(QtGui.QMainWindow):
print "(re)loading docs printed"
self.ui.prevCorres_treeWidget.clear()
self.ui.prevCorres_treeWidget.setHeaderLabels(
- ["Date", "Type", "Version", "Index"])
+ ["Date", "Type", "Version", "Index"])
- docs=docsprinted.previousDocs(self.pt.serialno)
+ docs = docsprinted.previousDocs(self.pt.serialno)
for d in docs:
- doc=[str(d[0]), str(d[1]), str(d[2]), str(d[3])]
- i=QtGui.QTreeWidgetItem(
- self.ui.prevCorres_treeWidget, doc)
+ doc = [str(d[0]), str(d[1]), str(d[2]), str(d[3])]
+ i = QtGui.QTreeWidgetItem(
+ self.ui.prevCorres_treeWidget, doc)
self.ui.prevCorres_treeWidget.expandAll()
for i in range(self.ui.prevCorres_treeWidget.columnCount()):
self.ui.prevCorres_treeWidget.resizeColumnToContents(i)
@@ -904,20 +876,22 @@ class OpenmolarGui(QtGui.QMainWindow):
ix = int(item.text(3))
if "(html)" in item.text(1):
result = QtGui.QMessageBox.question(self, _("Re-open"),
- _("Do you want to review and/or reprint this item?"),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ _(
+ "Do you want to review and/or reprint this item?"),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
- html, version=docsprinted.getData(ix)
- type = item.text(1).replace("(html)","")
+ html, version = docsprinted.getData(ix)
+ type = item.text(1).replace("(html)", "")
if om_printing.htmlEditor(self, type, html, version):
self.docsPrintedInit()
elif "pdf" in item.text(1):
result = QtGui.QMessageBox.question(self, _("Re-open"),
- _("Do you want to review and/or reprint this item?"),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ _(
+ "Do you want to review and/or reprint this item?"),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
try:
data, version = docsprinted.getData(ix)
@@ -925,16 +899,16 @@ class OpenmolarGui(QtGui.QMainWindow):
f.write(data)
f.close()
localsettings.openPDF()
- except Exception, e:
+ except Exception as e:
print "view PDF error"
print Exception, e
self.advise(_("error reviewing PDF file"), 1)
- else: #unknown data type... probably plain text.
+ else: # unknown data type... probably plain text.
print "other type of doc"
data = docsprinted.getData(ix)[0]
- if data == None:
+ if data is None:
data = _(
- "No information available about this document, sorry")
+ "No information available about this document, sorry")
self.advise(data, 1)
def docsImportedInit(self):
@@ -943,7 +917,7 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
self.ui.importDoc_treeWidget.clear()
self.ui.importDoc_treeWidget.setHeaderLabels([_("Date imported"),
- _("Description"), _("Size"), _("Type"), "Index"])
+ _("Description"), _("Size"), _("Type"), "Index"])
docs = docsimported.storedDocs(self.pt.serialno)
for doc in docs:
@@ -960,11 +934,11 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
filename = QtGui.QFileDialog.getOpenFileName()
if filename != '':
- self.advise(_("opening")+" %s"% filename)
+ self.advise(_("opening") + " %s" % filename)
try:
docsimported.add(self.pt.serialno, str(filename))
- except Exception, e:
- self.advise(_("error importing file") + "<br /> - %s"% e, 2)
+ except Exception as e:
+ self.advise(_("error importing file") + "<br /> - %s" % e, 2)
else:
self.advise(_("no file chosen"), 1)
self.docsImportedInit()
@@ -974,21 +948,22 @@ class OpenmolarGui(QtGui.QMainWindow):
called by a double click on the imported documents listview
'''
ix = int(item.text(4))
- print "opening file index ",ix
+ print "opening file index ", ix
result = QtGui.QMessageBox.question(self, _("Re-open"),
- _("Do you want to open a copy of this document?"),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ _(
+ "Do you want to open a copy of this document?"),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
try:
fpath = os.path.join(localsettings.localFileDirectory,
- "import_temp")
+ "import_temp")
f = open(fpath, "wb")
for data in docsimported.getData(ix):
f.write(data[0])
f.close()
- localsettings.openFile( fpath )
- except Exception, e:
+ localsettings.openFile(fpath)
+ except Exception as e:
print "unable to open stored document"
print Exception, e
self.advise(_("error opening document"), 1)
@@ -1002,10 +977,10 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.dayList_comboBox.clear()
if localsettings.clinicianNo != 0:
- header = _("Today's Patients")+ \
- " (%s)"%localsettings.clinicianInits
+ header = _("Today's Patients") + \
+ " (%s)" % localsettings.clinicianInits
else:
- header =_("Today's Patients (ALL)")
+ header = _("Today's Patients (ALL)")
dents = (localsettings.clinicianNo, )
ptList = appointments.todays_patients(dents)
@@ -1015,7 +990,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.dayList_comboBox.addItem(header)
for pt in ptList:
- val = "%s -- %s"%(pt[1],pt[0])
+ val = "%s -- %s" % (pt[1], pt[0])
#--be wary of changing this -- is used as a marker some
#--pt's have hyphonated names!
self.ui.dayList_comboBox.addItem(val)
@@ -1024,7 +999,7 @@ class OpenmolarGui(QtGui.QMainWindow):
arg = str(self.ui.dayList_comboBox.currentText())
if "--" in arg:
self.ui.dayList_comboBox.setCurrentIndex(0)
- serialno = int(arg[arg.index("--")+2:])
+ serialno = int(arg[arg.index("--") + 2:])
#--see above comment
self.getrecord(serialno)
@@ -1032,7 +1007,7 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
populate several comboboxes with the activedentists
'''
- s=["*ALL*"] + localsettings.ops.values()
+ s = ["*ALL*"] + localsettings.ops.values()
self.ui.daybookDent1ComboBox.addItems(s)
self.ui.daybookDent2ComboBox.addItems(s)
self.ui.cashbookDentComboBox.addItems(s)
@@ -1044,7 +1019,7 @@ class OpenmolarGui(QtGui.QMainWindow):
looks for patients with similar name, family or address
to the current pt
'''
- if self.pt.serialno == 0:
+ if not (self.pt.serialno or self.pt.familyno):
self.advise("No patient to compare to", 2)
return
dl = LoadRelativesDialog(self)
@@ -1056,11 +1031,10 @@ class OpenmolarGui(QtGui.QMainWindow):
cycle forwards through the list of recently visited records
'''
desiredPos = localsettings.recent_sno_index + 1
- if len(localsettings.recent_snos) > desiredPos:
+ try:
self.getrecord(localsettings.recent_snos[desiredPos],
- addToRecentSnos=False)
- localsettings.recent_sno_index = desiredPos
- else:
+ addToRecentSnos=False)
+ except IndexError:
self.advise(_("Reached end of the List"))
def last_patient(self):
@@ -1073,8 +1047,7 @@ class OpenmolarGui(QtGui.QMainWindow):
desiredPos = localsettings.recent_sno_index - 1
if len(localsettings.recent_snos) > desiredPos >= 0:
self.getrecord(localsettings.recent_snos[desiredPos],
- addToRecentSnos=False)
- localsettings.recent_sno_index = desiredPos
+ addToRecentSnos=False)
else:
self.advise(_("Reached Start of the List"))
@@ -1082,8 +1055,7 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
apply any changes made on the edit patient page
'''
- if self.pt.serialno == 0 and \
- self.ui.newPatientPushButton.isEnabled():
+ if self.pt.serialno == 0 and not self.entering_new_patient:
#- firstly.. don't apply edit page changes if there
#- iss no patient loaded,
#- and no new patient to apply
@@ -1121,16 +1093,33 @@ class OpenmolarGui(QtGui.QMainWindow):
self.getrecord(int(sno))
def getrecord(self, serialno,
- checkedNeedToLeaveAlready=False,
- addToRecentSnos=True,
- newPatientReload=False
- ):
+ checkedNeedToLeaveAlready=False,
+ addToRecentSnos=True,
+ newPatientReload=False
+ ):
'''
a record has been called by one of several means
'''
- if self.enteringNewPatient() or serialno in (0, None):
+ if self.enteringNewPatient():
+ return
+ if serialno in (0, None):
+ self.update_family_label()
return
+ if addToRecentSnos:
+ try:
+ localsettings.recent_snos.remove(serialno)
+ except ValueError:
+ pass
+ localsettings.recent_snos.append(serialno)
+ localsettings.recent_sno_index = localsettings.recent_snos.index(
+ serialno)
+
+ can_go_back = localsettings.recent_sno_index > 0
+ self.ui.backButton.setEnabled(can_go_back)
+ self.ui.nextButton.setEnabled(
+ localsettings.recent_sno_index < len(localsettings.recent_snos) - 1)
+
if (self.pt and serialno == self.pt.serialno and not newPatientReload):
self.ui.main_tabWidget.setCurrentIndex(0)
self.advise(_("Patient already loaded"))
@@ -1138,29 +1127,25 @@ class OpenmolarGui(QtGui.QMainWindow):
print "not loading"
self.advise(_("Not loading patient"))
else:
- if addToRecentSnos:
- localsettings.recent_snos.append(serialno)
- localsettings.recent_sno_index = len(
- localsettings.recent_snos) - 1
try:
self.pt = patient_class.patient(serialno)
self.pt_diary_widget.set_patient(self.pt)
try:
- self.loadpatient(newPatientReload = newPatientReload)
+ self.loadpatient(newPatientReload=newPatientReload)
except Exception as e:
message = _("Error populating interface")
LOGGER.exception(message)
- self.advise(u"<b>%s</b><hr /><pre>%s"% (message, e), 2)
+ self.advise(u"<b>%s</b><hr /><pre>%s" % (message, e), 2)
except localsettings.PatientNotFoundError:
print "NOT FOUND ERROR"
- self.advise (_("error getting serialno")+ " %d - " % serialno +
- _("please check this number is correct?"), 1)
+ self.advise(_("error getting serialno") + " %d - " % serialno +
+ _("please check this number is correct?"), 1)
except Exception as exc:
LOGGER.exception(
- "Unknown ERROR loading patient - serialno %d"% serialno)
- self.advise ("Unknown Error - Tell Neil<br />%s"% exc, 2)
+ "Unknown ERROR loading patient - serialno %d" % serialno)
+ self.advise("Unknown Error - Tell Neil<br />%s" % exc, 2)
def reload_patient(self):
'''
@@ -1168,7 +1153,7 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
if self.okToLeaveRecord():
sno = self.pt.serialno
- self.advise("%s %s"%(_("Reloading record"), sno))
+ self.advise("%s %s" % (_("Reloading record"), sno))
self.clearRecord()
self.getrecord(sno)
@@ -1225,36 +1210,37 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.notes_webView.setHtml("")
self.ui.notesEnter_textEdit.setText("")
for chart in (self.ui.staticChartWidget, self.ui.planChartWidget,
- self.ui.completedChartWidget, self.ui.perioChartWidget,
- self.ui.summaryChartWidget):
+ self.ui.completedChartWidget, self.ui.perioChartWidget,
+ self.ui.summaryChartWidget):
chart.clear()
#--necessary to restore the chart to full dentition
self.selectedChartWidget = "st"
- self.ui.staticChartWidget.setSelected(0, 0, True) #select the UR8
- self.ui.planChartWidget.setSelected(0, 0, False) #select the UR8
- self.ui.completedChartWidget.setSelected(0, 0, False) #select the UR8
+ self.ui.staticChartWidget.setSelected(0, 0, True) # select the UR8
+ self.ui.planChartWidget.setSelected(0, 0, False) # select the UR8
+ self.ui.completedChartWidget.setSelected(0, 0, False) # select the UR8
- self.ui.toothPropsWidget.setTooth("ur8","st")
+ self.ui.toothPropsWidget.setTooth("ur8", "st")
charts_gui.chartsTable(self)
charts_gui.bpe_dates(self)
try:
- pos = localsettings.csetypes.index(self.pt.cset)
+ pos = localsettings.CSETYPES.index(self.pt.cset)
except ValueError:
if not newPatientReload:
- QtGui.QMessageBox.information(self, "Advisory",
- "Please set a Valid Course Type for this patient")
+ message = _("Please set a Valid Course Type for this patient")
+ QtGui.QMessageBox.information(self, _("Advisory"), message)
+
pos = -1
self.ui.cseType_comboBox.setCurrentIndex(pos)
self.ui.contract_tabWidget.setCurrentIndex(pos)
#--update bpe
- labeltext = "currently editing %s %s %s - (%s)"% (
+ labeltext = "currently editing %s %s %s - (%s)" % (
self.pt.title, self.pt.fname, self.pt.sname, self.pt.serialno)
self.loadedPatient_label.setText(labeltext)
self.ui.hiddenNotes_label.setText("")
- if self.ui.tabWidget.currentIndex() == 4: #clinical summary
+ if self.ui.tabWidget.currentIndex() == 4: # clinical summary
self.ui.summaryChartWidget.update()
self.ui.debugBrowser.setText("")
@@ -1288,7 +1274,7 @@ class OpenmolarGui(QtGui.QMainWindow):
Dialog.exec_()
if dl.checkBox.checkState():
- LOGGER.debug("deleting Memo %s"% umemo.ix)
+ LOGGER.debug("deleting Memo %s" % umemo.ix)
memos.deleteMemo(umemo.ix)
def newCustomMemo(self):
@@ -1300,17 +1286,17 @@ class OpenmolarGui(QtGui.QMainWindow):
def medalert(self):
if self.pt.MEDALERT:
self.ui.medNotes_pushButton.setStyleSheet(
- "background-color: %s"% colours.med_warning )
+ "background-color: %s" % colours.med_warning)
else:
self.ui.medNotes_pushButton.setStyleSheet("")
- if self.pt.MH != None:
- mhdate=self.pt.MH[13]
- if mhdate == None:
+ if self.pt.MH is not None:
+ mhdate = self.pt.MH[13]
+ if mhdate is None:
chkdate = ""
else:
- chkdate = " - %s"% localsettings.formatDate(mhdate)
- self.ui.medNotes_pushButton.setText("MedNotes%s"% chkdate)
+ chkdate = " - %s" % localsettings.formatDate(mhdate)
+ self.ui.medNotes_pushButton.setText("MedNotes%s" % chkdate)
self.enableEdit(True)
@@ -1339,7 +1325,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.updateStatus()
return
self.pt.status = unicode(
- self.ui.status_comboBox.currentText().toUtf8())
+ self.ui.status_comboBox.currentText().toUtf8())
self.updateDetails()
def updateDetails(self):
@@ -1368,7 +1354,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.completed_listView.setEnabled(self.pt.underTreatment)
if self.pt.underTreatment:
- self.ui.estimate_label.setText(u"<b>%s</b><br />%s %s"% (
+ self.ui.estimate_label.setText(u"<b>%s</b><br />%s %s" % (
_("Active Course"),
_("started"),
localsettings.formatDate(self.pt.treatment_course.accd)))
@@ -1376,12 +1362,12 @@ class OpenmolarGui(QtGui.QMainWindow):
else:
self.ui.estimate_label.setText(
- u"<b>%s</b><br />%s %s<br />%s %s"% (
- _("Previous Course"),
- _("started"),
- localsettings.formatDate(self.pt.treatment_course.accd),
- _("completed"),
- localsettings.formatDate(self.pt.treatment_course.cmpd)))
+ u"<b>%s</b><br />%s %s<br />%s %s" % (
+ _("Previous Course"),
+ _("started"),
+ localsettings.formatDate(self.pt.treatment_course.accd),
+ _("completed"),
+ localsettings.formatDate(self.pt.treatment_course.cmpd)))
self.ui.plan_buttons_stacked_widget.setCurrentIndex(1)
if not self.pt.treatment_course.accd in ("", None):
self.ui.closeTx_pushButton.setText(_("Resume Existing Course"))
@@ -1409,17 +1395,19 @@ class OpenmolarGui(QtGui.QMainWindow):
if localsettings.clinicianNo == 0:
if localsettings.station == "surgery":
op_text = " <b>" + _("NO CLINICIAN SET") + "</b> - "
- self.advise(_("you are in surgery mode without a clinician"),1)
+ self.advise(
+ _("you are in surgery mode without a clinician"),
+ 1)
else:
op_text = ""
else:
op_text = (" <b>" + _("CLINICIAN") + "(" +
- localsettings.clinicianInits + ")</b> - ")
+ localsettings.clinicianInits + ")</b> - ")
if "/" in localsettings.operator:
op_text += " " + _("team") + " "
op_text += (" " + localsettings.operator + " " + _("using") + " " +
- localsettings.station + " " + _("mode"))
+ localsettings.station + " " + _("mode"))
self.operator_label.setText(op_text)
@@ -1431,7 +1419,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.tabWidget.setCurrentIndex(0)
self.diary_widget.reset()
c_list = QtGui.QCompleter([_("Mr"), _("Mrs"), _("Ms"), _("Miss"),
- _("Master"), _("Dr"), _("Professor")])
+ _("Master"), _("Dr"), _("Professor")])
self.ui.titleEdit.setCompleter(c_list)
if localsettings.station == "surgery":
@@ -1455,11 +1443,10 @@ class OpenmolarGui(QtGui.QMainWindow):
palette.setBrush(QtGui.QPalette.Base, brush)
for widg in (self.ui.snameEdit, self.ui.titleEdit,
- self.ui.fnameEdit, self.ui.addr1Edit, self.ui.dobEdit,
- self.ui.pcdeEdit, self.ui.sexEdit):
+ self.ui.fnameEdit, self.ui.addr1Edit, self.ui.dobEdit,
+ self.ui.pcdeEdit, self.ui.sexEdit):
widg.setPalette(palette)
- self.ui.cseType_comboBox.addItems(localsettings.csetypes)
self.ui.forumViewFilter_comboBox.addItems(
localsettings.allowed_logins)
@@ -1472,7 +1459,7 @@ class OpenmolarGui(QtGui.QMainWindow):
for old data about the patient
'''
- self.debugMenu=QtGui.QMenu()
+ self.debugMenu = QtGui.QMenu()
self.debugMenu.addAction("Patient table data")
self.debugMenu.addAction("Treatment table data")
self.debugMenu.addAction("HDP table data")
@@ -1483,7 +1470,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.debug_toolButton.setMenu(self.debugMenu)
def showForumActivity(self, newItems=True):
- tb=self.ui.main_tabWidget.tabBar()
+ tb = self.ui.main_tabWidget.tabBar()
if newItems:
tb.setTabText(7, _("NEW FORUM POSTS"))
tb.setTabTextColor(7, QtGui.QColor("red"))
@@ -1504,12 +1491,12 @@ class OpenmolarGui(QtGui.QMainWindow):
try:
filepath = QtGui.QFileDialog.getSaveFileName()
if filepath != '':
- f=open(filepath, "w")
+ f = open(filepath, "w")
f.write(pickle.dumps(self.pt))
f.close()
self.advise("Patient File Saved", 1)
- except Exception, e:
- self.advise("Patient File not saved - %s"% e, 2)
+ except Exception as e:
+ self.advise("Patient File not saved - %s" % e, 2)
def open_patient_fromfile(self):
'''
@@ -1532,8 +1519,8 @@ class OpenmolarGui(QtGui.QMainWindow):
self.pt.take_snapshot()
self.pt = loadedpt
f.close()
- except Exception, e:
- self.advise("error loading patient file - %s"% e, 2)
+ except Exception as e:
+ self.advise("error loading patient file - %s" % e, 2)
else:
self.advise(_("no file chosen"), 1)
self.loadpatient()
@@ -1592,7 +1579,7 @@ class OpenmolarGui(QtGui.QMainWindow):
newNotes = ""
if dl.exec_():
for phrase in dl.selectedPhrases:
- newNotes += phrase + "\n"
+ newNotes += phrase + "\n"
if newNotes != "":
self.addNewNote(newNotes)
@@ -1607,11 +1594,10 @@ class OpenmolarGui(QtGui.QMainWindow):
newNotes = ""
if dl.exec_():
for phrase in dl.selectedPhrases:
- newNotes += phrase + "\n"
+ newNotes += phrase + "\n"
if newNotes != "":
self.addNewNote(newNotes)
-
def addNewNote(self, arg):
'''
used when I programatically add text to the user textEdit
@@ -1636,8 +1622,10 @@ class OpenmolarGui(QtGui.QMainWindow):
if self.pt.serialno == 0:
self.advise("no patient selected", 1)
return
- Dialog = QtGui.QDialog(self)
- if medNotes.showDialog(Dialog, self.pt):
+
+ dl = MedNotesDialog(self.pt, self)
+ if dl.exec_():
+ dl.apply()
self.advise("Updated Medical Notes", 1)
self.medalert()
@@ -1648,14 +1636,13 @@ class OpenmolarGui(QtGui.QMainWindow):
if self.pt.serialno == 0:
self.advise("no patient selected", 1)
return
- Dialog = QtGui.QDialog(self)
- dl = newBPE.Ui_Dialog(Dialog)
- result=dl.getInput()
+ dl = BPE_Dialog(self)
+ result = dl.getInput()
if result[0]:
self.pt.bpe.append((localsettings.currentDay(), result[1]), )
#--add a bpe
- newnotes=str(self.ui.notesEnter_textEdit.toPlainText().toAscii())
- newnotes+=" bpe of %s recorded \n"%result[1]
+ newnotes = str(self.ui.notesEnter_textEdit.toPlainText().toAscii())
+ newnotes += " bpe of %s recorded \n" % result[1]
self.ui.notesEnter_textEdit.setText(newnotes)
self.ui.bpe_textBrowser
else:
@@ -1675,16 +1662,16 @@ class OpenmolarGui(QtGui.QMainWindow):
important function, checks for changes since the patient was loaded
'''
if self.pt.serialno != self.pt.dbstate.serialno:
- #this should NEVER happen!!!
+ # this should NEVER happen!!!
self.advise(
- _('''POTENTIALLY SERIOUS CONFUSION PROBLEM WITH PT RECORDS''') +
- ' %d and %d'% (self.pt.serialno, self.pt.dbstate.serialno), 2)
+ _('''POTENTIALLY SERIOUS CONFUSION PROBLEM WITH PT RECORDS''') +
+ ' %d and %d' % (self.pt.serialno, self.pt.dbstate.serialno), 2)
return []
changes = self.pt.changes
if (len(self.ui.notesEnter_textEdit.toPlainText()) != 0 or
- len(self.pt.HIDDENNOTES) != 0):
+ len(self.pt.HIDDENNOTES) != 0):
changes.append("New Notes")
if "treatment_course" in changes:
@@ -1716,7 +1703,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.pt.est_logger.add_row(
self.pt.courseno0, self.pt.est_logger_text)
- if result: #True if sucessful
+ if result: # True if sucessful
if not leavingRecord and "estimates" in uc:
#-- necessary to get index numbers for estimate data types
self.pt.getEsts()
@@ -1727,12 +1714,11 @@ class OpenmolarGui(QtGui.QMainWindow):
else:
self.advise("Error applying changes... please retry", 2)
- print "error saving changes to record %s"%self.pt.serialno,
+ print "error saving changes to record %s" % self.pt.serialno,
print result, str(uc)
-
if "New Notes" in uc:
- newnote=str(self.ui.notesEnter_textEdit.toPlainText().toAscii())
+ newnote = str(self.ui.notesEnter_textEdit.toPlainText().toAscii())
notetuplets = []
for noteline in newnote.split("\n"):
@@ -1771,24 +1757,24 @@ class OpenmolarGui(QtGui.QMainWindow):
arg and PHRASEBOOKS.has_phrasebook(localsettings.clinicianNo))
for widg in (
- self.ui.summaryChartWidget,
- self.ui.printEst_pushButton,
- self.ui.printAccount_pushButton,
- self.ui.relatedpts_pushButton,
- self.ui.saveButton,
- self.ui.phraseBook_pushButton,
- self.ui.clinician_phrasebook_pushButton,
- self.ui.exampushButton,
- self.ui.xray_pushButton,
- self.ui.medNotes_pushButton,
- self.ui.printGP17_pushButton,
- self.ui.newBPE_pushButton,
- self.ui.hygWizard_pushButton,
- self.ui.notesEnter_textEdit,
- self.ui.synopsis_lineEdit,
- self.ui.memos_pushButton,
- self.pt_diary_widget,
- self.ui.childsmile_button,
+ self.ui.summaryChartWidget,
+ self.ui.printEst_pushButton,
+ self.ui.printAccount_pushButton,
+ # self.ui.relatedpts_pushButton,
+ self.ui.saveButton,
+ self.ui.phraseBook_pushButton,
+ self.ui.clinician_phrasebook_pushButton,
+ self.ui.exampushButton,
+ self.ui.xray_pushButton,
+ self.ui.medNotes_pushButton,
+ self.ui.printGP17_pushButton,
+ self.ui.newBPE_pushButton,
+ self.ui.hygWizard_pushButton,
+ self.ui.notesEnter_textEdit,
+ self.ui.synopsis_lineEdit,
+ self.ui.memos_pushButton,
+ self.pt_diary_widget,
+ self.ui.childsmile_button,
):
widg.setEnabled(arg)
@@ -1831,7 +1817,7 @@ class OpenmolarGui(QtGui.QMainWindow):
menu option which allows adanced record changes
'''
if self.pt.serialno == 0:
- self.advise(_("no record selected"),1)
+ self.advise(_("no record selected"), 1)
else:
if permissions.granted(self):
dl = recordtools.recordTools(self)
@@ -1842,7 +1828,7 @@ class OpenmolarGui(QtGui.QMainWindow):
user is asking for a different font on the appointment book
'''
i, result = QtGui.QInputDialog.getInteger(self, _("FontSize"),
- _("Enter your preferred font size for appointment book") , 8,6,16)
+ _("Enter your preferred font size for appointment book"), 8, 6, 16)
if result:
self.diary_widget.aptFontSize(i)
@@ -1893,7 +1879,7 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
receives signals from the choose feescale combobox
'''
- fees_module.chooseFeescale(self,arg)
+ fees_module.chooseFeescale(self, arg)
def feeExpand_radiobuttons_clicked(self):
'''
@@ -1903,7 +1889,7 @@ class OpenmolarGui(QtGui.QMainWindow):
fees_module.expandFees(self)
def plan_page_course_but_clicked(self):
- if self.pt.underTreatment: # shouldn't happen
+ if self.pt.underTreatment: # shouldn't happen
return
course_module.setupNewCourse(self)
@@ -1913,7 +1899,7 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
if self.pt.underTreatment:
course_module.closeCourse(self)
- #static items may have changed
+ # static items may have changed
charts_gui.chartsTable(self)
self.load_clinicalSummaryPage()
self.ui.summaryChartWidget.update()
@@ -1994,7 +1980,7 @@ class OpenmolarGui(QtGui.QMainWindow):
fees_module.showTableXML(self)
def handle_chart_treatment_input(self, tooth, prop, completed):
- LOGGER.debug("%s %s completed=%s"% (tooth, prop, completed))
+ LOGGER.debug("%s %s completed=%s" % (tooth, prop, completed))
if course_module.newCourseNeeded(self):
return
@@ -2024,17 +2010,17 @@ class OpenmolarGui(QtGui.QMainWindow):
courseno = self.pt.treatment_course.courseno
if (completed and tx in existing_pl_items):
hash_ = localsettings.hash_func(
- "%s%s%s%s"% (courseno, tooth, n_txs+1, tx))
+ "%s%s%s%s" % (courseno, tooth, n_txs + 1, tx))
tx_hash = estimates.TXHash(hash_)
manipulate_plan.tx_hash_complete(self, tx_hash)
elif not completed and n_txs:
hash_ = localsettings.hash_func(
- "%s%s%s%s"% (courseno, tooth, n_txs, tx))
+ "%s%s%s%s" % (courseno, tooth, n_txs, tx))
tx_hash = estimates.TXHash(hash_)
manipulate_plan.tx_hash_reverse(self, tx_hash)
else:
manipulate_plan.add_treatments_to_plan(self,
- ((tooth, tx),), completed)
+ ((tooth, tx),), completed)
if removals:
manipulate_plan.remove_treatments_from_plan_and_est(
@@ -2156,7 +2142,7 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
forum_gui_module.loadForum(self)
- def contractTab_navigated(self,i):
+ def contractTab_navigated(self, i):
'''
the contract tab is changing
'''
@@ -2166,19 +2152,19 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
user is changing dnt1
'''
- contract_gui_module.changeContractedDentist(self,qstring)
+ contract_gui_module.changeContractedDentist(self, qstring)
def dnt2comboBox_clicked(self, qstring):
'''
user is changing dnt1
'''
- contract_gui_module.changeCourseDentist(self,qstring)
+ contract_gui_module.changeCourseDentist(self, qstring)
def cseType_comboBox_clicked(self, qstring):
'''
user is changing the course type
'''
- contract_gui_module.changeCourseType(self,qstring)
+ contract_gui_module.changeCourseType(self, qstring)
def editNHS_pushButton_clicked(self):
'''
@@ -2295,12 +2281,12 @@ class OpenmolarGui(QtGui.QMainWindow):
I can view attributes in memory, and compare to the original db values
'''
#--load a table of self.pt.attributes
- if arg != None:
+ if arg is not None:
txtype = str(arg.text()).split(" ")[0]
else:
txtype = None
- changesOnly=self.ui.ptAtts_checkBox.isChecked()
+ changesOnly = self.ui.ptAtts_checkBox.isChecked()
html = debug_html.toHtml(self.pt, txtype, changesOnly)
self.ui.debugBrowser.setText(html)
@@ -2352,7 +2338,7 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
prints a duplicate receipt
'''
- dl = duplicate_receipt_dialog.DuplicateReceiptDialog(self.pt, self)
+ dl = DuplicateReceiptDialog(self.pt, self)
if dl.exec_() and dl.duplicate_printed:
om_printing.commitPDFtoDB(self, "dup receipt")
self.updateHiddenNotesLabel()
@@ -2398,23 +2384,20 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
user has requested an account printing
'''
- if self.ui.accountB_radioButton.isChecked():
- om_printing.printaccount(self, "B") #print a medium letter
- elif self.ui.accountC_radioButton.isChecked():
- om_printing.printaccount(self, "C") #print "harsh letter"
- else:
- om_printing.printaccount(self) #print default account
+ dl = AccountSeverityDialog(self)
+ if dl.exec_():
+ om_printing.printaccount(self, dl.severity)
def printmultiDayList(self, args):
'''prints the multiday pages'''
#-- args= ((dent, date), (dent, date)...)
- dlist=multiDayListPrint.printDaylist()
- something_to_print=False
+ dlist = multiDayListPrint.printDaylist()
+ something_to_print = False
for arg in args:
- data=appointments.printableDaylistData(arg[1].toPyDate(), arg[0])
- #note arg[1]=Qdate
+ data = appointments.printableDaylistData(arg[1].toPyDate(), arg[0])
+ # note arg[1]=Qdate
if data != []:
- something_to_print=True
+ something_to_print = True
dlist.addDaylist(arg[1], arg[0], data)
if something_to_print:
dlist.print_()
@@ -2436,8 +2419,9 @@ class OpenmolarGui(QtGui.QMainWindow):
normal notes print
'''
self.advise(
- _("use the checkboxes on the notes tab to control what is printed."),
- 1)
+ _(
+ "use the checkboxes on the notes tab to control what is printed."),
+ 1)
om_printing.printNotes(self)
def printMH(self):
@@ -2522,25 +2506,25 @@ class OpenmolarGui(QtGui.QMainWindow):
belong to any other function
'''
QtCore.QObject.connect(self.ui.closeCourse_pushButton,
- QtCore.SIGNAL("clicked()"), self.closeTx_pushButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.closeTx_pushButton_clicked)
QtCore.QObject.connect(self.ui.saveButton,
- QtCore.SIGNAL("clicked()"), self.saveButtonClicked)
+ QtCore.SIGNAL("clicked()"), self.saveButtonClicked)
QtCore.QObject.connect(self.ui.exampushButton,
- QtCore.SIGNAL("clicked()"), self.showExamDialog)
+ QtCore.SIGNAL("clicked()"), self.showExamDialog)
QtCore.QObject.connect(self.ui.hygWizard_pushButton,
- QtCore.SIGNAL("clicked()"), self.showHygDialog)
+ QtCore.SIGNAL("clicked()"), self.showHygDialog)
QtCore.QObject.connect(self.ui.xray_pushButton,
- QtCore.SIGNAL("clicked()"), self.addXrays)
+ QtCore.SIGNAL("clicked()"), self.addXrays)
QtCore.QObject.connect(self.ui.newBPE_pushButton,
- QtCore.SIGNAL("clicked()"), self.newBPE_Dialog)
+ QtCore.SIGNAL("clicked()"), self.newBPE_Dialog)
QtCore.QObject.connect(self.ui.medNotes_pushButton,
- QtCore.SIGNAL("clicked()"), self.showMedNotes)
+ QtCore.SIGNAL("clicked()"), self.showMedNotes)
self.ui.phraseBook_pushButton.clicked.connect(
self.show_phrase_book_dialog)
@@ -2548,40 +2532,40 @@ class OpenmolarGui(QtGui.QMainWindow):
self.show_clinician_phrase_book_dialog)
QtCore.QObject.connect(self.ui.memos_pushButton,
- QtCore.SIGNAL("clicked()"), self.newCustomMemo)
+ QtCore.SIGNAL("clicked()"), self.newCustomMemo)
QtCore.QObject.connect(self.ui.childsmile_button,
- QtCore.SIGNAL("clicked()"), self.childsmile_button_clicked)
+ QtCore.SIGNAL("clicked()"), self.childsmile_button_clicked)
self.ui.actionSurgery_Mode.toggled.connect(self.set_surgery_mode)
self.ui.actionDocuments_Dialog.triggered.connect(
self.documents_pushButton_clicked)
def signals_admin(self):
- #admin frame
+ # admin frame
QtCore.QObject.connect(self.ui.home_pushButton,
- QtCore.SIGNAL("clicked()"), self.home)
+ QtCore.SIGNAL("clicked()"), self.home)
QtCore.QObject.connect(self.ui.newPatientPushButton,
- QtCore.SIGNAL("clicked()"), self.enterNewPatient)
+ QtCore.SIGNAL("clicked()"), self.enterNewPatient)
QtCore.QObject.connect(self.ui.findButton,
- QtCore.SIGNAL("clicked()"), self.find_patient)
+ QtCore.SIGNAL("clicked()"), self.find_patient)
QtCore.QObject.connect(self.ui.reloadButton,
- QtCore.SIGNAL("clicked()"), self.reload_patient)
+ QtCore.SIGNAL("clicked()"), self.reload_patient)
QtCore.QObject.connect(self.ui.backButton,
- QtCore.SIGNAL("clicked()"), self.last_patient)
+ QtCore.SIGNAL("clicked()"), self.last_patient)
QtCore.QObject.connect(self.ui.nextButton,
- QtCore.SIGNAL("clicked()"), self.next_patient)
+ QtCore.SIGNAL("clicked()"), self.next_patient)
QtCore.QObject.connect(self.ui.relatedpts_pushButton,
- QtCore.SIGNAL("clicked()"), self.find_related)
+ QtCore.SIGNAL("clicked()"), self.find_related)
QtCore.QObject.connect(self.ui.dayList_comboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"),self.todays_pts)
+ QtCore.SIGNAL("currentIndexChanged(int)"), self.todays_pts)
def signals_reception(self):
'''
@@ -2589,19 +2573,19 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
QtCore.QObject.connect(self.ui.printAccount_pushButton,
- QtCore.SIGNAL("clicked()"), self.printaccount)
+ QtCore.SIGNAL("clicked()"), self.printaccount)
QtCore.QObject.connect(self.ui.printEst_pushButton,
- QtCore.SIGNAL("clicked()"), self.printEstimate)
+ QtCore.SIGNAL("clicked()"), self.printEstimate)
QtCore.QObject.connect(self.ui.printRecall_pushButton,
- QtCore.SIGNAL("clicked()"), self.printrecall)
+ QtCore.SIGNAL("clicked()"), self.printrecall)
QtCore.QObject.connect(self.ui.takePayment_pushButton,
- QtCore.SIGNAL("clicked()"), self.takePayment_pushButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.takePayment_pushButton_clicked)
QtCore.QObject.connect(self.ui.printGP17_pushButton,
- QtCore.SIGNAL("clicked()"), self.printGP17_clicked)
+ QtCore.SIGNAL("clicked()"), self.printGP17_clicked)
def signals_notes(self):
'''
@@ -2609,136 +2593,113 @@ class OpenmolarGui(QtGui.QMainWindow):
so that they can be scrolled to the end
'''
for wv in (self.ui.recNotes_webView, self.ui.notes_webView,
- self.ui.notesSummary_webView):
+ self.ui.notesSummary_webView):
QtCore.QObject.connect(wv,
- QtCore.SIGNAL("loadFinished(bool)"), self.webviewloaded)
+ QtCore.SIGNAL("loadFinished(bool)"), self.webviewloaded)
for wv in (self.ui.notes_webView, self.ui.notesSummary_webView,
- self.diary_widget.ui.appt_notes_webView):
+ self.diary_widget.ui.appt_notes_webView):
wv.linkClicked.connect(self.notes_link_clicked)
-
def signals_printing(self):
'''
connect buttons which print stuff
'''
QtCore.QObject.connect(self.ui.receiptPrintButton,
- QtCore.SIGNAL("clicked()"), self.printDupReceipt)
+ QtCore.SIGNAL("clicked()"), self.printDupReceipt)
QtCore.QObject.connect(self.ui.notesPrintButton,
- QtCore.SIGNAL("clicked()"), self.printNotes)
+ QtCore.SIGNAL("clicked()"), self.printNotes)
QtCore.QObject.connect(self.ui.referralLettersPrintButton,
- QtCore.SIGNAL("clicked()"), self.printReferral)
+ QtCore.SIGNAL("clicked()"), self.printReferral)
QtCore.QObject.connect(self.ui.standardLetterPushButton,
- QtCore.SIGNAL("clicked()"), self.printLetter)
+ QtCore.SIGNAL("clicked()"), self.printLetter)
QtCore.QObject.connect(self.ui.recallLoad_pushButton,
- QtCore.SIGNAL("clicked()"), self.exportRecalls)
+ QtCore.SIGNAL("clicked()"), self.exportRecalls)
QtCore.QObject.connect(self.ui.bulkMail_options_pushButton,
- QtCore.SIGNAL("clicked()"), self.bulkMailLetterOptions)
+ QtCore.SIGNAL("clicked()"), self.bulkMailLetterOptions)
QtCore.QObject.connect(self.ui.bulkMailPrint_pushButton,
- QtCore.SIGNAL("clicked()"), self.bulkMailPrint)
+ QtCore.SIGNAL("clicked()"), self.bulkMailPrint)
QtCore.QObject.connect(self.ui.bulk_mail_expand_pushButton,
- QtCore.SIGNAL("clicked()"), self.bulkMailExpand)
+ QtCore.SIGNAL("clicked()"), self.bulkMailExpand)
QtCore.QObject.connect(self.ui.importDoc_pushButton,
- QtCore.SIGNAL("clicked()"), self.importDoc)
+ QtCore.SIGNAL("clicked()"), self.importDoc)
QtCore.QObject.connect(self.ui.account2_pushButton,
- QtCore.SIGNAL("clicked()"), self.accountButton2Clicked)
+ QtCore.SIGNAL("clicked()"), self.accountButton2Clicked)
QtCore.QObject.connect(self.ui.prevCorres_treeWidget,
- QtCore.SIGNAL("itemDoubleClicked (QTreeWidgetItem *,int)"),
- self.showPrevPrintedDoc)
+ QtCore.SIGNAL(
+ "itemDoubleClicked (QTreeWidgetItem *,int)"),
+ self.showPrevPrintedDoc)
QtCore.QObject.connect(self.ui.importDoc_treeWidget,
- QtCore.SIGNAL("itemDoubleClicked (QTreeWidgetItem *,int)"),
- self.showImportedDoc)
+ QtCore.SIGNAL(
+ "itemDoubleClicked (QTreeWidgetItem *,int)"),
+ self.showImportedDoc)
self.ui.medicalPrintButton.clicked.connect(self.printMH)
def signals_menu(self):
- #menu
- QtCore.QObject.connect(self.ui.action_save_patient,
- QtCore.SIGNAL("triggered()"), self.save_patient_tofile)
-
- QtCore.QObject.connect(self.ui.action_Open_Patient,
- QtCore.SIGNAL("triggered()"), self.open_patient_fromfile)
-
- QtCore.QObject.connect(self.ui.actionSet_Clinician,
- QtCore.SIGNAL("triggered()"), self.setClinician)
-
- QtCore.QObject.connect(self.ui.actionSet_Assistant,
- QtCore.SIGNAL("triggered()"), self.setAssistant)
-
- QtCore.QObject.connect(self.ui.actionChange_Language,
- QtCore.SIGNAL("triggered()"), self.changeLanguage)
-
- QtCore.QObject.connect(self.ui.action_About,
- QtCore.SIGNAL("triggered()"), self.aboutOM)
-
- QtCore.QObject.connect(self.ui.action_About_QT,
- QtCore.SIGNAL("triggered()"), QtGui.qApp, QtCore.SLOT("aboutQt()"))
-
- QtCore.QObject.connect(self.ui.action_Quit,
- QtCore.SIGNAL("triggered()"), self.quit)
-
- QtCore.QObject.connect(self.ui.actionFull_Screen_Mode_Ctrl_Alt_F,
- QtCore.SIGNAL("triggered()"), self.fullscreen)
-
+ # menu
+ self.ui.action_save_patient.triggered.connect(self.save_patient_tofile)
+ self.ui.action_Open_Patient.triggered.connect(
+ self.open_patient_fromfile)
+ self.ui.actionSet_Clinician.triggered.connect(self.setClinician)
+ self.ui.actionSet_Assistant.triggered.connect(self.setAssistant)
+ self.ui.actionChange_Language.triggered.connect(self.changeLanguage)
+ self.ui.action_About.triggered.connect(self.aboutOM)
+ self.ui.action_About_QT.triggered.connect(
+ QtGui.QApplication.instance().aboutQt)
+ self.ui.action_Quit.triggered.connect(self.quit)
+ self.ui.actionFull_Screen_Mode_Ctrl_Alt_F.triggered.connect(
+ self.fullscreen)
self.ui.actionTable_View_For_Charting.toggled.connect(
self.showChartTable)
-
self.ui.actionClear_Today_s_Emergency_Slots.triggered.connect(
self.diary_widget.clearTodaysEmergencyTime)
-
- QtCore.QObject.connect(self.ui.actionTest_Print_a_GP17,
- QtCore.SIGNAL("triggered()"), self.testGP17)
-
- QtCore.QObject.connect(self.ui.actionNHS_Form_Settings,
- QtCore.SIGNAL("triggered()"), self.nhsformOptionsDialog)
-
- QtCore.QObject.connect(self.ui.actionAppointment_Tools,
- QtCore.SIGNAL("triggered()"), self.diary_widget.appointmentTools)
-
- QtCore.QObject.connect(self.ui.actionPrint_Daylists,
- QtCore.SIGNAL("triggered()"), self.daylistPrintWizard)
-
- QtCore.QObject.connect(self.ui.actionAdvanced_Record_Management,
- QtCore.SIGNAL("triggered()"), self.advancedRecordTools)
-
+ self.ui.actionTest_Print_a_GP17.triggered.connect(self.testGP17)
+ self.ui.actionNHS_Form_Settings.triggered.connect(
+ self.nhsformOptionsDialog)
+ self.ui.actionAppointment_Tools.triggered.connect(
+ self.diary_widget.appointmentTools)
+ self.ui.actionPrint_Daylists.triggered.connect(self.daylistPrintWizard)
+ self.ui.actionAdvanced_Record_Management.triggered.connect(
+ self.advancedRecordTools)
self.ui.actionFix_Locked_New_Course_of_Treatment.triggered.connect(
self.fix_zombied_course)
-
self.ui.actionAllow_Full_Edit.triggered.connect(
self.ui.cashbookTextBrowser.allow_full_edit)
-
self.ui.actionSet_Surgery_Number.triggered.connect(
self.set_surgery_number)
- self.ui.actionEdit_Phrasebooks.triggered.connect(
- self.edit_phrasebooks)
+ self.ui.actionEdit_Phrasebooks.triggered.connect(self.edit_phrasebooks)
+ self.ui.actionAllow_Edit.triggered.connect(self.allow_edit_daybook)
+ self.ui.actionEnable_Filters.triggered.connect(
+ self.enable_daybook_filters)
def signals_estimates(self):
- #Estimates and course ManageMent
+ # Estimates and course ManageMent
QtCore.QObject.connect(self.ui.closeTx_pushButton,
- QtCore.SIGNAL("clicked()"), self.closeTx_pushButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.closeTx_pushButton_clicked)
QtCore.QObject.connect(self.ui.estLetter_pushButton,
- QtCore.SIGNAL("clicked()"), self.customEstimate)
+ QtCore.SIGNAL("clicked()"), self.customEstimate)
QtCore.QObject.connect(self.ui.recalcEst_pushButton,
- QtCore.SIGNAL("clicked()"), self.recalculateEstimate)
+ QtCore.SIGNAL("clicked()"), self.recalculateEstimate)
QtCore.QObject.connect(self.ui.apply_exemption_pushButton,
- QtCore.SIGNAL("clicked()"), self.apply_exemption)
+ QtCore.SIGNAL("clicked()"), self.apply_exemption)
QtCore.QObject.connect(self.ui.rec_apply_exemption_pushButton,
- QtCore.SIGNAL("clicked()"), self.apply_exemption)
+ QtCore.SIGNAL("clicked()"), self.apply_exemption)
self.ui.xrayTxpushButton.clicked.connect(self.addXrayItems)
self.ui.perioTxpushButton.clicked.connect(self.addPerioItems)
@@ -2749,7 +2710,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.estWidget.updated_fees_signal.connect(self.updateDetails)
QtCore.QObject.connect(self.ui.estWidget,
- QtCore.SIGNAL("deleteItem"), self.estwidget_deleteTxItem)
+ QtCore.SIGNAL("deleteItem"), self.estwidget_deleteTxItem)
def signals_plan(self):
self.ui.advanced_tx_planning_button.clicked.connect(
@@ -2775,81 +2736,85 @@ class OpenmolarGui(QtGui.QMainWindow):
def signals_bulk_mail(self):
QtCore.QObject.connect(self.ui.bulk_mailings_treeView,
- QtCore.SIGNAL("doubleClicked (const QModelIndex&)"),
- self.bulk_mail_doubleclicked)
+ QtCore.SIGNAL(
+ "doubleClicked (const QModelIndex&)"),
+ self.bulk_mail_doubleclicked)
def signals_forum(self):
QtCore.QObject.connect(self.ui.forum_treeWidget,
- QtCore.SIGNAL("itemSelectionChanged ()"),
- self.forum_treeWidget_selectionChanged)
+ QtCore.SIGNAL("itemSelectionChanged ()"),
+ self.forum_treeWidget_selectionChanged)
self.ui.action_forum_show_advanced_options.triggered.connect(
- self.forum_mode)
+ self.forum_mode)
QtCore.QObject.connect(self.ui.forumDelete_pushButton,
- QtCore.SIGNAL("clicked()"), self.forumDeleteItem_clicked)
+ QtCore.SIGNAL("clicked()"), self.forumDeleteItem_clicked)
QtCore.QObject.connect(self.ui.forumReply_pushButton,
- QtCore.SIGNAL("clicked()"), self.forumReply_clicked)
+ QtCore.SIGNAL("clicked()"), self.forumReply_clicked)
QtCore.QObject.connect(self.ui.forumNewTopic_pushButton,
- QtCore.SIGNAL("clicked()"), self.forumNewTopic_clicked)
+ QtCore.SIGNAL("clicked()"), self.forumNewTopic_clicked)
QtCore.QObject.connect(self.ui.forumParent_pushButton,
- QtCore.SIGNAL("clicked()"), self.forumParent_clicked)
+ QtCore.SIGNAL("clicked()"), self.forumParent_clicked)
QtCore.QObject.connect(self.ui.forumViewFilter_comboBox,
- QtCore.SIGNAL("currentIndexChanged (const QString&)"),
- self.forumViewFilterChanged)
+ QtCore.SIGNAL(
+ "currentIndexChanged (const QString&)"),
+ self.forumViewFilterChanged)
QtCore.QObject.connect(self.ui.forumCollapse_pushButton,
- QtCore.SIGNAL("clicked()"), self.forumCollapse)
+ QtCore.SIGNAL("clicked()"), self.forumCollapse)
QtCore.QObject.connect(self.ui.forumExpand_pushButton,
- QtCore.SIGNAL("clicked()"), self.forumExpand)
+ QtCore.SIGNAL("clicked()"), self.forumExpand)
for widg in (self.ui.group_replies_radioButton,
- self.ui.forum_deletedposts_checkBox):
+ self.ui.forum_deletedposts_checkBox):
QtCore.QObject.connect(widg,
- QtCore.SIGNAL("toggled (bool)"), self.forum_radioButtons)
+ QtCore.SIGNAL("toggled (bool)"), self.forum_radioButtons)
def signals_history(self):
QtCore.QObject.connect(self.debugMenu,
- QtCore.SIGNAL("triggered (QAction *)"), self.showPtAttributes)
+ QtCore.SIGNAL("triggered (QAction *)"), self.showPtAttributes)
QtCore.QObject.connect(self.ui.ptAtts_checkBox,
- QtCore.SIGNAL("stateChanged (int)"), self.updateAttributes)
+ QtCore.SIGNAL("stateChanged (int)"), self.updateAttributes)
QtCore.QObject.connect(self.ui.historyPrint_pushButton,
- QtCore.SIGNAL("clicked()"), self.historyPrint)
+ QtCore.SIGNAL("clicked()"), self.historyPrint)
QtCore.QObject.connect(self.ui.pastPayments_pushButton,
- QtCore.SIGNAL("clicked()"), self.pastPayments_clicked)
+ QtCore.SIGNAL("clicked()"), self.pastPayments_clicked)
QtCore.QObject.connect(self.ui.pastTreatment_pushButton,
- QtCore.SIGNAL("clicked()"), self.pastTreatment_clicked)
+ QtCore.SIGNAL("clicked()"), self.pastTreatment_clicked)
QtCore.QObject.connect(self.ui.pastCourses_pushButton,
- QtCore.SIGNAL("clicked()"), self.pastCourses_clicked)
+ QtCore.SIGNAL("clicked()"), self.pastCourses_clicked)
QtCore.QObject.connect(self.ui.pastEstimates_pushButton,
- QtCore.SIGNAL("clicked()"), self.pastEstimates_clicked)
+ QtCore.SIGNAL("clicked()"), self.pastEstimates_clicked)
QtCore.QObject.connect(self.ui.past_course_estimates_pushButton,
- QtCore.SIGNAL("clicked()"), self.past_course_estimates_clicked)
+ QtCore.SIGNAL("clicked()"), self.past_course_estimates_clicked)
QtCore.QObject.connect(self.ui.NHSClaims_pushButton,
- QtCore.SIGNAL("clicked()"), self.NHSClaims_clicked)
+ QtCore.SIGNAL("clicked()"), self.NHSClaims_clicked)
self.ui.memo_history_pushButton.clicked.connect(self.show_memo_history)
self.ui.current_est_versioning_pushButton.clicked.connect(
self.show_estimate_versioning)
def signals_daybook(self):
- #daybook - cashbook
+ # daybook - cashbook
self.ui.daybookGoPushButton.clicked.connect(self.daybookView)
self.ui.daybookPrintButton.clicked.connect(self.daybookPrint)
+ self.ui.daybook_filters_pushButton.clicked.connect(
+ self.show_daybook_filter_help)
self.ui.cashbookGoPushButton.clicked.connect(self.cashbookView)
self.ui.cashbookPrintButton.clicked.connect(self.cashbookPrint)
@@ -2857,91 +2822,90 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.treatment_only_radioButton.clicked.connect(self.cashbookView)
self.ui.all_payments_radioButton.clicked.connect(self.cashbookView)
-
def signals_accounts(self):
- #accounts
+ # accounts
QtCore.QObject.connect(self.ui.loadAccountsTable_pushButton,
- QtCore.SIGNAL("clicked()"), self.loadAccountsTable_clicked)
+ QtCore.SIGNAL("clicked()"), self.loadAccountsTable_clicked)
QtCore.QObject.connect(self.ui.printSelectedAccounts_pushButton,
- QtCore.SIGNAL("clicked()"), self.printSelectedAccounts)
+ QtCore.SIGNAL("clicked()"), self.printSelectedAccounts)
QtCore.QObject.connect(self.ui.printAccountsTable_pushButton,
- QtCore.SIGNAL("clicked()"), self.printAccountsTable)
+ QtCore.SIGNAL("clicked()"), self.printAccountsTable)
QtCore.QObject.connect(self.ui.accounts_tableWidget,
- QtCore.SIGNAL("cellDoubleClicked (int,int)"),
- self.accountsTableClicked)
+ QtCore.SIGNAL("cellDoubleClicked (int,int)"),
+ self.accountsTableClicked)
def signals_contract(self):
- #contract
+ # contract
self.ui.status_comboBox.currentIndexChanged.connect(
self.change_pt_status)
QtCore.QObject.connect(self.ui.badDebt_pushButton,
- QtCore.SIGNAL("clicked()"), self.makeBadDebt_clicked)
+ QtCore.SIGNAL("clicked()"), self.makeBadDebt_clicked)
QtCore.QObject.connect(self.ui.contract_tabWidget,
- QtCore.SIGNAL("currentChanged(int)"), self.contractTab_navigated)
+ QtCore.SIGNAL("currentChanged(int)"), self.contractTab_navigated)
QtCore.QObject.connect(self.ui.dnt1comboBox, QtCore.
- SIGNAL("activated(const QString&)"), self.dnt1comboBox_clicked)
+ SIGNAL("activated(const QString&)"), self.dnt1comboBox_clicked)
QtCore.QObject.connect(self.ui.dnt2comboBox, QtCore.
- SIGNAL("activated(const QString&)"), self.dnt2comboBox_clicked)
+ SIGNAL("activated(const QString&)"), self.dnt2comboBox_clicked)
QtCore.QObject.connect(self.ui.cseType_comboBox,
- QtCore.SIGNAL("activated(const QString&)"),
- self.cseType_comboBox_clicked)
+ QtCore.SIGNAL("activated(const QString&)"),
+ self.cseType_comboBox_clicked)
QtCore.QObject.connect(self.ui.editNHS_pushButton,
- QtCore.SIGNAL("clicked()"), self.editNHS_pushButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.editNHS_pushButton_clicked)
for le in (self.ui.exemption_lineEdit, self.ui.exempttext_lineEdit):
- QtCore.QObject.connect(le,QtCore.SIGNAL("editingFinished ()"),
- self.exemption_edited)
+ QtCore.QObject.connect(le, QtCore.SIGNAL("editingFinished ()"),
+ self.exemption_edited)
QtCore.QObject.connect(self.ui.editPriv_pushButton,
- QtCore.SIGNAL("clicked()"), self.editPriv_pushButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.editPriv_pushButton_clicked)
QtCore.QObject.connect(self.ui.nhsclaims_pushButton,
- QtCore.SIGNAL("clicked()"), self.nhsclaims_pushButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.nhsclaims_pushButton_clicked)
QtCore.QObject.connect(self.ui.editHDP_pushButton,
- QtCore.SIGNAL("clicked()"), self.editHDP_pushButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.editHDP_pushButton_clicked)
QtCore.QObject.connect(self.ui.editRegDent_pushButton,
- QtCore.SIGNAL("clicked()"), self.editRegDent_pushButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.editRegDent_pushButton_clicked)
def signals_feesTable(self):
- #feesTable
- ##TODO bring this functionality back
- #QtCore.QObject.connect(self.ui.printFeescale_pushButton,
- #QtCore.SIGNAL("clicked()"), self.printFeesTable)
+ # feesTable
+ # TODO bring this functionality back
+ # QtCore.QObject.connect(self.ui.printFeescale_pushButton,
+ # QtCore.SIGNAL("clicked()"), self.printFeesTable)
QtCore.QObject.connect(self.ui.feeScales_treeView,
- QtCore.SIGNAL("clicked (QModelIndex)"),
- self.feeScale_clicked)
+ QtCore.SIGNAL("clicked (QModelIndex)"),
+ self.feeScale_clicked)
QtCore.QObject.connect(self.ui.feeScales_treeView,
- QtCore.SIGNAL("expanded (QModelIndex)"),
- self.feeScale_expanded)
+ QtCore.SIGNAL("expanded (QModelIndex)"),
+ self.feeScale_expanded)
QtCore.QObject.connect(self.ui.chooseFeescale_comboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"),
- self.chooseFeescale_comboBox_changed)
+ QtCore.SIGNAL("currentIndexChanged(int)"),
+ self.chooseFeescale_comboBox_changed)
QtCore.QObject.connect(self.ui.feeExpand_radioButton,
- QtCore.SIGNAL("clicked()"), self.feeExpand_radiobuttons_clicked)
+ QtCore.SIGNAL("clicked()"), self.feeExpand_radiobuttons_clicked)
QtCore.QObject.connect(self.ui.feeCompress_radioButton,
- QtCore.SIGNAL("clicked()"), self.feeExpand_radiobuttons_clicked)
+ QtCore.SIGNAL("clicked()"), self.feeExpand_radiobuttons_clicked)
self.ui.documents_pushButton.clicked.connect(
self.documents_pushButton_clicked)
QtCore.QObject.connect(self.ui.feeSearch_lineEdit,
- QtCore.SIGNAL("returnPressed()"), self.feeSearch_lineEdit_edited)
+ QtCore.SIGNAL("returnPressed()"), self.feeSearch_lineEdit_edited)
self.ui.search_descriptions_radioButton.toggled.connect(
self.feeSearch_pushButton_clicked)
@@ -2950,10 +2914,10 @@ class OpenmolarGui(QtGui.QMainWindow):
self.feeSearch_pushButton_clicked)
QtCore.QObject.connect(self.ui.feescale_tester_pushButton,
- QtCore.SIGNAL("clicked()"), self.feescale_tester_pushButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.feescale_tester_pushButton_clicked)
QtCore.QObject.connect(self.ui.feetable_xml_pushButton,
- QtCore.SIGNAL("clicked()"), self.feetable_xml)
+ QtCore.SIGNAL("clicked()"), self.feetable_xml)
self.ui.hide_rare_feescale_codes_checkBox.toggled.connect(
self.hide_rare_feescale_items)
@@ -2984,17 +2948,17 @@ class OpenmolarGui(QtGui.QMainWindow):
self.reverse_completed_chart_treatments)
QtCore.QObject.connect(self.ui.toothPropsWidget,
- QtCore.SIGNAL("NextTooth"), self.navigateCharts)
+ QtCore.SIGNAL("NextTooth"), self.navigateCharts)
self.ui.static_control_panel.clicked.connect(
self.ui.toothPropsWidget.static_input)
#--fillings have changed!!
QtCore.QObject.connect(self.ui.toothPropsWidget.lineEdit,
- QtCore.SIGNAL("Changed_Properties"), self.updateCharts)
+ QtCore.SIGNAL("Changed_Properties"), self.updateCharts)
QtCore.QObject.connect(self.ui.toothPropsWidget.lineEdit,
- QtCore.SIGNAL("DeletedComments"), self.deleteComments)
+ QtCore.SIGNAL("DeletedComments"), self.deleteComments)
self.ui.static_control_panel.deciduous_signal.connect(
self.flipDeciduous)
@@ -3003,33 +2967,36 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.static_control_panel.setEnabled)
def signals_editPatient(self):
- #edit page
+ # edit page
self.ui.email1_button.clicked.connect(self.send_email)
self.ui.email2_button.clicked.connect(self.send_email)
self.ui.auto_address_button.clicked.connect(self.raise_address_dialog)
self.ui.titleEdit.editingFinished.connect(self.check_sex)
self.ui.family_button.clicked.connect(self.raise_family_dialog)
+ self.ui.save_new_patient_pushButton.clicked.connect(
+ self.checkNewPatient)
+ self.ui.abort_new_patient_pushButton.clicked.connect(self.home)
def signals_notesPage(self):
- #notes page
+ # notes page
for rb in (self.ui.notes_includePrinting_checkBox,
- self.ui.notes_includePayments_checkBox,
- self.ui.notes_includeTimestamps_checkBox,
- self.ui.notes_includeMetadata_checkBox,
- self.ui.summary_notes_checkBox):
+ self.ui.notes_includePayments_checkBox,
+ self.ui.notes_includeTimestamps_checkBox,
+ self.ui.notes_includeMetadata_checkBox,
+ self.ui.summary_notes_checkBox):
rb.toggled.connect(self.updateNotesPage)
rb.toggled.connect(self.load_notes_summary)
def signals_periochart(self):
- #periochart
- ## defunct QtCore.QObject.connect(self.ui.perioChartWidget,
- ##QtCore.SIGNAL("toothSelected"), self.periocharts)
+ # periochart
+ # defunct QtCore.QObject.connect(self.ui.perioChartWidget,
+ # QtCore.SIGNAL("toothSelected"), self.periocharts)
QtCore.QObject.connect(self.ui.perioChartDateComboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"), self.layoutPerioCharts)
+ QtCore.SIGNAL("currentIndexChanged(int)"), self.layoutPerioCharts)
QtCore.QObject.connect(self.ui.bpeDateComboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"), self.bpe_table)
+ QtCore.SIGNAL("currentIndexChanged(int)"), self.bpe_table)
def signals_tabs(self, connect=True):
'''
@@ -3038,21 +3005,21 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
if connect:
QtCore.QObject.connect(self.ui.main_tabWidget,
- QtCore.SIGNAL("currentChanged(int)"), self.handle_mainTab)
+ QtCore.SIGNAL("currentChanged(int)"), self.handle_mainTab)
QtCore.QObject.connect(self.ui.tabWidget,
- QtCore.SIGNAL("currentChanged(int)"), self.handle_patientTab)
+ QtCore.SIGNAL("currentChanged(int)"), self.handle_patientTab)
else:
QtCore.QObject.disconnect(self.ui.main_tabWidget,
- QtCore.SIGNAL("currentChanged(int)"), self.handle_mainTab)
+ QtCore.SIGNAL("currentChanged(int)"), self.handle_mainTab)
QtCore.QObject.disconnect(self.ui.tabWidget,
- QtCore.SIGNAL("currentChanged(int)"), self.handle_patientTab)
+ QtCore.SIGNAL("currentChanged(int)"), self.handle_patientTab)
def signals_appointments(self):
- #signals raised on the main appointment tab
+ # signals raised on the main appointment tab
QtCore.QObject.connect(self.ui.actionSet_Font_Size,
- QtCore.SIGNAL("triggered ()"), self.apptBook_fontSize)
+ QtCore.SIGNAL("triggered ()"), self.apptBook_fontSize)
self.diary_widget.bring_to_front.connect(self.show_diary)
@@ -3078,7 +3045,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.diary_widget.schedule_controller.set_patient(self.pt)
self.pt_diary_widget.layout_ptDiary()
self.signals_tabs(False)
- self.ui.main_tabWidget.setCurrentIndex(1) #appointmenttab
+ self.ui.main_tabWidget.setCurrentIndex(1) # appointmenttab
self.signals_tabs()
self.diary_widget.start_scheduling(self.pt)
@@ -3092,15 +3059,17 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
if not self.pt.underTreatment:
self.advise(
- _("Recalculate Estimate is for active courses only"), 1)
+ _("Recalculate Estimate is for active courses only"), 1)
return
- result=QtGui.QMessageBox.question(self, "Confirm",
- u"%s<hr /><i>(%s)</i>"% (
- _("Scrap the estimate and re-price everything?"),
- _("Custom items and items added using feescale method will be unaffected")
- ),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.No )
+ result = QtGui.QMessageBox.question(self, "Confirm",
+ u"%s<hr /><i>(%s)</i>" % (
+ _(
+ "Scrap the estimate and re-price everything?"),
+ _(
+ "Custom items and items added using feescale method will be unaffected")
+ ),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No)
if result == QtGui.QMessageBox.No:
return
@@ -3112,15 +3081,16 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
applies a max fee chargeable
'''
- result=QtGui.QMessageBox.question(self, _("Confirm"),
- _("apply an exemption to the NHS items on this estimate?"),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.No )
+ result = QtGui.QMessageBox.question(self, _("Confirm"),
+ _(
+ "apply an exemption to the NHS items on this estimate?"),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No)
if result == QtGui.QMessageBox.No:
return
max, result = QtGui.QInputDialog.getInteger(self, _("input needed"),
- _("maximum charge for the patient")+"<br />"+_(
- "please enter the amount in pence, or leave as 0 for full exemption"))
+ _("maximum charge for the patient") + "<br />" + _(
+ "please enter the amount in pence, or leave as 0 for full exemption"))
if result and estimates.apply_exemption(self.pt, max):
self.handle_patientTab()
@@ -3161,29 +3131,32 @@ class OpenmolarGui(QtGui.QMainWindow):
dl.apply()
def update_family_label(self):
- message_2 = u"&%s"% _("Relatives")
+ message_2 = u"&%s" % _("Relatives")
if self.pt.familyno:
- message = u"%s %s - <b>%d %s</b>"% (
+ message = u"%s %s - <b>%d %s</b>" % (
_("Family ID"),
self.pt.familyno,
self.pt.n_family_members,
_("Member(s)")
- )
- message_2 += " (%d)"% (self.pt.n_family_members-1)
-
+ )
+ message_2 += " (%d)" % (self.pt.n_family_members - 1)
+ localsettings.last_family_no = self.pt.familyno
+ elif self.pt.serialno == 0:
+ message = _("No Patient Loaded")
else:
message = _("Not a member of a known family")
self.ui.family_group_label.setText(message)
-
self.ui.relatedpts_pushButton.setText(message_2)
+ LOGGER.debug("updating family label '%s' '%s'" % (message, message_2))
+
def send_email(self):
if self.sender == self.ui.email2_button:
email = self.ui.email2Edit.text()
else:
email = self.ui.email1Edit.text()
- webbrowser.open("mailto:%s"% email)
+ webbrowser.open("mailto:%s" % email)
def load_pt_statuses(self):
ds = DistinctStatuses()
@@ -3192,12 +3165,12 @@ class OpenmolarGui(QtGui.QMainWindow):
def load_fee_tables(self):
localsettings.loadFeeTables()
for warning in localsettings.FEETABLES.warnings:
- self.advise(u"<b>%s</b><hr />%s"% (
- _("error loading feetable"), warning)
- ,2)
+ self.advise(u"<b>%s</b><hr />%s" % (
+ _("error loading feetable"), warning), 2)
+ self.ui.cseType_comboBox.addItems(localsettings.CSETYPES)
def hide_rare_feescale_items(self, bool):
- #TODO - this could actually have 3 levels.
+ # TODO - this could actually have 3 levels.
if bool:
level = 1
else:
@@ -3231,7 +3204,10 @@ class OpenmolarGui(QtGui.QMainWindow):
dl = AdvancedTxPlanningDialog(self)
if dl.exec_():
- manipulate_plan.complete_txs(self, tuple(dl.completed_items), False)
+ manipulate_plan.complete_txs(
+ self,
+ tuple(dl.completed_items),
+ False)
manipulate_plan.reverse_txs(self, tuple(dl.reversed_items), False)
if dl.new_plan_items:
_add_txs(dl.new_plan_items)
@@ -3239,41 +3215,41 @@ class OpenmolarGui(QtGui.QMainWindow):
_add_txs(dl.new_cmp_items, completed=True)
if dl.deleted_plan_items:
manipulate_plan.remove_treatments_from_plan_and_est(
- self, dl.deleted_plan_items)
+ self, dl.deleted_plan_items)
if dl.deleted_cmp_items:
manipulate_plan.remove_treatments_from_plan_and_est(
- self, dl.deleted_cmp_items, completed=True)
+ self, dl.deleted_cmp_items, completed=True)
self.update_plan_est()
self.updateDetails()
def show_plan_chart_context_menu(self, att, values, point):
QtCore.QTimer.singleShot(100, partial(
- manipulate_plan.plan_viewer_context_menu, self, att, values, point))
+ manipulate_plan.plan_viewer_context_menu, self, att, values, point))
def show_cmp_chart_context_menu(self, att, values, point):
# use singleShot to slow this down fractionally
#(was occasionaly firing the Qmenu)
QtCore.QTimer.singleShot(100, partial(
- manipulate_plan.cmp_viewer_context_menu, self, att, values, point))
+ manipulate_plan.cmp_viewer_context_menu, self, att, values, point))
def show_plan_listview_context_menu(self, point):
- LOGGER.debug("plan listview pressed %s"% point)
+ LOGGER.debug("plan listview pressed %s" % point)
QtCore.QTimer.singleShot(100,
- partial(manipulate_plan.plan_list_right_click, self, point))
+ partial(manipulate_plan.plan_list_right_click, self, point))
def handle_plan_listview_2xclick(self, index):
- LOGGER.debug("plan listview 2xclick %s"% index)
+ LOGGER.debug("plan listview 2xclick %s" % index)
manipulate_plan.plan_listview_2xclick(self, index)
def show_cmp_listview_context_menu(self, point):
- LOGGER.debug("completed listview pressed %s"% point)
+ LOGGER.debug("completed listview pressed %s" % point)
# use singleShot to slow this down fractionally
#(was occasionaly firing the Qmenu)
QtCore.QTimer.singleShot(100,
- partial(manipulate_plan.cmp_list_right_click, self, point))
+ partial(manipulate_plan.cmp_list_right_click, self, point))
def handle_completed_listview_2xclick(self, index):
- LOGGER.debug("completed listview 2xclick %s"% index)
+ LOGGER.debug("completed listview 2xclick %s" % index)
manipulate_plan.completed_listview_2xclick(self, index)
def set_surgery_number(self):
@@ -3284,10 +3260,14 @@ class OpenmolarGui(QtGui.QMainWindow):
if dialog.exec_():
localsettings.surgeryno = dl.comboBox.currentIndex()
localsettings.updateLocalSettings(
- "surgeryno", str(localsettings.surgeryno))
+ "surgeryno", str(localsettings.surgeryno))
return True
return False
+ def allow_edit_daybook(self, bool_value):
+ daybook.ALLOW_TX_EDITS = bool_value
+ daybookHistory.ALLOW_TX_EDITS = bool_value
+
def edit_phrasebooks(self):
def editor_closed():
self.phrasebook_editor.setParent(None)
@@ -3301,6 +3281,35 @@ class OpenmolarGui(QtGui.QMainWindow):
self.phrasebook_editor.show()
self.phrasebook_editor.closed_signal.connect(editor_closed)
+ def enable_daybook_filters(self, bool_value):
+ self.ui.daybook_filters_frame.setEnabled(bool_value)
+ if bool_value == False:
+ self.ui.daybook_filters_lineEdit.setText("")
+
+ def show_daybook_filter_help(self):
+ self.advise(daybook.filter_help_text(), 1)
+
+ def set_browser_source(self, url):
+ '''
+ A function to re-implement QTextBrowser.setUrl
+ this will catch "edit links"
+ '''
+ url = str(url.toString().toAscii())
+ m = re.match("daybook_id\?(\d+)feesa=(\d+)feesb=(\d+)", url)
+ n = re.match("daybook_id_edit\?(\d+)", url)
+ if m:
+ id = int(m.groups()[0])
+ fee = int(m.groups()[1])
+ ptfee = int(m.groups()[2])
+
+ dl = DaybookItemDialog(id, fee, ptfee, self)
+ dl.exec_()
+ if n and permissions.granted():
+ id = int(n.groups()[0])
+ dl = DaybookEditDialog(id, self)
+ if dl.exec_():
+ dl.update_treatments()
+
def excepthook(self, exc_type, exc_val, tracebackobj):
'''
PyQt4 prints unhandled exceptions to stdout and carries on regardless
@@ -3310,7 +3319,8 @@ class OpenmolarGui(QtGui.QMainWindow):
message = ""
for l in traceback.format_exception(exc_type, exc_val, tracebackobj):
message += l
- self.advise('UNHANDLED EXCEPTION!<hr /><pre>%s'% message, 2)
+ self.advise('UNHANDLED EXCEPTION!<hr /><pre>%s' % message, 2)
+
def main(app):
'''
@@ -3324,7 +3334,7 @@ def main(app):
data = f.read().strip("\n")
f.close()
if localsettings.hash_func(data) != \
- '1fd0c27f4d65caaa10ef5ef6a714faf96ed44fdd':
+ '1fd0c27f4d65caaa10ef5ef6a714faf96ed44fdd':
raise IOError("bad checksum")
LOGGER.warning("allowing developer login")
except:
@@ -3342,9 +3352,9 @@ if __name__ == "__main__":
LOGGER.warning("dev mode in use - verbose logging")
os.chdir(os.path.expanduser("~"))
- LOGGER.debug("Qt Version: %s"% QtCore.QT_VERSION_STR)
- LOGGER.debug("PyQt Version: %s"% QtCore.PYQT_VERSION_STR)
+ LOGGER.debug("Qt Version: %s" % QtCore.QT_VERSION_STR)
+ LOGGER.debug("PyQt Version: %s" % QtCore.PYQT_VERSION_STR)
newapp = QtGui.QApplication(sys.argv)
localsettings.operator = "NW"
- #localsettings.station = "reception"
+ # localsettings.station = "reception"
main(newapp)
diff --git a/src/openmolar/qt4gui/new_patient_gui.py b/src/openmolar/qt4gui/new_patient_gui.py
index b4a6128..b41b97f 100644
--- a/src/openmolar/qt4gui/new_patient_gui.py
+++ b/src/openmolar/qt4gui/new_patient_gui.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
from gettext import gettext as _
@@ -12,10 +28,51 @@ from gettext import gettext as _
from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings
-from openmolar.dbtools import writeNewPatient
+from openmolar.dbtools import writeNewPatient, families
LOGGER = logging.getLogger("openmolar")
+
+def check_use_family(om_gui):
+ if localsettings.LAST_ADDRESS == ("",) * 8:
+ return
+ result = QtGui.QMessageBox.question(om_gui,
+ _("Question"),
+ _(
+ "Use details from the previous record?"),
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes
+ if result:
+ dup_tup = localsettings.LAST_ADDRESS
+ om_gui.ui.addr1Edit.setText(dup_tup[1])
+ om_gui.ui.addr2Edit.setText(dup_tup[2])
+ om_gui.ui.addr3Edit.setText(dup_tup[3])
+ om_gui.ui.townEdit.setText(dup_tup[4])
+ om_gui.ui.countyEdit.setText(dup_tup[5])
+ om_gui.ui.pcdeEdit.setText(dup_tup[6])
+ om_gui.ui.tel1Edit.setText(dup_tup[7])
+ om_gui.ui.snameEdit.setText(dup_tup[0])
+ else:
+ return
+
+ if localsettings.last_family_no is None:
+ if QtGui.QMessageBox.question(om_gui,
+ _("Question"),
+ _("Start a new family group?"),
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+ om_gui.pt.familyno = families.new_group(
+ localsettings.previous_sno())
+ else:
+ if QtGui.QMessageBox.question(om_gui,
+ _("Question"),
+ _(
+ "Add the new patient to this family group?"),
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+ om_gui.pt.familyno = localsettings.last_family_no
+
+
def enterNewPatient(om_gui):
'''
called by the user clicking the new patient button
@@ -24,13 +81,15 @@ def enterNewPatient(om_gui):
#--check for unsaved changes
if not om_gui.okToLeaveRecord():
LOGGER.debug(
- "not entering new patient - still editing current record")
+ "not entering new patient - still editing current record")
return
- #--disable the newPatient Button
- #--THE STATE OF THIS BUTTON IS USED TO MONITOR USER ACTIONS
- #--DO NOT CHANGE THIS LINE
- om_gui.ui.newPatientPushButton.setEnabled(False)
+ #--make the ui dialog like
+ om_gui.entering_new_patient = True
+ om_gui.ui.new_notes_frame.hide()
+ om_gui.ui.details_frame.hide()
+ om_gui.ui.new_patient_frame.show()
+ om_gui.ui.family_groupBox.hide()
#--disable the tabs which are normally enabled by default
om_gui.ui.tabWidget.setTabEnabled(4, False)
@@ -38,10 +97,10 @@ def enterNewPatient(om_gui):
#--clear any current record
om_gui.clearRecord()
+ om_gui.pt.familyno = None
#--disable the majority of widgets
om_gui.enableEdit(False)
- om_gui.changeSaveButtonforNewPatient()
#--move to the edit patient details page
om_gui.ui.tabWidget.setTabEnabled(0, True)
@@ -52,14 +111,8 @@ def enterNewPatient(om_gui):
om_gui.ui.sexEdit.setCurrentIndex(0)
om_gui.ui.titleEdit.setFocus()
- #--give some help
- om_gui.ui.detailsBrowser.setHtml(
- '<div align="center"><h2>%s</h2>%s<hr /><em>%s</em></div>'% (
- _("New Patient Mode"),
- _("Please enter at least the required fields."),
- _("Use the Save Changes button to commit to the database, "
- "or the home button to leave this page")
- ))
+ check_use_family(om_gui)
+
def checkNewPatient(om_gui):
'''
@@ -67,36 +120,33 @@ def checkNewPatient(om_gui):
before commiting to database
'''
LOGGER.debug("check new patient")
- atts=[]
- allfields_entered=True
+ atts = []
+ allfields_entered = True
- #-- check these widgets for entered text.
+ # check these widgets for entered text.
for widg in (om_gui.ui.snameEdit, om_gui.ui.titleEdit, om_gui.ui.fnameEdit,
- om_gui.ui.addr1Edit, om_gui.ui.pcdeEdit):
+ om_gui.ui.addr1Edit, om_gui.ui.pcdeEdit):
if len(widg.text()) == 0:
- allfields_entered=False
+ allfields_entered = False
if allfields_entered:
- #--update 'pt'
+ # update 'pt'
om_gui.apply_editpage_changes()
om_gui.pt.cset = localsettings.DEFAULT_COURSETYPE
sno = writeNewPatient.commit(om_gui.pt)
if sno == -1:
om_gui.advise(_("Error saving new patient, sorry!"), 2)
else:
- #--sucessful save
- #--reset the gui
+ # successful save so reset the gui and continue
finishedNewPatientInput(om_gui)
- #--set that serialno
- #om_gui.pt.serialno = sno
- #om_gui.clearRecord()
om_gui.getrecord(sno, newPatientReload=True)
else:
- #-- prompt user for more info
+ # prompt user for more info
om_gui.advise(_(
- "insufficient data to create a new record."
- "please fill in all highlighted fields"
- ), 2)
+ "insufficient data to create a new record."
+ "please fill in all highlighted fields"
+ ), 2)
+
def finishedNewPatientInput(om_gui):
'''
@@ -108,8 +158,13 @@ def finishedNewPatientInput(om_gui):
and restore the save button text
'''
LOGGER.debug("restoring gui to normal state (after entering new patient)")
- om_gui.ui.detailsBrowser.setText("")
- om_gui.ui.newPatientPushButton.setEnabled(True)
+
+ om_gui.entering_new_patient = False
+
+ om_gui.ui.new_notes_frame.show()
+ om_gui.ui.details_frame.show()
+ om_gui.ui.new_patient_frame.hide()
+ om_gui.ui.family_groupBox.show()
om_gui.ui.tabWidget.setTabEnabled(4, True)
om_gui.ui.tabWidget.setTabEnabled(3, True)
@@ -117,7 +172,6 @@ def finishedNewPatientInput(om_gui):
om_gui.ui.tabWidget.setTabEnabled(0, False)
- om_gui.restoreSaveButtonAfterNewPatient()
def abortNewPatientEntry(om_gui):
'''
@@ -126,9 +180,10 @@ def abortNewPatientEntry(om_gui):
om_gui.ui.main_tabWidget.setCurrentIndex(0)
if QtGui.QMessageBox.question(om_gui, "Confirm",
- _("New Patient not saved. Abandon Changes?"),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes ) == QtGui.QMessageBox.Yes:
+ "%s<hr /><em>%s</em>" % (
+ _("New Patient not saved."),
+ _("Abandon Changes?")),
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Ok:
finishedNewPatientInput(om_gui)
return True
-
diff --git a/src/openmolar/qt4gui/phrasebook/__init__.py b/src/openmolar/qt4gui/phrasebook/__init__.py
index e69de29..c701215 100644
--- a/src/openmolar/qt4gui/phrasebook/__init__.py
+++ b/src/openmolar/qt4gui/phrasebook/__init__.py
@@ -0,0 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/openmolar/qt4gui/phrasebook/phrasebook_dialog.py b/src/openmolar/qt4gui/phrasebook/phrasebook_dialog.py
index 55771a5..7502259 100644
--- a/src/openmolar/qt4gui/phrasebook/phrasebook_dialog.py
+++ b/src/openmolar/qt4gui/phrasebook/phrasebook_dialog.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
import types
@@ -15,12 +31,13 @@ from openmolar.dbtools.phrasebook import PHRASEBOOKS
try:
from collections import OrderedDict
except ImportError:
- #OrderedDict only came in python 2.7
+ # OrderedDict only came in python 2.7
print "using openmolar.backports for OrderedDict"
from openmolar.backports import OrderedDict
class shadePicker(QtGui.QFrame):
+
def __init__(self, parent=None):
super(shadePicker, self).__init__(parent)
@@ -30,18 +47,19 @@ class shadePicker(QtGui.QFrame):
self.cb.setText(_("Shade"))
self.comboBox = QtGui.QComboBox(self)
- self.comboBox.addItems(["A1","A2","A3","A3.5","A4","B1","B2","B3","B4",
- "C1","C2","C3","C4","D1","D2","D3","D4"])
+ self.comboBox.addItems(
+ ["A1", "A2", "A3", "A3.5", "A4", "B1", "B2", "B3", "B4",
+ "C1", "C2", "C3", "C4", "D1", "D2", "D3", "D4"])
self.comboBox.setCurrentIndex(-1)
layout.addWidget(self.cb)
layout.addWidget(self.comboBox)
spacerItem = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Expanding,
- QtGui.QSizePolicy.Minimum)
+ QtGui.QSizePolicy.Minimum)
layout.addItem(spacerItem)
QtCore.QObject.connect(self.comboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"), self.slot)
+ QtCore.SIGNAL("currentIndexChanged(int)"), self.slot)
def slot(self, index):
self.cb.setChecked(True)
@@ -49,17 +67,73 @@ class shadePicker(QtGui.QFrame):
def result(self):
return _("Shade") + " - " + self.comboBox.currentText()
+
+class ListModel(QtCore.QAbstractListModel):
+
+ '''
+ A simple model to provide "tabs" for the phrasebook
+ '''
+
+ def __init__(self, parent=None):
+ QtCore.QAbstractListModel.__init__(self, parent)
+ self.tabs = []
+ self.icons = []
+
+ def rowCount(self, parent=QtCore.QModelIndex()):
+ return len(self.tabs)
+
+ def data(self, index, role):
+ if not index.isValid():
+ pass
+ elif role == QtCore.Qt.DisplayRole:
+ return self.tabs[index.row()]
+ elif role == QtCore.Qt.DecorationRole:
+ return self.icons[index.row()]
+
+ def add_item(self, label, icon):
+ self.beginResetModel()
+ self.tabs.append(label)
+ self.icons.append(icon)
+ self.endResetModel()
+
+
+class MockTabWidget(QtGui.QWidget):
+
+ def __init__(self, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+ self.stacked_widget = QtGui.QStackedWidget()
+ self.list_view = QtGui.QListView()
+ self.list_model = ListModel()
+ self.list_view.setModel(self.list_model)
+ layout = QtGui.QHBoxLayout(self)
+ layout.addWidget(self.list_view)
+ layout.addWidget(self.stacked_widget)
+ self.list_view.pressed.connect(self.select_tab)
+
+ def select_tab(self, index):
+ self.stacked_widget.setCurrentIndex(index.row())
+
+ def addTab(self, widget, icon, label):
+ self.stacked_widget.addWidget(widget)
+ self.list_model.add_item(label, icon)
+ if self.list_view.currentIndex().row() == -1:
+ index = self.list_model.createIndex(0, 0)
+ self.list_view.setCurrentIndex(index)
+
+
class PhraseBookDialog(QtGui.QDialog):
+
def __init__(self, parent=None, id=0):
QtGui.QDialog.__init__(self, parent)
self.setWindowTitle(_("Phrase Book"))
layout = QtGui.QVBoxLayout(self)
- self.tabWidget = QtGui.QTabWidget()
+ self.tabWidget = MockTabWidget()
+
self.buttonBox = QtGui.QDialogButtonBox(self)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(
- QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
+ QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.buttonBox.setCenterButtons(True)
self.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), self.accept)
self.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), self.reject)
@@ -71,10 +145,15 @@ class PhraseBookDialog(QtGui.QDialog):
self.xml = minidom.parseString(PHRASEBOOKS.book(id).xml)
sections = self.xml.getElementsByTagName("section")
- icon = QtGui.QIcon(":icons/expand.svg")
for section in sections:
- header = section.getElementsByTagName("header")
+ header = section.getElementsByTagName("header")[0]
+ header_text = header.firstChild.data
+ icon_loc = header.getAttribute("icon")
+ if icon_loc:
+ icon = QtGui.QIcon(icon_loc)
+ else:
+ icon = QtGui.QIcon(":icons/pencil.png")
page = QtGui.QWidget(self)
layout = QtGui.QVBoxLayout(page)
phrases = section.getElementsByTagName("phrase")
@@ -84,7 +163,7 @@ class PhraseBookDialog(QtGui.QDialog):
layout.addStretch()
elif phrase.hasAttribute("sub_heading"):
text = phrase.firstChild.data
- label = QtGui.QLabel(u"<b>%s</b>"%text)
+ label = QtGui.QLabel(u"<b>%s</b>" % text)
layout.addWidget(label)
else:
text = phrase.firstChild.data
@@ -100,20 +179,20 @@ class PhraseBookDialog(QtGui.QDialog):
self.dict[sp.cb] = sp.result
spacerItem = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Minimum,
- QtGui.QSizePolicy.Expanding)
+ QtGui.QSizePolicy.Expanding)
layout.addItem(spacerItem)
- self.tabWidget.addTab(page, icon, header[0].firstChild.data)
+ self.tabWidget.addTab(page, icon, header_text)
def sizeHint(self):
- return QtCore.QSize(800,400)
+ return QtCore.QSize(1000, 400)
@property
def selectedPhrases(self):
retlist = []
for cb, value in self.dict.iteritems():
if cb.isChecked():
- if type(value) == types.MethodType:
+ if isinstance(value, types.MethodType):
text = value()
else:
text = value
@@ -121,7 +200,6 @@ class PhraseBookDialog(QtGui.QDialog):
return retlist
if __name__ == "__main__":
- import time
from openmolar.qt4gui import resources_rc
app = QtGui.QApplication([])
dl = PhraseBookDialog()
diff --git a/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py b/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py
index b519f93..4399191 100644
--- a/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py
+++ b/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from functools import partial
import logging
@@ -47,14 +49,16 @@ STYLESHEET = os.path.join(
try:
from collections import OrderedDict
except ImportError:
- #OrderedDict only came in python 2.7
+ # OrderedDict only came in python 2.7
LOGGER.warning("using openmolar.backports for OrderedDict")
from openmolar.backports import OrderedDict
from openmolar.dbtools.phrasebook import PHRASEBOOKS
+
class ControlPanel(QtGui.QListView):
phrase_selected = QtCore.pyqtSignal(object)
+
def __init__(self, parent=None):
QtGui.QListView.__init__(self, parent)
self.list_model = PhrasesListModel()
@@ -122,7 +126,7 @@ class PhrasebookEditor(QtGui.QMainWindow):
action_find = QtGui.QAction(icon, _("Find"), self)
action_find.setShortcut("Ctrl+F")
action_find.setToolTip(
- _("Search current file for first forward match of entered text"))
+ _("Search current file for first forward match of entered text"))
action_find_again = QtGui.QAction(icon, _("Find Again"), self)
action_find_again.setShortcut("Ctrl+G")
@@ -145,7 +149,8 @@ class PhrasebookEditor(QtGui.QMainWindow):
self.action_refactor = QtGui.QAction(_("XML tidy"), self)
self.action_refactor.triggered.connect(self.refactor)
- self.action_check_parseable = QtGui.QAction(_("Check Well Formed"), self)
+ self.action_check_parseable = QtGui.QAction(
+ _("Check Well Formed"), self)
self.action_check_parseable.triggered.connect(self.check_parseable)
self.action_check_validity = QtGui.QAction(_("Check Validity"), self)
@@ -187,7 +192,7 @@ class PhrasebookEditor(QtGui.QMainWindow):
m.setStandardButtons(QtGui.QMessageBox.NoButton)
m.setWindowTitle(_("advisory"))
m.setModal(False)
- QtCore.QTimer.singleShot(3*1000, m.accept)
+ QtCore.QTimer.singleShot(3 * 1000, m.accept)
m.show()
elif importance == 1:
LOGGER.info(message)
@@ -197,21 +202,21 @@ class PhrasebookEditor(QtGui.QMainWindow):
QtGui.QMessageBox.warning(self, _("Error"), message)
def sizeHint(self):
- return QtCore.QSize(800,500)
+ return QtCore.QSize(800, 500)
def closeEvent(self, event=None):
'''
called when application closes.
'''
if self.is_dirty:
- message = u"<b>%s</b><hr />%s"%(
+ message = u"<b>%s</b><hr />%s" % (
_("WARNING - you have unsaved changes!"),
_("Are you sure you want to quit?"))
if QtGui.QMessageBox.question(self, _("Confirm"),
- message,
- QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel,
- QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Cancel:
+ message,
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Cancel:
event.ignore()
return
self.closed_signal.emit()
@@ -246,19 +251,18 @@ class PhrasebookEditor(QtGui.QMainWindow):
self.loading = False
def view_phrasebook(self, ix=0):
- LOGGER.debug("View phrasebook %s"% ix)
+ LOGGER.debug("View phrasebook %s" % ix)
while self.loading:
QtCore.QTimer.singleShot(1000, self.view_phrasebook)
return
if len(self.text_editors) > 0:
self.control_panel.set_xml(self.text_editors[ix].text)
self.setWindowTitle(
- "%s - %s" %(self.window_title, ix))
+ "%s - %s" % (self.window_title, ix))
self.update_index()
else:
QtGui.QMessageBox.information(self, _("Information"),
- _("You appear to have no phrasebooks installed in your database"))
-
+ _("You appear to have no phrasebooks installed in your database"))
def update_index(self):
self.control_panel.set_xml(self.text)
@@ -277,7 +281,7 @@ class PhrasebookEditor(QtGui.QMainWindow):
xml = re.sub(">[\s]*<", "><", self.text)
dom = minidom.parseString(xml)
- #don't use setText here that updates orig_text and is_dirty won't work
+ # don't use setText here that updates orig_text and is_dirty won't work
self.text_edit.update_text(dom.toprettyxml())
def check_parseable(self, action=None, show_message=True):
@@ -287,12 +291,12 @@ class PhrasebookEditor(QtGui.QMainWindow):
self.advise(_("Phrasebook is well formed"), 1)
return True
except Exception as exc:
- self.advise(u"<b>%s</b><hr />%s"% (
+ self.advise(u"<b>%s</b><hr />%s" % (
_("Phrasebook is not well formed"), exc.message), 2)
return False
def check_validity(self):
- result, message = self.check_xml_validity(self.text)
+ result, message = self.check_xml_validity(self.text)
if result:
self.advise(_("Phrasebook is valid"), 1)
else:
@@ -301,6 +305,7 @@ class PhrasebookEditor(QtGui.QMainWindow):
def check_xml_validity(self, xml):
message_handler = MessageHandler()
+ LOGGER.debug("checking phrasebook xml against %s"% STYLESHEET)
f = QtCore.QFile(STYLESHEET)
f.open(QtCore.QIODevice.ReadOnly)
schema = QXmlSchema()
@@ -315,10 +320,10 @@ class PhrasebookEditor(QtGui.QMainWindow):
def find_phrase(self, index):
phrase_count = 0
for lineno, line in enumerate(self.text.split("\n")):
- if phrase_count == index.row()+1:
+ if phrase_count == index.row() + 1:
self.text_edit.setFocus(True)
- self.text_edit.setFirstVisibleLine(lineno-2)
- self.text_edit.setCursorPosition(lineno-1, 0)
+ self.text_edit.setFirstVisibleLine(lineno - 2)
+ self.text_edit.setCursorPosition(lineno - 1, 0)
self.text_edit.ensureCursorVisible()
break
@@ -338,8 +343,8 @@ class PhrasebookEditor(QtGui.QMainWindow):
def find_again(self):
if not self.text_edit.findFirst(
- self.search_text, True, True, True, True):
- self.advise("'%s' %s"% (self.search_text, _("not found")))
+ self.search_text, True, True, True, True):
+ self.advise("'%s' %s" % (self.search_text, _("not found")))
def new_phrasebook(self):
offer_list = []
@@ -351,7 +356,7 @@ class PhrasebookEditor(QtGui.QMainWindow):
return
dl = QtGui.QInputDialog(self)
choice, result = dl.getItem(self, _("Choose"),
- _("A phrasebook for which clinician?"), sorted(offer_list))
+ _("A phrasebook for which clinician?"), sorted(offer_list))
if result:
ix = localsettings.ops_reverse[str(choice.toAscii())]
PHRASEBOOKS.create_book(ix)
@@ -359,9 +364,9 @@ class PhrasebookEditor(QtGui.QMainWindow):
def apply_changes(self):
if QtGui.QMessageBox.question(self, _("confirm"),
- _("commit all local files to database?"),
- QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel
- ) == QtGui.QMessageBox.Ok:
+ _("commit all local files to database?"),
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel
+ ) == QtGui.QMessageBox.Ok:
no_ = 0
for te in self.text_editors:
if not te.is_dirty:
@@ -369,17 +374,17 @@ class PhrasebookEditor(QtGui.QMainWindow):
new_xml = te.text()
result, message = self.check_xml_validity(new_xml)
if not result:
- self.advise("%s %s %s"% (
- _("Phrasebook"), te.db_index, _("is not valid")), 2)
+ self.advise("%s %s %s" % (
+ _("Phrasebook"), te.db_index, _("is not valid")), 2)
continue
result = PHRASEBOOKS.update_database(new_xml, te.db_index)
if result:
te.setText(new_xml)
no_ += 1
- self.advise("%s %d %s"% (_("Updated"), no_, _("Books")), 1)
+ self.advise("%s %d %s" % (_("Updated"), no_, _("Books")), 1)
def cursor_position_changed(self, row, col):
- self.cursor_pos_label.setText("Line %d, Column %d"% (row+1, col))
+ self.cursor_pos_label.setText("Line %d, Column %d" % (row + 1, col))
def text_changed(self):
new_text = self.text_edit.text()
@@ -391,7 +396,7 @@ class PhrasebookEditor(QtGui.QMainWindow):
try:
for te in self.text_editors:
if te.is_dirty:
- LOGGER.debug("%s is dirty"% te)
+ LOGGER.debug("%s is dirty" % te)
return True
return False
except:
diff --git a/src/openmolar/qt4gui/phrasebook/phrasebook_model.py b/src/openmolar/qt4gui/phrasebook/phrasebook_model.py
index 8d61b60..7089fb4 100644
--- a/src/openmolar/qt4gui/phrasebook/phrasebook_model.py
+++ b/src/openmolar/qt4gui/phrasebook/phrasebook_model.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
from xml.dom import minidom
@@ -27,7 +29,9 @@ from PyQt4 import QtCore
LOGGER = logging.getLogger("openmolar")
+
class PhrasesListModel(QtCore.QAbstractListModel):
+
def __init__(self):
QtCore.QAbstractListModel.__init__(self)
self.xml = ""
@@ -76,4 +80,4 @@ class PhrasesListModel(QtCore.QAbstractListModel):
LOGGER.debug("Resetting phrasebook model")
self._headings = None
self._dom = None
- self._rowcount = None
\ No newline at end of file
+ self._rowcount = None
diff --git a/src/openmolar/qt4gui/printing/__init__.py b/src/openmolar/qt4gui/printing/__init__.py
index e69de29..c701215 100755
--- a/src/openmolar/qt4gui/printing/__init__.py
+++ b/src/openmolar/qt4gui/printing/__init__.py
@@ -0,0 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/openmolar/qt4gui/printing/accountPrint.py b/src/openmolar/qt4gui/printing/accountPrint.py
index 5da4113..d2664ed 100644
--- a/src/openmolar/qt4gui/printing/accountPrint.py
+++ b/src/openmolar/qt4gui/printing/accountPrint.py
@@ -1,123 +1,182 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
-from PyQt4 import QtCore,QtGui
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+from PyQt4 import QtCore, QtGui
from openmolar.settings import localsettings
import datetime
+
class document():
+
''' this class provides a letter asking for settlement of an account'''
- def __init__(self,title,fname,sname,addresslines,postcode,amount,parent=None):
- self.type=type
+
+ def __init__(
+ self,
+ title,
+ fname,
+ sname,
+ addresslines,
+ postcode,
+ amount,
+ parent=None):
+ self.type = type
self.printer = QtGui.QPrinter()
self.printer.setPageSize(QtGui.QPrinter.A5)
self.pdfprinter = QtGui.QPrinter()
self.pdfprinter.setPageSize(QtGui.QPrinter.A5)
-
- self.title=title
- self.fname=fname
- self.sname=sname
- self.addresslines=addresslines
- self.postcode=postcode
+
+ self.title = title
+ self.fname = fname
+ self.sname = sname
+ self.addresslines = addresslines
+ self.postcode = postcode
self.amount = localsettings.formatMoney(amount)
- self.tone="A"
- self.previousCorrespondenceDate=""
- self.requireDialog=True
+ self.tone = "A"
+ self.previousCorrespondenceDate = ""
+ self.requireDialog = True
self.dialog = QtGui.QPrintDialog(self.printer)
-
- def setTone(self,arg):
+
+ def setTone(self, arg):
'''determines how aggressive the letter is'''
- if arg in ("A","B","C"):
- self.tone=arg
- def setPreviousCorrespondenceDate(self,arg):
- self.previousCorrespondenceDate=arg
-
+ if arg in ("A", "B", "C"):
+ self.tone = arg
+
+ def setPreviousCorrespondenceDate(self, arg):
+ self.previousCorrespondenceDate = arg
+
def dialogExec(self):
- retarg=False
+ retarg = False
if self.requireDialog:
- retarg=self.dialog.exec_()
+ retarg = self.dialog.exec_()
else:
- retarg=True
+ retarg = True
return retarg
-
+
def print_(self):
if not self.dialogExec():
return False
self.pdfprinter.setOutputFormat(QtGui.QPrinter.PdfFormat)
self.pdfprinter.setOutputFileName(localsettings.TEMP_PDF)
-
- for printer in (self.printer,self.pdfprinter):
- AddressMargin=80
+
+ for printer in (self.printer, self.pdfprinter):
+ AddressMargin = 80
LeftMargin = 50
TopMargin = 80
sansFont = QtGui.QFont("Helvetica", 9)
sansLineHeight = QtGui.QFontMetrics(sansFont).height()
serifFont = QtGui.QFont("Times", 10)
serifLineHeight = QtGui.QFontMetrics(serifFont).height()
- sigFont=QtGui.QFont("Lucida Handwriting",8)
+ sigFont = QtGui.QFont("Lucida Handwriting", 8)
fm = QtGui.QFontMetrics(serifFont)
DateWidth = fm.width(" September 99, 2999 ")
-
+
painter = QtGui.QPainter(printer)
pageRect = printer.pageRect()
painter.save()
painter.setPen(QtCore.Qt.black)
painter.setFont(sansFont)
- x,y = AddressMargin,TopMargin+50
- painter.drawText(x, y, "%s %s %s"%(self.title.title(),self.fname.title(),self.sname.title()))
+ x, y = AddressMargin, TopMargin + 50
+ painter.drawText(
+ x, y, "%s %s %s" %
+ (self.title.title(), self.fname.title(), self.sname.title()))
y += sansLineHeight
for line in self.addresslines:
if line:
- painter.drawText(x, y, str(line).title()+",")
+ painter.drawText(x, y, str(line).title() + ",")
y += sansLineHeight
if self.postcode:
- painter.drawText(x, y, self.postcode.upper()+".") #postcode
+ painter.drawText(x, y, self.postcode.upper() + ".") # postcode
y += serifLineHeight
-
+
painter.setFont(serifFont)
- x,y=LeftMargin,(pageRect.height()*0.35)
- painter.drawText(x+250, y,
- QtCore.QDate.currentDate().toString(localsettings.QDATE_FORMAT))
+ x, y = LeftMargin, (pageRect.height() * 0.35)
+ painter.drawText(x + 250, y,
+ QtCore.QDate.currentDate().toString(localsettings.QDATE_FORMAT))
y += sansLineHeight
y += serifLineHeight
- painter.drawText(x, y, "Dear %s %s," %(self.title.title(),self.sname.title()))
- y += serifLineHeight*1.5
- if self.tone=="C":
- painter.drawText(x, y,_("STATEMENT OF ACCOUNT - FINAL REMINDER"))
- y += serifLineHeight*1.2
- painter.drawText(x, y, _("We are concerned that despite previous correspondance,"))
+ painter.drawText(
+ x, y, "Dear %s %s," %
+ (self.title.title(), self.sname.title()))
+ y += serifLineHeight * 1.5
+ if self.tone == "C":
+ painter.drawText(
+ x,
+ y,
+ _("STATEMENT OF ACCOUNT - FINAL REMINDER"))
+ y += serifLineHeight * 1.2
+ painter.drawText(
+ x,
+ y,
+ _("We are concerned that despite previous correspondance,"))
y += serifLineHeight
- painter.drawText(x, y, _("your account still stands as follows: "))
+ painter.drawText(
+ x,
+ y,
+ _("your account still stands as follows: "))
else:
- painter.drawText(x, y, _("Please note that your account stands as follows:- "))
- y += serifLineHeight*1.5
- painter.drawText(x, y, _(u"Amount : %s")%self.amount)
- y += serifLineHeight*2
- if self.tone=="A":
+ painter.drawText(
+ x,
+ y,
+ _("Please note that your account stands as follows:- "))
+ y += serifLineHeight * 1.5
+ painter.drawText(x, y, _(u"Amount : %s") % self.amount)
+ y += serifLineHeight * 2
+ if self.tone == "A":
painter.drawText(x, y, _("This amount is now due in full. *"))
- elif self.tone=="B":
- d=self.previousCorrespondenceDate
- if d=="" or d==None:
- painter.drawText(x, y, _("A previous account was sent out to you on %s")%d)
- y+=serifLineHeight
- painter.drawText(x, y, _("It would be appreciated if you would settle this matter as soon as possible."))
+ elif self.tone == "B":
+ d = self.previousCorrespondenceDate
+ if d == "" or d is None:
+ painter.drawText(
+ x, y, _("A previous account was sent out to you on %s") %
+ d)
+ y += serifLineHeight
+ painter.drawText(
+ x,
+ y,
+ _("It would be appreciated if you would settle this matter as soon as possible."))
else:
- painter.drawText(x, y, _("It would be appreciated if this account is settled within seven days."))
- y+=serifLineHeight
- painter.drawText(x, y, _("On this deadline, we will pass this debt to"))
- y+=serifLineHeight
- painter.drawText(x, y, _("Scott & Company Sheriff Officers for collection."))
+ painter.drawText(
+ x,
+ y,
+ _("It would be appreciated if this account is settled within seven days."))
+ y += serifLineHeight
+ painter.drawText(
+ x,
+ y,
+ _("On this deadline, we will pass this debt to"))
+ y += serifLineHeight
+ painter.drawText(
+ x,
+ y,
+ _("Scott & Company Sheriff Officers for collection."))
- y += serifLineHeight*2
+ y += serifLineHeight * 2
painter.drawText(x, y, _("Yours sincerely,"))
y += serifLineHeight * 1.5
painter.setFont(sigFont)
- painter.drawText(x, y+30, "The Academy Dental Practice")
+ painter.drawText(x, y + 30, "The Academy Dental Practice")
y = pageRect.height() - 120
painter.drawLine(x, y, pageRect.width() - (2 * AddressMargin), y)
y += 2
@@ -127,22 +186,31 @@ class document():
option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
option.setWrapMode(QtGui.QTextOption.WordWrap)
painter.drawText(
- QtCore.QRectF(x, y,
- pageRect.width() - (2 * AddressMargin), 31),
- _('* Cheques payable to: "Academy Dental Practice"\n') +
- _('Or telephone us with your switch/visa/mastercard details.'),
- option)
+ QtCore.QRectF(x, y,
+ pageRect.width() - (2 * AddressMargin), 31),
+ _('* Cheques payable to: "Academy Dental Practice"\n') +
+ _(
+ 'Or telephone us with your switch/visa/mastercard details.'),
+ option)
painter.restore()
return True
-
+
if __name__ == "__main__":
import sys
localsettings.initiate()
app = QtGui.QApplication(sys.argv)
- account=document('TITLE', 'FNAME', 'SNAME', ("MY STREET", 'MY VILLAGE', '', '', 'Inverness-shire'),'IV2 222',"80.00")
+ account = document(
+ 'TITLE',
+ 'FNAME',
+ 'SNAME',
+ ("MY STREET",
+ 'MY VILLAGE',
+ '',
+ '',
+ 'Inverness-shire'),
+ 'IV2 222',
+ "80.00")
account.setTone("B")
account.print_()
account.setTone("C")
account.print_()
-
-
diff --git a/src/openmolar/qt4gui/printing/apptcardPrint.py b/src/openmolar/qt4gui/printing/apptcardPrint.py
index f8fcd8d..d8365a0 100644
--- a/src/openmolar/qt4gui/printing/apptcardPrint.py
+++ b/src/openmolar/qt4gui/printing/apptcardPrint.py
@@ -1,23 +1,41 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
import datetime
-from PyQt4 import QtCore,QtGui
+from PyQt4 import QtCore, QtGui
from openmolar.settings import localsettings
class Card(object):
+
def __init__(self, parent=None):
self.printer = QtGui.QPrinter()
self.pt = None
- self.appts=()
+ self.appts = ()
def setProps(self, patient, appts=()):
self.pt = patient
@@ -38,50 +56,48 @@ class Card(object):
painter.setFont(font)
- rect = QtCore.QRectF(pageRect.width()/6, pageRect.height()/20,
- pageRect.width()*5/6, pageRect.height()/3)
+ rect = QtCore.QRectF(pageRect.width() / 6, pageRect.height() / 20,
+ pageRect.width() * 5 / 6, pageRect.height() / 3)
- text = "%s %s %s\n%s\n"%(
+ text = "%s %s %s\n%s\n" % (
self.pt.title, self.pt.fname, self.pt.sname, self.pt.address)
- text += "Our ref %d\n\n"% self.pt.serialno
+ text += "Our ref %d\n\n" % self.pt.serialno
painter.drawText(rect, text)
option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
option.setWrapMode(QtGui.QTextOption.WordWrap)
- y = pageRect.height()/3
- painter.drawLine(0,int(y),int(pageRect.width()),int(y))
+ y = pageRect.height() / 3
+ painter.drawLine(0, int(y), int(pageRect.width()), int(y))
- y += fontLineHeight*1.5
+ y += fontLineHeight * 1.5
font.setBold(True)
painter.setFont(font)
- rect = QtCore.QRectF(0, y, pageRect.width(), fontLineHeight*1.5)
+ rect = QtCore.QRectF(0, y, pageRect.width(), fontLineHeight * 1.5)
painter.drawText(rect, "You have the following appointments with us",
- option)
+ option)
font.setBold(False)
painter.setFont(font)
for appt in self.appts:
- y += fontLineHeight*1.5
+ y += fontLineHeight * 1.5
atime = localsettings.wystimeToHumanTime(appt.atime)
adate = localsettings.longDate(appt.date)
- text = "%s - %s with %s"%(atime, adate, appt.dent_inits)
+ text = "%s - %s with %s" % (atime, adate, appt.dent_inits)
- rect = QtCore.QRectF(0, y, pageRect.width(), fontLineHeight*1.5)
+ rect = QtCore.QRectF(0, y, pageRect.width(), fontLineHeight * 1.5)
painter.drawText(rect, text, option)
+ y = pageRect.height() * 2 / 3
-
- y = pageRect.height() *2/3
-
- painter.drawLine(0,int(y),int(pageRect.width()),int(y))
+ painter.drawLine(0, int(y), int(pageRect.width()), int(y))
font.setItalic(True)
painter.setFont(font)
- rect = QtCore.QRectF(0, y, pageRect.width(), pageRect.height()*1/3)
+ rect = QtCore.QRectF(0, y, pageRect.width(), pageRect.height() * 1 / 3)
painter.drawText(rect, localsettings.APPOINTMENT_CARD_FOOTER, option)
if __name__ == "__main__":
@@ -96,4 +112,3 @@ if __name__ == "__main__":
appts = appointments.get_pts_appts(pt, True)
mycard.setProps(pt, appts)
mycard.print_()
-
diff --git a/src/openmolar/qt4gui/printing/bookprint.py b/src/openmolar/qt4gui/printing/bookprint.py
index 651095a..c957f15 100644
--- a/src/openmolar/qt4gui/printing/bookprint.py
+++ b/src/openmolar/qt4gui/printing/bookprint.py
@@ -1,23 +1,44 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui
+
class printBook():
+
'''initiates with an image (chart) as the argument'''
+
def __init__(self, html):
self.html = html
self.printer = QtGui.QPrinter()
self.printer.setPageSize(QtGui.QPrinter.A4)
+
def printpage(self, askfirst=True):
dialog = QtGui.QPrintDialog(self.printer)
if askfirst and not dialog.exec_():
return
- #print dir(self.printer)
+ # print dir(self.printer)
document = QtGui.QTextDocument()
document.setHtml(self.html)
document.print_(self.printer)
@@ -25,7 +46,7 @@ class printBook():
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
- form = printBook("<html><body><h1>This is a Test</h1><p>I trust it worked?</p></body></html>")
- form.printpage(True) #show a dialog for testing purposes
+ form = printBook(
+ "<html><body><h1>This is a Test</h1><p>I trust it worked?</p></body></html>")
+ form.printpage(True) # show a dialog for testing purposes
app.exec_()
-
diff --git a/src/openmolar/qt4gui/printing/bulk_mail.py b/src/openmolar/qt4gui/printing/bulk_mail.py
index 21d0714..0b07f15 100644
--- a/src/openmolar/qt4gui/printing/bulk_mail.py
+++ b/src/openmolar/qt4gui/printing/bulk_mail.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
@@ -25,17 +41,18 @@ DEBUG = False
SALUTATION = _("Dear")
-BODY = '''%s\n%s'''% (
-_("We are writing to inform you that your dental examination is now due."),
-_("Please contact the surgery to arrange an appointment. *")
+BODY = '''%s\n%s''' % (
+ _("We are writing to inform you that your dental examination is now due."),
+ _("Please contact the surgery to arrange an appointment. *")
)
-FAMILY_BODY = '''%s\n%s'''%(
-_("We are writing to inform you that your dental examinations are now due."),
-_("Please contact the surgery to arrange suitable appointments. *"),
+FAMILY_BODY = '''%s\n%s''' % (
+ _(
+ "We are writing to inform you that your dental examinations are now due."),
+ _("Please contact the surgery to arrange suitable appointments. *"),
)
-SIGN_OFF= _("Yours sincerely,")
+SIGN_OFF = _("Yours sincerely,")
SIGNATURE = localsettings.PRACTICE_NAME
@@ -45,30 +62,30 @@ please accept our apologies and ignore this letter.''')
try:
filepath = os.path.join(localsettings.localFileDirectory,
- "recall_footer.txt")
+ "recall_footer.txt")
f = open(filepath, "r")
CUSTOM_TEXT = f.read()
f.close()
except IOError:
- LOGGER.warning("no recall footer found in '%s'"% filepath)
- CUSTOM_TEXT= ""
+ LOGGER.warning("no recall footer found in '%s'" % filepath)
+ CUSTOM_TEXT = ""
try:
filepath = os.path.join(localsettings.localFileDirectory,
- "recall_postscript.txt")
+ "recall_postscript.txt")
f = open(filepath, "r")
PS_TEXT = f.read()
f.close()
except IOError:
- LOGGER.exception("no recall ps found in %s"% filepath)
- PS_TEXT= ""
+ LOGGER.warning("no recall ps found in %s" % filepath)
+ PS_TEXT = ""
class OMLetter(object):
+
def __init__(self, recipients):
self.recipients = recipients
-
@property
def head(self):
return self.recipients[0]
@@ -80,20 +97,20 @@ class OMLetter(object):
@property
def _topline(self):
head = self.head
- line_ = u"%s %s %s"% (
+ line_ = u"%s %s %s" % (
head.title,
head.fname.strip(),
head.sname.strip()
- )
+ )
for r in self.recipients[1:]:
if r.age > 18:
- line_ += "\n%s %s %s"% (r.title, r.fname, r.sname)
+ line_ += "\n%s %s %s" % (r.title, r.fname, r.sname)
else:
- line_ += ", %s"% (r.fname)
+ line_ += ", %s" % (r.fname)
if ", " in line_:
i = line_.rindex(", ")
- line_ = "%s and%s"% (line_[:i], line_[i+1:])
+ line_ = "%s and%s" % (line_[:i], line_[i + 1:])
return line_
@@ -101,7 +118,7 @@ class OMLetter(object):
def address(self):
head = self.head
- address_ = u'%s\n%s\n%s\n%s\n%s\n%s\n%s'% (
+ address_ = u'%s\n%s\n%s\n%s\n%s\n%s\n%s' % (
self._topline,
head.addr1.title(),
head.addr2.title(),
@@ -119,7 +136,7 @@ class OMLetter(object):
def subjects(self):
subjects_ = []
for r in self.recipients:
- subjects_.append("%s %s %s - %s %s"% (
+ subjects_.append("%s %s %s - %s %s" % (
r.title, r.fname, r.sname,
_("our ref"), r.serialno))
return subjects_
@@ -128,7 +145,7 @@ class OMLetter(object):
def subject_text(self):
text = ""
for subject in self.subjects:
- text += "%s\n"% subject
+ text += "%s\n" % subject
return text
@property
@@ -143,9 +160,9 @@ class OMLetter(object):
elif self.head.age < 18:
salut_ = self.head.fname
else:
- salut_ = "%s %s"% (self.head.title, self.head.sname.strip())
+ salut_ = "%s %s" % (self.head.title, self.head.sname.strip())
- return u"%s %s,"% (SALUTATION, salut_)
+ return u"%s %s," % (SALUTATION, salut_)
@property
def text(self):
@@ -153,7 +170,9 @@ class OMLetter(object):
return FAMILY_BODY
return BODY
+
class TreeItem(object):
+
def __init__(self, data, parent=None):
self.parentItem = parent
self.itemData = data
@@ -186,7 +205,9 @@ class TreeItem(object):
return 0
+
class treeModel(QtCore.QAbstractItemModel):
+
def __init__(self, header, mydata):
super(QtCore.QAbstractItemModel, self).__init__()
self.FAMILYICON = QtGui.QIcon()
@@ -221,7 +242,7 @@ class treeModel(QtCore.QAbstractItemModel):
else:
return QtCore.QVariant()
elif role == QtCore.Qt.UserRole:
- ## a user role which simply returns the python object
+ # a user role which simply returns the python object
return item.itemData
return QtCore.QVariant()
@@ -234,7 +255,7 @@ class treeModel(QtCore.QAbstractItemModel):
def headerData(self, section, orientation, role):
if (orientation == QtCore.Qt.Horizontal and
- role == QtCore.Qt.DisplayRole):
+ role == QtCore.Qt.DisplayRole):
return self.rootItem.data(section)
return QtCore.QVariant()
@@ -294,7 +315,7 @@ class treeModel(QtCore.QAbstractItemModel):
if position > indentations[-1]:
if parents[-1].childCount() > 0:
parents.append(
- parents[-1].child(parents[-1].childCount() - 1))
+ parents[-1].child(parents[-1].childCount() - 1))
indentations.append(position)
else:
while position < indentations[-1] and len(parents) > 0:
@@ -305,6 +326,7 @@ class treeModel(QtCore.QAbstractItemModel):
class bulkMails(object):
+
def __init__(self, om_gui):
self.om_gui = om_gui
self.printer = QtGui.QPrinter()
@@ -332,7 +354,7 @@ class bulkMails(object):
dl.setupUi(dialog)
dl.dateEdit.setDate(localsettings.currentDay())
dialog.connect(dl.custDate_radioButton,
- QtCore.SIGNAL("toggled (bool)"), enableDate)
+ QtCore.SIGNAL("toggled (bool)"), enableDate)
if dialog.exec_():
if dl.custDate_radioButton.isChecked():
self.adate = dl.dateEdit.date().toPyDate()
@@ -360,10 +382,10 @@ class bulkMails(object):
'''
if self.expanded:
self.om_gui.ui.bulk_mail_expand_pushButton.setText(
- _("Collapse All"))
+ _("Collapse All"))
else:
self.om_gui.ui.bulk_mail_expand_pushButton.setText(
- _("Expand All"))
+ _("Expand All"))
def setData(self, headers, recipients):
'''
@@ -372,7 +394,7 @@ class bulkMails(object):
self.headers = headers
self.recipients = recipients
self.populateTree()
- self.expanded = False
+ self.expanded = False
self.update_expand_ButtonText()
for i in range(len(self.headers)):
self.om_gui.ui.bulk_mailings_treeView.resizeColumnToContents(i)
@@ -390,7 +412,7 @@ class bulkMails(object):
'''
letters = {}
for recipient in self.recipients:
- if letters.has_key(recipient.letterno):
+ if recipient.letterno in letters:
letters[recipient.letterno].append(recipient)
else:
letters[recipient.letterno] = [recipient]
@@ -405,7 +427,7 @@ class bulkMails(object):
emit the serialno of the selected row
'''
try:
- #item = index.internalPointer()
+ # item = index.internalPointer()
pt = self.bulk_model.data(index, QtCore.Qt.UserRole)
print pt.serialno
return pt.serialno
@@ -425,13 +447,12 @@ class bulkMails(object):
italic_font = QtGui.QFont(font)
italic_font.setItalic(True)
- sigFont = QtGui.QFont("URW Chancery L",15)
+ sigFont = QtGui.QFont("URW Chancery L", 15)
sigFont.setBold(True)
- sig_font_height = QtGui.QFontMetrics(sigFont).height()*1.2
+ sig_font_height = QtGui.QFontMetrics(sigFont).height() * 1.2
pageRect = self.printer.pageRect()
-
LEFT = 60
RIGHT = 80
TOP = 170
@@ -448,14 +469,14 @@ class bulkMails(object):
300, ADDRESS_HEIGHT)
dateRect = QtCore.QRectF(LEFT, addressRect.bottom(),
- RECT_WIDTH, DATE_HEIGHT)
+ RECT_WIDTH, DATE_HEIGHT)
bodyRect = QtCore.QRectF(LEFT, dateRect.bottom(),
- RECT_WIDTH, BODY_HEIGHT)
+ RECT_WIDTH, BODY_HEIGHT)
footerRect = QtCore.QRectF(LEFT,
- pageRect.height() - FOOTER_HEIGHT,
- RECT_WIDTH, FOOTER_HEIGHT)
+ pageRect.height() - FOOTER_HEIGHT,
+ RECT_WIDTH, FOOTER_HEIGHT)
painter = QtGui.QPainter(self.printer)
@@ -482,11 +503,11 @@ class bulkMails(object):
option = QtGui.QTextOption(QtCore.Qt.AlignLeft)
option.setWrapMode(QtGui.QTextOption.WordWrap)
- ##address
+ # address
painter.drawText(addressRect, letter.address, option)
if DEBUG:
- painter.drawRect(addressRect.adjusted(2,2,-2,-2))
- ##date
+ painter.drawRect(addressRect.adjusted(2, 2, -2, -2))
+ # date
if self.use_given_recall_date:
pdate = letter.recd
@@ -496,22 +517,22 @@ class bulkMails(object):
if self.LONGDATE:
pdate_str = localsettings.longDate(pdate)
else:
- pdate_str = "%s %s"% (localsettings.monthName(pdate),
- pdate.year)
+ pdate_str = "%s %s" % (localsettings.monthName(pdate),
+ pdate.year)
painter.drawText(dateRect, pdate_str,
- QtGui.QTextOption(QtCore.Qt.AlignRight))
+ QtGui.QTextOption(QtCore.Qt.AlignRight))
if DEBUG:
- painter.drawRect(dateRect.adjusted(2,2,-2,-2))
- ##salutation
+ painter.drawRect(dateRect.adjusted(2, 2, -2, -2))
+ # salutation
rect = bodyRect.adjusted(
- 0, 0, 0, 2*line_height- bodyRect.height())
+ 0, 0, 0, 2 * line_height - bodyRect.height())
painter.drawText(rect, letter.salutation, option)
if DEBUG:
- painter.drawRect(rect.adjusted(2,2,-2,-2))
+ painter.drawRect(rect.adjusted(2, 2, -2, -2))
- ##subject
- #option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
+ # subject
+ # option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
font.setBold(True)
painter.setFont(font)
subject_count = len(letter.subjects) + 1
@@ -519,24 +540,24 @@ class bulkMails(object):
rect.bottomLeft().x(), rect.bottomLeft().y(),
bodyRect.width(), line_height * subject_count)
- subj_rect = rect.adjusted(50,0,-50,0)
+ subj_rect = rect.adjusted(50, 0, -50, 0)
painter.drawText(subj_rect, letter.subject_text, option)
if DEBUG:
- painter.drawRect(subj_rect.adjusted(2,2,-2,-2))
+ painter.drawRect(subj_rect.adjusted(2, 2, -2, -2))
font.setBold(False)
painter.setFont(font)
- ##body
- line_count = letter.text.count("\n")+3
+ # body
+ line_count = letter.text.count("\n") + 3
body_rect = QtCore.QRectF(
rect.bottomLeft().x(), subj_rect.bottomLeft().y(),
bodyRect.width(), line_height * line_count)
painter.drawText(body_rect, letter.text, option)
if DEBUG:
- painter.drawRect(body_rect.adjusted(2,2,-2,-2))
+ painter.drawRect(body_rect.adjusted(2, 2, -2, -2))
- ##custom
+ # custom
line_count = CUSTOM_TEXT.count("\n") + 5
custom_rect = QtCore.QRectF(
body_rect.bottomLeft().x(), body_rect.bottomLeft().y(),
@@ -546,10 +567,10 @@ class bulkMails(object):
painter.drawText(custom_rect, CUSTOM_TEXT, option)
if DEBUG:
- painter.drawRect(custom_rect.adjusted(2,2,-2,-2))
+ painter.drawRect(custom_rect.adjusted(2, 2, -2, -2))
- ##signature
- #place signature immediately after the body
+ # signature
+ # place signature immediately after the body
# + custom text (which will vary)
sign_off_rect = QtCore.QRectF(
@@ -557,7 +578,7 @@ class bulkMails(object):
body_rect.width(), line_height * 1.5)
painter.drawText(sign_off_rect, SIGN_OFF, option)
if DEBUG:
- painter.drawRect(sign_off_rect.adjusted(2,2,-2,-2))
+ painter.drawRect(sign_off_rect.adjusted(2, 2, -2, -2))
sig_rect = sign_off_rect.adjusted(
20, sign_off_rect.height(), 0, sig_font_height)
@@ -565,11 +586,11 @@ class bulkMails(object):
painter.setFont(sigFont)
painter.drawText(sig_rect, SIGNATURE, option)
if DEBUG:
- painter.drawRect(sig_rect.adjusted(2,2,-2,-2))
+ painter.drawRect(sig_rect.adjusted(2, 2, -2, -2))
painter.restore()
- ##ps
- line_count = PS_TEXT.count("\n")+2
+ # ps
+ line_count = PS_TEXT.count("\n") + 2
ps_rect = QtCore.QRectF(
body_rect.bottomLeft().x(),
sig_rect.bottomLeft().y() + line_height,
@@ -579,9 +600,9 @@ class bulkMails(object):
painter.drawText(ps_rect, PS_TEXT, option)
if DEBUG:
- painter.drawRect(ps_rect.adjusted(2,2,-2,-2))
+ painter.drawRect(ps_rect.adjusted(2, 2, -2, -2))
- ##footer
+ # footer
option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
option.setWrapMode(QtGui.QTextOption.WordWrap)
@@ -590,15 +611,15 @@ class bulkMails(object):
painter.drawText(footerRect, FOOTER, option)
if DEBUG:
- painter.drawRect(footerRect.adjusted(2,2,-2,-2))
+ painter.drawRect(footerRect.adjusted(2, 2, -2, -2))
- ##fold marks
- pen = QtGui.QPen(QtGui.QBrush(QtCore.Qt.black),3)
+ # fold marks
+ pen = QtGui.QPen(QtGui.QBrush(QtCore.Qt.black), 3)
painter.setPen(pen)
- top_fold_y = pageRect.height()/3
+ top_fold_y = pageRect.height() / 3
painter.drawLine(0, top_fold_y, 10, top_fold_y)
- top_fold_y = pageRect.height()*2/3
+ top_fold_y = pageRect.height() * 2 / 3
painter.drawLine(0, top_fold_y, 10, top_fold_y)
painter.restore()
@@ -615,11 +636,11 @@ if __name__ == "__main__":
om_gui = maingui.OpenmolarGui()
conditions = "recd>=%s and recd<=%s and dnt1=%s"
- values = date(2012,7,1), date(2012,7,13), 6
+ values = date(2012, 7, 1), date(2012, 7, 13), 6
patients = recall.getpatients(conditions, values)
letters = bulkMails(om_gui)
- #letters.showOptions()
+ # letters.showOptions()
letters.setData(recall.HEADERS, patients)
letters.print_()
app.closeAllWindows()
diff --git a/src/openmolar/qt4gui/printing/chartPrint.py b/src/openmolar/qt4gui/printing/chartPrint.py
index 21facd1..30733c7 100644
--- a/src/openmolar/qt4gui/printing/chartPrint.py
+++ b/src/openmolar/qt4gui/printing/chartPrint.py
@@ -1,16 +1,36 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import math
import sys
from PyQt4 import QtCore, QtGui
+
class printChart():
+
'''initiates with an image (chart) as the argument'''
+
def __init__(self, chartimage, landscape=False):
self.image = chartimage
self.printer = QtGui.QPrinter()
@@ -48,6 +68,5 @@ if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
chart = QtGui.QPixmap("images/testchart.png")
form = printChart(chart)
- form.printpage(True) #show a dialog for testing purposes
+ form.printpage(True) # show a dialog for testing purposes
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/printing/daylistprint.py b/src/openmolar/qt4gui/printing/daylistprint.py
index 7e682ca..3824919 100644
--- a/src/openmolar/qt4gui/printing/daylistprint.py
+++ b/src/openmolar/qt4gui/printing/daylistprint.py
@@ -1,109 +1,139 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
from __future__ import division
-from PyQt4 import QtCore,QtGui
+from PyQt4 import QtCore, QtGui
from openmolar.settings import localsettings
import datetime
+
class printDaylist():
- def __init__(self,parent=None):
+
+ def __init__(self, parent=None):
self.printer = QtGui.QPrinter()
self.printer.setPageSize(QtGui.QPrinter.A4)
- self.dates=[]
- self.dentist=[]
- self.dayMemo=[]
- self.apps=[]
+ self.dates = []
+ self.dentist = []
+ self.dayMemo = []
+ self.apps = []
- def addDaylist(self,date,dentist,apps):
+ def addDaylist(self, date, dentist, apps):
self.dates.append(date.toString())
self.dentist.append(localsettings.apptix_reverse[dentist])
self.dayMemo.append(apps[0])
self.apps.append(apps[1:])
- def print_(self,expanded=False):
+ def print_(self, expanded=False):
'''if expanded, the list will fill the page'''
dialog = QtGui.QPrintDialog(self.printer)
if not dialog.exec_():
return
- LeftMargin,RightMargin,TopMargin,BottomMargin = 30,30,30,100 #leave space at the bottom for notes?
+ LeftMargin, RightMargin, TopMargin, BottomMargin = 30, 30, 30, 100 # leave space at the bottom for notes?
sansFont = QtGui.QFont("Helvetica", 9)
fm = QtGui.QFontMetrics(sansFont)
- pageWidth=self.printer.pageRect().width()-LeftMargin-RightMargin
+ pageWidth = self.printer.pageRect().width() - LeftMargin - RightMargin
painter = QtGui.QPainter(self.printer)
- for page in range(0,len(self.dates)):
+ for page in range(0, len(self.dates)):
painter.save()
- rowCount=len(self.apps[page])
+ rowCount = len(self.apps[page])
if not expanded:
rowHeight = fm.height()
else:
- pageHeight=self.printer.pageRect().height()-TopMargin-BottomMargin
- rowHeight=pageHeight/(rowCount+3) #+3 allows for headings
- ###get col widths.
- colwidths={}
- #start,end,name,serialno,code0,code1,code2,note
+ pageHeight = self.printer.pageRect(
+ ).height() - TopMargin - BottomMargin
+ rowHeight = pageHeight / \
+ (rowCount + 3) # +3 allows for headings
+ # get col widths.
+ colwidths = {}
+ # start,end,name,serialno,code0,code1,code2,note
for app in self.apps[page]:
#--get widths
- printApp=("12:00","(150 mins)",
- app.name,"88888","P",app.treat,app.note)
- col=0
+ printApp = ("12:00", "(150 mins)",
+ app.name, "88888", "P", app.treat, app.note)
+ col = 0
for att in printApp:
- w=fm.width(str(att))
- if not colwidths.has_key(col):
- colwidths[col]=w
- elif colwidths[col]<w:
- colwidths[col]=w
- col+=1
- total=0
+ w = fm.width(str(att))
+ if col not in colwidths:
+ colwidths[col] = w
+ elif colwidths[col] < w:
+ colwidths[col] = w
+ col += 1
+ total = 0
for col in range(len(colwidths)):
- total+=colwidths[col]
+ total += colwidths[col]
for col in range(len(colwidths)):
- colwidths[col]=colwidths[col]*pageWidth/total
+ colwidths[col] = colwidths[col] * pageWidth / total
- x,y=LeftMargin,TopMargin
+ x, y = LeftMargin, TopMargin
painter.setPen(QtCore.Qt.black)
painter.setFont(sansFont)
option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
option = QtGui.QTextOption(QtCore.Qt.AlignVCenter)
- rect=QtCore.QRectF(x, y,pageWidth, rowHeight)
- now=QtCore.QDateTime.currentDateTime().toString()
- painter.drawText(rect,"Daylist for %s %s"%(self.dentist[page],self.dayMemo[page]),option)
+ rect = QtCore.QRectF(x, y, pageWidth, rowHeight)
+ now = QtCore.QDateTime.currentDateTime().toString()
+ painter.drawText(
+ rect, "Daylist for %s %s" %
+ (self.dentist[page], self.dayMemo[page]), option)
y += rowHeight
- rect=QtCore.QRectF(x, y,pageWidth, rowHeight)
- painter.drawText(rect,self.dates[page],option)
- y += rowHeight*1.5
+ rect = QtCore.QRectF(x, y, pageWidth, rowHeight)
+ painter.drawText(rect, self.dates[page], option)
+ y += rowHeight * 1.5
painter.setBrush(QtGui.QColor("#eeeeee"))
- col=0
- for column in ("Start","Length","Name","No","","Treat","memo"):
- rect=QtCore.QRectF(x, y,colwidths[col], rowHeight)
+ col = 0
+ for column in ("Start", "Length", "Name", "No", "", "Treat", "memo"):
+ rect = QtCore.QRectF(x, y, colwidths[col], rowHeight)
painter.drawRect(rect)
- painter.drawText(rect.adjusted(2,0,-2,0),column,option)
- x+=colwidths[col]
- col+=1
- y+=rowHeight
+ painter.drawText(rect.adjusted(2, 0, -2, 0), column, option)
+ x += colwidths[col]
+ col += 1
+ y += rowHeight
painter.setBrush(QtCore.Qt.transparent)
for app in self.apps[page]:
- printApp=(app.start,"(%d mins)"%app.length(),
- app.name,app.serialno,app.cset,app.treat.strip(),app.note)
- x=LeftMargin
- col=0
+ printApp = (app.start, "(%d mins)" % app.length(),
+ app.name, app.serialno, app.cset, app.treat.strip(), app.note)
+ x = LeftMargin
+ col = 0
for att in printApp:
- rect=QtCore.QRectF(x, y,colwidths[col], rowHeight)
+ rect = QtCore.QRectF(x, y, colwidths[col], rowHeight)
painter.drawRect(rect)
if att:
- painter.drawText(rect.adjusted(2,0,-2,0),str(att),option)
- x+=colwidths[col]
- col+=1
+ painter.drawText(
+ rect.adjusted(2,
+ 0,
+ -2,
+ 0),
+ str(att),
+ option)
+ x += colwidths[col]
+ col += 1
y += rowHeight
- rect=QtCore.QRectF(LeftMargin, y,pageWidth, rowHeight)
- painter.drawText(rect,"Printed %s"%now,option)
- if page < len(self.dates)-1:
+ rect = QtCore.QRectF(LeftMargin, y, pageWidth, rowHeight)
+ painter.drawText(rect, "Printed %s" % now, option)
+ if page < len(self.dates) - 1:
self.printer.newPage()
painter.restore()
@@ -114,10 +144,9 @@ if __name__ == "__main__":
import datetime
localsettings.initiate()
app = QtGui.QApplication(sys.argv)
- d=datetime.date.today()
- apps=appointments.printableDaylistData(d,4)
-
- p=printDaylist()
- p.addDaylist(QtCore.QDate.currentDate(),4,apps[0],apps[1:])
- p.print_(True)
+ d = datetime.date.today()
+ apps = appointments.printableDaylistData(d, 4)
+ p = printDaylist()
+ p.addDaylist(QtCore.QDate.currentDate(), 4, apps[0], apps[1:])
+ p.print_(True)
diff --git a/src/openmolar/qt4gui/printing/estimatePrint.py b/src/openmolar/qt4gui/printing/estimatePrint.py
index 4fe98e5..ef32a84 100644
--- a/src/openmolar/qt4gui/printing/estimatePrint.py
+++ b/src/openmolar/qt4gui/printing/estimatePrint.py
@@ -1,19 +1,37 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
-from PyQt4 import QtCore,QtGui
+from PyQt4 import QtCore, QtGui
from openmolar.settings import localsettings
import datetime
+
class estimate(object):
+
def __init__(self, parent=None):
self.setProps()
self.estItems = []
@@ -23,11 +41,11 @@ class estimate(object):
self.pdfprinter = QtGui.QPrinter()
self.pdfprinter.setPageSize(QtGui.QPrinter.A5)
- def setProps(self,tit="",fn="",sn="",serialno=0):
- self.title=tit
- self.fname=fn
- self.sname=sn
- self.ourref=serialno
+ def setProps(self, tit="", fn="", sn="", serialno=0):
+ self.title = tit
+ self.fname = fn
+ self.sname = sn
+ self.ourref = serialno
def setEsts(self, ests):
self.estItems = ests
@@ -39,11 +57,11 @@ class estimate(object):
self.pdfprinter.setOutputFormat(QtGui.QPrinter.PdfFormat)
self.pdfprinter.setOutputFileName(localsettings.TEMP_PDF)
- for printer in (self.printer,self.pdfprinter):
+ for printer in (self.printer, self.pdfprinter):
LeftMargin = 50
TopMargin = 150
serifFont = QtGui.QFont("Times", 11)
- fm=QtGui.QFontMetrics(serifFont)
+ fm = QtGui.QFontMetrics(serifFont)
serifLineHeight = fm.height()
painter = QtGui.QPainter(printer)
pageRect = printer.pageRect()
@@ -52,28 +70,28 @@ class estimate(object):
center = QtGui.QTextOption(QtCore.Qt.AlignCenter)
alignRight = QtGui.QTextOption(QtCore.Qt.AlignRight)
- x,y = LeftMargin,TopMargin
- painter.drawText(x, y, "%s %s %s"%(self.title.title(),
- self.fname.title(),self.sname.title()))
+ x, y = LeftMargin, TopMargin
+ painter.drawText(x, y, "%s %s %s" % (self.title.title(),
+ self.fname.title(), self.sname.title()))
y += serifLineHeight
- painter.drawText(x, y, "Our Ref - "+str(self.ourref))
+ painter.drawText(x, y, "Our Ref - " + str(self.ourref))
- y += serifLineHeight*1.5
+ y += serifLineHeight * 1.5
mystr = 'Estimate Printed on '
w = fm.width(mystr)
painter.drawText(x, y, mystr)
- painter.drawText(x+w, y,
- QtCore.QDate.currentDate().toString(localsettings.QDATE_FORMAT))
+ painter.drawText(x + w, y,
+ QtCore.QDate.currentDate().toString(localsettings.QDATE_FORMAT))
x = LeftMargin + 10
y += serifLineHeight
pt_total = 0
- #separate into NHS and non-NHS items.
- sorted_ests = {"N":[],"P":[]}
+ # separate into NHS and non-NHS items.
+ sorted_ests = {"N": [], "P": []}
for est in self.estItems:
if "N" in est.csetype:
@@ -84,7 +102,7 @@ class estimate(object):
for type_, description in (
("N", _("NHS items")),
("P", _("Private items"))
- ):
+ ):
if sorted_ests[type_]:
y += serifLineHeight
@@ -101,36 +119,37 @@ class estimate(object):
amount = est.ptfee
- #print number,item,amount
+ # print number,item,amount
mult = ""
- if number>1:
+ if number > 1:
mult = "s"
- item = item.replace("*",mult)
- item = item.replace("^","")
+ item = item.replace("*", mult)
+ item = item.replace("^", "")
painter.drawText(QtCore.QRectF(x, y, 60, serifLineHeight),
- str(number))
+ str(number))
- painter.drawText(QtCore.QRectF(x+60, y, 280,
- serifLineHeight), QtCore.QString(item))
+ painter.drawText(QtCore.QRectF(x + 60, y, 280,
+ serifLineHeight), QtCore.QString(item))
- painter.drawText(QtCore.QRectF(x+280, y, 100,
- serifLineHeight), localsettings.formatMoney(amount),
- alignRight)
+ painter.drawText(QtCore.QRectF(x + 280, y, 100,
+ serifLineHeight), localsettings.formatMoney(
+ amount),
+ alignRight)
y += serifLineHeight
y += serifLineHeight
#-- 280+100=280
- painter.drawLine(int(x), int(y), int(x)+380, int(y))
- y += serifLineHeight*1.5
+ painter.drawLine(int(x), int(y), int(x) + 380, int(y))
+ y += serifLineHeight * 1.5
painter.drawText(QtCore.QRectF(x, y, 180, serifLineHeight),
- QtCore.QString("TOTAL"))
+ QtCore.QString("TOTAL"))
- painter.drawText(QtCore.QRectF(x+280, y, 100,serifLineHeight),
- QtCore.QString(localsettings.formatMoney(pt_total)), alignRight)
+ painter.drawText(QtCore.QRectF(x + 280, y, 100, serifLineHeight),
+ QtCore.QString(localsettings.formatMoney(pt_total)), alignRight)
y += serifLineHeight * 4
@@ -140,8 +159,8 @@ class estimate(object):
option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
option.setWrapMode(QtGui.QTextOption.WordWrap)
painter.drawText(QtCore.QRectF(0, y, pageRect.width(), 31),
- "Please note, this estimate may be subject to change if "+\
- "clinical circumstances dictate.", option)
+ "Please note, this estimate may be subject to change if " +
+ "clinical circumstances dictate.", option)
return True
if __name__ == "__main__":
@@ -150,7 +169,7 @@ if __name__ == "__main__":
localsettings.initiate(False)
from openmolar.dbtools import patient_class
from openmolar.ptModules import estimates
- pt=patient_class.patient(23664)
+ pt = patient_class.patient(23664)
app = QtGui.QApplication(sys.argv)
diff --git a/src/openmolar/qt4gui/printing/gp17/__init__.py b/src/openmolar/qt4gui/printing/gp17/__init__.py
index c134588..ad680e0 100644
--- a/src/openmolar/qt4gui/printing/gp17/__init__.py
+++ b/src/openmolar/qt4gui/printing/gp17/__init__.py
@@ -1,3 +1,27 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
from gp17_front import GP17Front
from gp17v1_front import GP17iFront
from gp17v1_back import GP17iBack
diff --git a/src/openmolar/qt4gui/printing/gp17/gp17_back.py b/src/openmolar/qt4gui/printing/gp17/gp17_back.py
index 8b8d003..9f814b4 100644
--- a/src/openmolar/qt4gui/printing/gp17/gp17_back.py
+++ b/src/openmolar/qt4gui/printing/gp17/gp17_back.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
Provides a Class for printing the GP17(Scotland) NHS form
@@ -37,93 +39,122 @@ RECTS = {}
x = 334
-RECTS["reg_continue"] = QtCore.QRectF(x, 141, checkBoxWidth, checkBoxHeight)
-RECTS["reg_another_dentist"] = QtCore.QRectF(x, 167, checkBoxWidth, checkBoxHeight)
-RECTS["reg_another_practice"] = QtCore.QRectF(x, 194, checkBoxWidth, checkBoxHeight)
-RECTS["no_reg"] = QtCore.QRectF(x, 220, checkBoxWidth, checkBoxHeight)
-RECTS["referred"] = QtCore.QRectF(x, 245, checkBoxWidth, checkBoxHeight)
-
-RECTS["pay_charges"] = QtCore.QRectF(x, 300, checkBoxWidth, checkBoxHeight)
-RECTS["HC3"] = QtCore.QRectF(x, 341, checkBoxWidth, checkBoxHeight)
-
-RECTS["4b_patient"] = QtCore.QRectF(97, 377, checkBoxWidth, checkBoxHeight)
-RECTS["4b_guardian"] = QtCore.QRectF(x, 377, checkBoxWidth, checkBoxHeight)
-
-RECTS["4c_patient"] = QtCore.QRectF(100, 930, checkBoxWidth, checkBoxHeight)
-RECTS["4c_guardian"] = QtCore.QRectF(334, 929, checkBoxWidth, checkBoxHeight)
-
-RECTS["8_patient"] = QtCore.QRectF(455, 926, checkBoxWidth, checkBoxHeight)
-RECTS["8_guardian"] = QtCore.QRectF(684, 926, checkBoxWidth, checkBoxHeight)
-
-RECTS["under_18"] = QtCore.QRectF(x, 528, checkBoxWidth, checkBoxHeight)
-RECTS["student"] = QtCore.QRectF(x, 556, checkBoxWidth, checkBoxHeight)
-RECTS["pregnant"] = QtCore.QRectF(x, 580, checkBoxWidth, checkBoxHeight)
-RECTS["feeding"] = QtCore.QRectF(x, 608, checkBoxWidth, checkBoxHeight)
+RECTS["reg_continue"] = QtCore.QRectF(
+ x, 141, checkBoxWidth, checkBoxHeight)
+RECTS["reg_another_dentist"] = QtCore.QRectF(
+ x, 167, checkBoxWidth, checkBoxHeight)
+RECTS["reg_another_practice"] = QtCore.QRectF(
+ x, 194, checkBoxWidth, checkBoxHeight)
+RECTS["no_reg"] = QtCore.QRectF(
+ x, 220, checkBoxWidth, checkBoxHeight)
+RECTS["referred"] = QtCore.QRectF(
+ x, 245, checkBoxWidth, checkBoxHeight)
+
+RECTS["pay_charges"] = QtCore.QRectF(
+ x, 300, checkBoxWidth, checkBoxHeight)
+RECTS["HC3"] = QtCore.QRectF(
+ x, 341, checkBoxWidth, checkBoxHeight)
+
+RECTS["4b_patient"] = QtCore.QRectF(
+ 97, 377, checkBoxWidth, checkBoxHeight)
+RECTS["4b_guardian"] = QtCore.QRectF(
+ x, 377, checkBoxWidth, checkBoxHeight)
+
+RECTS["4c_patient"] = QtCore.QRectF(
+ 100, 930, checkBoxWidth, checkBoxHeight)
+RECTS["4c_guardian"] = QtCore.QRectF(
+ 334, 929, checkBoxWidth, checkBoxHeight)
+
+RECTS["8_patient"] = QtCore.QRectF(
+ 455, 926, checkBoxWidth, checkBoxHeight)
+RECTS["8_guardian"] = QtCore.QRectF(
+ 684, 926, checkBoxWidth, checkBoxHeight)
+
+RECTS["under_18"] = QtCore.QRectF(
+ x, 528, checkBoxWidth, checkBoxHeight)
+RECTS["student"] = QtCore.QRectF(
+ x, 556, checkBoxWidth, checkBoxHeight)
+RECTS["pregnant"] = QtCore.QRectF(
+ x, 580, checkBoxWidth, checkBoxHeight)
+RECTS["feeding"] = QtCore.QRectF(
+ x, 608, checkBoxWidth, checkBoxHeight)
RECTS["income_related_employment_support"] \
- = QtCore.QRectF(x, 648, checkBoxWidth, checkBoxHeight)
-RECTS["income_support"] = QtCore.QRectF(x, 675, checkBoxWidth, checkBoxHeight)
+ = QtCore.QRectF(x, 648, checkBoxWidth, checkBoxHeight)
+RECTS["income_support"] = QtCore.QRectF(
+ x, 675, checkBoxWidth, checkBoxHeight)
-RECTS["job_seekers"] = QtCore.QRectF(x, 700, checkBoxWidth, checkBoxHeight)
-RECTS["tax credit"] = QtCore.QRectF(x, 728, checkBoxWidth, checkBoxHeight)
-RECTS["pension credit"] = QtCore.QRectF(x, 756, checkBoxWidth, checkBoxHeight)
-RECTS["HC2"] = QtCore.QRectF(x, 861, checkBoxWidth, checkBoxHeight)
-RECTS["HC2_number"] = QtCore.QRectF(191, 855, 128, 32)
+RECTS["job_seekers"] = QtCore.QRectF(
+ x, 700, checkBoxWidth, checkBoxHeight)
+RECTS["tax credit"] = QtCore.QRectF(
+ x, 728, checkBoxWidth, checkBoxHeight)
+RECTS["pension credit"] = QtCore.QRectF(
+ x, 756, checkBoxWidth, checkBoxHeight)
+RECTS["HC2"] = QtCore.QRectF(
+ x, 861, checkBoxWidth, checkBoxHeight)
+RECTS["HC2_number"] = QtCore.QRectF(191, 855, 128, 32)
-RECTS["no_evidence"] = QtCore.QRectF(x, 897, checkBoxWidth, checkBoxHeight)
+RECTS["no_evidence"] = QtCore.QRectF(
+ x, 897, checkBoxWidth, checkBoxHeight)
-RECTS["pftr"] = QtCore.QRectF(686, 1037, checkBoxWidth, checkBoxHeight)
+RECTS["pftr"] = QtCore.QRectF(
+ 686, 1037, checkBoxWidth, checkBoxHeight)
-RECTS["observations"] = QtCore.QRectF(376, 213, 343, 193)
+RECTS["observations"] = QtCore.QRectF(376, 213, 343, 193)
-RECTS["paid_a"] = QtCore.QRectF(623, 795, checkBoxWidth, checkBoxHeight)
-RECTS["paid_b"] = QtCore.QRectF(641, 795, checkBoxWidth, checkBoxHeight)
-RECTS["paid_c"] = QtCore.QRectF(660, 795, checkBoxWidth, checkBoxHeight)
-RECTS["paid_d"] = QtCore.QRectF(686, 795, checkBoxWidth, checkBoxHeight)
-RECTS["paid_s"] = QtCore.QRectF(706, 795, checkBoxWidth, checkBoxHeight)
-
-RECTS["Dent_sig"] = QtCore.QRectF(477, 497, 242, 26)
-RECTS["Dent_sig_date"] = QtCore.QRectF(477, 532, 130, 26)
+RECTS["paid_a"] = QtCore.QRectF(
+ 623, 795, checkBoxWidth, checkBoxHeight)
+RECTS["paid_b"] = QtCore.QRectF(
+ 641, 795, checkBoxWidth, checkBoxHeight)
+RECTS["paid_c"] = QtCore.QRectF(
+ 660, 795, checkBoxWidth, checkBoxHeight)
+RECTS["paid_d"] = QtCore.QRectF(
+ 686, 795, checkBoxWidth, checkBoxHeight)
+RECTS["paid_s"] = QtCore.QRectF(
+ 706, 795, checkBoxWidth, checkBoxHeight)
-RECTS["Dent_sigPA"] = QtCore.QRectF(475, 79, 242, 26)
-RECTS["Dent_sig_datePA"] = QtCore.QRectF(475, 111, 158, 26)
+RECTS["Dent_sig"] = QtCore.QRectF(477, 497, 242, 26)
+RECTS["Dent_sig_date"] = QtCore.QRectF(477, 532, 130, 26)
+
+RECTS["Dent_sigPA"] = QtCore.QRectF(475, 79, 242, 26)
+RECTS["Dent_sig_datePA"] = QtCore.QRectF(475, 111, 158, 26)
class Gp17Back(PrintedForm):
+
'''
a class to set up and print a GP17
'''
data = None
-
+
def __init__(self):
PrintedForm.__init__(self)
self.rects = RECTS
-
+
def print_(self):
self.set_offset(gp17config.OFFSET_LEFT, gp17config.OFFSET_TOP)
- self.set_scaling(gp17config.SCALE_X, gp17config.SCALE_Y)
-
+ self.set_scaling(gp17config.SCALE_X, gp17config.SCALE_Y)
+
painter = PrintedForm.print_(self)
self._fill(painter)
-
+
def _fill(self, painter):
if self.data is None:
return
-
-
+
+
if __name__ == "__main__":
- os.chdir(os.path.expanduser("~")) # for print to file
+ os.chdir(os.path.expanduser("~")) # for print to file
from openmolar.settings import localsettings
TEST_IMAGE = os.path.join(localsettings.resources_location,
- "gp17", "back.jpg")
-
+ "gp17", "back.jpg")
+
app = QtGui.QApplication([])
form = Gp17Back()
-
+
form.testing_mode = True
-
+
form.print_background = True
form.BACKGROUND_IMAGE = TEST_IMAGE
-
+
form.controlled_print()
-
diff --git a/src/openmolar/qt4gui/printing/gp17/gp17_config.py b/src/openmolar/qt4gui/printing/gp17/gp17_config.py
index f055366..5745005 100644
--- a/src/openmolar/qt4gui/printing/gp17/gp17_config.py
+++ b/src/openmolar/qt4gui/printing/gp17/gp17_config.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
Provides a Class for printing the GP17-1(Scotland) NHS form (back side)
@@ -31,7 +33,9 @@ CONF_PATH = os.path.join(localsettings.localFileDirectory, "gp17.conf")
SECTIONS = ("gp17Front", "gp17iFront", "gp17iBack")
+
class GP17Config(ConfigParser.ConfigParser):
+
def __init__(self):
ConfigParser.ConfigParser.__init__(self)
self.read_conf()
@@ -40,101 +44,100 @@ class GP17Config(ConfigParser.ConfigParser):
self.add_section(section)
except ConfigParser.DuplicateSectionError:
pass
-
+
def read_conf(self):
self.read([CONF_PATH])
-
+
@property
def OFFSET_LEFT(self):
try:
return int(self.get("gp17Front", "left"))
except ConfigParser.NoOptionError:
return 0
-
+
@property
def OFFSET_TOP(self):
try:
return int(self.get("gp17Front", "top"))
except ConfigParser.NoOptionError:
return 0
-
+
@property
def SCALE_X(self):
try:
return float(self.get("gp17Front", "scale_x"))
except ConfigParser.NoOptionError:
return 1.0
-
+
@property
def SCALE_Y(self):
try:
return float(self.get("gp17Front", "scale_y"))
except ConfigParser.NoOptionError:
return 1.0
-
+
@property
def GP17i_OFFSET_LEFT(self):
try:
return int(self.get("gp17iFront", "left"))
except ConfigParser.NoOptionError:
return 0
-
+
@property
def GP17i_OFFSET_TOP(self):
try:
return int(self.get("gp17iFront", "top"))
except ConfigParser.NoOptionError:
return 0
-
+
@property
def GP17i_SCALE_X(self):
try:
return float(self.get("gp17iFront", "scale_x"))
except ConfigParser.NoOptionError:
return 1.0
-
+
@property
def GP17i_SCALE_Y(self):
try:
return float(self.get("gp17iFront", "scale_y"))
except ConfigParser.NoOptionError:
return 1.0
-
+
@property
def GP17iback_OFFSET_LEFT(self):
try:
return int(self.get("gp17iBack", "left"))
except ConfigParser.NoOptionError:
return 0
-
+
@property
def GP17iback_OFFSET_TOP(self):
try:
return int(self.get("gp17iBack", "top"))
except ConfigParser.NoOptionError:
return 0
-
+
@property
def GP17iback_SCALE_X(self):
try:
return float(self.get("gp17iBack", "scale_x"))
except ConfigParser.NoOptionError:
return 1.0
-
+
@property
def GP17iback_SCALE_Y(self):
try:
return float(self.get("gp17iBack", "scale_y"))
except ConfigParser.NoOptionError:
return 1.0
-
-
+
def save_config(self):
self.set("gp17Front", "left", self.OFFSET_LEFT)
self.set("gp17Front", "top", self.OFFSET_TOP)
self.set("gp17Front", "scale_x", self.SCALE_X)
self.set("gp17Front", "scale_y", self.SCALE_Y)
-
+
self.set("gp17iFront", "left", self.GP17i_OFFSET_LEFT)
self.set("gp17iFront", "top", self.GP17i_OFFSET_TOP)
self.set("gp17iFront", "scale_x", self.GP17i_SCALE_X)
@@ -144,7 +147,7 @@ class GP17Config(ConfigParser.ConfigParser):
self.set("gp17iBack", "top", self.GP17iback_OFFSET_TOP)
self.set("gp17iBack", "scale_x", self.GP17iback_SCALE_X)
self.set("gp17iBack", "scale_y", self.GP17iback_SCALE_Y)
-
+
f = open(CONF_PATH, "w")
self.write(f)
f.close()
@@ -153,4 +156,3 @@ gp17config = GP17Config()
if __name__ == "__main__":
gp17config.save_config()
-
\ No newline at end of file
diff --git a/src/openmolar/qt4gui/printing/gp17/gp17_data.py b/src/openmolar/qt4gui/printing/gp17/gp17_data.py
index 2c0aebb..4c29bd7 100644
--- a/src/openmolar/qt4gui/printing/gp17/gp17_data.py
+++ b/src/openmolar/qt4gui/printing/gp17/gp17_data.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
Provides Gp17Data class for the data required by a GP17(Scotland) NHS form
@@ -32,6 +34,7 @@ from openmolar.ptModules import dec_perm
LOGGER = logging.getLogger("openmolar")
+
def convert_tooth(tooth):
'''
take something like "ul5" and return the iso code
@@ -46,43 +49,43 @@ def convert_tooth(tooth):
except ValueError:
tooth_no = tooth[2]
- result = "%s%s"% (iso_quadrant+1, tooth_no)
- LOGGER.debug("converted tooth '%s' to '%s'"% (tooth, result))
+ result = "%s%s" % (iso_quadrant + 1, tooth_no)
+ LOGGER.debug("converted tooth '%s' to '%s'" % (tooth, result))
return result
CAPITATION_SIMPLE = [
- "2771", #upper special tray
- "2772" #lower special tray
+ "2771", # upper special tray
+ "2772" # lower special tray
]
CONTINUING_CARE_SIMPLE = [
- "0101", # exam a
- "0111", # exam b
- "0201", # exam c
- "1001", # perio a
- "1011", # perio b
- "2771", #upper special tray
- "2772" #lower special tray
+ "0101", # exam a
+ "0111", # exam b
+ "0201", # exam c
+ "1001", # perio a
+ "1011", # perio b
+ "2771", # upper special tray
+ "2772" # lower special tray
]
TOOTH_SPECIFIC_CODES = [
- "0701", #Fissure sealant, unfilled third molars
- "1021", #non-surgical treatment of periodontal disease
- "1131", #crown lengthening
- "1401", #1 surface
- "1402", #2 surface
- "1403", #2 or more surface including MO or DO
- "1404", #3 or more surface including MOD
- "1411", #tunnel
- "1412", #tunnel, max per tooth
- "1421", #resin
- "1420", #2 or more (same tooth)
- "1422", #acid etch - 1 angle
- "1423", #incisal edge
- "1424", #2 agles - mesial and distal
- "1425", #cusp tip
- "1426", #glass ionomer - 1 filling
- "1427", #glass ionomer - 2 or more
+ "0701", # Fissure sealant, unfilled third molars
+ "1021", # non-surgical treatment of periodontal disease
+ "1131", # crown lengthening
+ "1401", # 1 surface
+ "1402", # 2 surface
+ "1403", # 2 or more surface including MO or DO
+ "1404", # 3 or more surface including MOD
+ "1411", # tunnel
+ "1412", # tunnel, max per tooth
+ "1421", # resin
+ "1420", # 2 or more (same tooth)
+ "1422", # acid etch - 1 angle
+ "1423", # incisal edge
+ "1424", # 2 agles - mesial and distal
+ "1425", # cusp tip
+ "1426", # glass ionomer - 1 filling
+ "1427", # glass ionomer - 2 or more
"1431",
"1461",
"1462",
@@ -293,36 +296,40 @@ TOOTH_SPECIFIC_CODES = [
]
test_misc_dict = {
- "on_referral":True,
- "special_needs":True,
- "not_extending":True,
- "radiographs":True,
- "models":True,
- "trauma":True
- }
+ "on_referral": True,
+ "special_needs": True,
+ "not_extending": True,
+ "radiographs": True,
+ "models": True,
+ "trauma": True
+}
+
class DuckCode(object):
- def __init__(self, code, number=1, free_replace= False):
+
+ def __init__(self, code, number=1, free_replace=False):
self.code = code
self.number = number
self.free_replace = free_replace
test_complex_codes = [
- DuckCode("4401",2),
- DuckCode("3803",1,True)
- ]
+ DuckCode("4401", 2),
+ DuckCode("3803", 1, True)
+]
+
class DuckCourse(object):
- accd = date(1969,12,9)
- cmpd = date(2015,12,9)
+ accd = date(1969, 12, 9)
+ cmpd = date(2015, 12, 9)
+
class DuckPatient(object):
sname = "Wallace"
fname = "Bea"
- dob = date(1969,12,9)
+ dob = date(1969, 12, 9)
sex = "F"
nhsno = "1231234567"
- psn = "Davis" #previous surname
+ psn = "Davis" # previous surname
addr1 = "The Gables"
addr2 = "Daviot"
addr3 = ""
@@ -331,15 +338,20 @@ class DuckPatient(object):
pcde = "IV25XQ"
dnt1 = 1
dnt2 = None
- #dent0,dent1,dent2,dent3 = 0,0,0,0
+ # dent0,dent1,dent2,dent3 = 0,0,0,0
bpe = [""]
under_capitation = False
estimates = []
- nhs_claims = []
+
+ def nhs_claims(self, completed=True):
+ return []
+
def __init__(self):
self.treatment_course = DuckCourse()
+
class Gp17Data(object):
+
'''
a class to hold data required by the form
'''
@@ -348,7 +360,7 @@ class Gp17Data(object):
def __init__(self, pt=None, testing_mode=False):
- LOGGER.debug("Gp17Data object created, pt = %s testing_mode = %s"% (
+ LOGGER.debug("Gp17Data object created, pt = %s testing_mode = %s" % (
pt, testing_mode))
self.pt = DuckPatient() if pt is None else pt
@@ -359,13 +371,14 @@ class Gp17Data(object):
self.misc_dict = test_misc_dict
self.exclusions = []
+ self.completed_only = True
def format_date(self, date):
'''
format's a date of birth to MMDDYYYY
'''
try:
- return "%02d%02d%04d"% (
+ return "%02d%02d%04d" % (
date.day,
date.month,
date.year)
@@ -385,12 +398,12 @@ class Gp17Data(object):
The Dentist's Information
'''
try:
- text = localsettings.dentDict[self.dentist][2]+"\n"
+ text = localsettings.dentDict[self.dentist][2] + "\n"
except KeyError:
- print "Key Error getting dentist",self.dentist
+ print "Key Error getting dentist", self.dentist
text = "\n"
for line in localsettings.practiceAddress:
- text += line+"\n"
+ text += line + "\n"
try:
text += localsettings.dentDict[self.dentist][3]
except KeyError:
@@ -420,9 +433,9 @@ class Gp17Data(object):
@property
def pcde(self):
- pcde = self.pt.pcde.replace(" ","")
+ pcde = self.pt.pcde.replace(" ", "")
if len(pcde) == 6:
- return "%s %s"% (pcde[:3], pcde[3:])
+ return "%s %s" % (pcde[:3], pcde[3:])
return pcde
@property
@@ -464,21 +477,21 @@ class Gp17Data(object):
'''
chart - returns True if the tooth is present.
'''
- if type(self.pt) == DuckPatient:
+ if isinstance(self.pt, DuckPatient):
return True
- old_quadrant = ["ur","ul","ll","lr"][(quadrant %4)-1]
- old_notation = "%s%dst"%(old_quadrant, tooth)
+ old_quadrant = ["ur", "ul", "ll", "lr"][(quadrant % 4) - 1]
+ old_notation = "%s%dst" % (old_quadrant, tooth)
static_string = self.pt.__dict__[old_notation].split(" ")
- #print "checking for tooth %s%s (%s), '%s'"% (
+ # print "checking for tooth %s%s (%s), '%s'"% (
# quadrant, tooth, old_notation, static_string)
if "TM" in static_string or "UE" in static_string:
return False
if quadrant > 4:
- if self._is_deciduous(quadrant-4, tooth):
+ if self._is_deciduous(quadrant - 4, tooth):
result = True
else:
result = False
@@ -506,9 +519,9 @@ class Gp17Data(object):
return False
array = dec_perm.fromSignedByte(att)
- if quadrant in (2,4):
+ if quadrant in (2, 4):
array = list(reversed(array))
- return array[tooth-1] == "1"
+ return array[tooth - 1] == "1"
@property
def bpe(self):
@@ -538,7 +551,7 @@ class Gp17Data(object):
else:
allowed_claim_codes = CONTINUING_CARE_SIMPLE
- for item in self.pt.nhs_claims:
+ for item in self.pt.nhs_claims(self.completed_only):
if item.itemcode in allowed_claim_codes:
try:
items[item.itemcode] += item.number
@@ -572,16 +585,16 @@ class Gp17Data(object):
allowed_claim_codes = TOOTH_SPECIFIC_CODES
- #iterate over the estimates
- for item in self.pt.nhs_claims:
+ # iterate over the estimates
+ for item in self.pt.nhs_claims(self.completed_only):
if item.itemcode in allowed_claim_codes:
for hash_ in item.tx_hashes:
att, tx = self.pt.get_tx_from_hash(hash_)
iso_tooth = convert_tooth(att)
if iso_tooth is None:
LOGGER.error(
- "GP17 IGNORING itemcode %s as not tooth specific?"%
- item.itemcode)
+ "GP17 IGNORING itemcode %s as not tooth specific?" %
+ item.itemcode)
continue
try:
ts_items[item.itemcode].append(iso_tooth)
@@ -594,4 +607,3 @@ class Gp17Data(object):
if __name__ == "__main__":
data = Gp17Data(testing_mode=True)
-
diff --git a/src/openmolar/qt4gui/printing/gp17/gp17_front.py b/src/openmolar/qt4gui/printing/gp17/gp17_front.py
index b9a633a..fdb3da9 100644
--- a/src/openmolar/qt4gui/printing/gp17/gp17_front.py
+++ b/src/openmolar/qt4gui/printing/gp17/gp17_front.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your OPTION) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
Provides a Class for printing the GP17(Scotland) NHS form
@@ -38,29 +40,61 @@ CB_WIDTH = 16
CB_HEIGHT = 16
-teeth_x = [ 50,92,133,173,216,256,300,342, 394,434,474,516,560,599,640,681]
+teeth_x = [
+ 50,
+ 92,
+ 133,
+ 173,
+ 216,
+ 256,
+ 300,
+ 342,
+ 394,
+ 434,
+ 474,
+ 516,
+ 560,
+ 599,
+ 640,
+ 681]
RECTS = {}
-#upper teeth
-for i,x in enumerate(teeth_x):
- RECTS["upper%da"% (i+1)] = QtCore.QRectF(x, 355, 32, CB_HEIGHT)
- RECTS["upper%db"% (i+1)] = QtCore.QRectF(x, 382, 32, CB_HEIGHT)
- RECTS["upper%dc"% (i+1)] = QtCore.QRectF(x, 409, 32, CB_HEIGHT)
- RECTS["lower%da"% (i+1)] = QtCore.QRectF(x, 485, 32, CB_HEIGHT)
- RECTS["lower%db"% (i+1)] = QtCore.QRectF(x, 511, 32, CB_HEIGHT)
- RECTS["lower%dc"% (i+1)] = QtCore.QRectF(x, 538, 32, CB_HEIGHT)
-
-
-#row1
-xs = [80, 100, 175, 195, 292, 312, 383, 403, 439, 460, 481, 501, 532, 552, 578, 596]
-ys= [594, 627, 661, 694, 727, 760, 794, 828, 860, 894, 927, 961, 994, 1028]
-
-#column 1
+# upper teeth
+for i, x in enumerate(teeth_x):
+ RECTS["upper%da" % (i + 1)] = QtCore.QRectF(x, 355, 32, CB_HEIGHT)
+ RECTS["upper%db" % (i + 1)] = QtCore.QRectF(x, 382, 32, CB_HEIGHT)
+ RECTS["upper%dc" % (i + 1)] = QtCore.QRectF(x, 409, 32, CB_HEIGHT)
+ RECTS["lower%da" % (i + 1)] = QtCore.QRectF(x, 485, 32, CB_HEIGHT)
+ RECTS["lower%db" % (i + 1)] = QtCore.QRectF(x, 511, 32, CB_HEIGHT)
+ RECTS["lower%dc" % (i + 1)] = QtCore.QRectF(x, 538, 32, CB_HEIGHT)
+
+
+# row1
+xs = [
+ 80,
+ 100,
+ 175,
+ 195,
+ 292,
+ 312,
+ 383,
+ 403,
+ 439,
+ 460,
+ 481,
+ 501,
+ 532,
+ 552,
+ 578,
+ 596]
+ys = [594, 627, 661, 694, 727, 760, 794, 828, 860, 894, 927, 961, 994, 1028]
+
+# column 1
RECTS["0101"] = QtCore.QRectF(xs[0], ys[0], CB_WIDTH, CB_HEIGHT)
RECTS["0111"] = QtCore.QRectF(xs[0], ys[1], CB_WIDTH, CB_HEIGHT)
RECTS["0121"] = QtCore.QRectF(xs[0], ys[2], CB_WIDTH, CB_HEIGHT)
-#skips a row
+# skips a row
RECTS["2730"] = QtCore.QRectF(xs[0], ys[4], CB_WIDTH, CB_HEIGHT)
RECTS["2731"] = QtCore.QRectF(xs[0], ys[5], CB_WIDTH, CB_HEIGHT)
RECTS["2732"] = QtCore.QRectF(xs[0], ys[6], CB_WIDTH, CB_HEIGHT)
@@ -163,7 +197,6 @@ RECTS["2121a"] = QtCore.QRectF(xs[6], ys[12], CB_WIDTH, CB_HEIGHT)
RECTS["2121b"] = QtCore.QRectF(xs[7], ys[12], CB_WIDTH, CB_HEIGHT)
-
RECTS["4401a"] = QtCore.QRectF(xs[10], ys[0], CB_WIDTH, CB_HEIGHT)
RECTS["4401b"] = QtCore.QRectF(xs[11], ys[0], CB_WIDTH, CB_HEIGHT)
@@ -177,25 +210,25 @@ RECTS["4404a"] = QtCore.QRectF(xs[14], ys[1], CB_WIDTH, CB_HEIGHT)
RECTS["4404b"] = QtCore.QRectF(xs[15], ys[1], CB_WIDTH, CB_HEIGHT)
-#dentists use only
+# dentists use only
RECTS["DENTIST_USE_pound"] = QtCore.QRectF(634, ys[0], 48, 410)
RECTS["DENTIST_USE_pence"] = QtCore.QRectF(688, ys[0], 30, 410)
-for i in range(1,10):
- RECTS["other%dA"% i] = QtCore.QRectF(
- xs[8], ys[2+i], CB_WIDTH, CB_HEIGHT)
- RECTS["other%dB"% i] = QtCore.QRectF(
- xs[9], ys[2+i], CB_WIDTH, CB_HEIGHT)
- RECTS["other%dC"% i] = QtCore.QRectF(
- xs[10], ys[2+i], CB_WIDTH, CB_HEIGHT)
- RECTS["other%dD"% i] = QtCore.QRectF(
- xs[11], ys[2+i], CB_WIDTH, CB_HEIGHT)
- RECTS["other%da"% i] = QtCore.QRectF(
- xs[12], ys[2+i], CB_WIDTH, CB_HEIGHT)
- RECTS["other%db"% i] = QtCore.QRectF(
- xs[13], ys[2+i], CB_WIDTH, CB_HEIGHT)
- RECTS["free_replace%d"% i] = QtCore.QRectF(
- xs[15], ys[2+i], CB_WIDTH, CB_HEIGHT)
+for i in range(1, 10):
+ RECTS["other%dA" % i] = QtCore.QRectF(
+ xs[8], ys[2 + i], CB_WIDTH, CB_HEIGHT)
+ RECTS["other%dB" % i] = QtCore.QRectF(
+ xs[9], ys[2 + i], CB_WIDTH, CB_HEIGHT)
+ RECTS["other%dC" % i] = QtCore.QRectF(
+ xs[10], ys[2 + i], CB_WIDTH, CB_HEIGHT)
+ RECTS["other%dD" % i] = QtCore.QRectF(
+ xs[11], ys[2 + i], CB_WIDTH, CB_HEIGHT)
+ RECTS["other%da" % i] = QtCore.QRectF(
+ xs[12], ys[2 + i], CB_WIDTH, CB_HEIGHT)
+ RECTS["other%db" % i] = QtCore.QRectF(
+ xs[13], ys[2 + i], CB_WIDTH, CB_HEIGHT)
+ RECTS["free_replace%d" % i] = QtCore.QRectF(
+ xs[15], ys[2 + i], CB_WIDTH, CB_HEIGHT)
RECTS["4600a"] = QtCore.QRectF(xs[14], ys[12], CB_WIDTH, CB_HEIGHT)
@@ -212,61 +245,93 @@ RECTS["TOTAL4"] = QtCore.QRectF(662, ys[13], CB_WIDTH, CB_HEIGHT)
RECTS["TOTAL5"] = QtCore.QRectF(684, ys[13], CB_WIDTH, CB_HEIGHT)
RECTS["TOTAL6"] = QtCore.QRectF(702, ys[13], CB_WIDTH, CB_HEIGHT)
-##sname boxes
+# sname boxes
PADDING = 3.1
for i in range(14):
x = 94 + i * (TEXTBOX_WIDTH + PADDING)
y = 28
- RECTS["surname_%02d"% i] = QtCore.QRectF(x,y,TEXTBOX_WIDTH,TEXTBOX_HEIGHT)
-
-##fname boxes
+ RECTS[
+ "surname_%02d" %
+ i] = QtCore.QRectF(
+ x,
+ y,
+ TEXTBOX_WIDTH,
+ TEXTBOX_HEIGHT)
+
+# fname boxes
for i in range(14):
x = 94 + i * (TEXTBOX_WIDTH + PADDING)
y = 60
- RECTS["forename_%02d"% i] = QtCore.QRectF(x,y,TEXTBOX_WIDTH,TEXTBOX_HEIGHT)
-
-##dob
-for i, x in enumerate([66,85,123,142,180,199,217,236]):
- RECTS["dob_%d"% i] = QtCore.QRectF(x, 93 ,TEXTBOX_WIDTH,TEXTBOX_HEIGHT)
-
-##sex
+ RECTS[
+ "forename_%02d" %
+ i] = QtCore.QRectF(
+ x,
+ y,
+ TEXTBOX_WIDTH,
+ TEXTBOX_HEIGHT)
+
+# dob
+for i, x in enumerate([66, 85, 123, 142, 180, 199, 217, 236]):
+ RECTS["dob_%d" % i] = QtCore.QRectF(x, 93, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
+
+# sex
RECTS["male"] = QtCore.QRectF(304, 93, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
RECTS["female"] = QtCore.QRectF(341, 93, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
-## patient identifier
-for i, x in enumerate([133,152,171,198,217,236,255,274,293,312]):
- RECTS["pid_%d"% i] = QtCore.QRectF(x, 124 ,TEXTBOX_WIDTH,TEXTBOX_HEIGHT)
+# patient identifier
+for i, x in enumerate([133, 152, 171, 198, 217, 236, 255, 274, 293, 312]):
+ RECTS["pid_%d" % i] = QtCore.QRectF(x, 124, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
-## previous sname
-for i, x in enumerate([133,152,171,190,209,228,247,266,286,305,324,343]):
- RECTS["psn_%d"% i] = QtCore.QRectF(x, 157 ,TEXTBOX_WIDTH,TEXTBOX_HEIGHT)
+# previous sname
+for i, x in enumerate([133, 152, 171, 190, 209, 228, 247, 266, 286, 305, 324, 343]):
+ RECTS["psn_%d" % i] = QtCore.QRectF(x, 157, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
-##dentists stamp box
+# dentists stamp box
RECTS["stampbox"] = QtCore.QRectF(426, 42, 292, 132)
-##address
+# address
for i, x in enumerate(range(16, 340, 19)):
- RECTS["addr1_%02d"% i] = QtCore.QRectF(x, 216, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
- RECTS["addr2_%02d"% i] = QtCore.QRectF(x, 244, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
- RECTS["addr3_%02d"% i] = QtCore.QRectF(x, 272, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
-
-##postcode
-for i, x in enumerate((92,111,130,149,187,206,225)):
- RECTS["pcde_%d"% i] = QtCore.QRectF(x, 304, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
-
-##accept date and completiondate
-for i, x in enumerate((540,560,591,609,640,659,678,697)):
- RECTS["accd_%d"% i] = QtCore.QRectF(x, 185, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
- RECTS["cmpd_%d"% i] = QtCore.QRectF(x, 219, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
-
-##treatmentonReferral/specialNeeds/registration
+ RECTS[
+ "addr1_%02d" %
+ i] = QtCore.QRectF(
+ x,
+ 216,
+ TEXTBOX_WIDTH,
+ TEXTBOX_HEIGHT)
+ RECTS[
+ "addr2_%02d" %
+ i] = QtCore.QRectF(
+ x,
+ 244,
+ TEXTBOX_WIDTH,
+ TEXTBOX_HEIGHT)
+ RECTS[
+ "addr3_%02d" %
+ i] = QtCore.QRectF(
+ x,
+ 272,
+ TEXTBOX_WIDTH,
+ TEXTBOX_HEIGHT)
+
+# postcode
+for i, x in enumerate((92, 111, 130, 149, 187, 206, 225)):
+ RECTS["pcde_%d" % i] = QtCore.QRectF(x, 304, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
+
+# accept date and completiondate
+for i, x in enumerate((540, 560, 591, 609, 640, 659, 678, 697)):
+ RECTS["accd_%d" % i] = QtCore.QRectF(x, 185, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
+ RECTS["cmpd_%d" % i] = QtCore.QRectF(x, 219, TEXTBOX_WIDTH, TEXTBOX_HEIGHT)
+
+# treatmentonReferral/specialNeeds/registration
RECTS["on_referral"] = QtCore.QRectF(697, 260, CB_WIDTH, CB_HEIGHT)
RECTS["special_needs"] = QtCore.QRectF(697, 290, CB_WIDTH, CB_HEIGHT)
RECTS["not_extending"] = QtCore.QRectF(697, 316, CB_WIDTH, CB_HEIGHT)
-OPTION = QtGui.QTextOption(QtCore.Qt.AlignCenter|QtCore.Qt.AlignVCenter)
+OPTION = QtGui.QTextOption(QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)
+
class GP17Front(PrintedForm):
+
'''
a class to set up and print a GP17
'''
@@ -283,7 +348,7 @@ class GP17Front(PrintedForm):
def is_active(self):
if "neil" in os.path.expanduser("~"):
return False
- return QtCore.QDate.currentDate() < QtCore.QDate(2013,7,1)
+ return QtCore.QDate.currentDate() < QtCore.QDate(2013, 7, 1)
def set_data(self, data):
self.data = data
@@ -292,7 +357,7 @@ class GP17Front(PrintedForm):
def BACKGROUND_IMAGE(self):
if self._bg_pixmap is None:
self._bg_pixmap = QtGui.QPixmap(os.path.join(
- localsettings.resources_location, "gp17", "front.jpg"))
+ localsettings.resources_location, "gp17", "front.jpg"))
return self._bg_pixmap
def print_(self):
@@ -308,10 +373,10 @@ class GP17Front(PrintedForm):
serifFont = QtGui.QFont("Courier", 12)
serifFont.setBold(True)
- fm=QtGui.QFontMetrics(serifFont)
+ fm = QtGui.QFontMetrics(serifFont)
serifLineHeight = fm.height()
- painter.setPen(QtGui.QPen(QtCore.Qt.black,1))
+ painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
painter.setFont(serifFont)
for func_ in (
@@ -328,16 +393,16 @@ class GP17Front(PrintedForm):
self._fill_address,
self._fill_simple_codes,
self._fill_complex_codes
- ):
+ ):
painter.save()
- #painter.translate(self.off_set)
+ # painter.translate(self.off_set)
func_(painter)
painter.restore()
def _fill_surname(self, painter):
for i in range(14):
- rect = self.rects["surname_%02d"% i]
+ rect = self.rects["surname_%02d" % i]
try:
painter.drawText(rect, self.data.pt.sname[i], OPTION)
except IndexError:
@@ -345,7 +410,7 @@ class GP17Front(PrintedForm):
def _fill_forename(self, painter):
for i in range(14):
- rect = self.rects["forename_%02d"% i]
+ rect = self.rects["forename_%02d" % i]
try:
painter.drawText(rect, self.data.pt.fname[i], OPTION)
except IndexError:
@@ -353,7 +418,7 @@ class GP17Front(PrintedForm):
def _fill_dob(self, painter):
for i in range(8):
- rect = self.rects["dob_%d"% i]
+ rect = self.rects["dob_%d" % i]
try:
painter.drawText(rect, self.data.dob[i], OPTION)
except IndexError:
@@ -361,16 +426,16 @@ class GP17Front(PrintedForm):
def _fill_sex(self, painter):
sex = self.data.pt.sex
- if sex=="M":
+ if sex == "M":
painter.drawText(self.rects["male"], "M", OPTION)
- elif sex=="F":
- painter.drawText(self.rects["female"],"F", OPTION)
+ elif sex == "F":
+ painter.drawText(self.rects["female"], "F", OPTION)
else:
print "UNKNOWN SEX for GP17!"
def _fill_pid(self, painter):
for i in range(10):
- rect = self.rects["pid_%d"% i]
+ rect = self.rects["pid_%d" % i]
try:
painter.drawText(rect, self.data.identifier[i], OPTION)
except IndexError:
@@ -378,7 +443,7 @@ class GP17Front(PrintedForm):
def _fill_previous_surname(self, painter):
for i in range(10):
- rect = self.rects["psn_%d"% i]
+ rect = self.rects["psn_%d" % i]
try:
painter.drawText(rect, self.data.previous_sname[i], OPTION)
except IndexError:
@@ -389,28 +454,28 @@ class GP17Front(PrintedForm):
def _fill_address(self, painter):
for i in range(18):
- rect = self.rects["addr1_%02d"% i]
+ rect = self.rects["addr1_%02d" % i]
try:
painter.drawText(rect, self.data.addr1[i], OPTION)
except IndexError:
break
for i in range(18):
- rect = self.rects["addr2_%02d"% i]
+ rect = self.rects["addr2_%02d" % i]
try:
painter.drawText(rect, self.data.addr2[i], OPTION)
except IndexError:
break
for i in range(18):
- rect = self.rects["addr3_%02d"% i]
+ rect = self.rects["addr3_%02d" % i]
try:
painter.drawText(rect, self.data.addr3[i], OPTION)
except IndexError:
break
for i in range(7):
- rect = self.rects["pcde_%d"% i]
+ rect = self.rects["pcde_%d" % i]
try:
painter.drawText(rect, self.data.pcde[i], OPTION)
except IndexError:
@@ -418,7 +483,7 @@ class GP17Front(PrintedForm):
def _fill_accd(self, painter):
for i in range(8):
- rect = self.rects["accd_%d"% i]
+ rect = self.rects["accd_%d" % i]
try:
painter.drawText(rect, self.data.accd[i], OPTION)
except IndexError:
@@ -426,29 +491,39 @@ class GP17Front(PrintedForm):
def _fill_cmpd(self, painter):
for i in range(8):
- rect = self.rects["cmpd_%d"% i]
+ rect = self.rects["cmpd_%d" % i]
try:
painter.drawText(rect, self.data.cmpd[i], OPTION)
except IndexError:
break
def _fill_misc_cbs(self, painter):
- for key in ["on_referral", "not_extending", "special_needs","on_referral",
- "radiographs","models","trauma"]:
+ for key in [
+ "on_referral", "not_extending", "special_needs", "on_referral",
+ "radiographs", "models", "trauma"]:
if self.data.misc_dict.get(key, False):
rect = self.rects[key]
painter.drawText(rect, "X", OPTION)
def _fill_simple_codes(self, painter):
self.row = 1
+
def other_treatment():
- painter.drawText(self.rects["other%dA"% self.row], code[0], OPTION)
- painter.drawText(self.rects["other%dB"% self.row], code[1], OPTION)
- painter.drawText(self.rects["other%dC"% self.row], code[2], OPTION)
- painter.drawText(self.rects["other%dD"% self.row], code[3], OPTION)
- painter.drawText(self.rects["other%da"% self.row], "0", OPTION)
- painter.drawText(self.rects["other%db"% self.row], "1", OPTION)
+ painter.drawText(
+ self.rects["other%dA" %
+ self.row], code[0], OPTION)
+ painter.drawText(
+ self.rects["other%dB" %
+ self.row], code[1], OPTION)
+ painter.drawText(
+ self.rects["other%dC" %
+ self.row], code[2], OPTION)
+ painter.drawText(
+ self.rects["other%dD" %
+ self.row], code[3], OPTION)
+ painter.drawText(self.rects["other%da" % self.row], "0", OPTION)
+ painter.drawText(self.rects["other%db" % self.row], "1", OPTION)
self.row += 1
for code in self.data.simple_codes:
@@ -460,16 +535,29 @@ class GP17Front(PrintedForm):
def _fill_complex_codes(self, painter):
def other_treatment():
- painter.drawText(self.rects["other%dA"% self.row], code.code[0], OPTION)
- painter.drawText(self.rects["other%dB"% self.row], code.code[1], OPTION)
- painter.drawText(self.rects["other%dC"% self.row], code.code[2], OPTION)
- painter.drawText(self.rects["other%dD"% self.row], code.code[3], OPTION)
- n = "%02d"% code.number
- painter.drawText(self.rects["other%da"% self.row], n[0], OPTION)
- painter.drawText(self.rects["other%db"% self.row], n[1], OPTION)
+ painter.drawText(
+ self.rects["other%dA" %
+ self.row], code.code[0], OPTION)
+ painter.drawText(
+ self.rects["other%dB" %
+ self.row], code.code[1], OPTION)
+ painter.drawText(
+ self.rects["other%dC" %
+ self.row], code.code[2], OPTION)
+ painter.drawText(
+ self.rects["other%dD" %
+ self.row], code.code[3], OPTION)
+ n = "%02d" % code.number
+ painter.drawText(self.rects["other%da" % self.row], n[0], OPTION)
+ painter.drawText(self.rects["other%db" % self.row], n[1], OPTION)
if code.free_replace:
- painter.drawText(self.rects["free_replace%d"% self.row], "X", OPTION)
+ painter.drawText(
+ self.rects[
+ "free_replace%d" %
+ self.row],
+ "X",
+ OPTION)
self.row += 1
for code in self.data.complex_codes:
@@ -477,21 +565,21 @@ class GP17Front(PrintedForm):
other_treatment()
continue
try:
- n = "%02d"% code.number
- painter.drawText(self.rects["%sa"% code.code], n[0], OPTION)
- painter.drawText(self.rects["%sb"% code.code], n[1], OPTION)
+ n = "%02d" % code.number
+ painter.drawText(self.rects["%sa" % code.code], n[0], OPTION)
+ painter.drawText(self.rects["%sb" % code.code], n[1], OPTION)
except KeyError:
other_treatment()
if __name__ == "__main__":
- os.chdir(os.path.expanduser("~")) # for print to file
+ os.chdir(os.path.expanduser("~")) # for print to file
from openmolar.settings import localsettings
from openmolar.qt4gui.printing.gp17.gp17_data import Gp17Data
data = Gp17Data(testing_mode=True)
TEST_IMAGE = os.path.join(localsettings.resources_location, "gp17",
- "front.jpg")
+ "front.jpg")
data = Gp17Data(testing_mode=True)
@@ -507,6 +595,5 @@ if __name__ == "__main__":
form.controlled_print()
- #for key in sorted(form.rects.keys()):
+ # for key in sorted(form.rects.keys()):
# print key,
-
diff --git a/src/openmolar/qt4gui/printing/gp17/gp17_printer.py b/src/openmolar/qt4gui/printing/gp17/gp17_printer.py
index f6ba2f9..94cfe2c 100644
--- a/src/openmolar/qt4gui/printing/gp17/gp17_printer.py
+++ b/src/openmolar/qt4gui/printing/gp17/gp17_printer.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your OPTION) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
Provides a Class for printing the GP17s
@@ -30,7 +32,9 @@ from PyQt4 import QtCore, QtGui
from openmolar.qt4gui.dialogs.gp17_printdialog import GP17PrintDialog
from openmolar.qt4gui.printing.om_printing import commitPDFtoDB
+
class GP17Printer(object):
+
def __init__(self, om_gui):
self.om_gui = om_gui
@@ -46,23 +50,23 @@ class GP17Printer(object):
if final_paperwork:
result = QtGui.QMessageBox.question(self.om_gui,
- _("Question"),
- _("Print an NHS form now?"),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
+ _("Question"),
+ _("Print an NHS form now?"),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.No:
return
- if test: #self.om_gui.pt.serialno == 0:
+ if test: # self.om_gui.pt.serialno == 0:
pt = None
else:
pt = self.om_gui.pt
dl = GP17PrintDialog(pt, self.om_gui)
dl.choose_form_widget.boxes_checkbox.setChecked(test)
- #chosenDent = str(dl.dents_comboBox.currentText())
- #dent = localsettings.ops_reverse.get(chosenDent)
- #form = GP17.gp17(self.om_gui.pt, dent, self.om_gui, test)
+ # chosenDent = str(dl.dents_comboBox.currentText())
+ # dent = localsettings.ops_reverse.get(chosenDent)
+ # form = GP17.gp17(self.om_gui.pt, dent, self.om_gui, test)
if dl.exec_():
for Form in dl.chosen_forms:
form = Form()
@@ -74,7 +78,7 @@ class GP17Printer(object):
commitPDFtoDB(self.om_gui, form.NAME)
self.om_gui.pt.addHiddenNote(
- "printed", "%s %s"% (form.NAME, dl.dent_inits))
+ "printed", "%s %s" % (form.NAME, dl.dent_inits))
self.om_gui.updateHiddenNotesLabel()
@@ -83,10 +87,10 @@ if __name__ == "__main__":
from openmolar.qt4gui import maingui
from openmolar.dbtools import patient_class
- os.chdir(os.path.expanduser("~")) #for save pdf
+ os.chdir(os.path.expanduser("~")) # for save pdf
localsettings.initiate()
- localsettings.station="reception" #prevent no clinician popup
+ localsettings.station = "reception" # prevent no clinician popup
app = QtGui.QApplication([])
@@ -95,4 +99,4 @@ if __name__ == "__main__":
om_gui.pt = patient_class.patient(2981)
p = GP17Printer(om_gui)
- p.test_print()
\ No newline at end of file
+ p.test_print()
diff --git a/src/openmolar/qt4gui/printing/gp17/gp17v1_back.py b/src/openmolar/qt4gui/printing/gp17/gp17v1_back.py
index e284db4..86228da 100644
--- a/src/openmolar/qt4gui/printing/gp17/gp17v1_back.py
+++ b/src/openmolar/qt4gui/printing/gp17/gp17v1_back.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
Provides a Class for printing the GP17-1(Scotland) NHS form (back side)
@@ -32,56 +34,58 @@ from openmolar.backports.printed_form import PrintedForm
from openmolar.qt4gui.printing.gp17.gp17_config import gp17config
# size of a box for a text field (ie character)
-T_BOX = QtCore.QRectF(0,0, 15, 16)
+T_BOX = QtCore.QRectF(0, 0, 15, 16)
# size of a box for an X (ie check box)
-C_BOX = QtCore.QRectF(0,0, 14, 14)
+C_BOX = QtCore.QRectF(0, 0, 14, 14)
RECTS = {}
x = 334
-RECTS["reg_continue"] = C_BOX.translated(x, 196)
-RECTS["reg_another_dentist"] = C_BOX.translated(x, 218)
-RECTS["reg_another_practice"] = C_BOX.translated(x, 240)
-RECTS["no_reg"] = C_BOX.translated(x, 260)
-RECTS["referred"] = C_BOX.translated(x, 280)
+RECTS["reg_continue"] = C_BOX.translated(x, 196)
+RECTS["reg_another_dentist"] = C_BOX.translated(x, 218)
+RECTS["reg_another_practice"] = C_BOX.translated(x, 240)
+RECTS["no_reg"] = C_BOX.translated(x, 260)
+RECTS["referred"] = C_BOX.translated(x, 280)
-RECTS["pay_charges"] = C_BOX.translated(x, 330)
-RECTS["HC3"] = C_BOX.translated(x, 372)
-RECTS["HC3_number"] = QtCore.QRectF(200, 369, 118, 30)
+RECTS["pay_charges"] = C_BOX.translated(x, 330)
+RECTS["HC3"] = C_BOX.translated(x, 372)
+RECTS["HC3_number"] = QtCore.QRectF(200, 369, 118, 30)
-RECTS["4b_patient"] = C_BOX.translated(102, 408)
-RECTS["4b_guardian"] = C_BOX.translated(x, 408)
+RECTS["4b_patient"] = C_BOX.translated(102, 408)
+RECTS["4b_guardian"] = C_BOX.translated(x, 408)
-RECTS["4c_patient"] = C_BOX.translated(104, 934)
-RECTS["4c_guardian"] = C_BOX.translated(x, 934)
+RECTS["4c_patient"] = C_BOX.translated(104, 934)
+RECTS["4c_guardian"] = C_BOX.translated(x, 934)
-RECTS["8_patient"] = C_BOX.translated(455, 940)
-RECTS["8_guardian"] = C_BOX.translated(684, 940)
+RECTS["8_patient"] = C_BOX.translated(455, 940)
+RECTS["8_guardian"] = C_BOX.translated(684, 940)
-RECTS["under_18"] = C_BOX.translated(x, 556)
-RECTS["student"] = C_BOX.translated(x, 575)
-RECTS["pregnant"] = C_BOX.translated(x, 594)
-RECTS["nursing"] = C_BOX.translated(x, 613)
+RECTS["under_18"] = C_BOX.translated(x, 556)
+RECTS["student"] = C_BOX.translated(x, 575)
+RECTS["pregnant"] = C_BOX.translated(x, 594)
+RECTS["nursing"] = C_BOX.translated(x, 613)
RECTS["income_related_employment_support"] = C_BOX.translated(x, 646)
-RECTS["income_support"] = C_BOX.translated(x, 665)
-RECTS["job_seekers"] = C_BOX.translated(x, 684)
-RECTS["unused"] = C_BOX.translated(x, 703)
+RECTS["income_support"] = C_BOX.translated(x, 665)
+RECTS["job_seekers"] = C_BOX.translated(x, 684)
+RECTS["unused"] = C_BOX.translated(x, 703)
-RECTS["pension credit"] = C_BOX.translated(x, 744)
-RECTS["tax credit"] = C_BOX.translated(x, 763)
+RECTS["pension credit"] = C_BOX.translated(x, 744)
+RECTS["tax credit"] = C_BOX.translated(x, 763)
-RECTS["HC2"] = C_BOX.translated(x, 872)
-RECTS["HC2_number"] = QtCore.QRectF(200, 872, 118, 32)
+RECTS["HC2"] = C_BOX.translated(x, 872)
+RECTS["HC2_number"] = QtCore.QRectF(200, 872, 118, 32)
-RECTS["no_evidence"] = C_BOX.translated(x, 913)
+RECTS["no_evidence"] = C_BOX.translated(x, 913)
-RECTS["observations"] = QtCore.QRectF(384, 210, 320, 328)
+RECTS["observations"] = QtCore.QRectF(384, 210, 320, 328)
+
+for i, x in enumerate([610, 627, 644, 670, 687]):
+ RECTS["paid_%02d" % i] = T_BOX.translated(x, 784)
-for i, x in enumerate([610,627,644,670,687]):
- RECTS["paid_%02d"%i] = T_BOX.translated(x, 784)
class GP17iBack(PrintedForm):
+
'''
a class to set up and print a GP17 (tooth specific version)
'''
@@ -95,7 +99,7 @@ class GP17iBack(PrintedForm):
@classmethod
def is_active(self):
- #return QtCore.QDate.currentDate() >= QtCore.QDate(2013,7,1)
+ # return QtCore.QDate.currentDate() >= QtCore.QDate(2013,7,1)
return False
def set_data(self, data):
@@ -105,7 +109,7 @@ class GP17iBack(PrintedForm):
def BACKGROUND_IMAGE(self):
if self._bg_pixmap is None:
self._bg_pixmap = QtGui.QPixmap(os.path.join(
- localsettings.resources_location, "gp17-1", "back.png"))
+ localsettings.resources_location, "gp17-1", "back.png"))
return self._bg_pixmap
def print_(self):
@@ -123,10 +127,10 @@ class GP17iBack(PrintedForm):
if __name__ == "__main__":
- os.chdir(os.path.expanduser("~")) # for print to file
+ os.chdir(os.path.expanduser("~")) # for print to file
from openmolar.settings import localsettings
TEST_IMAGE = os.path.join(localsettings.resources_location,
- "gp17-1", "back.png")
+ "gp17-1", "back.png")
app = QtGui.QApplication([])
form = GP17iBack()
@@ -137,4 +141,3 @@ if __name__ == "__main__":
form.BACKGROUND_IMAGE = TEST_IMAGE
form.controlled_print()
-
diff --git a/src/openmolar/qt4gui/printing/gp17/gp17v1_front.py b/src/openmolar/qt4gui/printing/gp17/gp17v1_front.py
index e880d1c..f9d5692 100644
--- a/src/openmolar/qt4gui/printing/gp17/gp17v1_front.py
+++ b/src/openmolar/qt4gui/printing/gp17/gp17v1_front.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011, Neil Wallace <rowinggolfer at googlemail.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your OPTION) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
Provides a Class for printing the GP17-1(Scotland) NHS form (front side)
@@ -37,56 +39,56 @@ PADDING = 2.5
RECTS = {}
# size of a box for a text field (ie character)
-T_BOX = QtCore.QRectF(0,0, TEXTBOX_WIDTH, 16)
+T_BOX = QtCore.QRectF(0, 0, TEXTBOX_WIDTH, 16)
# size of a box for an X (ie check box)
-C_BOX = QtCore.QRectF(0,0, 14, 14)
+C_BOX = QtCore.QRectF(0, 0, 14, 14)
# box for charting
-CHART_BOX = QtCore.QRectF(0,0, 13, 8)
+CHART_BOX = QtCore.QRectF(0, 0, 13, 8)
# box for shading in
-S_BOX = QtCore.QRectF(0,0, 8, 10)
+S_BOX = QtCore.QRectF(0, 0, 8, 10)
-##sname boxes
+# sname boxes
pcde_box = 0
for i in range(14):
x = 96 + i * (TEXTBOX_WIDTH + PADDING)
- RECTS["surname_%02d"% i] = T_BOX.translated(x,69)
- RECTS["forename_%02d"% i] = T_BOX.translated(x,95)
- RECTS["addr1_%02d"% i] = T_BOX.translated(x, 198)
- RECTS["addr2_%02d"% i] = T_BOX.translated(x, 224)
- RECTS["addr3_%02d"% i] = T_BOX.translated(x, 248)
+ RECTS["surname_%02d" % i] = T_BOX.translated(x, 69)
+ RECTS["forename_%02d" % i] = T_BOX.translated(x, 95)
+ RECTS["addr1_%02d" % i] = T_BOX.translated(x, 198)
+ RECTS["addr2_%02d" % i] = T_BOX.translated(x, 224)
+ RECTS["addr3_%02d" % i] = T_BOX.translated(x, 248)
if i < 10:
- RECTS["chi_%02d"% i] = T_BOX.translated(x, 148)
+ RECTS["chi_%02d" % i] = T_BOX.translated(x, 148)
if 1 < i < 14:
- RECTS["prev_sno_%02d"% (i-2)] = T_BOX.translated(x, 175)
- if i in (0,1,2,3,5,6,7):
- RECTS["pcde_%d"% pcde_box] = T_BOX.translated(x, 270)
+ RECTS["prev_sno_%02d" % (i - 2)] = T_BOX.translated(x, 175)
+ if i in (0, 1, 2, 3, 5, 6, 7):
+ RECTS["pcde_%d" % pcde_box] = T_BOX.translated(x, 270)
pcde_box += 1
-##dob
-for i, x in enumerate([66,84, 118,136,174,192,208,224]):
+# dob
+for i, x in enumerate([66, 84, 118, 136, 174, 192, 208, 224]):
y = 121
- RECTS["dob_%d"% i] = T_BOX.translated(x, y )
+ RECTS["dob_%d" % i] = T_BOX.translated(x, y)
-##sex
+# sex
RECTS["male"] = T_BOX.translated(291, y)
RECTS["female"] = T_BOX.translated(324, y)
-##dentists stamp box
+# dentists stamp box
RECTS["stampbox"] = QtCore.QRectF(440, 72, 272, 124)
-for i, x in enumerate([544,562, 594,612, 643,661,679,697]):
- RECTS["accd_%02d"% i] = T_BOX.translated(x, 202)
- RECTS["cmpd_%02d"% i] = T_BOX.translated(x, 232)
+for i, x in enumerate([544, 562, 594, 612, 643, 661, 679, 697]):
+ RECTS["accd_%02d" % i] = T_BOX.translated(x, 202)
+ RECTS["cmpd_%02d" % i] = T_BOX.translated(x, 232)
-for i, x in enumerate([552,570,588, 656,674,692]):
- RECTS["bpe_%02d"% i] = T_BOX.translated(x, 268)
+for i, x in enumerate([552, 570, 588, 656, 674, 692]):
+ RECTS["bpe_%02d" % i] = T_BOX.translated(x, 268)
left_x, right_x = 548, 696
-for i, y in enumerate([302,340,360,380,408,432,452]):
+for i, y in enumerate([302, 340, 360, 380, 408, 432, 452]):
field = (
"special_needs", "0111", "1011", "2772",
"advice", "models", "trauma")[i]
@@ -96,43 +98,43 @@ for i, y in enumerate([302,340,360,380,408,432,452]):
if i == 0:
pass
elif i == 4:
- RECTS["rad_01"] = C_BOX.translated(left_x-18, y)
+ RECTS["rad_01"] = C_BOX.translated(left_x - 18, y)
RECTS["rad_02"] = C_BOX.translated(left_x, y)
elif i == 6:
- RECTS["ref_01"] = C_BOX.translated(left_x-18, y)
+ RECTS["ref_01"] = C_BOX.translated(left_x - 18, y)
RECTS["ref_02"] = C_BOX.translated(left_x, y)
else:
field = (
None, "0101", "1001", "2771",
- None, "rads_available", None )[i]
+ None, "rads_available", None)[i]
RECTS[field] = C_BOX.translated(left_x, y)
-#chart
+# chart
for quadrant in range(1, 5):
- y = 356 if quadrant < 3 else 370
- if quadrant in (2,3):
+ y = 356 if quadrant < 3 else 370
+ if quadrant in (2, 3):
x_offset = 206
- t_range = range(1,9) #Left teeth are in left to right order
+ t_range = range(1, 9) # Left teeth are in left to right order
else:
x_offset = 58
- t_range = range(8,0, -1) #reverse for the right side
+ t_range = range(8, 0, -1) # reverse for the right side
for i, toothno in enumerate(t_range):
- tooth = "chart_%s%s"% (quadrant, toothno)
+ tooth = "chart_%s%s" % (quadrant, toothno)
x = i * 17.5 + x_offset
RECTS[tooth] = CHART_BOX.translated(x, y)
for quadrant in range(5, 9):
- y = 344 if quadrant < 7 else 382
- if quadrant in (6,7):
+ y = 344 if quadrant < 7 else 382
+ if quadrant in (6, 7):
x_offset = 206
- t_range = range(1,6) #Left teeth are in left to right order
+ t_range = range(1, 6) # Left teeth are in left to right order
else:
x_offset = 112
- t_range = range(5,0, -1) #reverse for the right side
+ t_range = range(5, 0, -1) # reverse for the right side
for i, toothno in enumerate(t_range):
- tooth = "chart_%s%s"% (quadrant, toothno)
+ tooth = "chart_%s%s" % (quadrant, toothno)
x = i * 17.5 + x_offset
RECTS[tooth] = CHART_BOX.translated(x, y)
@@ -141,43 +143,45 @@ RECTS["refused"] = C_BOX.translated(696, 902)
RECTS["pftr"] = C_BOX.translated(696, 930)
for row in range(9):
- y = 544 + row*25
- for i, x in enumerate([554,572,590,608,634,652]):
- RECTS["other%s_%02d"% (row, i)] = T_BOX.translated(x, y)
- RECTS["other_replacement_%02d"% row] = T_BOX.translated(696, y)
+ y = 544 + row * 25
+ for i, x in enumerate([554, 572, 590, 608, 634, 652]):
+ RECTS["other%s_%02d" % (row, i)] = T_BOX.translated(x, y)
+ RECTS["other_replacement_%02d" % row] = T_BOX.translated(696, y)
for i, x in enumerate([442, 460, 494, 512, 543, 561, 579, 597]):
- RECTS["dentist_sigdate_%02d"% i] = T_BOX.translated(x, 1014)
+ RECTS["dentist_sigdate_%02d" % i] = T_BOX.translated(x, 1014)
-for i, x in enumerate([600,618,636,654,680,698]):
- RECTS["claim_total_%02d"% i] = T_BOX.translated(x, 772)
+for i, x in enumerate([600, 618, 636, 654, 680, 698]):
+ RECTS["claim_total_%02d" % i] = T_BOX.translated(x, 772)
# tooth specific item section
for row in range(10):
- y = 446 + row*61.5
- for i, x in enumerate([22,40,58,76]):
- RECTS["item%s_code%02d"% (row+1, i)] = T_BOX.translated(x, y)
+ y = 446 + row * 61.5
+ for i, x in enumerate([22, 40, 58, 76]):
+ RECTS["item%s_code%02d" % (row + 1, i)] = T_BOX.translated(x, y)
- RECTS["item%s_void"% (row+1)] = S_BOX.translated(82, y+24)
+ RECTS["item%s_void" % (row + 1)] = S_BOX.translated(82, y + 24)
- #item chart
+ # item chart
for quadrant in range(1, 5):
- ty = y+1 if quadrant < 3 else y+23
- if quadrant in (2,3):
+ ty = y + 1 if quadrant < 3 else y + 23
+ if quadrant in (2, 3):
x_offset = 226
- t_range = range(1,9) #Left teeth are in left to right order
+ t_range = range(1, 9) # Left teeth are in left to right order
else:
x_offset = 98
- t_range = range(8,0, -1) #reverse for the right side
+ t_range = range(8, 0, -1) # reverse for the right side
for i, toothno in enumerate(t_range):
- tooth = "item%s_chart_%s%s"% (row+1, quadrant, toothno)
+ tooth = "item%s_chart_%s%s" % (row + 1, quadrant, toothno)
x = i * 15 + x_offset
RECTS[tooth] = S_BOX.translated(x, ty)
OPTION = QtGui.QTextOption(QtCore.Qt.AlignCenter)
+
class GP17iFront(PrintedForm):
+
'''
a class to set up and print a GP17 (tooth specific version)
'''
@@ -195,7 +199,7 @@ class GP17iFront(PrintedForm):
@classmethod
def is_active(self):
return "neil" in os.path.expanduser("~") or \
- QtCore.QDate.currentDate() >= QtCore.QDate(2013,7,1)
+ QtCore.QDate.currentDate() >= QtCore.QDate(2013, 7, 1)
def set_data(self, data):
self.data = data
@@ -206,7 +210,7 @@ class GP17iFront(PrintedForm):
def BACKGROUND_IMAGE(self):
if self._bg_pixmap is None:
self._bg_pixmap = QtGui.QPixmap(os.path.join(
- localsettings.resources_location, "gp17-1", "front.png"))
+ localsettings.resources_location, "gp17-1", "front.png"))
return self._bg_pixmap
def print_(self):
@@ -223,10 +227,10 @@ class GP17iFront(PrintedForm):
serifFont = QtGui.QFont("Courier", 12)
serifFont.setBold(True)
- fm=QtGui.QFontMetrics(serifFont)
+ fm = QtGui.QFontMetrics(serifFont)
serifLineHeight = fm.height()
- painter.setPen(QtGui.QPen(QtCore.Qt.black,1))
+ painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
painter.setFont(serifFont)
for func_ in (
@@ -242,22 +246,22 @@ class GP17iFront(PrintedForm):
self._fill_address,
self._fill_charting,
self._fill_bpe,
- #self._fill_misc_cbs,
+ # self._fill_misc_cbs,
self._fill_common_codes,
self._fill_tooth_specific_codes,
- #self._fill_complex_codes
+ # self._fill_complex_codes
self._fill_unhandled_codes,
- ):
+ ):
painter.save()
- #painter.translate(self.off_set)
+ # painter.translate(self.off_set)
func_(painter)
painter.restore()
def _fill_surname(self, painter):
for i in range(14):
- rect = self.rects["surname_%02d"% i]
+ rect = self.rects["surname_%02d" % i]
try:
painter.drawText(rect, self.data.pt.sname[i], OPTION)
except IndexError:
@@ -265,7 +269,7 @@ class GP17iFront(PrintedForm):
def _fill_forename(self, painter):
for i in range(14):
- rect = self.rects["forename_%02d"% i]
+ rect = self.rects["forename_%02d" % i]
try:
painter.drawText(rect, self.data.pt.fname[i], OPTION)
except IndexError:
@@ -273,7 +277,7 @@ class GP17iFront(PrintedForm):
def _fill_dob(self, painter):
for i in range(8):
- rect = self.rects["dob_%d"% i]
+ rect = self.rects["dob_%d" % i]
try:
painter.drawText(rect, self.data.dob[i], OPTION)
except IndexError:
@@ -281,16 +285,16 @@ class GP17iFront(PrintedForm):
def _fill_sex(self, painter):
sex = self.data.pt.sex
- if sex=="M":
+ if sex == "M":
painter.drawText(self.rects["male"], "M", OPTION)
- elif sex=="F":
- painter.drawText(self.rects["female"],"F", OPTION)
+ elif sex == "F":
+ painter.drawText(self.rects["female"], "F", OPTION)
else:
print "UNKNOWN SEX for GP17!"
def _fill_pid(self, painter):
for i in range(10):
- rect = self.rects["chi_%02d"% i]
+ rect = self.rects["chi_%02d" % i]
try:
painter.drawText(rect, self.data.identifier[i], OPTION)
except IndexError:
@@ -298,7 +302,7 @@ class GP17iFront(PrintedForm):
def _fill_previous_surname(self, painter):
for i in range(10):
- rect = self.rects["prev_sno_%02d"% i]
+ rect = self.rects["prev_sno_%02d" % i]
try:
painter.drawText(rect, self.data.previous_sname[i], OPTION)
except IndexError:
@@ -309,28 +313,28 @@ class GP17iFront(PrintedForm):
def _fill_address(self, painter):
for i in range(14):
- rect = self.rects["addr1_%02d"% i]
+ rect = self.rects["addr1_%02d" % i]
try:
painter.drawText(rect, self.data.addr1[i], OPTION)
except IndexError:
break
for i in range(14):
- rect = self.rects["addr2_%02d"% i]
+ rect = self.rects["addr2_%02d" % i]
try:
painter.drawText(rect, self.data.addr2[i], OPTION)
except IndexError:
break
for i in range(14):
- rect = self.rects["addr3_%02d"% i]
+ rect = self.rects["addr3_%02d" % i]
try:
painter.drawText(rect, self.data.addr3[i], OPTION)
except IndexError:
break
for i in range(7):
- rect = self.rects["pcde_%d"% i]
+ rect = self.rects["pcde_%d" % i]
try:
painter.drawText(rect, self.data.pcde[i], OPTION)
except IndexError:
@@ -338,7 +342,7 @@ class GP17iFront(PrintedForm):
def _fill_accd(self, painter):
for i in range(8):
- rect = self.rects["accd_%02d"% i]
+ rect = self.rects["accd_%02d" % i]
try:
painter.drawText(rect, self.data.accd[i], OPTION)
except IndexError:
@@ -346,7 +350,7 @@ class GP17iFront(PrintedForm):
def _fill_cmpd(self, painter):
for i in range(8):
- rect = self.rects["cmpd_%02d"% i]
+ rect = self.rects["cmpd_%02d" % i]
try:
painter.drawText(rect, self.data.cmpd[i], OPTION)
except IndexError:
@@ -357,27 +361,28 @@ class GP17iFront(PrintedForm):
return
painter.save()
painter.setBrush(QtGui.QBrush(QtCore.Qt.black))
- for quadrant in range(1,9):
- for tooth in range(1,9):
+ for quadrant in range(1, 9):
+ for tooth in range(1, 9):
if quadrant > 4 and tooth > 5:
continue
if not self.data.tooth_present(quadrant, tooth):
- tooth_id = "%s%s"% (quadrant, tooth)
- rect = self.rects["chart_%s"% tooth_id]
- painter.drawRect(rect.adjusted(0,2,0,-2))
+ tooth_id = "%s%s" % (quadrant, tooth)
+ rect = self.rects["chart_%s" % tooth_id]
+ painter.drawRect(rect.adjusted(0, 2, 0, -2))
painter.restore()
def _fill_bpe(self, painter):
for i in range(6):
- rect = self.rects["bpe_%02d"% i]
+ rect = self.rects["bpe_%02d" % i]
try:
painter.drawText(rect, self.data.bpe[i], OPTION)
except IndexError:
break
def _fill_misc_cbs(self, painter):
- for key in ["on_referral", "not_extending", "special_needs","on_referral",
- "radiographs","models","trauma"]:
+ for key in [
+ "on_referral", "not_extending", "special_needs", "on_referral",
+ "radiographs", "models", "trauma"]:
if self.data.misc_dict.get(key, False):
rect = self.rects[key]
painter.drawText(rect, "X", OPTION)
@@ -388,37 +393,36 @@ class GP17iFront(PrintedForm):
'''
for code, number in self.data.common_codes.iteritems():
if code == "0201":
- #small xrays could be multiple
- n_string = "%02d"% number
+ # small xrays could be multiple
+ n_string = "%02d" % number
try:
painter.drawText(
self.rects["rad_01"], n_string[0], OPTION)
painter.drawText(
self.rects["rad_02"], n_string[1], OPTION)
except KeyError:
- print "unable to claim code %s"% code
+ print "unable to claim code %s" % code
else:
try:
painter.drawText(self.rects[code], "X", OPTION)
except KeyError:
- print "unable to claim code %s"% code
-
+ print "unable to claim code %s" % code
def _fill_tooth_specific_codes(self, painter):
row = 1
for code, teeth in self.data.tooth_specific_codes.iteritems():
if row > 9:
- self.unhandled_ts_codes.appen(code)
+ self.unhandled_ts_codes.append(code)
continue
for i in range(4):
painter.drawText(
- self.rects["item%s_code%02d"% (row,i)], code[i], OPTION)
+ self.rects["item%s_code%02d" % (row, i)], code[i], OPTION)
painter.save()
for tooth in teeth:
painter.setBrush(QtGui.QBrush(QtCore.Qt.black))
- painter.drawRect(self.rects["item%s_chart_%s"% (row,tooth)])
+ painter.drawRect(self.rects["item%s_chart_%s" % (row, tooth)])
painter.restore()
row += 1
@@ -430,13 +434,12 @@ class GP17iFront(PrintedForm):
other_treatment()
continue
try:
- n = "%02d"% code.number
- painter.drawText(self.rects["%sa"% code.code], n[0], OPTION)
- painter.drawText(self.rects["%sb"% code.code], n[1], OPTION)
+ n = "%02d" % code.number
+ painter.drawText(self.rects["%sa" % code.code], n[0], OPTION)
+ painter.drawText(self.rects["%sb" % code.code], n[1], OPTION)
except KeyError:
other_treatment()
-
def _fill_unhandled_codes(self, painter):
for item in self.unhandled_ts_codes:
print "unhandled tooth specific code", item
@@ -444,7 +447,7 @@ class GP17iFront(PrintedForm):
print "unhandled item code", item
if __name__ == "__main__":
- os.chdir(os.path.expanduser("~")) # for print to file
+ os.chdir(os.path.expanduser("~")) # for print to file
from openmolar.qt4gui.printing.gp17.gp17_data import Gp17Data
@@ -461,5 +464,5 @@ if __name__ == "__main__":
form.controlled_print()
for key in sorted(form.rects.keys()):
- #print key, form.rects[key]
+ # print key, form.rects[key]
pass
diff --git a/src/openmolar/qt4gui/printing/letterprint.py b/src/openmolar/qt4gui/printing/letterprint.py
index 837fb1f..6171e57 100644
--- a/src/openmolar/qt4gui/printing/letterprint.py
+++ b/src/openmolar/qt4gui/printing/letterprint.py
@@ -1,19 +1,38 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui
+
class letter():
- def __init__(self,html):
- self.html=html
+
+ def __init__(self, html):
+ self.html = html
self.printer = QtGui.QPrinter()
self.printer.setPageSize(QtGui.QPrinter.A4)
- def printpage(self,askfirst=True):
+ def printpage(self, askfirst=True):
dialog = QtGui.QPrintDialog(self.printer)
if askfirst and not dialog.exec_():
return
@@ -28,6 +47,5 @@ if __name__ == "__main__":
form = letter('''<html><body>
<h1>This is a Test of referralprint.py</h1>
<p>I trust it worked?</p></body></html>''')
- form.printpage(True) #show a dialog for testing purposes
+ form.printpage(True) # show a dialog for testing purposes
app.exec_()
-
diff --git a/src/openmolar/qt4gui/printing/mh_print.py b/src/openmolar/qt4gui/printing/mh_print.py
index 9f48ba3..aa6eb4a 100644
--- a/src/openmolar/qt4gui/printing/mh_print.py
+++ b/src/openmolar/qt4gui/printing/mh_print.py
@@ -1,30 +1,31 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2012-2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
-
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from __future__ import division
import datetime
-from PyQt4 import QtCore,QtGui
+from PyQt4 import QtCore, QtGui
from openmolar.settings import localsettings
@@ -33,20 +34,23 @@ MARGIN_RIGHT = 25
MARGIN_TOP = 20
MARGIN_BOTTOM = 30
-#alter this to print rectangles
+# alter this to print rectangles
DEBUG = False
+
class MHPrint(object):
+
'''
A class to print the MH form for a patient
'''
+
def __init__(self, pt, parent):
self.pt = pt
self.parent = parent
self.printer = QtGui.QPrinter()
self.printer.setPageSize(QtGui.QPrinter.A4)
col_width = 1
-
+
def print_(self):
'''
print the MH form
@@ -55,7 +59,7 @@ class MHPrint(object):
font = painter.font()
font.setBold(bold)
painter.setFont(font)
-
+
def bold_off():
bold_on(False)
@@ -64,78 +68,81 @@ class MHPrint(object):
print a rectangle
'''
bottom_y = y + line_height
- left_point = QtCore.QPointF(MARGIN_LEFT + left*col_width, bottom_y)
+ left_point = QtCore.QPointF(
+ MARGIN_LEFT +
+ left *
+ col_width,
+ bottom_y)
right_point = QtCore.QPointF(
- MARGIN_LEFT + (left +colspan) *col_width, bottom_y)
+ MARGIN_LEFT + (left + colspan) * col_width, bottom_y)
painter.drawLine(left_point, right_point)
-
+
def print_text(text, y, left=0, colspan=12, rowspan=1,
- option=QtCore.Qt.AlignLeft):
+ option=QtCore.Qt.AlignLeft):
'''
print the text in a box
'''
rect = QtCore.QRectF(
- MARGIN_LEFT + left*col_width, y,
- colspan*col_width-5, line_height * rowspan
- )
+ MARGIN_LEFT + left * col_width, y,
+ colspan * col_width - 5, line_height * rowspan
+ )
if DEBUG:
painter.drawRect(rect)
- text_option = QtGui.QTextOption(option|QtCore.Qt.AlignVCenter)
+ text_option = QtGui.QTextOption(option | QtCore.Qt.AlignVCenter)
text_option.setWrapMode(text_option.NoWrap)
painter.drawText(rect, text, text_option)
- return line_height*rowspan # so that y can be adjusted accordingly
-
+ return line_height * rowspan # so that y can be adjusted accordingly
+
dialog = QtGui.QPrintDialog(self.printer, self.parent)
-
+
if not dialog.exec_():
return
-
+
page_width = self.printer.pageRect().width() - (
MARGIN_LEFT + MARGIN_RIGHT)
-
- #use a 12 column grid
- col_width = page_width/12
-
+
+ # use a 12 column grid
+ col_width = page_width / 12
+
painter = QtGui.QPainter(self.printer)
pen = QtGui.QPen(QtCore.Qt.black)
pen.setWidth(2)
painter.setPen(2)
-
+
font = QtGui.QFont("sans", 14)
font.setBold(True)
painter.setFont(font)
-
+
line_height = QtGui.QFontMetrics(painter.font()).height()
- padding = line_height/6
-
+ padding = line_height / 6
+
y = MARGIN_TOP
for value in localsettings.MH_HEADER:
if not value:
continue
-
- y += print_text(value, y, option=QtCore.Qt.AlignCenter)
-
+
+ y += print_text(value, y, option=QtCore.Qt.AlignCenter)
+
print_line(y)
-
- y += 2*line_height
-
+
+ y += 2 * line_height
+
painter.setFont(QtGui.QFont("sans", 9))
line_height = QtGui.QFontMetrics(painter.font()).height()
- padding = line_height/3
-
- print_text(str(self.pt.serialno), MARGIN_TOP, 11,1)
-
+ padding = line_height / 3
+
+ print_text(str(self.pt.serialno), MARGIN_TOP, 11, 1)
+
bold_on()
y += print_text(_("PLEASE CHECK/COMPLETE THESE DETAILS"), y)
y += padding
section_bottom = y
-
-
+
print_text(_("Address"), y, 0, colspan=2, option=QtCore.Qt.AlignRight)
bold_off()
-
+
for value in (
self.pt.name,
self.pt.addr1,
@@ -143,14 +150,14 @@ class MHPrint(object):
self.pt.addr3,
self.pt.town,
self.pt.county,
- self.pt.pcde):
+ self.pt.pcde):
if value in (None, ""):
continue
-
+
y += print_text(value, y, 2, colspan=5)
-
- y = section_bottom #move back up to print next rows
-
+
+ y = section_bottom # move back up to print next rows
+
for field, value in (
(_("Date of Birth"), localsettings.formatDate(self.pt.dob)),
(_("Home tel"), self.pt.tel1),
@@ -158,36 +165,36 @@ class MHPrint(object):
(_("Mobile"), self.pt.mobile),
(_("Email"), self.pt.email1),
(_("Alternate Email"), self.pt.email2),
- ):
- if (value in (None, "")
- and field in (_("Work tel"),_("Alternate Email"))):
+ ):
+ if (value in (None, "")
+ and field in (_("Work tel"), _("Alternate Email"))):
continue
-
+
bold_on()
print_text(field, y, 7, colspan=2, option=QtCore.Qt.AlignRight)
bold_off()
y += print_text(value, y, 9, colspan=3)
-
- if section_bottom > y:
- y = section_bottom
+
+ if section_bottom > y:
+ y = section_bottom
y += line_height
print_line(y)
- y += 2*line_height
+ y += 2 * line_height
bold_on()
- print_text(_("Please Circle"), y, 6, colspan=2,
- option=QtCore.Qt.AlignCenter)
+ print_text(_("Please Circle"), y, 6, colspan=2,
+ option=QtCore.Qt.AlignCenter)
y += print_text(_("Give Details"), y, 8, colspan=4)
-
+
y += print_text(_("ARE YOU CURRENTLY?"), y, 0, colspan=6)
y += padding
bold_off()
-
+
print_text(_("Taking any prescribed medicines?"), y, 0.5, 5.5)
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
-
+
for i in range(5):
print_line(y, 8, 4)
y += line_height + padding
@@ -198,158 +205,251 @@ class MHPrint(object):
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
y += print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
y += padding
-
+
if self.pt.sex == "F" and 13 < self.pt.ageYears < 55:
print_text(_("Pregnant or Breast Feeding?"), y, 0.5, 5.5)
print_line(y, 8, 4)
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
- y += print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
-
+ y += print_text(
+ _("No"),
+ y,
+ 7,
+ colspan=1,
+ option=QtCore.Qt.AlignLeft)
+
y += line_height
bold_on()
y += print_text(_("DO YOU SUFFER FROM?"), y, 0, colspan=6)
y += padding
bold_off()
-
- print_text(_("Yes"), y, 6, colspan=1, rowspan=2, option=QtCore.Qt.AlignRight)
- print_text(_("No"), y, 7, colspan=1, rowspan=2, option=QtCore.Qt.AlignLeft)
- y += print_text(_("Allergies to Any Medicines or Substances?"), y, 0.5, 5.5)
+
+ print_text(
+ _("Yes"),
+ y,
+ 6,
+ colspan=1,
+ rowspan=2,
+ option=QtCore.Qt.AlignRight)
+ print_text(
+ _("No"),
+ y,
+ 7,
+ colspan=1,
+ rowspan=2,
+ option=QtCore.Qt.AlignLeft)
+ y += print_text(
+ _("Allergies to Any Medicines or Substances?"),
+ y,
+ 0.5,
+ 5.5)
print_line(y, 8, 4)
y += print_text(_("eg. Penicillin, aspirin or latex."), y, 2, 4)
-
+
y += padding
-
- print_text(_("Bronchitis, Asthma, other Chest Conditions?"), y, 0.5, 5.5)
+
+ print_text(
+ _("Bronchitis, Asthma, other Chest Conditions?"),
+ y,
+ 0.5,
+ 5.5)
print_line(y, 8, 4)
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
y += print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
-
+
y += padding
-
- print_text(_("Yes"), y, 6, colspan=1, rowspan=2, option=QtCore.Qt.AlignRight)
- print_text(_("No"), y, 7, colspan=1, rowspan=2, option=QtCore.Qt.AlignLeft)
- y += print_text(_("Heart Problems, Angina, Blood pressure"), y, 0.5, 5.5)
+
+ print_text(
+ _("Yes"),
+ y,
+ 6,
+ colspan=1,
+ rowspan=2,
+ option=QtCore.Qt.AlignRight)
+ print_text(
+ _("No"),
+ y,
+ 7,
+ colspan=1,
+ rowspan=2,
+ option=QtCore.Qt.AlignLeft)
+ y += print_text(
+ _("Heart Problems, Angina, Blood pressure"),
+ y,
+ 0.5,
+ 5.5)
print_line(y, 8, 4)
y += print_text(_("problems, or a stroke?"), y, 2, 4)
y += padding
-
+
print_text(_("Diabetes?"), y, 0.5, 5.5)
print_line(y, 8, 4)
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
y += print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
-
+
y += padding
-
+
print_text(_("Arthritis?"), y, 0.5, 5.5)
print_line(y, 8, 4)
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
y += print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
-
+
y += padding
-
- print_text(_("Yes"), y, 6, colspan=1, rowspan=2, option=QtCore.Qt.AlignRight)
- print_text(_("No"), y, 7, colspan=1, rowspan=2, option=QtCore.Qt.AlignLeft)
- y += print_text(_("Bruising or persistant bleeding after"), y, 0.5, 5.5)
+
+ print_text(
+ _("Yes"),
+ y,
+ 6,
+ colspan=1,
+ rowspan=2,
+ option=QtCore.Qt.AlignRight)
+ print_text(
+ _("No"),
+ y,
+ 7,
+ colspan=1,
+ rowspan=2,
+ option=QtCore.Qt.AlignLeft)
+ y += print_text(
+ _("Bruising or persistant bleeding after"),
+ y,
+ 0.5,
+ 5.5)
print_line(y, 8, 4)
y += print_text(_("surgery or tooth extraction?"), y, 2, 4)
-
+
y += padding
-
- print_text(_("Yes"), y, 6, colspan=1, rowspan=2, option=QtCore.Qt.AlignRight)
- print_text(_("No"), y, 7, colspan=1, rowspan=2, option=QtCore.Qt.AlignLeft)
+
+ print_text(
+ _("Yes"),
+ y,
+ 6,
+ colspan=1,
+ rowspan=2,
+ option=QtCore.Qt.AlignRight)
+ print_text(
+ _("No"),
+ y,
+ 7,
+ colspan=1,
+ rowspan=2,
+ option=QtCore.Qt.AlignLeft)
y += print_text(_("Any Infectious Diseases"), y, 0.5, 5.5)
print_line(y, 8, 4)
y += print_text(_("(including HIV and Hepatitis)?"), y, 2, 4)
-
+
y += line_height
bold_on()
- y += print_text(_("DID YOU, AS A CHILD OR SINCE HAVE"), y, 0, colspan=6)
+ y += print_text(
+ _("DID YOU, AS A CHILD OR SINCE HAVE"),
+ y,
+ 0,
+ colspan=6)
y += padding
bold_off()
-
+
print_text(_("Bacterial Endocarditis?"), y, 0.5, 5.5)
print_line(y, 8, 4)
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
y += print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
-
+
y += padding
-
- print_text(_("Liver Disease (eg. Jaundice or Hepatitis)?"), y, 0.5, 5.5)
+
+ print_text(
+ _("Liver Disease (eg. Jaundice or Hepatitis)?"),
+ y,
+ 0.5,
+ 5.5)
print_line(y, 8, 4)
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
y += print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
-
+
y += padding
-
- print_text(_("A bad reaction to a Local or General Anaesthetic?"), y, 0.5, 5.5)
+
+ print_text(
+ _("A bad reaction to a Local or General Anaesthetic?"),
+ y,
+ 0.5,
+ 5.5)
print_line(y, 8, 4)
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
y += print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
-
+
y += padding
-
+
print_text(_("A joint replacement or other implant?"), y, 0.5, 5.5)
print_line(y, 8, 4)
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
y += print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
-
+
y += padding
-
+
print_text(_("Heart Surgery?"), y, 0.5, 5.5)
print_line(y, 8, 4)
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
y += print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
-
+
y += padding
-
+
print_text(_("Brain Surgery?"), y, 0.5, 5.5)
print_line(y, 8, 4)
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
y += print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
-
+
y += padding
-
- print_text(_("Yes"), y, 6, colspan=1, rowspan=2, option=QtCore.Qt.AlignRight)
- print_text(_("No"), y, 7, colspan=1, rowspan=2, option=QtCore.Qt.AlignLeft)
+
+ print_text(
+ _("Yes"),
+ y,
+ 6,
+ colspan=1,
+ rowspan=2,
+ option=QtCore.Qt.AlignRight)
+ print_text(
+ _("No"),
+ y,
+ 7,
+ colspan=1,
+ rowspan=2,
+ option=QtCore.Qt.AlignLeft)
y += print_text(_("Treatment that required you to be"), y, 0.5, 5.5)
print_line(y, 8, 4)
y += print_text(_("in Hospital?"), y, 2, 4)
y += padding
-
- print_text(_("A close relative with Creutzfeldt Jacob Disease?"), y, 0.5, 5.5)
+
+ print_text(
+ _("A close relative with Creutzfeldt Jacob Disease?"),
+ y,
+ 0.5,
+ 5.5)
print_line(y, 8, 4)
print_text(_("Yes"), y, 6, colspan=1, option=QtCore.Qt.AlignRight)
y += print_text(_("No"), y, 7, colspan=1, option=QtCore.Qt.AlignLeft)
-
y += line_height
print_line(y)
- y += line_height*2
+ y += line_height * 2
bold_on()
print_text(
-_("PLEASE GIVE ANY OTHER DETAILS WHICH YOU THINK MAY BE RELEVANT TO YOUR DENTIST")
- , y)
-
+ _("PLEASE GIVE ANY OTHER DETAILS WHICH YOU THINK MAY BE RELEVANT TO YOUR DENTIST"), y)
+
y = self.printer.pageRect().height() - MARGIN_BOTTOM
-
+
print_text(_("Patient's Signature"), y, 0, 3)
print_line(y, 3, 6)
-
+
date_ = localsettings.formatDate(localsettings.currentDay())
print_text(date_, y, 10, 2)
-
-
+
+
if __name__ == "__main__":
- #DEBUG = True
+ # DEBUG = True
localsettings.initiate()
- app = QtGui.QApplication([])
+ app = QtGui.QApplication([])
from openmolar.dbtools.patient_class import patient
-
+
mw = QtGui.QWidget()
pt = patient(19342)
-
+
mh_print = MHPrint(pt, mw)
mh_print.print_()
-
-
\ No newline at end of file
diff --git a/src/openmolar/qt4gui/printing/multiDayListPrint.py b/src/openmolar/qt4gui/printing/multiDayListPrint.py
index f2527f3..d0fb73f 100644
--- a/src/openmolar/qt4gui/printing/multiDayListPrint.py
+++ b/src/openmolar/qt4gui/printing/multiDayListPrint.py
@@ -1,32 +1,53 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
from __future__ import division
-from PyQt4 import QtCore,QtGui
+from PyQt4 import QtCore, QtGui
from openmolar.settings import localsettings
import datetime
+
class printDaylist():
- def __init__(self,parent=None):
+
+ def __init__(self, parent=None):
self.printer = QtGui.QPrinter()
self.printer.setPageSize(QtGui.QPrinter.A4)
self.printer.setOrientation(QtGui.QPrinter.Landscape)
- self.dates=[]
- self.sheets={} #dentist,memo,apps
+ self.dates = []
+ self.sheets = {} # dentist,memo,apps
- def addDaylist(self,date,dentist,apps):
- d=date.toString()
+ def addDaylist(self, date, dentist, apps):
+ d = date.toString()
if not d in self.dates:
self.dates.append(d)
- self.sheets[d]=([],[],[])
- self.sheets[d][0].append(localsettings.apptix_reverse[dentist]) #dentist
+ self.sheets[d] = ([], [], [])
+ self.sheets[d][0].append(
+ localsettings.apptix_reverse[dentist]) # dentist
self.sheets[d][1].append(apps[0])
self.sheets[d][2].append(apps[1:])
-
+
def print_(self):
'''
print all.
@@ -34,93 +55,116 @@ class printDaylist():
dialog = QtGui.QPrintDialog(self.printer)
if not dialog.exec_():
return
- LeftMargin,RightMargin,TopMargin,BottomMargin = 30,30,30,30
+ LeftMargin, RightMargin, TopMargin, BottomMargin = 30, 30, 30, 30
AbsoluteLeft = LeftMargin
sansFont = QtGui.QFont("Helvetica", 6)
fm = QtGui.QFontMetrics(sansFont)
- pageWidth=self.printer.pageRect().width()-LeftMargin-RightMargin
+ pageWidth = self.printer.pageRect().width() - LeftMargin - RightMargin
painter = QtGui.QPainter(self.printer)
- page=0
+ page = 0
for date in self.dates:
- LeftMargin=AbsoluteLeft
+ LeftMargin = AbsoluteLeft
painter.save()
- books=self.sheets[date]
- pageCols=len(books)
- rowCount=0
+ books = self.sheets[date]
+ pageCols = len(books)
+ rowCount = 0
for book in books[2]:
- if len(books[2])>rowCount: #book could be ()
- rowCount=len(books[2])
+ if len(books[2]) > rowCount: # book could be ()
+ rowCount = len(books[2])
rowHeight = fm.height()
- pageHeight=self.printer.pageRect().height()-TopMargin-BottomMargin
- #rowHeight=pageHeight/(rowCount+3) #+3 allows for headings
- columnWidth=(self.printer.pageRect().width()-LeftMargin-RightMargin)/pageCols
- columnNo=0
+ pageHeight = self.printer.pageRect(
+ ).height() - TopMargin - BottomMargin
+ # rowHeight=pageHeight/(rowCount+3) #+3 allows for headings
+ columnWidth = (
+ self.printer.pageRect(
+ ).width(
+ ) - LeftMargin - RightMargin) / pageCols
+ columnNo = 0
for book in books[2]:
- x=LeftMargin
- ###get col widths.
- colwidths={}
+ x = LeftMargin
+ # get col widths.
+ colwidths = {}
for app in book:
#--trial run to get widths
- printApp=("12:00","(150)",
- app.name,"88888","P",app.treat,app.note)
- col=0
+ printApp = ("12:00", "(150)",
+ app.name, "88888", "P", app.treat, app.note)
+ col = 0
for att in printApp:
- w=fm.width(str(att))
- if not colwidths.has_key(col):
- colwidths[col]=w
- elif colwidths[col]<w:
- colwidths[col]=w
- col+=1
- total=0
+ w = fm.width(str(att))
+ if col not in colwidths:
+ colwidths[col] = w
+ elif colwidths[col] < w:
+ colwidths[col] = w
+ col += 1
+ total = 0
for col in range(len(colwidths)):
- total+=colwidths[col]
+ total += colwidths[col]
for col in range(len(colwidths)):
- colwidths[col]=colwidths[col]*0.97*columnWidth/total
+ colwidths[col] = colwidths[
+ col] * 0.97 * columnWidth / total
- y=TopMargin
+ y = TopMargin
painter.setPen(QtCore.Qt.black)
painter.setFont(sansFont)
option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
option = QtGui.QTextOption(QtCore.Qt.AlignVCenter)
- rect=QtCore.QRectF(x, y,pageWidth, rowHeight)
- now=QtCore.QDateTime.currentDateTime().toString()
- painter.drawText(rect,"Daylist for %s %s"%(books[0][columnNo],books[1][columnNo]),option)
+ rect = QtCore.QRectF(x, y, pageWidth, rowHeight)
+ now = QtCore.QDateTime.currentDateTime().toString()
+ painter.drawText(
+ rect, "Daylist for %s %s" %
+ (books[0][columnNo], books[1][columnNo]), option)
y += rowHeight
- rect=QtCore.QRectF(x, y,pageWidth, rowHeight)
- painter.drawText(rect,self.dates[page],option)
- y += rowHeight*1.5
+ rect = QtCore.QRectF(x, y, pageWidth, rowHeight)
+ painter.drawText(rect, self.dates[page], option)
+ y += rowHeight * 1.5
painter.setBrush(QtGui.QColor("#eeeeee"))
- col=0
- for column in ("Start","Len","Name","No.","","Treat","memo"):
- rect=QtCore.QRectF(x, y,colwidths[col], rowHeight)
+ col = 0
+ for column in ("Start", "Len", "Name", "No.", "", "Treat", "memo"):
+ rect = QtCore.QRectF(x, y, colwidths[col], rowHeight)
painter.drawRect(rect)
- painter.drawText(rect.adjusted(2,0,-2,0),column,option)
- x+=colwidths[col]
- col+=1
- y+=rowHeight
+ painter.drawText(
+ rect.adjusted(2,
+ 0,
+ -2,
+ 0),
+ column,
+ option)
+ x += colwidths[col]
+ col += 1
+ y += rowHeight
painter.setBrush(QtCore.Qt.transparent)
for app in book:
#--print each app!
- printApp=(app.getStart(),"(%d)"%app.length(),
- app.name,app.serialno,app.cset,app.treat.strip(),app.note)
- x=LeftMargin
- col=0
+ printApp = (app.getStart(), "(%d)" % app.length(),
+ app.name, app.serialno, app.cset, app.treat.strip(), app.note)
+ x = LeftMargin
+ col = 0
for att in printApp:
- rect=QtCore.QRectF(x, y,colwidths[col], rowHeight)
+ rect = QtCore.QRectF(x, y, colwidths[col], rowHeight)
painter.drawRect(rect)
if att:
- painter.drawText(rect.adjusted(2,0,-2,0),str(att),option)
- x+=colwidths[col]
- col+=1
+ painter.drawText(
+ rect.adjusted(2,
+ 0,
+ -2,
+ 0),
+ str(att),
+ option)
+ x += colwidths[col]
+ col += 1
y += rowHeight
LeftMargin += columnWidth
- columnNo+=1
- rect=QtCore.QRectF(AbsoluteLeft, pageHeight-rowHeight,pageWidth, rowHeight)
- painter.drawText(rect,"Printed %s"%now,option)
- if page < len(self.dates)-1:
+ columnNo += 1
+ rect = QtCore.QRectF(
+ AbsoluteLeft,
+ pageHeight - rowHeight,
+ pageWidth,
+ rowHeight)
+ painter.drawText(rect, "Printed %s" % now, option)
+ if page < len(self.dates) - 1:
self.printer.newPage()
- page+=1
+ page += 1
painter.restore()
@@ -131,11 +175,10 @@ if __name__ == "__main__":
from openmolar.dbtools import appointments
import datetime
app = QtGui.QApplication(sys.argv)
- d=datetime.date.today()
- apps=appointments.printableDaylistData(d,4)
+ d = datetime.date.today()
+ apps = appointments.printableDaylistData(d, 4)
- p=printDaylist()
- for i in range(0,3):
- p.addDaylist(QtCore.QDate.currentDate(),4,apps[0],apps[1:])
+ p = printDaylist()
+ for i in range(0, 3):
+ p.addDaylist(QtCore.QDate.currentDate(), 4, apps[0], apps[1:])
p.print_()
-
diff --git a/src/openmolar/qt4gui/printing/om_printing.py b/src/openmolar/qt4gui/printing/om_printing.py
index 1223530..48dd971 100644
--- a/src/openmolar/qt4gui/printing/om_printing.py
+++ b/src/openmolar/qt4gui/printing/om_printing.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
provides the main class which is my gui
@@ -49,17 +65,18 @@ from openmolar.qt4gui.dialogs.print_record_dialog import PrintRecordDialog
LOGGER = logging.getLogger("openmolar")
+
def commitPDFtoDB(om_gui, descr, serialno=None):
'''
grabs "temp.pdf" and puts into the db.
'''
LOGGER.info("comitting pdf to db")
- if serialno == None:
+ if serialno is None:
serialno = om_gui.pt.serialno
try:
- ##todo - this try/catch is naff.
+ # todo - this try/catch is naff.
pdfDup = utilities.getPDF()
- if pdfDup == None:
+ if pdfDup is None:
om_gui.advise(_("PDF is NONE - (tell devs this happened)"))
else:
#-field is 20 chars max.. hence the [:14]
@@ -67,8 +84,9 @@ def commitPDFtoDB(om_gui, descr, serialno=None):
#--now refresh the docprinted widget (if visible)
if om_gui.ui.prevCorres_treeWidget.isVisible():
om_gui.docsPrintedInit()
- except Exception, e:
- om_gui.advise(_("Error saving PDF copy %s")% e, 2)
+ except Exception as e:
+ om_gui.advise(_("Error saving PDF copy %s") % e, 2)
+
def printDupReceipt(om_gui):
'''
@@ -77,14 +95,15 @@ def printDupReceipt(om_gui):
dupdate = localsettings.currentDay()
amount = om_gui.ui.receiptDoubleSpinBox.value()
- printReceipt(om_gui, {_("Professional Services"):amount*100},
- total=amount*100, duplicate=True, dupdate=dupdate)
+ printReceipt(om_gui, {_("Professional Services"): amount * 100},
+ total=amount * 100, duplicate=True, dupdate=dupdate)
- om_gui.pt.addHiddenNote("printed", "%s %.02f"% (
+ om_gui.pt.addHiddenNote("printed", "%s %.02f" % (
_("duplicate receipt for"),
amount))
om_gui.updateHiddenNotesLabel()
+
def printReceipt(om_gui, valDict, total="0.00"):
'''
print a receipt
@@ -95,8 +114,8 @@ def printReceipt(om_gui, valDict, total="0.00"):
myreceipt = receiptPrint.Receipt()
myreceipt.setProps(om_gui.pt.title, om_gui.pt.fname, om_gui.pt.sname,
- om_gui.pt.addr1, om_gui.pt.addr2, om_gui.pt.addr3, om_gui.pt.town,
- om_gui.pt.county, om_gui.pt.pcde)
+ om_gui.pt.addr1, om_gui.pt.addr2, om_gui.pt.addr3, om_gui.pt.town,
+ om_gui.pt.county, om_gui.pt.pcde)
myreceipt.total = total
@@ -107,6 +126,7 @@ def printReceipt(om_gui, valDict, total="0.00"):
om_gui.pt.addHiddenNote("printed", "receipt")
om_gui.updateHiddenNotesLabel()
+
def printLetter(om_gui):
'''
prints a letter to the patient
@@ -135,6 +155,7 @@ def printLetter(om_gui):
else:
referred_pt.toNotes(referred_pt.serialno, referred_pt.HIDDENNOTES)
+
def printAccountsTable(om_gui):
'''
print the table
@@ -160,25 +181,26 @@ def printAccountsTable(om_gui):
item = table.item(row, col)
if item:
if col == 1:
- html += '<td align="right">%s</td>'% item.text()
+ html += '<td align="right">%s</td>' % item.text()
elif col == 12:
money = int(float(item.text()) * 100)
money_str = localsettings.formatMoney(money)
- html += '<td align="right">%s</td>'% money_str
+ html += '<td align="right">%s</td>' % money_str
total += money
else:
- html += '<td>%s</td>'% item.text()
+ html += '<td>%s</td>' % item.text()
else:
html += '<td> </td>'
html += '</tr>\n'
html += '<tr><td colspan="11"></td><td><b>' + _('TOTAL') + '''</b></td>
- <td align="right"><b>%s</b></td></tr></table></body></html>'''% (
+ <td align="right"><b>%s</b></td></tr></table></body></html>''' % (
localsettings.formatMoney(total))
myclass = letterprint.letter(html)
myclass.printpage()
+
def printEstimate(om_gui):
if om_gui.pt.serialno == 0:
om_gui.advise(_("no patient selected"), 1)
@@ -187,7 +209,7 @@ def printEstimate(om_gui):
est = estimatePrint.estimate()
est.setProps(om_gui.pt.title, om_gui.pt.fname, om_gui.pt.sname,
- om_gui.pt.serialno)
+ om_gui.pt.serialno)
est.setEsts(estimates.sorted_estimates(om_gui.pt.estimates))
@@ -196,6 +218,7 @@ def printEstimate(om_gui):
om_gui.pt.addHiddenNote("printed", "estimate")
om_gui.updateHiddenNotesLabel()
+
def customEstimate(om_gui, html=""):
'''
prints a custom estimate to the patient
@@ -206,14 +229,13 @@ def customEstimate(om_gui, html=""):
if html == "":
html = standardletter.getHtml(om_gui.pt)
pt_total = 0
- ehtml = "<br />%s"% _(
- "Estimate for your current course of treatment.")
- ehtml += "<br />"*4
+ ehtml = "<br />%s" % _(
+ "Estimate for your current course of treatment.")
+ ehtml += "<br />" * 4
ehtml += '<table width="400">'
-
- #separate into NHS and non-NHS items.
- sorted_ests = {"N":[], "P":[]}
+ # separate into NHS and non-NHS items.
+ sorted_ests = {"N": [], "P": []}
for est in estimates.sorted_estimates(om_gui.pt.estimates):
if "N" in est.csetype:
@@ -224,9 +246,9 @@ def customEstimate(om_gui, html=""):
for type_, description in (
("N", _("NHS items")),
("P", _("Private items"))
- ):
+ ):
if sorted_ests[type_]:
- ehtml += '<tr><td colspan = "3"><b>%s</b></td></tr>'% (
+ ehtml += '<tr><td colspan = "3"><b>%s</b></td></tr>' % (
description)
for est in sorted_ests[type_]:
pt_total += est.ptfee
@@ -241,13 +263,13 @@ def customEstimate(om_gui, html=""):
item = item.replace("^", "")
ehtml += '''<tr><td>%s</td><td>%s</td>
- <td align="right">%s</td></tr>'''% (
- number, item, localsettings.formatMoney(amount))
+ <td align="right">%s</td></tr>''' % (
+ number, item, localsettings.formatMoney(amount))
ehtml += _('''<tr><td></td><td><b>TOTAL</b></td>
-<td align="right"><b>%s</b></td></tr>''')% localsettings.formatMoney(pt_total)
- ehtml += "</table>" + "<br />"*4
- html = html.replace("<br />"*(12), ehtml)
+<td align="right"><b>%s</b></td></tr>''') % localsettings.formatMoney(pt_total)
+ ehtml += "</table>" + "<br />" * 4
+ html = html.replace("<br />" * (12), ehtml)
html += _('''<p><i>Please note, this estimate may be subject
to change if clinical circumstances dictate.</i></p>''')
@@ -255,6 +277,7 @@ to change if clinical circumstances dictate.</i></p>''')
om_gui.pt.addHiddenNote("printed", "cust estimate")
om_gui.updateHiddenNotesLabel()
+
def htmlEditor(om_gui, type="", html="", version=0):
'''
raise a dialog to print an html editor
@@ -270,22 +293,29 @@ def htmlEditor(om_gui, type="", html="", version=0):
html = str(dl.textEdit.toHtml().toAscii())
- docsprinted.add(om_gui.pt.serialno, "%s (html)"% type, html, version+1)
+ docsprinted.add(
+ om_gui.pt.serialno,
+ "%s (html)" %
+ type,
+ html,
+ version +
+ 1)
return True
+
def printReferral(om_gui):
'''prints a referal letter controlled by referal.xml file'''
- ####TODO this file should really be in the sql database
+ # TODO this file should really be in the sql database
if om_gui.pt.serialno == 0:
om_gui.advise("no patient selected", 1)
return
desc = om_gui.ui.referralLettersComboBox.currentText()
- ##todo re-enable this
- #if "Ortho" in desc:
+ # todo re-enable this
+ # if "Ortho" in desc:
# orthoWizard(om_gui)
# return
html = referral.getHtml(desc, om_gui.pt)
- Dialog = QtGui.QDialog()#, QtCore.Qt.WindowMinimizeButtonHint)
+ Dialog = QtGui.QDialog() # , QtCore.Qt.WindowMinimizeButtonHint)
dl = Ui_enter_letter_text.Ui_Dialog()
dl.setupUi(Dialog)
dl.textEdit.setHtml(html)
@@ -305,6 +335,7 @@ def printReferral(om_gui):
else:
referred_pt.toNotes(referred_pt.serialno, referred_pt.HIDDENNOTES)
+
def orthoWizard(om_gui):
'''prints a referal letter controlled by referal.xml file'''
desc = om_gui.ui.referralLettersComboBox.currentText()
@@ -324,6 +355,7 @@ def orthoWizard(om_gui):
om_gui.docsPrintedInit()
om_gui.updateHiddenNotesLabel()
+
def printChart(om_gui):
if om_gui.pt.serialno == 0:
om_gui.advise("no patient selected", 1)
@@ -334,6 +366,7 @@ def printChart(om_gui):
om_gui.pt.addHiddenNote("printed", "static chart")
om_gui.updateHiddenNotesLabel()
+
def printMonth(om_gui):
temp = om_gui.ui.monthView.selectedDate
om_gui.ui.monthView.selectedDate = None
@@ -343,6 +376,7 @@ def printMonth(om_gui):
myclass.printpage()
om_gui.ui.monthView.selectedDate = temp
+
def printaccount(om_gui, tone="A"):
if om_gui.pt.serialno == 0:
om_gui.advise("no patient selected", 1)
@@ -350,30 +384,32 @@ def printaccount(om_gui, tone="A"):
doc = accountPrint.document(
om_gui.pt.title, om_gui.pt.fname, om_gui.pt.sname,
(om_gui.pt.addr1, om_gui.pt.addr2, om_gui.pt.addr3,
- om_gui.pt.town, om_gui.pt.county),
+ om_gui.pt.town, om_gui.pt.county),
om_gui.pt.pcde, om_gui.pt.fees
- )
+ )
doc.setTone(tone)
if tone == "B":
doc.setPreviousCorrespondenceDate(om_gui.pt.billdate)
- ####TODO unsure if this is correct date! - p
- ####lease print one and try it!
+ # TODO unsure if this is correct date! - p
+ # lease print one and try it!
if doc.print_():
om_gui.pt.updateBilling(tone)
- om_gui.pt.addHiddenNote("printed", "account - tone %s"%tone)
+ om_gui.pt.addHiddenNote("printed", "account - tone %s" % tone)
om_gui.addNewNote("Account Printed")
- commitPDFtoDB(om_gui, "Account tone%s"%tone)
+ commitPDFtoDB(om_gui, "Account tone%s" % tone)
om_gui.updateHiddenNotesLabel()
+
def accountButton2Clicked(om_gui):
if om_gui.ui.accountB_radioButton.isChecked():
om_gui.printaccount("B")
elif om_gui.ui.accountC_radioButton.isChecked():
- #print "harsh letter"
+ # print "harsh letter"
om_gui.printaccount("C")
else:
om_gui.printaccount()
+
def printdaylists(om_gui, args, expanded=False):
'''
prints the single book pages
@@ -389,6 +425,7 @@ def printdaylists(om_gui, args, expanded=False):
if something_to_print:
dlist.print_(expanded)
+
def printmultiDayList(om_gui, args):
'''
prints the multiday pages
@@ -398,13 +435,14 @@ def printmultiDayList(om_gui, args):
something_to_print = False
for arg in args:
data = appointments.printableDaylistData(arg[1].toPyDate(), arg[0])
- #note arg[1]=Qdate
+ # note arg[1]=Qdate
if data != []:
something_to_print = True
dlist.addDaylist(arg[1], arg[0], data)
if something_to_print:
dlist.print_()
+
def daylistPrintWizard(om_gui):
def checkAll(arg):
for cb in checkBoxes.values():
@@ -441,16 +479,17 @@ def daylistPrintWizard(om_gui):
printmultiDayList(om_gui, books)
else:
printdaylists(
- om_gui, books, dl.onePageFull_radioButton.isChecked())
+ om_gui, books, dl.onePageFull_radioButton.isChecked())
+
def printrecall(om_gui):
if om_gui.pt.serialno == 0:
om_gui.advise("no patient selected", 1)
else:
args = (
- (om_gui.pt.title, om_gui.pt.fname, om_gui.pt.sname, om_gui.pt.dnt1,
- om_gui.pt.serialno, om_gui.pt.addr1, om_gui.pt.addr2, om_gui.pt.addr3,
- om_gui.pt.town, om_gui.pt.county, om_gui.pt.pcde), )
+ (om_gui.pt.title, om_gui.pt.fname, om_gui.pt.sname, om_gui.pt.dnt1,
+ om_gui.pt.serialno, om_gui.pt.addr1, om_gui.pt.addr2, om_gui.pt.addr3,
+ om_gui.pt.town, om_gui.pt.county, om_gui.pt.pcde), )
recall_printer = recallprint.RecallPrinter(args)
recall_printer.print_()
@@ -458,6 +497,7 @@ def printrecall(om_gui):
om_gui.pt.addHiddenNote("printed", "recall - non batch")
om_gui.updateHiddenNotesLabel()
+
def printNotes(om_gui):
if om_gui.pt.serialno == 0:
om_gui.advise("no patient selected", 1)
@@ -467,21 +507,23 @@ def printNotes(om_gui):
image = QtGui.QPixmap.grabWidget(om_gui.ui.summaryChartWidget)
image.save(image_file.name)
dl = PrintRecordDialog(
- om_gui.pt, "file://%s"% image_file.name, om_gui)
+ om_gui.pt, "file://%s" % image_file.name, om_gui)
dl.exec_()
+
def print_mh_form(om_gui):
if om_gui.pt.serialno == 0:
om_gui.advise("no patient selected", 1)
return
- LOGGER.info("print MH form for %s"% om_gui.pt.serialno)
+ LOGGER.info("print MH form for %s" % om_gui.pt.serialno)
mh_printer = MHPrint(om_gui.pt, om_gui)
mh_printer.print_()
+
def print_mh_forms(serialnos, om_gui):
for serialno in serialnos:
pt = patient_class.patient(serialno)
- LOGGER.info("print MH form for %s"% pt.serialno)
+ LOGGER.info("print MH form for %s" % pt.serialno)
mh_printer = MHPrint(pt, om_gui)
mh_printer.print_()
@@ -501,15 +543,16 @@ def printSelectedAccounts(om_gui):
for col in range(13, 16):
item = om_gui.ui.accounts_tableWidget.item(row, col)
if item.checkState():
- tone = ("A", "B", "C")[col-13]
+ tone = ("A", "B", "C")[col - 13]
sno = int(om_gui.ui.accounts_tableWidget.item(row, 1).text())
- LOGGER.info("Account tone %s letter to %s"%(tone, sno))
+ LOGGER.info("Account tone %s letter to %s" % (tone, sno))
printpt = patient_class.patient(sno)
doc = accountPrint.document(printpt.title,
- printpt.fname, printpt.sname, (printpt.addr1,
- printpt.addr2, printpt.addr3, printpt.town,
- printpt.county), printpt.pcde, printpt.fees)
+ printpt.fname, printpt.sname, (
+ printpt.addr1,
+ printpt.addr2, printpt.addr3, printpt.town,
+ printpt.county), printpt.pcde, printpt.fees)
doc.setTone(tone)
@@ -531,19 +574,20 @@ def printSelectedAccounts(om_gui):
if doc.print_():
printpt.updateBilling(tone)
printpt.addHiddenNote(
- "printed", "account - tone %s"%tone)
+ "printed", "account - tone %s" % tone)
patient_write_changes.discreet_changes(printpt, (
- "billct", "billdate", "billtype"))
+ "billct", "billdate", "billtype"))
patient_write_changes.toNotes(sno,
- printpt.HIDDENNOTES)
+ printpt.HIDDENNOTES)
commitPDFtoDB(om_gui,
- "Account tone%s"%tone, printpt.serialno)
+ "Account tone%s" % tone, printpt.serialno)
no_printed += 1
- om_gui.advise("%d letters printed"% no_printed, 1)
+ om_gui.advise("%d letters printed" % no_printed, 1)
+
def historyPrint(om_gui):
html = om_gui.ui.debugBrowser.toHtml()
diff --git a/src/openmolar/qt4gui/printing/recallprint.py b/src/openmolar/qt4gui/printing/recallprint.py
index b275cf3..3bdc3a8 100644
--- a/src/openmolar/qt4gui/printing/recallprint.py
+++ b/src/openmolar/qt4gui/printing/recallprint.py
@@ -1,35 +1,54 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
-from PyQt4 import QtCore,QtGui
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+from PyQt4 import QtCore, QtGui
from openmolar.settings import localsettings
import datetime
DATE_FORMAT = "MMMM, yyyy"
+
class RecallPrinter():
+
def __init__(self, rows):
self.printer = QtGui.QPrinter()
self.printer.setPageSize(QtGui.QPrinter.A5)
self.recalls = rows
-
+
def print_(self):
dialog = QtGui.QPrintDialog(self.printer)
if not dialog.exec_():
return
- AddressMargin=80
+ AddressMargin = 80
LeftMargin = 50
TopMargin = 80
sansFont = QtGui.QFont("Helvetica", 8)
sansLineHeight = QtGui.QFontMetrics(sansFont).height()
serifFont = QtGui.QFont("Helvetica", 8)
serifLineHeight = QtGui.QFontMetrics(serifFont).height()
- sigFont=QtGui.QFont("Lucida Handwriting",10)
+ sigFont = QtGui.QFont("Lucida Handwriting", 10)
fm = QtGui.QFontMetrics(serifFont)
DateWidth = fm.width(" September 99, 2999 ")
painter = QtGui.QPainter(self.printer)
@@ -39,38 +58,55 @@ class RecallPrinter():
painter.save()
painter.setPen(QtCore.Qt.black)
painter.setFont(sansFont)
- #put dent serialno in topleft corner
- painter.drawText(LeftMargin, TopMargin, "%s %d"%(localsettings.ops[recall[3]],recall[4]))
- x,y = AddressMargin,TopMargin+50
- painter.drawText(x, y, "%s %s %s"%(recall[0].title(),recall[1].title(),recall[2].title()))
+ # put dent serialno in topleft corner
+ painter.drawText(
+ LeftMargin, TopMargin, "%s %d" %
+ (localsettings.ops[recall[3]], recall[4]))
+ x, y = AddressMargin, TopMargin + 50
+ painter.drawText(
+ x, y, "%s %s %s" %
+ (recall[0].title(), recall[1].title(), recall[2].title()))
y += sansLineHeight
for line in recall[5:10]:
if line:
- painter.drawText(x, y, str(line).title()+",")
+ painter.drawText(x, y, str(line).title() + ",")
y += serifLineHeight
if recall[10]:
- painter.drawText(x, y, str(recall[10])+".") #postcode
+ painter.drawText(x, y, str(recall[10]) + ".") # postcode
y += serifLineHeight
- x,y=LeftMargin,(pageRect.height()*0.3)
- painter.drawText(x+250, y, QtCore.QDate.currentDate().toString(DATE_FORMAT))
+ x, y = LeftMargin, (pageRect.height() * 0.3)
+ painter.drawText(
+ x + 250,
+ y,
+ QtCore.QDate.currentDate(
+ ).toString(
+ DATE_FORMAT))
y += sansLineHeight
painter.setFont(serifFont)
y += serifLineHeight
- painter.drawText(x, y, _("Dear %s %s,") %(recall[0].title(),recall[2].title()))
- y += serifLineHeight*2
- painter.drawText(x, y,
- _('We are writing to inform you that your dental examination is now due.'))
+ painter.drawText(
+ x, y, _("Dear %s %s,") %
+ (recall[0].title(), recall[2].title()))
+ y += serifLineHeight * 2
+ painter.drawText(x, y,
+ _('We are writing to inform you that your dental examination is now due.'))
y += serifLineHeight
- painter.drawText(x, y, _('Please contact the surgery to arrange an appointment. *'))
- y += serifLineHeight*1.2
- painter.drawText(x, y, _('We look forward to seeing you in the near future.'))
+ painter.drawText(
+ x,
+ y,
+ _('Please contact the surgery to arrange an appointment. *'))
+ y += serifLineHeight * 1.2
+ painter.drawText(
+ x,
+ y,
+ _('We look forward to seeing you in the near future.'))
painter.setPen(QtCore.Qt.black)
- y += serifLineHeight*2
+ y += serifLineHeight * 2
painter.drawText(x, y, _("Yours sincerely,"))
y += serifLineHeight * 1.5
painter.setFont(sigFont)
- y += serifLineHeight * 2
+ y += serifLineHeight * 2
painter.drawText(x, y, "The Academy Dental Practice")
painter.setFont(serifFont)
y = pageRect.height() - 120
@@ -82,11 +118,11 @@ class RecallPrinter():
option = QtGui.QTextOption(QtCore.Qt.AlignCenter)
option.setWrapMode(QtGui.QTextOption.WordWrap)
painter.drawText(
- QtCore.QRectF(x, y,
- pageRect.width() - (2 * AddressMargin), 31),
- "* If you already have a future appointment with us - "
- "please accept our apologies and ignore this letter.",
- option)
+ QtCore.QRectF(x, y,
+ pageRect.width() - (2 * AddressMargin), 31),
+ "* If you already have a future appointment with us - "
+ "please accept our apologies and ignore this letter.",
+ option)
page += 1
if page <= len(self.recalls):
self.printer.newPage()
@@ -97,11 +133,9 @@ if __name__ == "__main__":
localsettings.initiate()
app = QtGui.QApplication(sys.argv)
pts = (
- ('TITLE', 'FNAME', 'SNAME', 6, 1809L,
- "6 ST MARY'S ROAD", 'KIRKHILL', '', '', '', 'IV5 7NX'),
- )
-
+ ('TITLE', 'FNAME', 'SNAME', 6, 1809,
+ "6 ST MARY'S ROAD", 'KIRKHILL', '', '', '', 'IV5 7NX'),
+ )
+
recall_printer = RecallPrinter(pts)
recall_printer.print_()
-
-
diff --git a/src/openmolar/qt4gui/printing/receiptPrint.py b/src/openmolar/qt4gui/printing/receiptPrint.py
index afa104b..1a8dfbd 100644
--- a/src/openmolar/qt4gui/printing/receiptPrint.py
+++ b/src/openmolar/qt4gui/printing/receiptPrint.py
@@ -1,17 +1,35 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
from __future__ import division
-from PyQt4 import QtCore,QtGui
+from PyQt4 import QtCore, QtGui
from openmolar.settings import localsettings
import datetime
+
class Receipt(object):
def __init__(self):
@@ -20,26 +38,26 @@ class Receipt(object):
self.pdfprinter = QtGui.QPrinter()
self.pdfprinter.setPageSize(QtGui.QPrinter.A5)
self.setProps()
- self.receivedDict={}
- self.isDuplicate=False
- self.dupdate=QtCore.QDate.currentDate()
+ self.receivedDict = {}
+ self.isDuplicate = False
+ self.dupdate = QtCore.QDate.currentDate()
def setProps(self, tit="", fn="", sn="", ad1="", ad2="", ad3="",
- ad4="", ad5="", pcd="", p="", n="", s="", t=""):
-
- self.title=tit
- self.fname=fn
- self.sname=sn
- self.addr1=ad1
- self.addr2=ad2
- self.addr3=ad3
- self.town=ad4
- self.county=ad5
- self.pcde=pcd
- self.pamount=p
- self.namount=n
- self.samount=s
- self.total=t
+ ad4="", ad5="", pcd="", p="", n="", s="", t=""):
+
+ self.title = tit
+ self.fname = fn
+ self.sname = sn
+ self.addr1 = ad1
+ self.addr2 = ad2
+ self.addr3 = ad3
+ self.town = ad4
+ self.county = ad5
+ self.pcde = pcd
+ self.pamount = p
+ self.namount = n
+ self.samount = s
+ self.total = t
def print_(self):
dialog = QtGui.QPrintDialog(self.printer)
@@ -48,12 +66,12 @@ class Receipt(object):
self.pdfprinter.setOutputFormat(QtGui.QPrinter.PdfFormat)
self.pdfprinter.setOutputFileName(localsettings.TEMP_PDF)
- for printer in (self.printer,self.pdfprinter):
+ for printer in (self.printer, self.pdfprinter):
LeftMargin = 50
TopMargin = 150
serifFont = QtGui.QFont("Times", 11)
- fm=QtGui.QFontMetrics(serifFont)
+ fm = QtGui.QFontMetrics(serifFont)
serifLineHeight = fm.height()
painter = QtGui.QPainter(printer)
pageRect = printer.pageRect()
@@ -62,66 +80,73 @@ class Receipt(object):
center = QtGui.QTextOption(QtCore.Qt.AlignCenter)
alignRight = QtGui.QTextOption(QtCore.Qt.AlignRight)
if self.isDuplicate:
- painter.drawText(QtCore.QRectF(0, 100,pageRect.width()\
- ,serifLineHeight),\
- QtCore.QString("DUPLICATE RECEIPT"),
- center)
-
- x,y = LeftMargin,TopMargin+30
- painter.drawText(x, y, "%s %s %s"%(self.title.title(),self.fname.title(),self.sname.title()))
+ painter.drawText(
+ QtCore.QRectF(
+ 0,
+ 100,
+ pageRect.width(),
+ serifLineHeight),
+ QtCore.QString("DUPLICATE RECEIPT"),
+ center)
+
+ x, y = LeftMargin, TopMargin + 30
+ painter.drawText(
+ x, y, "%s %s %s" %
+ (self.title.title(), self.fname.title(), self.sname.title()))
y += serifLineHeight
- for line in (self.addr1,self.addr2,self.addr3,self.town,self.county):
- if line!="":
- painter.drawText(x, y, str(line).title()+",")
+ for line in (self.addr1, self.addr2, self.addr3, self.town, self.county):
+ if line != "":
+ painter.drawText(x, y, str(line).title() + ",")
y += serifLineHeight
- if self.pcde!="":
- painter.drawText(x, y, str(self.pcde+".")) #postcode
-
+ if self.pcde != "":
+ painter.drawText(x, y, str(self.pcde + ".")) # postcode
- x,y=LeftMargin+50,TopMargin+serifLineHeight*10
- mystr='Received on '
- w=fm.width(mystr)
+ x, y = LeftMargin + 50, TopMargin + serifLineHeight * 10
+ mystr = 'Received on '
+ w = fm.width(mystr)
painter.drawText(x, y, mystr)
if not self.isDuplicate:
- painter.drawText(x+w, y,
- QtCore.QDate.currentDate().toString(
- localsettings.QDATE_FORMAT))
+ painter.drawText(x + w, y,
+ QtCore.QDate.currentDate().toString(
+ localsettings.QDATE_FORMAT))
else:
- painter.drawText(x+w, y, self.dupdate.toString(
+ painter.drawText(x + w, y, self.dupdate.toString(
localsettings.QDATE_FORMAT))
- y += serifLineHeight*2
-
+ y += serifLineHeight * 2
painter.drawText(x, y, QtCore.QString('relating to:-'))
y += serifLineHeight
for key in self.receivedDict.keys():
- amount=self.receivedDict[key]
+ amount = self.receivedDict[key]
if float(amount) != 0:
- rect_f = QtCore.QRectF(x,y,180,serifLineHeight)
+ rect_f = QtCore.QRectF(x, y, 180, serifLineHeight)
painter.drawText(rect_f, QtCore.QString(key))
- rect_f = QtCore.QRectF(x+180, y,100,serifLineHeight)
+ rect_f = QtCore.QRectF(x + 180, y, 100, serifLineHeight)
text = QtCore.QString(localsettings.formatMoney(amount))
- painter.drawText(rect_f , text, alignRight)
+ painter.drawText(rect_f, text, alignRight)
y += serifLineHeight
-
y += serifLineHeight
- painter.drawLine(int(x),int(y),int(x)+280,int(y))#130+150=280
- y += serifLineHeight*1.5
+ painter.drawLine(
+ int(x),
+ int(y),
+ int(x) + 280,
+ int(y)) # 130+150=280
+ y += serifLineHeight * 1.5
- rect_f = QtCore.QRectF(x,y,180,serifLineHeight)
+ rect_f = QtCore.QRectF(x, y, 180, serifLineHeight)
painter.drawText(rect_f, "TOTAL")
- rect_f = QtCore.QRectF(x+180, y,100,serifLineHeight)
+ rect_f = QtCore.QRectF(x + 180, y, 100, serifLineHeight)
text = QtCore.QString(localsettings.formatMoney(self.total))
painter.drawText(rect_f, text, alignRight)
- y += serifLineHeight*4
+ y += serifLineHeight * 4
font = QtGui.QFont("Helvetica", 7)
font.setItalic(True)
@@ -137,22 +162,21 @@ if __name__ == "__main__":
app = QtGui.QApplication([])
myreceipt = Receipt()
myreceipt.title = "tit"
- myreceipt.fname ="fname"
- myreceipt.sname ="sname"
- myreceipt.addr1 ="addr1"
- myreceipt.addr2 ="addr2"
- myreceipt.addr3 ="addr3"
- myreceipt.town ="addr4"
- myreceipt.county ="addr5"
- myreceipt.pcde ="PCDE"
- myreceipt.receivedDict ={
- "Private Treatment":"10.00",
- "NHS Treatment":"20.00",
- "Cuddly Toy":"5.00",
- "Sundry Items":"30.00"
- }
+ myreceipt.fname = "fname"
+ myreceipt.sname = "sname"
+ myreceipt.addr1 = "addr1"
+ myreceipt.addr2 = "addr2"
+ myreceipt.addr3 = "addr3"
+ myreceipt.town = "addr4"
+ myreceipt.county = "addr5"
+ myreceipt.pcde = "PCDE"
+ myreceipt.receivedDict = {
+ "Private Treatment": "10.00",
+ "NHS Treatment": "20.00",
+ "Cuddly Toy": "5.00",
+ "Sundry Items": "30.00"
+ }
myreceipt.total = "65.00"
myreceipt.isDuplicate = True
- myreceipt.dupdate = QtCore.QDate(2009,3,2)
+ myreceipt.dupdate = QtCore.QDate(2009, 3, 2)
myreceipt.print_()
-
diff --git a/src/openmolar/qt4gui/pt_diary_widget.py b/src/openmolar/qt4gui/pt_diary_widget.py
index a8c3797..6246961 100644
--- a/src/openmolar/qt4gui/pt_diary_widget.py
+++ b/src/openmolar/qt4gui/pt_diary_widget.py
@@ -1,24 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
@@ -40,7 +42,6 @@ from openmolar.qt4gui.dialogs import appt_prefs_dialog
from openmolar.qt4gui.dialogs import appointment_card_dialog
-
class PtDiaryWidget(QtGui.QWidget):
_pt = None
@@ -60,11 +61,11 @@ class PtDiaryWidget(QtGui.QWidget):
self.signals()
self.setSizePolicy(
QtGui.QSizePolicy(
- QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
- )
+ QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
+ )
def sizeHint(self):
- return QtCore.QSize(800,200)
+ return QtCore.QSize(800, 200)
def set_patient(self, patient):
self._pt = patient
@@ -99,7 +100,7 @@ class PtDiaryWidget(QtGui.QWidget):
if appt.serialno != self.pt.serialno:
return
self.diary_model.setSelectedAppt(appt)
- aprix = 0 if appt == None else appt.aprix
+ aprix = 0 if appt is None else appt.aprix
self.select_apr_ix(aprix)
def refresh_ptDiary(self, serialno):
@@ -118,17 +119,17 @@ class PtDiaryWidget(QtGui.QWidget):
self.ui.pt_diary_treeView.expandAll()
index = self.diary_model.parents.get(1, None)
- ##collapse past appointments
+ # collapse past appointments
past_index = self.diary_model.createIndex(0, 0, index)
self.ui.pt_diary_treeView.collapse(past_index)
appt = self.diary_model.selectedAppt
- if appt != None:
+ if appt is not None:
self.select_apr_ix(appt.aprix)
self.adjustDiaryColWidths()
- ## now emit a signal to update the drag/drop controller
+ # now emit a signal to update the drag/drop controller
self.appointment_selected.emit(appt)
def select_apr_ix(self, apr_ix):
@@ -187,7 +188,7 @@ class PtDiaryWidget(QtGui.QWidget):
self.ui.pt_diary_treeView.clearSelection()
else:
appt = self.ui.pt_diary_treeView.model().data(index,
- QtCore.Qt.UserRole)
+ QtCore.Qt.UserRole)
self.ui.pt_diary_treeView.setCurrentIndex(index)
self.diary_model.setSelectedAppt(appt)
@@ -209,7 +210,7 @@ class PtDiaryWidget(QtGui.QWidget):
self.ui.scheduleAppt_pushButton.hide()
self.ui.findAppt_pushButton.show()
- ## pass on a signal to synchronise other widgets if necessary
+ # pass on a signal to synchronise other widgets if necessary
self.appointment_selected.emit(appt)
def oddApptLength(self):
@@ -225,7 +226,6 @@ class PtDiaryWidget(QtGui.QWidget):
mins = dl.mins_spinBox.value()
return (hours, mins)
-
def newAppt_pushButton_clicked(self):
'''
user has asked for a new appointment
@@ -233,7 +233,7 @@ class PtDiaryWidget(QtGui.QWidget):
#--check there is a patient attached to this request!
if not self.pt.serialno:
self.advise(
- "You need to select a patient before performing this action.", 1)
+ "You need to select a patient before performing this action.", 1)
return
#--a sub proc for a subsequent dialog
@@ -242,15 +242,15 @@ class PtDiaryWidget(QtGui.QWidget):
def oddLength(i):
#-- last item of the appointment length combobox is "other length"
- if i == dl.apptlength_comboBox.count()-1:
+ if i == dl.apptlength_comboBox.count() - 1:
ol = self.oddApptLength()
if ol:
QtCore.QObject.disconnect(dl.apptlength_comboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"), oddLength)
+ QtCore.SIGNAL("currentIndexChanged(int)"), oddLength)
self.addApptLength(dl, ol[0], ol[1])
QtCore.QObject.connect(dl.apptlength_comboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"), oddLength)
+ QtCore.SIGNAL("currentIndexChanged(int)"), oddLength)
#--initiate a custom dialog
Dialog = QtGui.QDialog(self)
@@ -265,7 +265,7 @@ class PtDiaryWidget(QtGui.QWidget):
s = QtCore.QString(dent)
dl.practix_comboBox.addItem(s)
#--and select the patient's dentist
- if localsettings.apptix_reverse.has_key(self.pt.dnt1):
+ if self.pt.dnt1 in localsettings.apptix_reverse:
if localsettings.apptix_reverse[self.pt.dnt1] in dents:
pos = dents.index(localsettings.apptix_reverse[self.pt.dnt1])
dl.practix_comboBox.setCurrentIndex(pos)
@@ -285,10 +285,10 @@ class PtDiaryWidget(QtGui.QWidget):
#--connect the dialogs "make now" buttons to the procs just coded
QtCore.QObject.connect(dl.apptlength_comboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"), oddLength)
+ QtCore.SIGNAL("currentIndexChanged(int)"), oddLength)
QtCore.QObject.connect(dl.scheduleNow_pushButton,
- QtCore.SIGNAL("clicked()"), makeNow)
+ QtCore.SIGNAL("clicked()"), makeNow)
inputting = True
while inputting:
@@ -307,7 +307,8 @@ class PtDiaryWidget(QtGui.QWidget):
if "hour" in lengthText:
hour_index = lengthText.index("hour")
length = 60 * int(lengthText[:hour_index])
- lengthText = lengthText[lengthText.index(" ", hour_index):]
+ lengthText = lengthText[
+ lengthText.index(" ", hour_index):]
else:
length = 0
if "minute" in lengthText:
@@ -319,11 +320,12 @@ class PtDiaryWidget(QtGui.QWidget):
#--memo
note = str(dl.lineEdit.text().toAscii())
- ##TODO - add datespec and joint appointment options
+ # TODO - add datespec and joint appointment options
#--attempt WRITE appointement to DATABASE
- apr_ix = appointments.add_pt_appt(self.pt.serialno, practix, length,
- code0, -1, code1, code2, note, "", self.pt.cset)
+ apr_ix = appointments.add_pt_appt(
+ self.pt.serialno, practix, length,
+ code0, -1, code1, code2, note, "", self.pt.cset)
if apr_ix:
self.layout_ptDiary()
self.select_apr_ix(apr_ix)
@@ -336,19 +338,20 @@ class PtDiaryWidget(QtGui.QWidget):
else:
break
-
def apptWizard_pushButton_clicked(self):
'''
this shows a dialog to providing shortcuts to common groups of
appointments - eg imps,bite,try,fit
'''
def applyApptWizard(arg):
- i=0
+ i = 0
for appt in arg:
apr_ix = appointments.add_pt_appt(self.pt.serialno,
- appt.get("clinician"), appt.get("length"), appt.get("trt1"),
- -1, appt.get("trt2"), appt.get("trt3"), appt.get("memo"),
- appt.get("datespec"), self.pt.cset)
+ appt.get("clinician"), appt.get(
+ "length"), appt.get("trt1"),
+ -1, appt.get("trt2"), appt.get(
+ "trt3"), appt.get("memo"),
+ appt.get("datespec"), self.pt.cset)
if i == 0:
i = apr_ix
@@ -359,7 +362,7 @@ class PtDiaryWidget(QtGui.QWidget):
#--check there is a patient attached to this request!
if not (self.pt and self.pt.serialno):
self.advise(
- "You need to select a patient before performing this action.", 1)
+ "You need to select a patient before performing this action.", 1)
return
if self.pt.dnt1 in (0, None):
self.advise('''Patient doesn't have a dentist set,<br />
@@ -371,11 +374,10 @@ class PtDiaryWidget(QtGui.QWidget):
dl = appt_wizard_dialog.apptWizard(Dialog, self)
Dialog.connect(Dialog, QtCore.SIGNAL("AddAppointments"),
- applyApptWizard)
+ applyApptWizard)
Dialog.exec_()
-
def scheduleAppt_pushButton_clicked(self):
'''
user about to make an appointment
@@ -398,11 +400,11 @@ class PtDiaryWidget(QtGui.QWidget):
self.advise(_("No appointment selected"))
return
- if appt.date == None:
+ if appt.date is None:
if QtGui.QMessageBox.question(self, _("Confirm"),
- _("Delete Unscheduled Appointment?"),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+ _("Delete Unscheduled Appointment?"),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
delete_appt()
elif appt.past:
@@ -410,18 +412,18 @@ class PtDiaryWidget(QtGui.QWidget):
else:
message = _("Confirm Delete appointment at")
- message += " %s %s "% (appt.atime,
- localsettings.readableDate(appt.date))
+ message += " %s %s " % (appt.atime,
+ localsettings.readableDate(appt.date))
- message += _("with") + " %s?"% appt.dent_inits
+ message += _("with") + " %s?" % appt.dent_inits
if QtGui.QMessageBox.question(self, _("Confirm"), message,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
if appointments.delete_appt_from_aslot(appt):
- ##todo - if we deleted from the appt book,
- ##we should add to notes
+ # todo - if we deleted from the appt book,
+ # we should add to notes
print "future appointment deleted - add to notes!!"
appointments.made_appt_to_proposed(appt)
@@ -430,14 +432,15 @@ class PtDiaryWidget(QtGui.QWidget):
#--keep in the patient's diary?
if QtGui.QMessageBox.question(self, _("Question"),
- _("Removed from appointment book - keep for rescheduling?"),
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.No ) == QtGui.QMessageBox.No:
- #remove from the patients diary
+ _(
+ "Removed from appointment book - keep for rescheduling?"),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
+ # remove from the patients diary
if appointments.delete_appt_from_apr(appt):
self.advise(_("Sucessfully removed appointment"))
else:
- self.advise(_("Error removing from patient diary"),2)
+ self.advise(_("Error removing from patient diary"), 2)
self.layout_ptDiary()
@@ -449,22 +452,21 @@ class PtDiaryWidget(QtGui.QWidget):
if hours == 1:
lengthText = "1 hour "
elif hours > 1:
- lengthText = "%d hours "% hours
+ lengthText = "%d hours " % hours
else:
lengthText = ""
if mins > 0:
- lengthText += "%d minutes"% mins
+ lengthText += "%d minutes" % mins
lengthText = lengthText.strip(" ")
try:
dl.apptlength_comboBox.insertItem(0, QtCore.QString(lengthText))
dl.apptlength_comboBox.setCurrentIndex(0)
return
- except Exception, e:
+ except Exception as e:
print "exception in addApptLengthFunction", e
self.advise("unable to set the length of the appointment", 1)
return
-
def modifyAppt_clicked(self):
'''
modify an appointment in the patient's diary
@@ -476,18 +478,18 @@ class PtDiaryWidget(QtGui.QWidget):
def oddLength(i):
#-- odd appt length selected (see above)
- if i == dl.apptlength_comboBox.count()-1:
+ if i == dl.apptlength_comboBox.count() - 1:
ol = self.oddApptLength()
if ol:
QtCore.QObject.disconnect(dl.apptlength_comboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"), oddLength)
+ QtCore.SIGNAL("currentIndexChanged(int)"), oddLength)
self.addApptLength(dl, ol[0], ol[1])
QtCore.QObject.connect(dl.apptlength_comboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"), oddLength)
+ QtCore.SIGNAL("currentIndexChanged(int)"), oddLength)
- if self.diary_model.selectedAppt == None:
+ if self.diary_model.selectedAppt is None:
self.advise(_("No appointment selected"), 1)
else:
appt = self.diary_model.selectedAppt
@@ -511,7 +513,7 @@ class PtDiaryWidget(QtGui.QWidget):
self.addApptLength(dl, hours, mins)
if appt.date:
for widget in (dl.apptlength_comboBox, dl.practix_comboBox,
- dl.scheduleNow_pushButton):
+ dl.scheduleNow_pushButton):
widget.setEnabled(False)
pos = dl.practix_comboBox.findText(appt.dent_inits)
@@ -529,7 +531,7 @@ class PtDiaryWidget(QtGui.QWidget):
dl.lineEdit.setText(appt.memo)
QtCore.QObject.connect(dl.apptlength_comboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"), oddLength)
+ QtCore.SIGNAL("currentIndexChanged(int)"), oddLength)
QtCore.QObject.connect(dl.scheduleNow_pushButton,
QtCore.SIGNAL("clicked()"), makeNow)
@@ -541,9 +543,9 @@ class PtDiaryWidget(QtGui.QWidget):
if "hour" in lengthText and not "hours " in lengthText:
lengthText = lengthText.replace("hour", "hours ")
if "hour" in lengthText:
- length = 60*int(lengthText[:lengthText.index("hour")])
+ length = 60 * int(lengthText[:lengthText.index("hour")])
lengthText = lengthText[
- lengthText.index(" ", lengthText.index("hour")):]
+ lengthText.index(" ", lengthText.index("hour")):]
else:
length = 0
@@ -560,7 +562,7 @@ class PtDiaryWidget(QtGui.QWidget):
cst = ord(self.pt.cset[0])
appointments.modify_pt_appt(appt.aprix, appt.serialno,
- practix, length, code0, code1, code2, note, "", cst)
+ practix, length, code0, code1, code2, note, "", cst)
self.layout_ptDiary()
if appt.date is None:
@@ -570,12 +572,11 @@ class PtDiaryWidget(QtGui.QWidget):
self.scheduleAppt_pushButton_clicked()
else:
if not appointments.modify_aslot_appt(appt.date, practix,
- appt.atime, appt.serialno, code0, code1, code2, note, cst,
- 0, 0, 0):
+ appt.atime, appt.serialno, code0, code1, code2, note, cst,
+ 0, 0, 0):
self.advise(_("Error putting into dentist's book"), 2)
self.layout_ptDiary()
-
def findApptButton_clicked(self):
'''
an appointment in the patient's diary is being searched for by the user
@@ -590,7 +591,7 @@ class PtDiaryWidget(QtGui.QWidget):
'''
dl = appointment_card_dialog.AppointmentCardDialog(self.pt, self)
dl.exec_()
- #self.updateHiddenNotesLabel()
+ # self.updateHiddenNotesLabel()
def memo_edited(self):
self.pt.set_appt_memo(unicode(self.ui.appt_memo_lineEdit.text()))
@@ -598,7 +599,7 @@ class PtDiaryWidget(QtGui.QWidget):
def show_prefs_dialog(self):
dl = appt_prefs_dialog.ApptPrefsDialog(self.pt, self)
if dl.exec_():
- if type(self.pt) == BriefPatient:
+ if isinstance(self.pt, BriefPatient):
self.pt.appt_prefs.commit_changes()
else:
self.preferences_changed.emit()
@@ -609,22 +610,22 @@ class PtDiaryWidget(QtGui.QWidget):
self.ui.pt_diary_treeView.clicked.connect(self.treeview_clicked)
QtCore.QObject.connect(self.ui.apptWizard_pushButton,
- QtCore.SIGNAL("clicked()"), self.apptWizard_pushButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.apptWizard_pushButton_clicked)
QtCore.QObject.connect(self.ui.newAppt_pushButton,
- QtCore.SIGNAL("clicked()"), self.newAppt_pushButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.newAppt_pushButton_clicked)
QtCore.QObject.connect(self.ui.scheduleAppt_pushButton,
- QtCore.SIGNAL("clicked()"), self.scheduleAppt_pushButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.scheduleAppt_pushButton_clicked)
QtCore.QObject.connect(self.ui.clearAppt_pushButton,
- QtCore.SIGNAL("clicked()"), self.clearApptButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.clearApptButton_clicked)
QtCore.QObject.connect(self.ui.modifyAppt_pushButton,
- QtCore.SIGNAL("clicked()"), self.modifyAppt_clicked)
+ QtCore.SIGNAL("clicked()"), self.modifyAppt_clicked)
QtCore.QObject.connect(self.ui.findAppt_pushButton,
- QtCore.SIGNAL("clicked()"), self.findApptButton_clicked)
+ QtCore.SIGNAL("clicked()"), self.findApptButton_clicked)
self.ui.printAppt_pushButton.clicked.connect(
self.printApptCard_clicked)
@@ -643,7 +644,6 @@ if __name__ == "__main__":
def sig_catcher2(appt):
print "find appointment", appt
-
gettext.install("openmolar")
localsettings.initiate()
@@ -659,6 +659,3 @@ if __name__ == "__main__":
dw.find_appt.connect(sig_catcher2)
app.exec_()
-
-
-
diff --git a/src/openmolar/qt4gui/resources_rc.py b/src/openmolar/qt4gui/resources_rc.py
index 28b8dc8..ff7a2fa 100644
--- a/src/openmolar/qt4gui/resources_rc.py
+++ b/src/openmolar/qt4gui/resources_rc.py
@@ -2,7 +2,7 @@
# Resource object code
#
-# Created: Fri Nov 22 14:47:54 2013
+# Created: Fri Apr 4 16:15:43 2014
# by: The Resource Compiler for PyQt (Qt v4.8.6)
#
# WARNING! All changes made in this file will be lost!
@@ -15196,6 +15196,682 @@ qt_resource_data = "\
\xb6\x57\xa7\x45\xab\xde\xfc\xcb\xa5\x62\xfe\x0b\x98\xed\xc4\xbe\
\x20\x31\x63\xee\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
\
+\x00\x00\x2a\x18\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\
+\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xde\x03\
+\x1f\x0c\x28\x15\x92\xa0\x59\xc3\x00\x00\x20\x00\x49\x44\x41\x54\
+\x78\xda\xed\xbd\x7b\xb4\xdd\x57\x75\xdf\xfb\x99\x6b\xfd\x7e\xbf\
+\xbd\xcf\x5b\x6f\xcb\x32\xb6\x65\x2c\x3b\xd8\x02\x6c\x22\x43\x0a\
+\x21\xc5\xba\x04\x88\x13\xa0\x85\x11\x29\x6d\x92\x36\x09\x01\x7b\
+\xa4\x23\x0d\x35\xcd\xa3\xb9\xb7\xbd\x3a\x4a\x5b\xd2\x92\x94\xb4\
+\xa4\x25\xd7\x6a\x08\x81\xc0\x4d\x22\x05\xc2\x48\x09\xbe\x34\x21\
+\x56\x20\x04\x46\x86\x5d\x1e\x41\xe6\x61\x83\xf1\xdb\xb2\xde\xe7\
+\xb1\xf7\xef\xf7\x5b\x6b\xcd\x79\xff\x58\xbf\x7d\x74\xec\x76\x84\
+\xba\xd8\x95\x7c\xb4\x97\xc6\x96\xce\xd9\xfb\xe8\xe8\x68\xaf\xb9\
+\xe6\xfc\xce\xef\xfc\xce\xb9\xc4\xcc\x18\xaf\x0b\x77\xb9\xf1\x5b\
+\x30\x36\x80\xf1\x1a\x1b\xc0\x85\xb7\x84\xfd\x15\x87\xc4\xdf\x8d\
+\x4c\xef\xbd\x5b\xaa\xfd\x48\xb1\x1f\x29\xf6\x1e\x12\xcf\x21\xf1\
+\x22\xe2\x44\xf0\x7b\x05\x7f\x58\x28\x10\x3c\x82\x93\xfd\xfb\x9d\
+\xec\xdf\x5b\xad\x99\x37\xc2\xcc\x2e\xc8\x07\xe0\xe7\xb9\xa3\xe0\
+\xa0\x55\x06\x95\x61\x62\x98\x90\x1f\xce\x40\xe6\xe7\x29\x76\xdc\
+\x43\x0f\xdb\x31\xfb\x9f\x8e\x30\xfd\xe3\x46\x1f\xdb\xe3\xb1\x3b\
+\xcb\xb5\xf2\x3e\xc8\x05\x0b\x02\x6f\x91\x92\xef\x45\xe5\x45\x56\
+\x70\x0c\x67\x87\xe4\x92\xc7\x23\xa6\x53\xa4\x6a\x9a\xb4\xf1\x8f\
+\xdf\x79\x9c\xbf\xbc\xb5\x31\x50\xd9\x4f\xb1\xeb\x66\xa9\xee\x9a\
+\xbf\x39\xcc\x1f\xb8\x2d\xed\x63\x3f\xd8\x3e\x5d\x13\x9e\xf0\x42\
+\x35\x80\x7b\xfe\x9d\xfc\xed\x6d\xc2\x4f\x4e\x06\xb6\xc6\x1e\x97\
+\x97\x9e\xc6\x1c\x98\xa0\xe6\x88\x52\x32\x9b\x02\x6d\x84\x6f\xf4\
+\x7a\x7c\xcd\x25\xbe\xc2\x80\xaf\x7e\xf1\x41\x3e\x77\xdd\xaf\x58\
+\x34\x68\xc6\x06\xf0\x2c\x5a\xf7\xde\x2b\xbd\xab\x76\xc0\xd7\xff\
+\x19\xfd\x4d\xeb\xf9\xd7\x93\x05\x2f\x17\xa1\xc1\x23\x1e\x48\x86\
+\x79\x4f\x02\x04\x47\xc2\x51\x90\x3f\x07\x8f\x9a\x03\xa9\x98\x68\
+\x6b\x82\x38\xbe\xa6\x3d\xfe\x7a\xe1\xf3\x7c\x60\xcb\x3b\xec\x28\
+\xf7\x4a\x75\xe3\x07\x49\x87\xb9\x91\x7f\xbc\xef\xb0\xdf\x28\x96\
+\xf6\x1c\x14\xb7\xf3\x6e\x22\xd7\x22\xb6\x87\x02\xec\xbc\x34\x98\
+\xe2\x42\x39\xf1\x57\xfd\xd9\xcd\xca\x8e\x03\x6c\x9b\xe4\x8d\x7d\
+\xe3\x7b\xa2\x31\x04\x70\x06\x08\xe6\x1d\x20\x19\x16\x21\x08\x90\
+\x30\x14\x01\x0c\xd5\x04\x7e\x99\xe5\x6a\x0a\x42\x8f\x9d\xb6\xc4\
+\xc5\x73\x2f\xe1\x47\x96\xff\x50\x8e\x4d\x7e\x83\x0f\x9f\xb8\x9e\
+\xcf\x6d\xfc\xbb\x77\xdc\x29\x47\x24\x72\xcf\xf7\x17\x2f\x01\x6c\
+\x27\x05\x87\x88\x82\x61\x63\x0f\x70\x8e\xd7\x5e\xa9\xe4\xa0\xe9\
+\xd2\xdb\xe5\x13\xea\xf0\x93\x05\x05\xa0\xce\x21\xe2\xc1\x14\x95\
+\x62\x65\x9f\xd4\x4a\x9c\x80\x9a\x80\x38\x94\x0a\x4f\xc3\x80\x88\
+\x52\x22\x6c\x60\x9a\x33\x9c\xa2\xcf\x44\x98\xa3\x2c\x14\xbf\xd8\
+\xf2\x70\xa8\xf8\xe8\xc6\xd7\xef\x38\x28\x76\x8f\xb1\x9f\xc8\x3c\
+\x98\x49\x01\xd6\x8e\x0d\xe0\x5c\xfe\x47\x3f\xb3\x77\xc2\xbe\x78\
+\xe8\x65\x83\x65\xfe\x5d\x2f\x32\x30\x30\xef\xf3\x99\x97\x1c\xfb\
+\x11\x47\x42\x72\x08\x30\x41\xf0\xf9\x73\xf1\x28\x0d\x91\x29\x7a\
+\x78\x34\x25\x6a\x0c\xac\xc4\x15\x3d\x7a\x0c\x59\xb0\x49\x2a\xf5\
+\xb4\x38\xca\x81\x27\x4d\x15\x7c\x7e\xa1\xc7\x1f\xac\xbf\xd1\xbe\
+\x68\x72\xfe\x82\xc6\x0b\xc7\x00\xc0\xd9\xfb\xe5\x77\xe2\x09\xae\
+\x8e\x91\xa6\x97\x9f\x34\xc9\x2e\xdf\x28\x70\x26\xe8\x28\xe6\x8b\
+\x74\xcf\xe7\xaf\x53\x2b\xb2\x81\x24\x10\xe7\x51\x71\x08\x1e\x35\
+\x8f\x89\x03\x03\x95\x02\xb5\xfc\xbd\x54\x0a\x1c\x03\x62\x98\xe1\
+\xf8\x09\xc7\x7b\x2e\x7e\xa5\x7d\xee\x8e\xc3\xc2\xb1\xdd\xd8\xdd\
+\x60\xfb\xc0\xb8\x8f\x9e\xbc\x8f\x76\xcf\x3e\x8a\x83\xe7\xc8\x43\
+\x5c\x30\x18\xe0\x26\xf9\xf5\x32\xfd\x01\xdf\xa3\x8e\xe3\x3c\x80\
+\xa4\x02\x15\x30\x27\xa8\x18\x58\x42\xf1\xd9\x00\x44\xbb\xd8\xef\
+\x3a\x83\x70\x28\x06\x28\x86\xc3\xb0\xee\xf3\xd4\x19\x8a\x61\x52\
+\x76\x68\x01\x10\xc3\xda\x84\x54\xb3\xa4\xb2\xe2\xb9\x5b\x17\x79\
+\xdb\xf2\x67\xe5\xd8\xc2\x69\xde\xb9\xfb\x88\x3d\x32\x8f\xc0\xb5\
+\x70\x48\x2c\x18\x08\x08\xec\x1b\x7b\x80\x67\x74\x1d\x12\xfc\x9e\
+\x8f\xc8\xc3\x6d\xc9\x31\xbe\x49\xed\x97\x58\x06\xc4\xb9\x6e\x13\
+\x1d\xc2\x2a\x0f\xb0\x12\xfb\x3b\x0f\x80\x5b\xf5\xbc\x60\xf8\xb3\
+\xcf\x75\x1e\x04\x20\xe1\xc1\x0a\x4c\x8c\x14\x4a\x9a\x58\x50\xf4\
+\x0a\x9c\xc1\x50\x0a\xaa\xb6\xe2\xbe\xf6\x0c\xbf\x36\xfb\x7d\x76\
+\x4a\xee\xc0\xbf\xf3\x46\x29\x17\x64\xbe\xd9\x77\x8e\x42\xc4\x05\
+\x15\x02\x9a\x0f\xcb\x1f\x97\x7d\x2e\x6b\x21\xf8\xcf\x73\x52\xca\
+\x2e\xfc\x8f\x5c\xbd\x3f\x6b\x00\x29\x67\x06\x96\x04\xbc\x74\xe7\
+\xbf\xc0\x8c\xce\x30\x1c\x50\x74\x61\x22\x7f\x2e\x14\x24\x5c\xf6\
+\x18\xa9\x44\xbd\xc7\xa3\x0c\x29\x71\xf4\xf1\x21\x32\x70\x9e\x26\
+\xf5\x99\x6b\xa6\xf9\xc4\xcc\xce\xdb\x3e\xc0\xc1\x5b\x94\xcd\x08\
+\x37\x5a\x3c\x17\xef\xcb\x85\x53\x0b\x38\x44\xe1\x66\xf9\x82\x41\
+\x53\x55\xf4\x8b\x4b\x99\x52\xc3\x4b\x43\x63\xe0\x92\xe4\xb4\xcf\
+\x0c\x25\xa1\x2e\x65\x17\xef\x0c\x05\x62\xe7\x21\x4c\x5c\x8e\xf1\
+\x06\xd1\x94\x08\x04\x15\xa2\x2a\x2d\x10\x92\x11\x80\xd6\x47\x02\
+\x89\x41\x67\x24\x81\x96\x61\x59\x60\xbe\xa0\xac\x60\x71\xaa\xe5\
+\x65\x7a\xf7\x2d\xff\x82\x29\x9e\x23\x80\x70\xb8\xe0\x80\x94\xdc\
+\x2e\xbd\x87\x1e\x92\x89\xb1\x07\x78\xda\x43\xc0\x21\x3f\xc1\x5b\
+\x7b\xaf\xfd\xd8\xa3\x5f\x8e\xc2\xa9\xc2\x81\x1d\xa5\x91\xe3\x0c\
+\x18\x30\x48\x7d\x2a\x2f\xa8\x01\xf2\x24\x97\x8f\x47\xc5\x3a\x0f\
+\xe0\x40\x20\x99\xcf\xa7\x5f\x3c\xa6\x82\x3a\x8f\xe2\x31\x75\xe0\
+\xb2\x27\x49\x14\xa8\x7a\xcc\x15\x28\x25\xe0\x72\x88\xa0\x20\x51\
+\x82\x2a\x4d\xda\xc4\xfa\xf2\x71\x7e\x8f\x4f\xf3\x49\xb9\xd5\x1a\
+\xb8\xc1\xdb\xbd\x77\x39\x76\xfc\xef\x21\x8e\x2e\x18\x0f\xf0\xa2\
+\x7b\xf6\x16\xaf\xb3\x47\xd2\xc2\x83\xfc\x8e\x17\x92\x7a\x26\xe5\
+\x22\x7a\x5c\x44\x3f\xf6\x99\x74\x89\x84\x92\xc4\xe8\xce\x3e\x8a\
+\x92\xa4\x7b\x1e\xf2\xe7\x28\x31\x09\x2a\x09\x15\x45\xb1\xee\x35\
+\x30\xd2\xd9\xbf\xab\x82\x76\x44\x52\x36\x86\xee\x35\xb5\xfc\xfa\
+\xb0\xa0\xa5\x22\xc9\x12\xc7\x9a\xcd\xbc\x3e\xfe\x10\x3f\x6d\x1f\
+\x97\x75\x07\xb9\x4b\xb9\x6a\x3e\x8c\x3d\xc0\xd3\xfd\x1f\x3d\x4c\
+\x71\xcf\x5b\xc4\xdf\x74\xef\x3d\x7c\xfe\x0f\xae\xfa\xca\xd4\x34\
+\x0b\x56\xd0\x27\x10\xe4\x14\x0b\x7c\x93\x53\x14\x80\x43\xe0\x09\
+\x00\x0f\x0a\x92\x19\x48\x41\x4a\x02\xbe\x40\x89\xdd\x69\xce\xb4\
+\xb1\x75\x98\x60\x84\x01\x92\x16\x18\x9e\x44\x01\xae\x40\x93\xa0\
+\xbe\x24\xa9\x60\xae\x87\x2a\x24\xd7\x43\x89\x0c\xe2\x3a\x2a\x05\
+\x2b\x66\x10\xf7\x35\x7e\x5d\xfe\x8c\xa3\xb6\xcf\x74\xec\x01\x9e\
+\xce\xf5\xb5\xbb\xe4\xaa\xb7\x5b\xfc\xa4\x5d\xe5\x17\x3f\xc3\x6f\
+\xd8\x32\x06\x14\x02\x43\xdb\xc0\x5c\xba\x82\xf5\xd6\xa7\x20\xd2\
+\x98\x07\x12\x91\x48\x42\x09\x44\xa2\x24\x82\x06\x92\x44\x62\x6a\
+\x89\xea\x31\x1c\x49\x1d\xa6\x05\xaa\x8e\x88\x23\x69\xce\x04\x12\
+\x0e\x75\x82\x92\x08\x18\xc1\x27\x02\x89\xe8\x1c\x81\x48\x50\x47\
+\x04\xa2\x4e\x52\x16\x4a\x28\x26\x30\x57\xb3\xdc\x5e\xcd\x8f\x35\
+\x3f\xcd\x77\x70\x48\xbc\x20\x22\xfb\xc5\x81\xf4\xc7\x06\xf0\x6d\
+\xae\x3b\x0f\xdc\x00\x7b\xc4\x5d\x2c\xf3\xf1\x2d\xd3\xfc\xc7\x93\
+\x5f\xa6\x27\xa7\x39\x83\xd1\x8f\x82\xc8\x26\xe6\xb8\x9c\xcd\x6c\
+\x62\x26\x0d\x18\x5a\xec\x40\x9e\x01\xc5\x13\xf9\x12\x71\x40\x24\
+\x07\x07\x63\x14\x08\xb4\xe3\x07\xf4\x09\x1f\xe7\xe4\x50\x75\x44\
+\x38\x69\xe6\x0d\xba\x3f\xf3\xf7\x00\x8d\x0d\x2d\x42\x28\x0a\x66\
+\x81\xd7\x2d\xbd\x92\xe7\x99\x80\xed\xc3\x23\xcf\x1c\x49\x74\xc1\
+\x18\xc0\xae\xbb\x46\x3c\xff\x11\x3e\x0a\xea\x0a\xd2\x63\x5f\xa6\
+\xcf\x69\xb4\x34\x1a\xad\x19\x52\xe1\xd9\xc2\x5c\xb1\x9d\x8b\x75\
+\x9a\x9e\x7a\x7c\x1a\x6d\xb0\xa2\xce\x48\x2e\xfb\x86\x44\x47\x00\
+\x75\x06\x70\x76\xe3\x47\x9b\x1f\x57\x8c\x22\x75\x04\x51\x22\xac\
+\xe0\x82\xd4\x61\x83\x95\xbf\x5b\x80\x10\x11\x37\xe4\x54\x65\x44\
+\x3f\xc1\xf7\x71\x94\x2d\xc8\x7c\xfa\xcc\x83\xd2\x1b\x1b\xc0\xb7\
+\xcd\x03\x1c\x34\xee\x32\x76\xdb\x21\x67\x9b\xf9\xe1\xa9\xef\x40\
+\x96\x8e\x93\x16\xee\xa3\xb4\xc7\x29\x0b\x28\xad\x26\xa6\x88\x32\
+\x49\xcf\x6f\x64\xc6\x4d\x50\x7a\x50\xe2\xaa\xda\x7f\xae\x15\xd0\
+\x9d\x60\x45\x31\xa7\x5d\xb9\x6f\x64\x12\xac\x40\x42\xed\x6a\x8a\
+\xc9\xc5\x95\xaf\x4f\x44\x2c\x07\x84\x55\x80\x73\xc0\x40\x7b\x54\
+\xb1\xc0\x42\x81\x4d\x34\x58\xb3\x89\x37\x9c\x3c\x31\x3f\xfd\xb2\
+\xe7\x3c\x73\xda\x83\x0b\x07\x03\xbc\x77\xb9\xb4\x1b\xee\x75\x87\
+\xb1\xc4\x16\xfe\x5e\x39\x81\x6e\xd9\x85\xdc\x7b\x14\x39\xfe\x55\
+\x42\x78\x00\xe7\x12\xe2\x3c\x55\x0c\x28\x15\x1b\x64\x3d\x17\xc7\
+\x59\xb6\x98\xa7\x04\x52\x32\x1a\x0d\x34\x28\xce\xe5\x6d\x34\x33\
+\x4c\xa1\x5d\xf1\x02\xd9\x13\x24\xac\x03\x86\x5d\x18\x88\xb9\xd0\
+\x94\x34\xd3\xc9\xa9\x18\x69\x0d\xb2\x31\xe0\x0a\xbc\xab\x19\x16\
+\x81\x54\x36\xe8\xc0\x58\xea\x29\xb3\x1b\x36\xb0\xfb\x36\xf0\x5d\
+\xe0\x19\xd7\x02\xfe\x57\x97\xdd\xff\x13\xed\xa1\x23\x4c\x3e\xfe\
+\x31\xbe\x13\xc7\x36\x8b\xf8\xd9\x4d\xd4\x9b\x2f\x41\x1f\x7b\x90\
+\x6a\xd0\xa0\xb3\x67\x70\x33\x17\xa1\xc5\x2c\x2e\xd6\x2c\x9b\xd1\
+\x2b\x27\x59\x67\x15\x1b\x58\xe0\xb8\x2f\x58\x40\x39\x93\x02\x03\
+\x4a\x7a\x40\xf0\xf9\xb4\xf7\xd4\x68\xba\x5a\x41\xf7\x0f\x76\x3e\
+\xa0\x40\x09\x39\xef\xc7\x77\xaf\x29\xa8\xa1\x2e\xad\xaa\x39\x44\
+\x12\x65\xe7\x25\x12\xa9\xf4\x4c\xd2\x72\x62\xe0\xd8\xf6\xa3\x35\
+\x9b\x99\xe4\xb1\xb1\x07\xf8\x76\xd6\xbc\xb9\x7f\x7b\x2d\xcd\xdc\
+\x09\x7e\xc0\x4a\xc4\x15\x44\x73\x94\x97\x5e\x4b\x9a\xdc\x8a\x9d\
+\xaa\xa9\x1e\x7f\x14\x79\xf4\x1b\x54\xcb\x0f\x32\x89\xd1\x2f\x0b\
+\x8c\x16\xa4\x21\xd0\x67\x7d\x4a\x5c\x92\x12\xdb\x7c\xc1\x14\xd0\
+\x06\xa5\x1e\x34\x0c\x42\xcb\xd0\xa5\x15\xf7\x9e\x3a\x27\x9f\x9f\
+\x89\x18\xd2\x61\x83\xd1\xeb\x86\xae\xc2\x03\xf9\x63\x87\x75\x59\
+\x87\xa9\xc3\xbc\x02\x0d\x8d\x4f\xf4\xab\x8a\xab\xe1\x99\x49\x0b\
+\x2f\x18\x03\x38\xfa\x05\xe9\x9d\x90\xed\xbe\xea\xb1\x27\x4c\xe2\
+\x34\xe1\x4d\x69\x6d\x96\xb9\x2b\x77\xc1\xcc\x73\x68\x4e\x27\xfa\
+\x27\x8e\x92\x1e\x78\x18\x8e\xde\x43\xb1\xf8\x08\x25\x11\xf0\x54\
+\xaa\x38\xef\x99\xf4\x70\x31\x2d\xd7\x84\x9a\xed\x4e\x99\x9d\x74\
+\xf8\xd2\x28\x57\xe1\x7b\xeb\x68\x21\xeb\x02\xc0\x0a\x0e\x58\x01\
+\x88\xa9\x03\x81\x23\x43\x18\x19\x08\x2b\x21\xc3\x5c\xcb\x80\x92\
+\xa9\x22\x71\x46\x0a\x76\x3c\x53\xef\xcb\x05\x13\x02\xb6\x7e\xf5\
+\x41\xb5\x0f\x5e\xfa\x66\xed\xb1\x58\xb4\x94\x2e\xc7\xe0\x92\x01\
+\x4b\x00\x57\x7e\x27\x45\xcf\x31\x78\xe0\x6b\x14\x71\x11\xb7\xb4\
+\x84\x2d\x9c\x42\xa7\xa7\x28\xd6\xaf\x23\x4d\x4e\xe1\x14\x50\xc5\
+\x59\x44\x7c\xc1\xe5\x4b\x0b\x5c\xa6\xc6\xe3\x65\xc1\xfd\x13\xeb\
+\xa9\x5d\xde\x6e\x17\x8d\x50\x28\xa6\x1e\xd1\x12\x6d\x1d\xb1\xef\
+\x10\x35\x44\xc1\xa2\xe0\xaa\x16\xa1\x44\x5c\x85\xd2\x92\x98\x06\
+\x4d\xa8\x53\x70\x2d\x69\xa1\xa2\x9c\x5d\xe4\xcc\xd2\x1c\x33\x73\
+\x2d\x27\x78\x86\x3a\x11\x2e\xa0\x6a\xe0\xe1\x62\xf9\x43\xbb\xbf\
+\x50\x4e\x90\x4a\x21\xe1\x28\xbb\xf4\x0c\x80\x60\x14\x65\x81\x5b\
+\x7e\x84\xc5\xcf\x7d\x92\x22\x34\x88\x18\x56\x38\xfc\xe4\x04\x3a\
+\x33\x47\xb9\x71\x96\x76\x76\x12\x70\xf4\x97\x4e\x51\x7b\x8f\x6b\
+\xc1\x0d\x12\x2e\x2c\xd3\xce\xae\xe7\xe1\xde\x66\x1e\x99\x58\xcf\
+\xc2\xf2\x90\x54\x38\x64\x6a\x92\x56\x03\x85\x2b\x19\xa2\x18\x42\
+\x54\x21\xb0\x81\xd2\x41\xd2\x92\xe4\x7a\xc4\x90\x19\x44\xa3\x47\
+\x28\x27\x48\x03\x30\xb7\x85\x50\x4e\xc2\xf2\xbd\xdc\x3d\xbb\xc3\
+\x3e\x3b\x36\x80\x6f\x63\x0d\x7f\x59\xbe\x6b\xe2\x6a\x6e\x6b\xd7\
+\xb1\xb1\x68\x39\xe5\xa4\x4b\xe9\x46\x98\x4d\xc0\x5a\x9a\x38\xc4\
+\x15\x7d\xaa\x2f\x1e\x26\x3e\x7e\x82\xd9\x34\x64\x39\x05\xb4\x37\
+\x81\x9f\xa8\x60\xfd\x0c\x32\x35\x89\x4c\xad\x47\x08\xf8\xd4\xa2\
+\x21\x90\xd4\xa0\x6e\x90\x7a\x48\x0a\x0d\xda\x9f\xe6\xa1\xa9\xcd\
+\x3c\x7a\xc5\xe5\x3c\x16\x67\x88\x2d\x54\x55\x8f\x40\x8f\x10\x0d\
+\xa9\x72\x01\x29\x68\x85\x3a\x47\xa4\xdf\x85\x85\x2a\x83\xc1\x50\
+\xe2\xc2\x04\xcd\xbd\x9f\x62\xc3\x27\x3e\xc9\x27\x6f\x7d\x97\xfd\
+\xd5\xd8\x00\xbe\x8d\x15\xfe\x40\x7e\x3f\x4e\xf3\xe2\x89\x9a\x63\
+\x61\x96\xe9\xb2\xed\xf4\x7f\x23\x03\x08\x28\x20\x24\x62\x18\x12\
+\xaa\x12\x39\xf9\x30\xe1\x4b\x5f\x64\xdd\xc9\x13\x10\x52\x86\x75\
+\xde\x61\x65\x9f\xa2\x27\xe8\xba\x19\x74\x6e\x06\x49\x25\x9e\x06\
+\x6b\x13\x34\x01\x0d\x09\x1b\x0e\x70\x6d\x82\xa5\x96\x72\x7d\x8f\
+\xc7\x64\x1d\x8f\xaf\x5b\xc7\x99\xe7\xee\xe0\xb1\x8d\xd7\x72\x72\
+\x25\xfc\x7a\x22\xb9\x92\x98\xa8\x48\x4c\x90\x98\x25\x7c\xfd\xd3\
+\x4c\x7f\xe8\xb7\x79\x81\xdc\xcb\xf4\xcf\x7f\x69\xfe\x47\x8d\x67\
+\x46\x30\xb2\x66\x0d\xe0\x86\x1b\xa4\xbc\xeb\x4e\xc3\x44\xf4\xe1\
+\x3f\xe5\xca\xad\x35\x7f\xe2\x85\x33\x78\x1c\x82\xa2\x5d\x52\x96\
+\x91\xb8\x58\x44\x25\xd3\x33\xa0\x08\x01\x30\x4a\x22\x4b\x0f\xdf\
+\xcf\xfa\xbf\x3e\x02\x47\x8f\x93\x86\x35\x43\x71\x4c\xb8\x92\xa2\
+\x67\xd4\x65\x49\x31\x51\xc2\xf4\x7a\xa4\x5f\xa2\xde\xd0\x30\x44\
+\x06\x46\x55\xd7\xa4\xa6\x26\x0e\x5a\xa4\x19\x62\x8b\x03\xfc\xd2\
+\x00\x19\xd6\x58\xeb\x58\x98\x99\xe2\xf1\xd4\xa3\xa0\x8f\xeb\x05\
+\x2c\x94\xb4\xa7\x8e\xe2\x1e\xb9\x8f\x2b\xbd\xa3\x77\xf1\x2c\xc3\
+\x97\xbe\x8e\x9f\xfc\x91\xe7\xce\xff\x37\xdb\xb7\xef\x19\x11\x8c\
+\xac\x59\x10\xf8\xba\x3b\xb1\x5f\xd8\x2b\x26\xb6\xa7\xb2\xdf\x3e\
+\x74\x93\x6e\xc9\x60\x6f\x75\xdc\xef\x10\xb7\xac\x62\xf5\xdc\x0a\
+\x6a\x07\xd3\x04\x44\xa6\xb6\x6d\x66\xe1\x92\x97\xa1\x5f\x7f\x84\
+\xe9\x2f\x7e\x95\x8d\xc7\x1e\x62\xe1\xd4\x69\x9a\x64\x94\x45\x09\
+\x45\x9f\x42\x1e\xa1\x75\x05\x65\x51\x20\xfd\x82\x66\x6a\x8a\x26\
+\x28\x16\x22\xd2\x42\xb5\x94\xb0\xd6\xd0\x56\xd1\x26\xe2\x17\x6a\
+\xd6\x1d\x7b\x9c\x0d\x69\x28\x01\x3c\x8b\x4c\xd8\x34\xb5\x39\x42\
+\xe1\x1d\xad\x24\x3f\xb1\xbd\x9f\x7e\xfc\x47\xde\x77\xf0\xaf\xd9\
+\x7f\xf7\x33\x56\x19\x5c\xb3\x1e\xe0\x96\x03\x52\xde\x76\xcb\x41\
+\x15\xdb\x63\xcd\x21\xf9\x6c\x39\xc5\x94\x64\xf0\x27\x08\x46\x5a\
+\x69\x03\xc9\xbf\x87\x8e\xbd\x4b\x98\x45\xb0\x88\x23\x51\x38\xc5\
+\xac\xc5\x5b\xc0\x05\xa3\x72\x89\x33\xf7\x1f\xa5\x77\xe4\x2b\xb4\
+\xf7\x3d\xc2\xa6\x53\x8f\x71\xf4\xf4\x02\xc1\x57\x4c\xb6\x09\x6f\
+\x82\x2b\x7a\x98\xb4\x18\x67\x71\x86\x95\x13\x58\x68\xd1\x7a\x19\
+\x6b\x13\xd5\x70\x71\x46\x05\x2d\x85\x61\xd3\x14\x5a\xcc\x24\xfc\
+\x10\xfa\x03\xe3\x91\xc2\x71\x7b\xbb\x9b\x0f\x5c\xf2\x89\xd7\x3e\
+\x76\x1b\xff\xa5\x95\x6b\x77\x3a\x3b\x72\xa4\x1d\x7b\x80\xa7\xb0\
+\xde\xfa\x72\x7a\xc2\x9e\xc1\xc2\xef\xcb\xf7\x37\xd3\xcc\x55\x46\
+\x8b\x23\xf7\x01\x3d\xd9\x0f\xd8\x2a\x7f\x90\xc0\x32\x49\x2b\x92\
+\x48\x34\x88\x24\xac\x09\xa4\xa2\xe5\x4c\x1b\x28\xe6\xa6\xa8\xbe\
+\xeb\x05\xf8\xe7\x5d\xca\xd1\x2f\x3f\x40\xef\xe1\xd3\x6c\x3a\xf2\
+\x25\x4e\x2f\x2d\x41\x53\x4b\x93\x90\xde\xa8\xc1\x48\x70\x5e\x70\
+\x9a\x68\x0d\xc4\x3b\x44\xc1\x69\x6f\x7a\xb1\xd7\xd6\xa4\x41\x62\
+\x72\xc6\xf8\xd3\x23\xe6\xff\x62\xfb\x74\xfa\xf8\x1f\x2d\xda\x31\
+\xb9\xe5\x96\xf2\x8e\x03\xdb\x6c\xb7\xbd\xb6\x3a\x25\x52\x32\x7f\
+\xb0\x1d\x7b\x80\xa7\x9e\xf7\x79\x31\x2a\xfb\x80\xfc\x4e\xbb\x81\
+\xab\xab\x62\x45\xe5\x7f\x76\xe5\x0d\x37\x14\x55\x45\x25\x82\x24\
+\x84\x04\x04\x1c\x2d\x46\xc2\x11\x90\x18\xf1\x4d\x8b\xb5\x2d\xa9\
+\x8d\xc8\x20\xe2\xeb\x06\xab\x6b\xa8\x1b\x6c\x38\x44\x1e\x7c\x14\
+\xfb\xca\x7d\xd8\x83\x0f\x43\x88\x38\x53\x31\x13\x53\x29\x29\x25\
+\xa2\x38\x0a\x12\xad\x1a\xce\x33\xe3\x6f\xb8\x6e\xf1\xde\x9f\xfd\
+\xbc\xbd\x56\xd8\x5f\x19\xfb\xce\x49\x5f\xc0\x9a\x65\x02\x77\x9b\
+\xc8\x83\x7b\x65\x43\xbb\x81\x97\x94\x9e\xea\x7f\xd8\x9c\xb7\xaa\
+\x82\x27\xda\x7d\xc5\xd9\x82\xad\x01\x62\x11\x51\x45\x62\xc4\x34\
+\x21\x21\x21\x21\x40\x08\x90\x22\xd2\x46\x68\x03\x6e\x58\x13\x7a\
+\x93\xf8\xab\xaf\x84\x97\xbe\x94\xea\xd2\x8b\x69\xd7\xcd\x99\x2f\
+\x05\xb1\xd6\x01\x88\x46\x82\x5a\x21\x42\x25\x57\x5c\xb6\x58\x96\
+\x53\xbc\xe3\x90\x88\xe7\xf0\xb9\xeb\x1a\x5a\xb3\x06\x70\x78\xaf\
+\xb9\xe7\xfc\x20\x6f\x4a\x35\xc7\x49\xd4\x2b\xae\x7f\xb4\xf7\xb9\
+\x4a\x6f\xd6\x35\x79\x48\x02\x49\x1d\x36\xc8\x4c\xbe\x58\x42\xcc\
+\x90\xa4\x90\x22\x1a\x22\x29\x46\x2c\x24\x88\x2d\xa9\x6d\x48\xa1\
+\x21\xd5\x2d\x9a\x3c\x7d\x4d\xe8\xd2\x02\xba\xf4\x38\x83\x72\x82\
+\xaa\x2c\x49\xde\xa1\x05\xbe\x31\xc3\x84\xd2\x09\x6a\x14\xad\xdb\
+\x7e\x29\x47\xde\xfa\x69\xfb\xe4\x9e\x5d\x38\x8e\xed\x77\x63\x03\
+\x78\xba\xd7\x9e\x43\x09\xe1\x87\xad\x0f\xa9\xa2\x8f\xa2\xff\xdd\
+\xf9\xd7\x55\x59\xc0\x48\xfa\x99\x56\x3c\x00\xa2\x48\x52\x24\x19\
+\x3e\x2a\x84\x84\xc4\x84\xa4\x88\x84\xd1\xe9\x8f\x48\x4a\xb8\xe5\
+\xd3\x34\x83\x41\xe6\x00\x06\x8e\x89\xc5\x65\xc2\x52\x8d\x6b\x15\
+\xd7\x92\x0a\x33\xcc\x10\x73\x95\x4e\xcc\xce\xd2\xec\xbc\x98\x3f\
+\x94\x6f\xee\xee\xb3\x0b\x38\xf5\xc8\x39\x8b\xc3\x6b\x06\x04\xca\
+\xde\xbd\x9e\x77\x1c\x2c\xef\xd9\x2e\xf6\x67\xb7\xa0\xa7\xbe\x87\
+\xbf\xcf\x0c\xc3\xb2\x64\xda\xd5\x0c\x29\x3b\x1f\x90\x56\x19\x80\
+\x80\xa4\x8e\xa0\x15\xb2\x8c\xb3\x6b\x11\x31\x8f\x11\x91\xa2\x25\
+\x85\x84\x05\x45\x14\x24\xa6\xdc\xf6\x15\x23\x16\x22\xae\x69\x49\
+\xc3\x1a\x6d\x15\xd7\x44\xdc\x70\x88\xb5\x35\x69\x58\xe3\x9a\x1a\
+\x54\x0b\xf1\x45\xf4\x1a\x27\xe3\xe6\xb9\xc1\xdc\x83\x8b\x9c\xd9\
+\xbd\x83\x85\xef\x39\x64\xef\x33\x50\x6e\xe3\x9c\xb6\x8e\xaf\x1d\
+\x0f\xb0\xf3\x90\x71\x05\xcd\x55\x7b\x89\xb7\xdc\x66\x69\xb2\xe0\
+\x8d\xd6\x63\x22\x19\xd1\x8d\x34\x7d\xf6\xc4\x30\xb0\xa2\xda\xcb\
+\xd5\x3b\x31\x3d\x5b\xc1\xb3\x84\xa4\x04\xc1\x70\x49\x91\x94\x90\
+\xd0\x62\x51\x71\x31\x21\x6d\xc0\xda\x16\x62\xf6\x06\xae\x09\x48\
+\xdd\x42\x1d\x90\x41\x0d\x21\x52\xa9\x22\xa0\x48\xc2\xfa\x0c\xfd\
+\x83\x8b\x2c\x5e\xda\x47\xb7\x5d\xc9\x07\x8c\xae\x0f\x51\x44\x18\
+\x1b\xc0\xb7\xbf\xee\xc8\xb3\x1e\xfc\x6d\x07\x71\x8f\xfc\xa6\xbc\
+\xa8\xea\xf3\x42\x29\x30\x0f\xb1\xdb\x76\xf7\x84\xb3\x1f\xbb\x00\
+\xa0\xe4\x7e\xaf\x84\x8d\x32\x00\xd3\x9c\xfa\xb9\x88\x46\x45\x83\
+\x62\x29\x92\x62\xc2\xda\x80\xc6\x88\x85\x16\x8b\x01\x6b\x03\xd6\
+\x34\x68\x13\x60\x58\x63\x4b\x03\x74\x71\x91\x14\x1b\xa2\x64\xe9\
+\x07\xc9\x60\x58\x98\xf6\x74\x56\x5e\xfc\x12\xa6\x3f\xfa\x4f\xf9\
+\xad\xfd\x92\xe3\xbe\x99\xd9\xb9\x34\x82\x35\x63\x00\x1b\xde\x40\
+\x4f\x0c\xfd\x0c\xf8\x8d\x25\x7b\x29\x59\x6e\x1b\xac\x4c\x88\x42\
+\xfb\x44\xc7\x0f\x62\x67\xd9\x00\xc9\x14\x90\x58\x46\x05\x82\x62\
+\x29\xa3\x7c\x97\x12\x2e\xc4\x2e\xf6\x77\x8f\x46\x71\x31\x22\x75\
+\x44\xea\x36\x7b\x80\x3a\x20\x6d\x2e\x06\xd9\xb0\x41\x62\x8b\x89\
+\xc3\x89\x20\x0e\x49\x13\x4a\x35\xb3\x7e\x21\x6c\x5d\xc7\xfb\x0f\
+\xcc\x99\xdb\x67\xfb\xf4\x5c\x9f\xfe\x35\x65\x00\xff\xea\x3a\xea\
+\x79\xa4\xf8\xfe\xb7\x21\xd5\x2c\xaf\x35\xc1\x57\x05\x11\xc1\x9c\
+\x76\x2d\x1f\x23\xa1\x46\x5c\xf9\x48\x0c\xbc\x09\xa5\xe5\x3e\x6d\
+\x47\x02\x09\xd9\x9d\x04\xc1\xa2\x61\x96\xd0\x08\x2e\x18\x92\x22\
+\x31\x35\xc4\xd6\xe1\x92\x62\x21\xa0\xc3\x16\x6d\x07\x58\x68\xa1\
+\x8e\x94\xb1\x75\x66\x20\x29\x8a\x9a\x61\x60\x6e\x49\x7b\xf1\x45\
+\x57\x30\x73\xf5\x47\x76\xfc\xf2\x8e\xdb\x3b\x2e\xaa\x23\x61\xec\
+\x1c\x92\x31\x6b\xc6\x00\xde\xfe\x31\x8a\x13\x20\x6f\xbc\x9a\x1f\
+\xac\x27\x29\x46\x1b\xbc\x2a\xee\xdb\x93\xd8\x3f\x41\x73\xfa\xd7\
+\x61\x01\x6f\x91\x0c\xd5\xc1\x45\x85\xa4\xb8\x10\x21\x8e\xd0\x7f\
+\x80\x36\xe1\x42\xc2\x85\x16\x42\x40\xda\x9c\x0d\x48\x13\x60\xd0\
+\x40\x8a\x60\xa8\x5b\x55\x76\x10\x40\xd7\xd3\xc6\xad\x2f\xe0\xf0\
+\x55\x76\x4f\x78\xfb\xc9\xf3\x67\x64\xd0\x9a\x31\x80\xab\x26\x4c\
+\x36\x8a\x05\xb7\x89\x9b\x7d\xc3\xb2\xc8\xaa\xb4\x4f\x3a\x70\x37\
+\x02\x7e\xb6\xd2\xed\x27\x28\x66\x0a\x12\x49\x62\x5d\x96\xa0\x98\
+\x26\x34\xa5\x5c\xe7\x4f\x0a\x31\xa2\x6d\xca\x71\xbf\x49\x10\x02\
+\xd6\x46\xac\x69\xb0\xb6\x86\xba\x45\x07\x35\x16\x03\xea\x04\x8c\
+\x6e\xc6\x10\x88\x42\x71\xd9\x0b\x6d\xdd\xce\xbb\xf8\xbf\xff\xd1\
+\xdd\x32\xf9\x9c\x6b\x57\xe4\xa1\xe7\x7c\xad\x99\x34\xf0\xce\xdf\
+\x95\xb4\xfd\xed\xbc\x78\x79\x8e\x8b\xa6\x86\xd4\x4f\x20\x85\xc1\
+\x2c\xe7\xf5\x9a\x09\x99\x0e\xe8\x19\xd6\xfd\x09\x09\xd7\x79\x00\
+\x97\x14\xa2\xe6\x3f\x43\xca\x1f\xc7\x88\xc6\x51\xde\x9f\x91\xbf\
+\x85\x80\x84\x8c\x11\xa8\x13\x3e\x04\x5c\x0c\x04\x5f\x51\x58\x20\
+\x61\x39\xc6\x3b\xaa\xf0\xc2\xcb\x9b\xc3\xcf\xff\x23\x7b\xf0\xba\
+\x5b\xa4\x7c\xd9\xb6\xf9\x64\x63\x0f\xf0\xd4\xd6\xbd\xb7\x4b\x6f\
+\x3f\xe2\x04\xbc\x88\x14\xc2\x2d\xe5\xdd\x7b\xa5\x42\xf6\x7a\x79\
+\xe8\xd7\x26\x6e\xb8\xed\x66\xfc\xe5\xfc\xe8\xf4\x69\xea\xa6\xbf\
+\x4a\x41\x97\x69\x9e\xd1\x4e\x88\x08\x62\x86\x93\xdc\xdf\x2f\x39\
+\xb9\x07\x2b\x29\x70\x78\x49\x24\x8d\x58\x8c\x58\x4c\x98\x05\x34\
+\x45\x74\xf4\x5c\x50\xac\x0d\xa4\x26\x60\x75\xc0\x35\x0d\xda\x44\
+\x64\xb0\x44\xac\x6b\x92\xe1\x9c\x46\xac\x6f\x95\x4b\x13\x56\xf6\
+\x7b\xd6\xbb\xe6\xca\x66\x42\x26\xb8\x4d\x60\xe2\xe6\xe7\xe3\xf6\
+\x5c\x3b\x2f\xe3\x10\xf0\x54\x5d\xfc\x4d\xb7\xe9\xbe\xbd\x88\xed\
+\x15\x6c\x1e\x9d\x97\xdb\x6c\xe7\x41\xf3\x72\x64\xa7\xb7\x4b\x0f\
+\x61\xdf\x79\x60\xdd\xd4\x7a\x5e\xaf\x33\xf8\x7e\x5c\xe5\xfe\x57\
+\xe7\xfe\xa3\x74\x2f\xa7\x7e\xbe\xab\xff\x8b\x81\x4b\x11\x2c\x40\
+\x50\x5c\x54\x24\xa4\x9c\x05\x44\xcb\xfc\x7f\xd3\xb1\x7f\x31\x9f\
+\x7a\x1f\x13\xae\x89\x39\xef\xaf\x1b\x08\x91\x52\xb3\xc8\x44\xcc\
+\xb0\x61\xd9\xba\x99\x61\x91\x96\x9b\x62\xf9\xb2\xcb\xb9\xff\x8d\
+\xbf\x6f\x9f\xe6\x2e\x22\xeb\x28\x0e\xed\x31\x19\x87\x80\xa7\xb8\
+\xee\xfb\xe6\x2d\x5e\x0e\x11\x31\xf3\x40\x65\xaf\x90\xb0\x0f\x1b\
+\xf2\x97\xf3\xcf\x39\xf6\xff\xf0\x9a\x62\x2b\x6f\x58\x7f\x9a\x87\
+\xc3\x3a\xfa\x4e\xa8\xba\xaa\xff\x59\x3f\x10\x9f\x20\xd6\x46\x8c\
+\x15\xe8\x2d\x0a\x2e\x6b\xf2\xc5\x12\x1a\x14\xa7\x19\x04\x6a\x4a\
+\xd0\x11\x41\xda\x19\x80\xb5\xf9\x41\x5b\xa3\x6d\x8d\x2d\x2f\xa1\
+\xa1\x26\xe5\x49\x41\x6a\x96\x99\x45\x35\xbc\xdb\xbc\xa9\xf1\xcf\
+\xbf\x96\xdf\x90\x03\x4c\xda\x7a\x69\x38\x4d\xe4\x2e\x84\x5d\x63\
+\x0f\xf0\x94\xd6\xf6\x2f\x63\x98\x79\x43\xe4\xd1\x77\xc8\xdf\x1a\
+\x3c\xc8\xbf\xa8\xff\xb3\x1c\x26\xf1\xe9\xcd\x91\x9f\x9b\x19\x72\
+\x79\x9c\x65\xb6\xac\x98\x0b\x9e\xb0\xd2\x99\x4b\x46\xf6\x70\x16\
+\xe0\xa1\x60\xdd\xe9\x47\x71\x66\x78\x4d\x5d\xd1\x27\xc7\x7e\xd1\
+\x11\xfb\x97\x33\x00\x17\x62\xae\x05\xb4\x8a\x0f\x11\xe9\x18\x40\
+\xe9\xca\xc1\xa4\x98\x8b\xff\xd2\x99\x97\x6b\x45\x4f\xd2\xda\xcb\
+\xaf\x67\xf1\xbb\x7e\xdd\x3e\x74\xc7\xa3\xd2\xde\x7d\x37\x5e\xfe\
+\xb1\x45\xbb\xeb\xbc\x71\x00\xe7\x8f\x07\xb8\xeb\x2e\x29\x6f\xd8\
+\x75\x50\xec\xb7\xf7\xba\xf9\x6f\xc2\x7e\xa1\xbd\x79\x1e\x7f\x60\
+\xde\xd2\x5f\x7c\xaf\x6c\x7d\xe1\x43\x7c\xdf\xf0\xb7\xe4\x35\xc9\
+\x71\xc3\xd6\xad\x28\x4b\x34\x28\x62\x25\x03\x99\xc3\x7c\xd9\xa1\
+\xbd\x40\x5d\x42\xd5\x99\xb6\xa2\x88\x80\xaa\x03\xd7\x95\x7c\xbb\
+\x9c\xdf\x8f\x0a\x3f\x92\x08\x4e\xf1\xd1\xb2\x2e\x20\x65\xf5\x8f\
+\x0b\x19\x04\x6a\x1b\x49\x6d\xc8\x18\xa0\x8d\x58\x54\x64\xb9\x26\
+\xd4\x0d\x3e\x28\x3e\xb4\x5d\xfa\x98\x3b\x81\x45\xc4\x5c\x61\xa5\
+\x6d\xdd\x12\xd2\xe6\x39\x0e\x64\xdc\x91\x87\x40\x19\xc0\xcd\x96\
+\xc6\x06\xf0\xa4\x75\xc3\xcf\xce\x9b\x1d\xde\x2b\x62\xef\xb2\xbf\
+\x78\xde\xcf\x54\x3f\xf5\x66\x5e\x5e\xbc\x87\x57\xfe\x7b\x91\x9b\
+\x26\xbe\xc0\x14\x30\xa0\xc5\x63\x0c\x83\x43\xcb\x69\x84\x84\x8a\
+\x47\x99\x20\x4f\x7c\x76\x98\xf8\x4e\xf0\x95\xb9\x7d\x3a\xa4\x8f\
+\x4b\x19\xf1\x8f\x54\x3f\x5d\xd3\xb6\xb3\x5c\x06\x96\x94\x32\xaf\
+\x1f\x13\xa2\x11\x17\xbb\x13\x1f\xe3\x59\x2e\x60\x14\x02\x9a\x06\
+\x62\x40\x9a\x16\x69\x6a\x4c\x0d\x6f\x74\x83\xa6\xbb\x1e\xae\x01\
+\xc2\xab\xae\x20\xde\xbe\x8d\x0f\xf2\xde\x2b\x7a\x70\x5f\x7d\x3e\
+\x7a\xd6\xf3\x07\x03\xfc\xea\x7f\x11\xd9\x65\xce\x6e\x95\xef\x3b\
+\xf6\x13\xfc\x72\x55\xe2\x67\x07\x3c\x4e\x8f\x1e\xca\x52\x3d\xc7\
+\x06\x97\x18\x56\x90\x0a\x4f\xa1\x0e\x73\x8e\x64\x1e\xa4\x58\x61\
+\xfb\x47\xdd\xfc\xb6\x82\x01\xce\x0a\xbe\x4c\xec\x2c\x06\xe8\x4e\
+\x3f\xa2\x1d\x1f\x60\x24\x33\x9c\xe6\x5a\x80\xc6\x88\xa5\x88\x6b\
+\x23\x16\x5b\x24\x75\x75\x80\xba\xc1\x9a\x9a\x34\x6c\xa1\x1e\xa2\
+\x75\x8d\xa6\x74\x16\x68\x4a\xbe\x83\x43\x27\xa7\x5a\xbd\xf2\x32\
+\x0e\xbd\xe9\x5d\x96\xec\x2e\x91\xf3\x35\xb4\x9e\x73\x03\x18\xf1\
+\xe1\x7f\xf8\xe3\x4c\xdd\x74\x8d\xbc\xa3\xbd\x8a\xef\x5d\x6f\x2c\
+\x14\x50\xe8\x04\x9b\x23\x58\x9a\xa2\x3f\xb1\xc0\xf1\x30\x49\x4f\
+\x0b\x9c\x8b\xb4\xf4\x73\x81\x57\x84\xd1\x98\xc7\xb3\xdc\x9f\xae\
+\x94\x58\x33\xc9\xda\x89\x3d\xc9\xba\x7f\x53\x45\x9c\x66\x0f\x61\
+\x09\xa7\x19\xf4\x59\x0a\x10\x63\xce\xff\x53\xc2\x62\xea\x54\x3f\
+\x9a\xf9\xfe\x14\x91\xd0\x92\xda\x16\x62\xc0\x35\x5d\x41\x08\x01\
+\x31\xa1\xc3\x95\x26\x88\x7c\xf7\x55\x36\xfb\x7b\x3f\xc6\xbb\x4d\
+\xf6\x9a\xdc\x79\xa7\xd8\xd8\x00\x9e\xb8\xf6\xca\x21\x7f\x8c\x77\
+\x0b\x77\xcc\xf3\x95\xdb\xe7\x27\xbe\xe3\x2a\x3e\x1e\x23\xbd\xa2\
+\x64\x40\xc2\xe3\x30\x27\x84\xca\xe5\xd3\x6c\xb3\x54\xa5\x43\xcc\
+\xa1\x56\x51\xae\x30\x7d\x82\xd2\x90\xe2\x34\x65\xd1\x8d\x77\x37\
+\x4f\x21\x92\x5b\x30\x8d\xee\xe4\xe7\xcd\x77\x00\x2e\x8f\x80\x72\
+\xa2\xf9\x35\x4d\x68\x52\x88\x06\xc1\xb0\x26\x97\x7c\x5d\xc8\x9b\
+\x9f\x42\xc0\x35\x11\x1b\x26\xa4\x31\x24\x28\x6e\xa9\x46\xeb\x21\
+\x24\x13\x01\x33\xed\x5b\x59\xd5\xbd\xd4\x16\x8d\x9f\xf2\x96\xb6\
+\x6e\xe7\x23\x3f\xfd\x03\x76\xfa\x37\x10\x37\x7f\xc3\xa1\xc4\x79\
+\xaa\xbd\x3c\x67\x06\xb0\xc7\xf6\x56\x7b\xc4\xa2\xdc\x28\xfe\x92\
+\x7b\xf9\x39\x2d\x98\xf6\x13\x38\x55\x4a\x81\x20\x71\x65\xfa\x96\
+\xe0\x40\xba\x51\xae\x92\x27\x74\xa8\x59\x37\xb2\x15\x30\x87\xf8\
+\x51\x4f\x6e\xf6\x0a\x89\x84\xb3\x4e\xf4\x69\x9d\xc6\x4f\xce\x0e\
+\x74\xc3\x14\x93\x80\x69\x17\xdf\x53\xe8\x10\xbf\xae\x54\xfd\x2c\
+\x28\x2e\x06\x74\x54\xff\x8f\x01\xe9\x68\x5f\x69\x86\x58\x32\x0a\
+\xeb\xe8\xbe\xaa\x2e\x62\xec\x37\x55\xbf\x9e\x69\xbe\xe3\xaa\xc5\
+\xc9\xcb\x2e\xe6\x5d\x1c\xde\xef\xed\x63\x78\xd9\x72\x9b\xee\x83\
+\xf3\x72\x5a\xf8\x39\x4b\x03\xf7\xee\xbf\x23\x1c\x7e\xaf\x78\x93\
+\x77\x99\x9f\xe6\x1f\xb8\x92\x80\x11\x45\x58\x34\x65\x40\x05\x14\
+\x08\x45\xde\xe0\x95\x51\x6c\xbe\x7b\x48\xe7\x6f\xe9\x0c\x61\x24\
+\xe9\xee\xe4\x5c\x5d\xcc\xd7\xee\x61\x28\x62\x06\x23\xbd\x9f\xe4\
+\xf1\x2c\x24\x25\xb7\x01\xe4\x0c\xc0\x52\x44\x93\x61\x21\x66\x06\
+\x30\xc6\xdc\xf2\x15\x22\x52\x37\xd8\x60\x88\xd6\x43\xb4\x59\x46\
+\x53\x5c\x41\x14\xe6\x70\xa8\x61\x55\xb1\x58\x6c\xdd\xc6\xa7\x5e\
+\xf2\x6e\xbb\x8f\x3f\x3f\xe2\x0e\x6c\x41\xf9\xe8\xa3\xe7\xad\xf4\
+\xfa\x9c\x79\x00\x9b\xff\x73\x5e\x63\xf8\xbf\x5d\xfc\xcc\x9b\xcb\
+\x8a\x9a\x40\x49\x81\x4a\xc0\x89\xa3\x42\x72\xcb\x56\x47\xdf\xd2\
+\xa9\xf7\x24\x13\xf9\xb8\x0e\x75\xe3\x5c\x8e\xf3\x92\x9d\x6c\xce\
+\xed\xcb\x95\x31\x4c\x86\xe1\xd4\x30\x97\xcb\xba\x8c\x0a\x42\xa6\
+\x88\x45\x50\x5b\xe1\xf3\x35\x64\x0e\xc0\x46\xd5\xbf\x10\xf3\xc6\
+\x8f\x5e\x8f\x21\xa3\xff\x7a\x08\x6d\x5b\x38\x23\xe6\x71\xf3\x86\
+\x6b\xca\xd6\xb9\xa6\xd7\x6c\xbb\xaa\xe9\x5f\x72\x29\xbf\x79\x70\
+\xaf\xb8\x3d\x7b\x48\xb2\xcb\xe4\xe0\x47\xc5\x9d\xb3\x71\xe0\xe7\
+\xab\x01\xec\x07\xfd\xaf\x58\x1d\x4a\xf9\x07\xbd\x9c\xc2\xe5\xd2\
+\xac\xc7\x77\xdb\x68\xab\x99\x3b\x2b\x9e\xe0\xad\xcc\x15\x67\x7b\
+\xfb\x24\x1b\x45\x22\xac\x10\x3e\xda\xcd\xe7\x31\x12\xb8\x8c\xd2\
+\xbd\x58\xa7\xf8\x49\x98\xc4\x5c\xf2\x8d\x09\xf3\x81\x54\xeb\x8a\
+\xce\x2f\xb5\x4d\x87\x01\x5a\x08\x2d\x16\x6a\xb4\x5e\x26\x36\x81\
+\x32\x28\x7e\x50\x63\x4a\xd4\x6c\x93\x38\x87\xa8\x0b\x66\x03\xd4\
+\x5d\x73\x19\x0f\xbd\xe6\xbd\xf6\xa9\xd5\xec\x33\xfb\xce\xdf\xde\
+\x8b\x73\x16\x02\x4e\x7c\x6c\xbe\x0c\xef\x97\xdd\xbd\x92\x62\x58\
+\x74\xe7\x32\x5f\xcf\x68\x96\x31\x3d\x1d\xa4\x7e\x92\xa0\x7b\xb5\
+\x19\x74\x71\x35\x57\xf9\xb2\xd2\xa7\x9b\xc5\x67\x01\x23\x74\x9e\
+\x20\x66\x7f\x62\xd6\x61\x81\x5c\xed\x23\x25\xe8\xca\xbb\x2e\x26\
+\x2c\xa5\xfc\x5c\x9b\xcb\xbd\x1a\xba\x8f\xdb\x4e\x07\xd0\x06\xa8\
+\x6b\x2c\x76\x9c\xff\xa8\xe8\x9f\x30\x1a\x9c\xdd\x70\x45\x58\xbf\
+\xd8\xf2\x0b\xfc\xf6\x33\x37\xd8\x71\xcd\x18\xc0\x1b\x6f\x22\x39\
+\xc7\x9b\x98\xc4\x89\x76\xc3\x94\xc9\x71\x5e\xb2\x11\xac\xfc\xb2\
+\x2c\xad\xb2\xd5\x8f\x95\xf9\x7c\x5d\xde\x2f\x8a\xc9\x68\x0a\x4f\
+\x20\x4a\x9e\xf4\x19\x89\x5d\xb3\x67\xcc\x55\x3f\x22\xce\x12\x4e\
+\x13\xa9\xe3\xfa\x35\xa6\xae\xd2\xd7\x3d\x62\x16\x78\x58\xdb\xa2\
+\x75\x8b\x35\x11\x6b\x1b\x18\x2e\x93\x06\xcb\x68\x33\x24\x90\x45\
+\x43\xd2\xe5\xfe\x52\xe0\xdd\x73\x76\xf0\xc0\x4f\x7d\xd2\x3e\xc7\
+\x4f\xd0\x8e\x0d\xe0\x5b\xac\xdd\x62\x9a\x26\x79\xe9\xb0\xa0\xea\
+\x2b\x2d\x02\xd6\x95\x70\xcc\xad\x78\xcf\xb3\x42\x8e\x27\x2f\x5d\
+\x99\xa9\xb3\x52\xd3\x79\xc2\xb0\xc6\x16\xeb\x00\x9f\xcb\x73\xbc\
+\x73\xa3\x47\xa7\x02\x92\x18\xa0\x1d\xa9\x7d\x02\x34\x11\x17\x03\
+\xae\x0e\xb9\xae\xdf\xc6\x2c\xf3\x6e\x5b\x5c\xdd\xe4\x0a\x60\xdd\
+\x22\x75\x83\x33\x9c\xac\x9e\x2d\x20\x82\x5c\x7e\x69\xe8\xfb\x9a\
+\x5f\xb9\x4d\x6e\xe0\x06\x3b\x7f\x04\x1f\xe7\xad\x01\x98\xa1\xc1\
+\x58\x28\x05\x47\x89\xc3\xe3\xc4\x81\x55\x78\x0a\xdc\x48\x50\x29\
+\xa3\xa8\x3e\xba\xc1\xa7\x3b\xf5\xdd\x25\xaf\xd6\x29\xfd\x92\x19\
+\xc1\xe8\x6e\x43\x75\xf8\x0e\x03\x08\x8a\x5a\x1e\xf5\x68\x92\x87\
+\x35\x12\xf2\xf7\x11\xcb\xc5\x1d\x57\x8f\x42\x41\xae\xf3\xa7\x41\
+\x24\xb5\x6d\xa7\xf6\x6d\xd1\xb6\x45\x16\x17\x89\xc3\x1a\x67\x02\
+\x38\x15\x67\xa5\x98\xe0\xcc\xa1\x6a\x4e\x76\x5e\x83\xfe\xfd\xf7\
+\x71\xcf\xcd\xdc\x29\x67\xee\x7d\xf6\x14\xd9\xce\xe9\x0f\xda\x2b\
+\x79\xdc\x72\x5b\x06\xe6\xba\xf9\xfb\x74\x23\xd3\x46\x40\x50\x30\
+\xe9\xee\xf6\x7b\x92\xba\xef\xac\xc4\xeb\xec\xc7\x67\xef\xfc\xe9\
+\x58\x04\x4b\x38\xc9\x4d\xe1\xc6\xd9\xd0\x61\x16\x49\x31\x40\x6a\
+\xb1\x14\xb1\x64\xb8\x56\x29\xda\x80\x0b\x01\x9a\x80\xab\x23\x7e\
+\xd8\xe0\x06\x35\xd2\xb4\xb8\x36\xe1\x53\x1c\x95\x99\x63\x56\xfc\
+\x68\xbf\x58\x3f\xa7\x71\xd7\xab\x38\x53\x2d\xf3\x2b\x62\xf8\x7b\
+\xfe\x4f\xe2\xd8\x00\xbe\x15\x05\x0c\x92\x94\x63\xa5\x50\x2b\xf8\
+\x95\xdb\xbb\x7c\x7e\x5b\xcd\x3d\x11\xfc\x59\x77\x9b\x87\xc9\xca\
+\xa5\x0d\x2a\x4a\x1a\xdd\x05\x2d\x8a\x8a\x62\x92\x56\x15\x82\x57\
+\xf3\xff\xda\xa5\x7f\x29\x57\x03\xcd\x10\xcd\x57\x40\x11\x15\x5f\
+\x07\x8a\x18\x3a\xcd\x5f\x93\x35\x7e\x4d\x8d\x0e\x07\xa4\xe5\x01\
+\x71\x69\x08\x61\x48\x72\xe6\x2c\x5f\x2f\x26\x85\x77\x16\x85\x54\
+\x5c\x7f\x03\xfe\x05\x2f\xe6\x0c\x35\x3b\xee\xb9\x5f\xae\x39\x74\
+\x08\xc6\x06\xf0\x3f\xf1\x6f\xcb\x04\x27\x48\x98\x16\x1d\x95\x2e\
+\x4f\x00\x82\x89\xa2\xcb\xe6\x65\xa5\xa1\xcb\x3a\xf2\x57\x9f\x70\
+\xf2\x6d\x65\x4c\x2b\xdd\x19\xcf\xe8\x3f\x31\xba\xdd\xc7\x91\x6b\
+\xfc\x2e\x59\x16\x7b\x98\xa7\x2c\x0a\xac\xdf\x27\xf5\x2a\xd4\x0b\
+\x4d\xab\x48\x13\x28\xda\x16\x1b\x06\xdc\xb0\x45\x86\x0d\x6e\x30\
+\xcc\x95\xbf\xa4\xce\xba\xb7\xcc\x83\x53\xf3\x94\xb3\x55\x38\xf5\
+\x93\xff\x90\x2f\x85\x45\xc2\x20\xf0\xd8\x8e\x21\xbf\xb4\xd7\xe6\
+\x65\x6c\x00\xdf\x62\xdd\x7c\x40\xdc\xc9\xe3\x1c\x30\x98\x60\x24\
+\xd4\x74\x78\x0a\x0c\x47\xc4\xd3\xe2\xa9\xad\xa0\xa5\xc8\xf4\xaf\
+\x64\xb4\xdf\x88\xd0\x3e\xe1\xe4\xdb\x8a\x9c\x5b\x3a\xbe\xd0\xa1\
+\x94\x2b\xc1\x24\x74\xa2\x10\xcd\x3d\x01\x2e\x61\xda\x15\x84\x13\
+\x94\x55\x01\x33\xd3\x94\x5b\xd6\x11\xb7\xcc\x11\x36\xcd\x51\xce\
+\xf5\x90\xca\xe5\xbf\xdf\xb6\x54\x29\x8a\x0b\x18\x2d\x29\x19\x96\
+\x5c\x19\xf5\xd5\xd7\xf3\xe8\x7b\xfe\x2d\x5f\x44\xb0\x4a\x89\x93\
+\x67\x68\x53\xe2\xf9\xe1\x73\xf3\x2f\x13\x6e\x29\xf9\xa6\xf4\x05\
+\xfc\xed\xf7\x3e\x73\xd3\xbe\xbf\x6d\x4f\x7c\xae\x7a\x12\x64\xaf\
+\x78\x0e\x99\x36\x1f\x97\xdf\xac\x22\xbb\xac\xa4\x90\x9c\xff\x07\
+\x84\x1a\xcb\x17\x33\x49\x00\x42\x97\x24\x36\xdd\x15\x4c\xb2\x92\
+\xfb\xe7\x6a\x8f\x62\x6a\x88\xd7\xce\x5f\xe4\xd6\xaf\x15\xff\x61\
+\x99\x03\x70\x9a\xdb\xba\xd0\xac\xe7\xd7\x26\x2b\x7e\xac\x4d\xb8\
+\xb6\xc1\x06\x01\xd7\x0c\x73\xda\xd7\xb4\xb8\xa5\x21\xb6\xb4\x48\
+\x73\x66\x80\x2c\x0e\x29\x8e\x1d\xa5\x59\x1c\x30\xb7\x69\x96\xc1\
+\xdf\x7d\x15\xc7\xaf\xdd\xcc\xf1\xe9\x39\xd4\x6f\x60\x39\x4d\xd1\
+\x63\x96\x4b\xfc\x06\xb6\x84\x4d\x3c\xf2\x91\xe7\x71\xd3\xde\xdd\
+\x26\xf7\xdd\x21\xc5\x76\xb1\x76\xb5\x42\x69\xec\x01\x80\x77\xbe\
+\x93\x8a\xdb\x0e\x14\x55\xcb\xbf\x19\x7a\xd6\xcb\x68\x04\xbb\x62\
+\x14\xb4\x56\xb1\x4c\x8f\x33\x69\x82\x53\xb1\xcf\xc9\x24\x2c\x27\
+\x47\xdd\xb1\xf9\xba\xe2\xec\xbb\xdf\xbd\x75\x3d\x7e\x9a\x81\xdf\
+\xea\x8b\x19\x44\x51\xc9\x45\x21\x25\x9f\x7e\x0d\x96\x69\xe0\x4e\
+\xef\x47\x8a\xd9\x9b\xb8\x7c\x13\x88\x8f\x2d\x49\x0c\xf1\x8e\x72\
+\xaa\x4f\xd5\x53\xda\x8d\x1b\x99\x7a\xc9\xf5\x34\x3f\xf0\x6a\x06\
+\x65\x8b\x2d\x0f\x99\x4c\x91\xa2\x5d\x66\xda\x7b\xa6\x0d\x8c\x05\
+\x1e\x2f\x97\xd9\xf1\x03\xff\x8d\x9b\x6e\xbc\x43\xf8\x79\x21\xec\
+\x3f\x8f\x23\xc2\x39\x33\x80\xb7\x7d\x86\xd6\xb8\x05\x79\xad\xdd\
+\x3f\x21\xfc\xa9\x66\x17\xed\x34\xe2\x0c\x8c\x09\x4e\xcb\x14\xa7\
+\xfc\x0c\xc7\x8b\x19\x8e\xf9\x49\x4e\xfa\x8a\x53\x94\x2c\x9b\x5b\
+\xd1\xfc\x19\xdd\xe9\xef\x5c\xfc\x88\x9c\x91\x4e\xef\x97\x6b\xfe\
+\x23\x2f\xa0\xf8\x24\xb8\x98\x6b\x09\x92\x32\xb8\x44\x3b\xa2\x29\
+\x25\x08\x2d\xaa\x0d\x2d\x3e\x4f\xf4\x4e\x82\x4f\x8a\xf4\x2a\x7a\
+\x57\x3e\x87\xf6\xb9\x97\x30\xf4\x03\x64\x58\x31\xb1\xa0\x54\x4d\
+\x0b\xbe\x05\x4e\xd3\xa4\x01\x4b\x18\x65\x38\xcd\xb1\x89\x3e\xff\
+\xe4\x46\x41\x0f\xde\x43\x31\xff\x8a\xf3\x37\x2d\x3c\x77\x3c\xc0\
+\x5e\xb3\xdd\x57\x63\x26\xc4\xcf\xf7\xf9\x37\x28\xd1\x0c\x49\x46\
+\xb0\x21\x5b\x92\x21\x3a\xc5\xf1\xb8\x99\x93\xba\x89\x47\x74\x23\
+\x0f\x30\xc7\x51\xfa\x9c\xc4\xb3\xd8\x0d\x58\x77\xab\xd4\x3d\x22\
+\x64\x09\x58\x37\x84\x7d\x25\xdb\x30\x90\xa8\x84\x48\xae\xf4\x69\
+\xf7\x75\x4e\x73\x42\x40\x20\x46\xf0\x2a\x79\x86\x58\x12\xbc\x78\
+\x2a\xef\x10\x07\xc9\x3b\xec\xb2\xcb\xf0\x1b\x67\x51\xe7\x28\xdb\
+\x8a\x92\x88\x0f\x0d\x34\x0d\xa5\xcb\xf3\x04\xa5\x37\x24\xa5\x86\
+\x50\x28\x5e\x96\xb8\xfc\x17\xff\x84\x37\xc8\x0e\xd3\x83\xc7\xce\
+\xdb\xdb\xe3\xcf\xa5\x65\x8a\xfd\xfc\x8d\x78\x01\xee\x79\x85\x7d\
+\x63\xf0\x57\xfc\x3d\x13\x26\xa5\xa0\x70\x89\x58\x1c\x65\x07\x11\
+\x1d\x5e\xcc\x63\x61\x3b\x27\xdc\xd5\x3c\x1c\x2f\xe7\x61\x36\xf2\
+\x88\x4c\xf1\x38\x7d\x4e\x8b\xa7\x41\xc0\xfb\x8e\xde\x8d\xab\xca\
+\x48\x59\xed\xeb\x0c\x44\x33\x4e\x70\xd6\xa9\x7d\x55\x41\xbb\xe9\
+\x1f\x9a\x40\xd3\xd9\x14\x63\x54\x53\x48\x91\x36\x26\xa4\xaa\x90\
+\xf5\x33\x34\x95\xa7\x36\x41\x52\x47\x3d\x69\xe6\x0d\xca\x3a\x52\
+\xd6\x0d\x2e\x46\x0a\x22\x8e\x06\xb4\x21\x86\x05\x96\xca\x2d\xfc\
+\x2c\xbb\xb1\x77\xbf\x1b\x19\x1b\xc0\x7f\x57\x0d\x34\xb9\x1c\xec\
+\x63\x26\x25\x26\x7c\xea\x9f\xf3\x8d\x53\xa7\x78\x93\x33\x2e\x6a\
+\x40\xe3\x24\x45\xba\x8f\x9b\x66\xbe\xc1\xd5\x4d\xc1\x57\xea\x09\
+\x4e\xca\x65\x7c\x93\x2b\xf9\x46\xdc\xc4\x43\x4c\xf1\x78\x2c\x38\
+\x65\xd0\xa4\x94\xb5\x78\x23\xb7\xdf\x19\x81\x59\x42\x2d\x76\xc4\
+\x4f\x37\x00\xc2\x9e\x78\xbd\xcb\x68\x34\x94\x69\xea\x8a\x48\x5d\
+\xaf\xa0\x1a\xe6\x05\xed\x15\x48\xaf\xa4\x04\x4a\xd1\xac\x23\xd0\
+\x2c\x01\xb7\x94\xf0\x75\x43\x51\x37\xb8\xd4\xe0\x19\xa2\xbe\xa1\
+\xf5\xc3\xac\x58\x96\x93\xac\x3f\xf6\x2f\x65\xef\x7b\xef\x38\x7f\
+\xfb\x2f\xce\x99\x01\x5c\x6b\x22\xd7\x8a\xa5\x25\x21\xde\x2d\xd8\
+\xed\xf7\xc2\xa6\x0f\xdb\xe1\xb4\xcc\xcf\x57\x46\xe9\x96\xa0\x4c\
+\x34\x8b\x47\xf8\xee\xe9\x4f\xb1\xa7\x0f\xc7\x12\x2c\xb0\x81\x63\
+\xee\x0a\x1e\x63\x23\x47\xdd\x2c\xc7\xa5\x62\xd1\x39\x86\x62\x44\
+\x67\x24\xeb\x6a\x01\xdd\x26\x4a\x32\x5c\xca\x60\xcf\x0c\x5c\x77\
+\xf2\x73\xec\xcf\x4c\xe1\x8a\x5a\xd8\x46\x40\xd2\xb0\xa2\xc0\xf9\
+\x02\xc4\x50\x27\x98\x73\x2b\x25\x65\x24\x7f\x2f\x1f\x8d\xb2\x4d\
+\x14\x4d\x83\xb7\x86\xd2\x22\x62\x0d\x89\x9a\x28\x4b\x24\xe0\xf4\
+\x5c\xe2\xd6\x2b\x30\x3d\x5f\x0d\xe0\xbc\x99\x13\x28\x88\x3f\x28\
+\xb0\xd7\xcc\xd2\x47\xe4\x97\x29\xd9\x13\x61\xb9\x68\x50\x4a\x4a\
+\xf5\x7c\x5d\xbf\x9b\xf7\x9d\x99\x62\xa9\x14\xb6\x4c\x9c\x64\x8e\
+\x6f\x70\x79\xef\x14\x5b\x6d\x81\x19\x86\xcc\x6a\x60\xda\x2b\x95\
+\x25\x9c\x44\x54\x13\x2e\xe5\xc9\x9f\xae\xcd\xc2\x0f\x62\x9e\xf4\
+\xe1\x42\xc2\x34\x22\x4d\xee\xf8\x75\xc3\x84\x85\xdc\xe2\x25\x6d\
+\x83\x34\x4f\x1a\x2a\xe5\xba\xcf\x9c\x27\x79\x48\x38\x52\xe9\x88\
+\xd3\x3d\xc2\xfa\x39\x86\x1b\x27\x88\xb3\xd3\x24\x99\xa5\xa0\x0f\
+\x36\x49\x15\x66\xb9\xb8\x2a\x99\xfb\xca\x9d\x5c\xf7\xbc\x5f\xb4\
+\x13\x63\x0f\xf0\x37\xac\x79\x99\xb7\x3d\x07\xf1\x70\x69\xcf\x7f\
+\xc1\x7e\xb1\x4d\xbc\xbf\x6c\x99\x51\x8f\xd3\x21\x03\xab\xd9\x51\
+\xfe\x09\x3f\xb7\xf1\x7e\x2e\xf7\x9e\x85\xd2\x21\xbd\x8b\x39\xc1\
+\x34\xc7\xad\x60\x51\x0a\x6a\xe7\x69\x11\x22\x9d\x5a\x48\x73\x9f\
+\x18\x26\xe9\x1b\x00\x00\x09\xab\x49\x44\x41\x54\x9e\x74\xb4\x2f\
+\x3a\x62\x03\x3b\xae\x40\x65\xe5\x75\x34\x5f\x04\x27\xa6\xa8\xfc\
+\x4d\xfa\x3d\x5b\xc1\x09\x2e\x19\x3e\x46\xa4\x6d\x71\x6d\xc4\x37\
+\x81\xc2\x5a\x9c\x45\x3c\x81\xaa\x88\x98\x9d\xe6\xe4\xb6\xeb\x78\
+\xf5\x38\x04\x7c\x8b\xf5\x4d\x9b\xaf\xd8\x6b\x6a\x07\x1e\x8a\x77\
+\x20\x6e\xe2\xef\xd8\xfe\x33\x05\x6f\x95\x9a\x65\xe9\xb1\x49\x20\
+\x05\x70\xf2\x57\xfc\xd3\xc9\x3f\xe7\x55\x6e\x8a\x53\xa7\x13\x4b\
+\x5a\xb1\xe4\xa6\x68\xf1\x0c\x44\x18\x76\x44\xd2\x93\x3b\x6f\x46\
+\x40\x50\x3b\x91\xa8\x25\xc3\x2c\x62\xa3\x10\x60\x19\x18\x8e\xc2\
+\xc0\xdf\xe8\x16\x47\xa9\xa6\x69\x16\x87\x84\xd0\xc9\xc7\x5a\x24\
+\xb5\xf9\x27\x90\x16\xd1\x33\xb4\x52\x33\x2c\x16\x79\xd5\xf9\x6a\
+\x00\xe7\x0d\x38\x79\xef\x7e\xda\x9f\x30\xa9\xb6\x0b\xed\x23\x86\
+\x3f\x78\xad\x94\xeb\x5f\x77\xc7\x1f\x1f\x3f\xb0\xfb\xab\xeb\x0a\
+\xde\xe3\x22\x13\x0a\x93\x09\xce\xf8\x87\xb9\x29\xfe\x21\xd7\x4f\
+\x6d\xe3\x08\x3d\x4e\x36\x4a\xdd\xb3\x3c\x11\xcc\xd3\xdd\xf2\x23\
+\x98\x97\x2e\xf8\xe6\x5c\x30\x2b\x8a\xa5\x6b\xde\xc8\x5d\xc1\x32\
+\xa2\x94\xbb\xa9\x5d\xce\x74\x55\x2f\xe1\x93\xad\xc8\x65\xdc\xe0\
+\xf3\x25\xd0\x4e\xb2\x7c\x5c\xdb\x88\xaf\x23\xf4\x13\x5a\xe6\xcd\
+\x57\x3c\x55\x31\xe0\x74\xb3\x8e\x2b\x26\x17\x57\x26\x95\x8f\x31\
+\xc0\xff\x7c\x96\x20\x6e\x5e\x0c\x33\x11\x39\x74\xad\x6f\xf5\xee\
+\xdf\xb2\xc0\x8b\x8a\x12\x17\x5b\x62\x25\xf8\x18\x68\xa4\x47\xcb\
+\x24\xdf\xf4\x0d\x3e\xb5\x4c\xfb\xc0\x0c\x81\x89\xa0\xf8\xa2\xc1\
+\x2c\x20\x21\xe0\x82\x40\x9b\x5b\xbe\x2c\x1a\xd2\xd4\x68\x93\x40\
+\xb3\xdc\x4b\xea\x36\x8f\x76\x0f\x11\x6b\x03\x92\x22\x2a\x80\x09\
+\xce\xe5\x98\x60\xdd\x9c\x01\x75\x82\x16\x55\xd6\x83\x7b\x21\x4e\
+\x94\x0c\xd6\xf5\x88\x33\x93\xa4\xa9\x09\x64\x72\x12\xd7\x78\x26\
+\xa6\xa7\x58\x6f\x4b\x2c\xe8\x46\x3e\xef\xdf\x6c\xb7\x8c\x3d\xc0\
+\x53\x0c\x4f\x66\xc4\x43\x62\xde\x4c\x92\x7c\xc6\xde\x62\x77\xcb\
+\x4f\xd6\x91\xb7\xf5\x85\xc8\x80\x93\x5a\xb1\xa1\x68\x28\xf4\x34\
+\xd7\xa4\x1e\x4b\x5e\x30\x6b\xf3\xb4\xb0\x42\xf0\x38\x9c\x38\x24\
+\x95\x38\x8b\x67\xdd\xba\x9e\x2d\x17\x8b\x3e\x59\x71\xd4\x95\x8e\
+\x3b\xd1\x69\x4e\x09\x47\x1d\x48\x02\x22\x99\x5b\x88\x8a\x15\xf9\
+\xb2\x68\xd7\x46\xca\xba\xc4\x15\x89\x28\x09\x5f\x0f\x28\xac\x84\
+\xe9\x65\xe2\xa9\x19\x7a\xb3\x47\xf9\xfa\x18\x03\x3c\x55\x50\x08\
+\x2a\xec\x77\x7b\x40\x45\x4c\xf9\xaf\xd2\xf0\x10\xef\xe6\x4f\xd8\
+\xbd\x28\x7c\x39\xcd\x70\x65\xe5\x28\xed\x04\xc3\xa2\x4f\xdf\x0d\
+\x99\xa5\x61\xda\x12\xa5\x29\x62\x21\x0b\x43\x93\x81\x3b\x3b\xb2\
+\x49\x46\x3a\x3e\x5b\xa5\x36\x18\x55\x12\x6d\x04\x1a\x05\xe9\x14\
+\xc3\xa2\x09\x4b\x91\x18\x03\x29\x45\x62\x6c\x89\xb1\x25\xc5\x88\
+\x86\x36\xf7\x0a\x0e\x1b\xdc\x42\x43\xef\xd8\x22\x93\x8f\x9d\x61\
+\xea\xc4\x19\x8a\x53\x35\xb3\xc7\x5b\xca\xc5\x86\xfe\x03\xa7\x39\
+\x32\x0e\x01\x4f\xf5\x07\x13\x11\x0c\xb9\xed\x2e\xfc\x9f\xee\x42\
+\x77\xee\x46\x0e\xdf\x08\x87\xaf\x35\x07\x92\xc2\xd7\x79\x45\xd8\
+\xca\xbf\x2e\x87\x6c\x34\x63\x58\xb6\xf8\x98\x5d\xb6\x98\x91\x2c\
+\x20\x29\xe1\x0d\x34\x39\x9c\x24\x34\x24\x5c\x08\xb9\xbd\xbb\x69\
+\x72\x35\x50\xdb\x3c\xfa\xb5\x0e\x5d\x08\xc8\xc3\x1f\xa4\x89\x68\
+\x4c\x14\xa9\xed\x26\x09\x0b\x5e\xba\x4e\x83\x11\x08\x14\xc9\x75\
+\x88\x42\x08\xfd\x29\x5c\xbf\x20\x55\x05\x54\x0e\xfa\x1e\xe2\x1c\
+\xc5\xfa\x86\xf0\x47\xef\x7e\xe7\xcb\x6f\xb5\x5b\x87\x63\x03\x78\
+\x5a\x79\x83\x1b\x4a\x93\x7f\xe9\x9a\x5f\xfd\xfe\x1f\xf3\x9e\x9f\
+\xc6\xe3\x5c\x4b\xd9\x28\x4b\xad\x67\x7d\x18\x70\xaa\x32\x7a\x06\
+\x3e\xba\x7c\x97\x67\xca\xe9\x9e\xb5\x8a\x6f\x9b\x3c\xf9\xbb\x4d\
+\xb8\x14\x90\x41\x24\xc5\x96\xa2\xce\x5d\xc1\xd2\x0c\x48\x8d\xe2\
+\xea\x16\xda\x88\x0f\xf9\x8a\x47\xba\xe6\x13\x33\x8f\x4b\x01\xf3\
+\x1e\x2b\x4a\xb4\xe7\x61\x6a\x12\xd7\x2f\x71\x3d\x4f\xd3\xaf\x28\
+\x04\xca\xcf\xfe\x25\xff\xfe\x9f\xbd\xc3\x7e\xd3\xf6\x90\xce\xc7\
+\xf7\xf1\xd9\x3b\x25\x6c\xef\x9d\xba\xd3\x44\xee\xc6\xde\x73\xef\
+\xef\xc9\xed\x5b\xee\xe7\xd6\x6a\x92\x37\x96\x67\x18\xd4\xca\x19\
+\x07\xbd\xa5\x96\x28\xd0\x98\x31\x19\x14\x24\x4f\x7c\xd3\xd0\x62\
+\x2d\xf4\x70\x24\x4d\xd0\x82\x88\x83\xd4\xf5\x18\xab\x91\x02\xf8\
+\x94\x47\xc4\x59\x48\x10\x32\xe3\x27\xb1\x85\x50\x13\xcd\x48\x06\
+\xae\xa8\x70\x55\x0f\x37\xd1\xc3\xda\x84\xef\x57\x68\xcf\x53\xa5\
+\x44\x7d\xdf\xa3\xb0\xee\x5f\xf1\xbb\xec\x15\xc6\xcd\xa1\x4f\xf3\
+\xba\xe7\xa0\x4c\x7d\x50\x6c\xb0\xcf\xc4\x6e\x3f\xc6\xe3\x57\xfe\
+\x82\xbd\xed\xd5\x57\xc8\x57\xdf\xba\x87\xd7\xbc\x72\x8a\xab\x87\
+\x42\xbf\xac\x70\x83\x48\x6a\x22\x8d\x6f\xf3\x65\x4d\x51\xf1\xa6\
+\xa0\x42\x48\x5d\x2f\x60\x1b\x20\x81\xa4\xd8\x95\x84\x13\xce\x3a\
+\xf7\x1e\x13\x9a\x02\x1a\x22\xae\xa9\x91\xe5\x25\xd2\xb0\x46\x42\
+\x93\x29\x83\xa2\x84\xfe\x04\x5a\x55\xd0\x2f\x69\x4d\x90\xd0\x32\
+\x71\x2a\xb0\x65\xeb\x09\xfe\xf9\xcf\xfc\x88\x2d\xdb\x8f\x9e\xbf\
+\x22\xc1\x67\x6d\x08\xd8\x2d\x14\xff\xef\x23\x52\xfd\xf0\x57\x69\
+\x0f\xef\xb0\x72\xfa\x7a\xd9\x5e\x9d\xe0\xa5\xa7\x99\x9e\x58\x3f\
+\xb3\xb4\xed\x4d\xd7\x73\xfd\x1b\x77\xb2\xe1\x8a\xf5\xac\x3b\xd1\
+\xe4\x16\xf2\xd6\x70\x29\xe6\xd1\xee\x75\x1e\xea\x48\x1b\xce\x82\
+\xff\x8e\x0f\xb0\xe4\x28\x9b\x06\x1b\xd4\xb8\xe5\x21\xd6\x36\xa4\
+\xb6\x81\x61\x83\x2c\x0d\x49\xcb\x2d\x65\xb3\x44\x88\x81\x02\x87\
+\xab\x4a\xb4\x70\x48\x32\x74\x58\xe3\xdb\xb6\x2a\xb6\x6d\x69\x3f\
+\xf8\xd8\x51\x7e\xe9\xa0\x80\xdc\x69\xce\x76\x11\xc6\x06\xf0\x74\
+\xff\xf0\xfb\xf7\x3b\xdb\xb7\x6f\x34\x76\xfd\xf5\x38\x2e\x46\x99\
+\x76\x70\xb1\x56\xb3\x2f\x28\xe3\xc2\xab\xf7\xfd\x1f\xdc\xfa\xea\
+\x6d\x5c\xd4\x9f\xe1\x0d\x8b\x35\xc1\x94\x80\xd1\x1b\x36\xe8\x50\
+\xf3\xc8\x17\x17\x90\x41\x83\xd6\x11\x3f\x68\x70\x51\xb1\xe5\x06\
+\xb1\x16\xad\x23\x36\x80\x32\xd4\x68\x6a\x91\x30\x24\x76\xcd\x22\
+\x41\x73\x85\x10\x07\x7e\x68\x34\x7d\x98\xf0\xe6\xd2\xb0\xa7\x9f\
+\xfa\x70\x6d\x6f\x79\x56\xbc\x87\xcf\x5a\x10\x28\x22\xdd\xa8\x75\
+\x0f\x4c\x03\x3f\xd4\x85\xb4\xf5\xc0\xf6\xc9\x29\xbe\x77\xd0\xba\
+\x09\xda\xf4\x9c\x9b\x11\x39\xc0\x11\xf9\xd8\x5b\x76\xbe\xfe\x12\
+\xe1\xe5\x8f\x9d\xe1\xbb\xbc\xb1\xb5\x49\xd4\x83\x96\xba\x0e\x14\
+\x4d\xc0\xd5\x2d\x36\xac\x09\xc3\x61\xbe\x0d\xa4\x59\xc2\x0d\xcf\
+\x10\xea\x1a\x6d\x63\x6f\x2a\x77\x98\x09\x06\x51\xa4\x71\xd1\xc4\
+\x65\xf5\x98\xba\x0d\x14\xbd\xfb\xa5\x5d\x2c\xcc\xfd\xee\xaf\xf1\
+\xbc\xff\x70\xad\xe5\x6b\xde\x46\x3f\xe7\x98\x0a\x7e\x9a\xd7\x68\
+\xf3\xcd\x2c\x89\xc8\x75\x40\x00\x66\x3a\x63\xd8\xdc\x2e\x57\x1b\
+\x2b\xfa\xef\x6c\x84\x74\x15\xef\xaa\x6e\xde\xb5\x53\x97\x5e\xc7\
+\x1f\x5d\xb7\xcf\x3e\x0c\x4c\xfe\xc6\x2b\x65\xce\x22\xbb\xe6\xfa\
+\xdc\xb8\x10\xd8\x6d\xca\x3a\x35\x52\xe9\xe8\x15\x3d\x8a\x33\x81\
+\x76\x58\xc1\x60\x86\xde\x62\x89\xd3\xd0\x44\x97\x28\x4a\x45\x0b\
+\xc5\xb7\x82\xab\x82\x85\x25\x4b\xb3\x7d\xec\xc8\xf1\xe9\xf6\xb7\
+\x3e\xb1\x68\x1f\x42\x10\xb9\xe9\xd7\x2b\xba\x8d\x1f\xdd\x07\x70\
+\xbe\x1a\xc1\xb3\x3b\x04\x88\x38\x33\x53\x11\x79\x33\x50\x75\x9b\
+\x7f\x25\xb0\x0b\xd8\xb5\xe3\x26\xfa\xdc\x04\xf7\xbe\xf2\x5a\xe3\
+\xd0\xde\x08\xaf\x70\xfb\x6c\x77\x31\xbf\x1d\xe4\xc7\x2d\xcc\x8b\
+\xd8\x3e\xcb\xe5\x82\xff\xef\x26\xd9\xfe\xb1\x2f\x71\x79\x2b\x6c\
+\xf5\x8e\x4b\x9b\x33\xf4\x97\x23\x17\x31\x64\x73\x4c\xc5\xf5\x82\
+\x57\x81\xfb\x16\x09\x8f\x05\xf4\x91\x09\xc7\xc9\xa4\xfe\x74\x22\
+\x7d\xea\xe3\x66\xdf\x60\xe7\xce\x82\x97\x1f\xb1\xf9\x03\xfb\xed\
+\xd0\xfc\x7c\xff\x4b\xfb\x6c\x69\x95\x97\x1a\x1b\xc0\x33\x18\x02\
+\x76\x01\xd7\x01\x53\xc0\x25\xc0\x65\xc0\x6b\x80\x0f\x9b\xd9\x5b\
+\x72\x88\x30\xfd\x56\x15\xbe\x0b\x75\x3d\xab\xc7\xc5\x8b\x88\x03\
+\xae\x01\xca\xce\xfd\x4f\x00\x97\x02\x1b\x80\x5f\xea\x5e\x57\x90\
+\xf1\x4e\xaf\x39\x22\x28\xef\xea\x36\xa0\xd7\xb9\xff\x0a\xb8\xb8\
+\x0b\x01\xb7\x9b\xd9\x83\xab\x8c\x64\x94\xe9\x8d\xd7\x1a\x02\x81\
+\x2a\x22\x2f\xea\x0c\x61\xb2\x3b\xf5\xeb\x3a\x23\xd8\xd3\x65\x07\
+\xa3\xa5\xe3\xad\x7e\x96\x1b\xc0\xaa\x0b\x96\xa4\xdb\xfc\x51\xcc\
+\xa7\x8b\xff\x73\xc0\x0e\xe0\x71\x33\xfb\xf4\x78\x6b\xd7\x98\x01\
+\x74\x80\xcf\x99\xad\x28\x6c\x5f\xd0\xa5\x7e\xeb\xba\xd8\xbf\x09\
+\xb8\x1c\xf8\x87\xe3\x6d\x5d\x83\x20\xb0\x43\xfd\xba\xca\xb5\x6f\
+\xef\x0c\x78\xaa\x23\x7f\x9e\x0b\x2c\x02\xbf\x3b\xde\xd6\xb5\x99\
+\x05\xf8\x55\xc6\xb0\xb1\xdb\xf4\x11\x00\x9c\x05\x36\x03\xff\x57\
+\x67\x24\x6e\xbc\xb5\x6b\xcf\x00\x52\x17\x02\x52\x77\xda\x53\x67\
+\x00\xb3\x1d\x16\x70\x66\xf6\x9f\x44\xa4\x1c\x6f\xeb\x1a\x34\x00\
+\x33\x5b\x3d\x31\xec\x9a\xee\xe4\x4f\x00\x17\x01\x3b\x81\x9f\x5a\
+\xf5\xa5\x63\xd4\xbf\x06\x31\x80\xef\xa0\xc0\xfa\x2e\xee\x57\xc0\
+\xc6\xee\xf4\x1f\x33\xb3\xdf\x5f\xed\x29\xc6\x5b\xbb\xf6\xb2\x80\
+\xd4\x19\xc2\x35\x5d\x5e\x3f\xdd\x21\xff\x17\x01\x3f\xd8\xb9\xfe\
+\x38\x4a\x13\xc7\x5b\xbb\x06\x79\x80\x2e\x0c\x6c\xef\x5c\xff\x7a\
+\x32\xed\x7b\xb7\x99\xdd\xbe\xda\x56\xc6\xdb\xba\x76\x79\x80\x6d\
+\x64\xd6\x6f\xba\x33\x80\xbf\x05\xec\x7a\x12\x3f\x30\x5e\x6b\x95\
+\x07\x20\x57\xfa\x7a\x1d\x06\xb8\x02\xf8\x4b\x33\xfb\xeb\xf1\xa9\
+\xbf\x70\x3c\xc0\xd5\x9d\x07\xd8\x0c\xbc\x0c\xb8\x4c\x44\x46\xff\
+\x87\x38\xde\xce\x35\x64\x00\xab\xc4\x1e\xa3\x1a\xc0\xa8\xf2\xb7\
+\x8e\x5c\xf1\xfb\x80\x99\x3d\xda\xbd\x3e\x46\xfd\x6b\xd0\x03\x3c\
+\x41\x49\x23\x22\x97\x76\xae\xff\x22\xe0\xa5\xc0\x0f\x75\xc8\x5f\
+\x19\x57\xfb\xd6\x1e\x06\xe8\x36\xde\xad\xca\xe9\x77\x76\xe0\xef\
+\x12\xe0\xfd\x5d\xee\x1f\xba\x2f\x1d\x63\x80\x35\x18\x02\x56\x6e\
+\x0a\x12\x91\x8b\xbb\xd3\xbf\x89\x5c\x05\x7c\x43\xf7\xbc\xeb\x8c\
+\x64\x6c\x04\x6b\x11\x04\x76\xc0\x0f\x72\x9d\xbf\x47\xae\x01\xbc\
+\xd7\xcc\x56\x5f\xc3\x9a\xc6\xdb\xb8\x86\xb3\x80\x55\xe8\x7f\x0b\
+\x70\x9d\x99\xbd\x5e\x44\x8a\xd1\x65\xcc\xe3\xb5\x86\x0d\xa0\x73\
+\xf1\x9b\xc9\x15\xbf\x2b\x81\x77\x88\x48\x0f\xce\xcf\x36\xab\x31\
+\x08\x7c\x9a\xf7\xbf\x63\xf7\x9e\x47\x66\xfd\x2e\x07\xde\x6d\x66\
+\xcd\x78\xdb\x2e\x0c\x03\x18\xad\x17\x02\x57\x03\xb7\xad\x36\x8e\
+\xf1\xd6\x5d\x00\x1e\x40\x44\x2e\x21\x97\x7d\x2f\x37\xb3\x03\xdd\
+\x73\x85\x9d\xbd\x03\x74\xbc\xd6\xb0\x01\x58\x87\xfe\x5f\x0c\xfc\
+\xaa\x88\x54\x23\xd4\xbf\x8a\xfe\x1d\xaf\xb5\x6a\x00\x5d\xfc\x7f\
+\x11\x59\xea\xf5\xa1\x2e\xdd\x1b\x5d\x25\x35\xf6\x00\x6b\x2d\x0b\
+\x58\xcd\xfd\x77\xa9\xdf\xc5\x5d\xfc\x7f\xe7\xa8\x0b\x78\xbc\x5d\
+\x6b\xdb\x03\x8c\x74\xff\x23\x46\xef\xf9\xc0\x92\x99\x7d\x76\xbc\
+\x4d\x17\x80\x01\x74\x1b\x2f\xab\x74\xff\x6f\x00\xfe\x63\x17\xef\
+\xc7\xc5\x9e\xb5\x6e\x00\xab\xb8\x7f\x13\x91\xe7\x02\x43\x33\xfb\
+\x1a\xa3\xbb\x02\xc7\xeb\x82\x00\x81\xae\xdb\xf0\xdd\xc0\x7f\x18\
+\xa1\xfd\xb1\xdc\xeb\xc2\x30\x00\xe1\x6c\x69\xd7\x99\xd9\x03\x1d\
+\xda\xb7\x55\xa2\x90\xf1\x7a\xba\xdf\xf4\xf3\xe6\xc6\x90\xb3\xe8\
+\x7f\xa3\x59\xbe\x5d\x63\x54\xf4\x19\x67\x01\x17\x86\x01\x14\xab\
+\xf2\xfb\x15\x6f\xd0\x81\xc2\x71\xb7\xcf\x5a\x37\x80\xf1\x3a\x37\
+\xeb\xff\x07\x53\x67\x9d\x45\x66\xc2\xae\x71\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
\x00\x00\x1a\x97\
\x89\
\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@@ -39324,144 +40000,6 @@ qt_resource_data = "\
\xbd\x7e\x3a\x92\x9e\x69\xfa\x99\x71\x3d\x28\xf8\x03\xe9\x4a\x01\
\xef\xb4\x3e\x14\xed\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
\x82\
-\x00\x00\x08\x79\
-\x89\
-\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
-\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
-\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
-\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
-\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
-\x79\x71\xc9\x65\x3c\x00\x00\x08\x0b\x49\x44\x41\x54\x78\xda\x62\
-\xfc\xff\xff\x3f\x03\x0c\x30\x32\x32\x32\x90\x03\x36\x6f\x3e\x64\
-\xc8\xc5\xc5\xb1\x9e\x95\x95\x55\xfe\xce\x9d\x3b\x3e\x49\x49\xa1\
-\x7b\x80\xc2\xbf\x80\xf8\x3f\x3e\x7d\x20\xbb\x01\x02\x88\x89\x81\
-\x42\xb0\x6a\xd5\x4e\x45\x66\x66\xe6\x7d\x26\x26\x5a\xf2\x62\x62\
-\x82\x0c\xd7\xae\x5d\x16\x07\x0a\xf3\x01\x31\x33\x31\xfa\x01\x02\
-\x88\x62\x07\xfc\xfe\xfd\xaf\x41\x53\x53\x41\x80\x8f\x8f\x1b\xc8\
-\xfe\xc3\xf0\xee\xdd\x3b\x1e\xa0\x30\x07\x28\x40\xd1\xd5\xee\xd9\
-\x73\x4a\x60\xf3\xe6\xfd\x82\xc8\x72\x00\x01\x44\xb1\x03\x80\xc0\
-\x5e\x41\x41\x0a\xcc\xf8\xf3\xe7\x2f\xc3\xaf\x5f\xbf\xb1\xc6\xe3\
-\x86\x0d\x07\x04\x7e\xfe\xfc\x75\x80\x95\x95\x7d\x23\x90\x0b\x72\
-\x24\x0b\x48\x1c\x20\x80\x58\x28\xb5\x9d\x9b\x9b\x53\xfe\xef\xdf\
-\x7f\x60\x36\xd0\x72\x20\xfe\x83\xa1\x66\xf1\xe2\x6d\x60\xcb\x0d\
-\x0d\xd5\xf5\xdf\xbe\xfd\x08\x12\x92\x00\xe2\xe7\x40\xfc\x05\x20\
-\x80\x28\x0e\x81\x1f\x3f\x7e\x41\x2d\xfe\xcd\x00\xb4\x04\x18\x0a\
-\xa8\x0e\x98\x3e\x7d\x2d\xd8\x72\x60\x1a\xd1\x97\x93\x93\x60\x00\
-\x26\x56\x90\x30\x28\x1a\xd8\x40\x0c\x80\x00\xa2\xd8\x01\xdf\xbf\
-\xff\x84\x3b\x00\xe4\x18\x50\x3a\x80\x81\xee\xee\xc5\x60\xcb\xad\
-\xad\xf5\xf5\x95\x94\xa4\xc1\x62\x8f\x1e\xbd\x80\x85\x3c\x38\xaa\
-\x00\x02\x88\x85\x1a\x21\xf0\xf3\xe7\x6f\x30\x1b\x14\x02\xb0\x28\
-\x48\x4c\x2c\x01\x59\xbe\xdb\xc9\xc9\x04\x6c\xf9\xbf\x7f\xff\x18\
-\x3e\x7c\xf8\xcc\x70\xeb\xd6\xbd\xcb\x40\xe9\xbf\xb0\x2c\x0a\x10\
-\x40\x54\x70\x00\x24\x04\x60\x8e\x01\x85\x80\xb6\xb6\x29\x9f\xb8\
-\xb8\xfc\x16\x7b\x7b\x23\x3d\x65\x65\x19\xb0\xd8\x9b\x37\x1f\x19\
-\xb6\x6d\x3b\xf2\x75\xcb\x96\xd5\xd3\x81\x4a\xbf\x81\x32\x10\x48\
-\x0f\x40\x00\xb1\x50\x2b\x0d\xc0\xd8\xcc\xcc\x6c\x3c\x76\x76\x41\
-\xab\x1c\x1d\x4d\xb4\x54\x54\x64\x81\x96\xff\x05\x5a\xfe\x01\x54\
-\x58\x7d\xdd\xb4\x69\x79\xd9\xfe\xfd\x5b\xce\x02\x95\xbe\x01\x29\
-\x07\xe9\x01\x08\x20\xaa\x84\x00\x28\xe8\x61\x51\x20\x25\xa5\x56\
-\xe1\xe6\x66\xc1\xa3\xaa\x2a\x07\x4e\x90\xaf\x5f\xbf\x67\xd8\xb8\
-\xf1\xe0\xd7\x9d\x3b\x57\x97\x1d\x39\xb2\x13\x64\xf9\x33\x20\x7e\
-\x0f\xca\xb5\x20\x3d\x00\x01\x44\xa5\x10\xf8\x03\xa6\x2f\x5e\xbc\
-\xcd\xe0\xea\x6a\xc1\xa3\xa6\x26\x0f\xb7\x7c\xfd\xfa\x7d\x5f\xf7\
-\xef\xdf\x58\x76\xf2\xe4\x5e\x90\xe5\x4f\xa1\xbe\xff\x09\x4b\x03\
-\x00\x01\xc4\x42\x79\x49\xf8\x87\xe1\xd3\xa7\xaf\x0c\x2b\x57\xee\
-\x66\x30\x32\x52\x67\xd0\xd0\x50\x00\x5b\xfe\xea\xd5\x3b\x86\xb5\
-\x6b\xf7\x7e\x3d\x7a\x74\x5b\xd9\xf9\xf3\x07\xb1\x5a\x0e\x02\x00\
-\x01\x44\x94\x03\x0e\x34\x68\x3a\xfe\xfb\xff\x9f\x09\x58\x57\x31\
-\x3a\x36\xdc\x38\x80\x9c\x8a\x41\x3e\x5f\xb1\x62\x17\x83\xae\xae\
-\x0a\x83\xba\xba\x3c\xdc\xf2\x55\xab\x76\x7d\x3d\x73\x66\x77\xd9\
-\x95\x2b\xc7\x70\x5a\x0e\x02\x00\x01\x84\xd3\x01\x5b\xca\x34\x05\
-\x98\x99\x18\x26\xf0\x8a\x32\x07\x48\x68\x73\xf0\xb3\x71\x32\x31\
-\xfc\xff\xf5\x9f\xe1\xec\x04\x9d\x4f\x6f\xde\xfe\xaa\x72\x6f\xbe\
-\x35\xf7\x40\x93\x1a\xd7\x91\x37\xb7\x19\xd8\x64\xec\xc0\x16\x7f\
-\xfd\xfa\x9d\xe1\xdb\xb7\x1f\x0c\x6b\xd6\xec\xfd\x7a\xfa\xf4\xae\
-\xb2\x5b\xb7\x4e\xe1\xb5\x1c\x04\x00\x02\x08\xab\x03\x56\xe6\x6a\
-\x38\x32\xb2\x32\xae\x33\x0c\xe5\x13\x10\xd7\x62\x47\x91\x93\x36\
-\xe7\xe4\xbb\xbb\xf9\xe3\x94\xd5\xc5\xca\x9c\x82\xdc\x2c\x71\x82\
-\x7f\x98\x18\xa2\xd3\x02\xc1\x16\xf7\xf7\x2f\x67\x78\xfa\xf4\x15\
-\xd0\xe7\xc4\x59\x0e\x02\x00\x01\x84\xe1\x80\x45\x19\xea\x8e\xfc\
-\xe2\xcc\xfb\x9c\x92\x78\x19\x58\x39\x18\x19\xbe\xde\xfc\xc6\xf0\
-\xeb\xc3\x3f\x06\x26\x36\x46\x06\x5e\x05\x16\x06\x66\x56\x46\x06\
-\x65\x67\x4e\x86\x6f\xaf\xfe\x74\xcb\x58\x71\x30\x28\x3d\xf9\xc0\
-\xb0\x7a\xf5\x5e\x70\x6e\x78\xf1\xe4\x21\xc3\xef\xd7\x47\xfa\x80\
-\x96\x9f\x83\xa6\x76\xbc\x96\x83\x00\x40\x00\x31\x22\x37\x48\xe6\
-\xa6\x68\x0a\x70\x71\x33\xde\x0f\xce\xe3\x02\x05\x3f\xc3\x83\xa3\
-\xbf\x18\x6e\x5c\xff\xbe\xe7\xf0\xb5\x2f\x3b\xe5\x45\xd9\x44\x6d\
-\x74\x78\xb2\xb4\x7c\x39\x79\x98\x81\x8e\xf9\xf9\xe5\x1f\x03\x3b\
-\x0f\xa4\x24\xbf\x71\x95\x9b\xe1\xf5\x95\x3f\x0c\x92\x8a\xbf\x19\
-\xe6\x2e\x7e\x54\xd4\xb1\xfe\xc5\x16\xa8\xef\xbf\xe3\xb3\x1c\x64\
-\x37\x40\x00\xa1\x84\x00\x30\x41\x17\x9a\xd8\x31\x09\xb0\xfd\xfd\
-\xcd\x70\x79\xcf\x5f\x86\x2d\x87\x3e\xf6\x57\x2d\x7b\x02\xaa\x3e\
-\xdf\x01\xf1\xd7\x39\x99\x8a\x1f\xc4\xd4\x99\xda\xc4\x15\x99\x18\
-\xd8\x41\x25\xf9\x57\x60\x91\xf6\xf1\x3f\xc3\xff\x7b\xdf\x19\x4c\
-\x83\x79\x19\x3e\xdc\xff\xcb\x60\xa3\xc1\xeb\x76\xac\x55\x20\xfc\
-\xdf\x7f\x86\x73\xdf\x7e\xfc\xdb\xe8\xd6\x72\x6b\x1f\x34\xcf\x63\
-\x75\x08\x40\x00\xa1\x54\x46\xcc\x6c\xff\xe3\x55\x15\xff\x32\x7c\
-\x7a\xf2\x8b\xe1\xd4\xf9\x1f\x7b\xa0\x96\x83\x82\xf2\x11\xc8\x47\
-\xac\x8c\xcc\x0f\x3f\xbf\x06\x9a\xf5\xe5\x17\x18\x7f\x7d\xfe\x8b\
-\xe1\xd6\xb1\x7f\x0c\xf2\x4e\x5c\x0c\x1c\xc0\x1a\x9e\x5b\x98\x91\
-\xc1\x3a\x98\xcf\xc3\x32\x5d\xc0\x5c\xdb\x83\x3b\x53\x56\x85\x7d\
-\xc7\x8e\x6a\xf5\x69\xa0\x5a\x1b\x57\xc5\x07\x10\x40\x28\x82\x12\
-\xa2\xff\xe4\x19\xbe\xfe\x62\xf8\xf1\xe1\x37\xc3\xc3\x97\xbf\xef\
-\x02\x85\x3e\x00\xf1\x6b\x20\xfe\x0c\x8a\x4b\x66\x06\xe6\x08\x11\
-\x7e\x60\xb1\x0b\x54\xf3\xf9\xe5\x1f\x86\x33\x07\x19\xbe\x32\x73\
-\x31\x02\xab\x58\xa0\xe7\xbe\xff\x61\xe0\x05\x56\xb2\x02\xe2\x8c\
-\x60\x36\x88\xd6\x70\x66\x67\x50\xd6\x66\x4b\x59\x5d\xa8\xda\x0e\
-\xd4\xcf\x8b\xcd\x11\x00\x01\x84\x22\x20\xcc\x0b\xcc\xde\xdf\x7e\
-\x31\xfc\xfd\xfa\x87\x81\x89\x91\x59\x14\x5a\x5e\x83\xca\xd9\x7f\
-\xd3\xe2\x35\x12\x65\x25\xfe\xf8\x0a\xb0\xfd\x64\xf8\xf4\xea\x2f\
-\xc3\xf1\x63\xcc\x5f\xa7\x6e\x7f\x55\xf6\xe7\x37\xd0\xf2\x1f\xbf\
-\xe1\xf8\xf3\xfd\x5f\x0c\xef\xae\xfd\x02\xd3\x20\xbe\x8a\x29\x13\
-\x83\xb4\x24\x6b\x4e\xbc\xbd\xa8\x21\xd0\x1c\x4e\xf4\xa6\x1a\x40\
-\x00\xa1\xa4\x81\x07\x8f\x18\x19\xac\xd4\x7e\x31\x48\x02\x03\xcc\
-\x48\x91\x3b\xa8\xc6\x47\x99\x85\x99\x99\xf1\x26\x17\x1b\x93\x85\
-\x96\xec\x77\x5b\x73\xd5\x1f\x0c\x1f\x5e\x31\x33\x1c\xba\xcc\xfd\
-\x75\xc1\x81\xd7\x65\xeb\x4f\xbf\x3b\x5b\x1a\x01\x6c\x83\xfe\x80\
-\x54\xc1\x8f\xaf\x30\x30\x5c\xba\xfc\x0b\x98\x68\x3f\xef\x74\xd0\
-\xe6\x75\xd1\xd6\x61\x73\x97\xd5\x61\x60\x90\x57\x67\x60\x30\xbc\
-\xca\xed\xbf\xf0\xe0\xeb\xeb\x50\x4f\xfd\x85\xd9\x09\x10\x40\x28\
-\x0e\xb8\xfd\x8c\xf9\xe8\xcb\x67\xff\xad\xc5\xf9\x7e\x33\xf8\xe9\
-\xff\x62\xd0\x97\x62\xf5\x03\x89\x0b\x70\xff\x63\xe0\xe7\xfa\xcb\
-\xf0\xfe\x03\x2b\xc3\xde\xeb\xfc\x5f\x17\x1f\x7d\x5d\xb6\xe9\xec\
-\x3b\x70\x3e\x87\x84\x00\xb0\x10\x02\x46\xd2\xe5\x4b\xff\x2f\xfb\
-\xb4\xdf\x06\x05\xf7\xdb\xce\x0d\x2f\x36\x6c\xaf\x56\x9f\x25\x24\
-\xce\xe0\x28\x0a\x0c\x4b\x11\x5e\x36\x47\xa0\xf8\x54\x20\xfe\x88\
-\xec\x00\x80\x00\x42\x89\x82\x57\x1f\x7f\x95\x2f\x3a\x28\xf0\xf9\
-\xe5\x4b\x50\x8d\xfd\x9b\x41\x9e\xfb\x1b\x18\x73\xfe\xf9\xc5\x70\
-\xee\x2e\x17\xc3\xa6\xf3\x02\x2f\xe7\x1f\x7c\x03\xb2\xfc\x0c\xac\
-\x90\xf9\xf3\x0b\xe2\x80\x17\x0f\xff\x33\xec\xbb\xfc\x79\x3d\xb4\
-\xa6\x03\x25\xdc\x27\xcf\xdf\xfd\x59\x00\x12\x67\xfd\xfb\x87\x01\
-\xd8\x68\x06\xb5\x03\xb9\x80\x98\x15\xd9\x4e\x80\x00\x42\x09\x81\
-\x69\x07\x1e\x9c\x8a\xb1\x90\x09\x9a\xf0\x4d\xb8\x46\x4d\xe4\x9f\
-\x3d\x17\xfb\x3f\x06\x70\x79\xf0\x81\xed\xde\xb3\x8f\x3f\x76\xaf\
-\x3f\xfb\x78\xeb\x83\xd7\x3f\x40\x16\x83\x9c\xf8\x16\x94\x30\xff\
-\xfc\xf9\xf7\x11\x18\xd7\xfc\xbf\x80\x39\xfe\xfd\x97\x7f\xa0\x44\
-\xfb\x09\x9a\x68\x7f\x00\x13\xed\xf3\x5f\xdf\xff\x82\xd3\x02\x37\
-\x27\x33\xa8\xbf\xc0\x8e\x6e\x27\x40\x00\xa1\x97\x84\x7f\x96\x9c\
-\x78\x72\x04\x48\x47\x02\xb1\x10\xb4\xf9\x0c\xea\x60\xfc\x83\x96\
-\x68\x9f\xa0\x39\xe3\x33\xb4\x45\xf3\xff\xe1\x53\xa6\xcb\xc0\x10\
-\xb0\xe1\x01\x36\x31\x65\x85\x38\xf5\x81\x62\xeb\xa1\xea\x19\x80\
-\x2d\x74\x3b\x36\xc6\x3f\xe0\x10\xba\x76\xff\xdf\x65\x6c\x7d\x05\
-\x80\x00\x42\xcf\x16\xff\xa1\x16\x81\x8a\xd0\x87\xa0\x64\x01\xc4\
-\x37\x81\xf8\x16\x10\xdf\x85\x06\xfb\x07\xe4\x6e\x17\xd0\x73\x0f\
-\xdf\xbe\xfe\xcf\x20\xce\xf5\x93\x41\x51\x84\x25\x38\xcc\x4c\x1c\
-\x94\xda\xd9\xba\xc3\x55\x8d\x18\xfe\xfd\xcf\x95\xe5\xff\xc1\x00\
-\x92\xff\xf4\xed\xdf\x0b\xa8\xa3\xff\x21\x5b\x08\x10\x40\xd8\x2a\
-\xa3\xff\x50\x85\xbf\x89\xa9\xaa\xdf\x7f\xf9\xbb\xe4\xe2\x6d\xf6\
-\x68\x27\xad\x4f\x0c\x9e\x7a\x1f\x79\x7e\xfc\xe0\x5f\xa7\x23\xc5\
-\x77\x82\x87\xfd\xbf\xa6\x9f\xd1\x07\x7e\xb6\xbf\x7f\x19\x2e\xde\
-\xe6\x63\xb8\xf5\xfc\xfb\x51\x68\x0e\x40\x69\xb7\x03\x04\x10\x23\
-\x15\x3a\xa7\xac\x3d\x11\x6a\x07\xc3\x8d\xdf\x59\xca\x08\xfc\xc4\
-\x90\x7c\xfd\x85\x95\x61\xd6\x11\xc1\xcb\x35\x6b\xef\x66\x43\x43\
-\xf5\x05\x34\x04\xc1\x75\x01\x40\x00\x51\xa3\x6b\xf6\xe7\xc6\xb3\
-\x6f\xe9\xeb\xce\x09\x7e\x7e\xfc\x92\x19\x52\x26\x40\x31\x88\xbf\
-\xec\xa4\xd0\xd7\xb5\xa7\x5f\x75\x43\xb3\xdf\x47\xf4\x10\x00\x08\
-\x20\x6a\x84\x00\x38\x14\x82\x8c\x24\x0c\xd4\xc4\xb9\x6b\x55\x44\
-\xfe\xf9\x8a\x71\xff\x62\x78\xf5\x95\x8d\xe1\xda\x4b\x86\x3d\x7b\
-\xaf\xbf\x5d\x78\xf1\xf1\xa7\xeb\xd0\xf4\xf3\x16\x39\x6a\x41\x76\
-\x03\x04\x18\x00\x02\x25\xa9\xd2\x7a\x2a\xd4\xc0\x00\x00\x00\x00\
-\x49\x45\x4e\x44\xae\x42\x60\x82\
\x00\x00\x01\x45\
\x89\
\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@@ -39576,6 +40114,10 @@ qt_resource_name = "\
\x05\x30\x1a\xc7\
\x00\x61\
\x00\x64\x00\x64\x00\x5f\x00\x75\x00\x73\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x07\x01\x57\xa7\
+\x00\x70\
+\x00\x69\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
\x00\x0c\
\x07\x17\x80\x27\
\x00\x73\
@@ -39688,10 +40230,6 @@ qt_resource_name = "\
\x09\xf1\x8f\xc7\
\x00\x70\
\x00\x65\x00\x6e\x00\x63\x00\x69\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\
-\x00\x0c\
-\x07\xa0\x86\x47\
-\x00\x73\
-\x00\x65\x00\x70\x00\x61\x00\x72\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
\x00\x10\
\x01\xbc\x1f\x87\
\x00\x63\
@@ -39699,59 +40237,59 @@ qt_resource_name = "\
"
qt_resource_struct = "\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x29\x00\x00\x00\x01\
-\x00\x00\x00\x64\x00\x02\x00\x00\x00\x0b\x00\x00\x00\x2a\
-\x00\x00\x02\x9e\x00\x00\x00\x00\x00\x01\x00\x05\x41\x65\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x2a\x00\x00\x00\x01\
+\x00\x00\x00\x64\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x2b\
+\x00\x00\x02\xb2\x00\x00\x00\x00\x00\x01\x00\x05\x6b\x81\
\x00\x00\x00\xd2\x00\x00\x00\x00\x00\x01\x00\x01\xb4\xc7\
\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x01\x00\x01\x94\xf2\
-\x00\x00\x03\x8a\x00\x00\x00\x00\x00\x01\x00\x08\x45\xe6\
+\x00\x00\x03\x9e\x00\x00\x00\x00\x00\x01\x00\x08\x70\x02\
\x00\x00\x02\x28\x00\x00\x00\x00\x00\x01\x00\x03\xab\x35\
\x00\x00\x01\xe6\x00\x00\x00\x00\x00\x01\x00\x02\x85\xe3\
\x00\x00\x02\x02\x00\x00\x00\x00\x00\x01\x00\x03\x9b\xb3\
\x00\x00\x00\xee\x00\x00\x00\x00\x00\x01\x00\x01\xba\x17\
\x00\x00\x01\x9a\x00\x00\x00\x00\x00\x01\x00\x02\x53\xc2\
-\x00\x00\x03\xe2\x00\x00\x00\x00\x00\x01\x00\x08\x71\xde\
+\x00\x00\x03\xf6\x00\x00\x00\x00\x00\x01\x00\x08\x9b\xfa\
\x00\x00\x01\xd0\x00\x00\x00\x00\x00\x01\x00\x02\x72\x55\
-\x00\x00\x04\x3a\x00\x00\x00\x00\x00\x01\x00\x08\xa0\x93\
-\x00\x00\x04\x20\x00\x00\x00\x00\x00\x01\x00\x08\x97\x65\
+\x00\x00\x04\x4e\x00\x00\x00\x00\x00\x01\x00\x08\xca\xaf\
+\x00\x00\x04\x34\x00\x00\x00\x00\x00\x01\x00\x08\xc1\x81\
\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x63\x53\
\x00\x00\x01\x10\x00\x00\x00\x00\x00\x01\x00\x01\xc2\x56\
\x00\x00\x02\x46\x00\x00\x00\x00\x00\x01\x00\x03\xb2\x4a\
-\x00\x00\x02\x64\x00\x00\x00\x00\x00\x01\x00\x03\xcc\xe5\
-\x00\x00\x04\x50\x00\x00\x00\x00\x00\x01\x00\x08\xaf\x3f\
-\x00\x00\x04\x50\x00\x00\x00\x00\x00\x01\x00\x08\xb5\x7e\
-\x00\x00\x03\xc0\x00\x00\x00\x00\x00\x01\x00\x08\x69\xfd\
-\x00\x00\x03\x46\x00\x00\x00\x00\x00\x01\x00\x06\xc9\xc4\
+\x00\x00\x02\x5a\x00\x00\x00\x00\x00\x01\x00\x03\xdc\x66\
+\x00\x00\x02\x78\x00\x00\x00\x00\x00\x01\x00\x03\xf7\x01\
+\x00\x00\x04\x64\x00\x00\x00\x00\x00\x01\x00\x08\xd9\x5b\
+\x00\x00\x04\x64\x00\x00\x00\x00\x00\x01\x00\x08\xdf\x9a\
+\x00\x00\x03\xd4\x00\x00\x00\x00\x00\x01\x00\x08\x94\x19\
+\x00\x00\x03\x5a\x00\x00\x00\x00\x00\x01\x00\x06\xf3\xe0\
\x00\x00\x01\x7e\x00\x00\x00\x00\x00\x01\x00\x02\x4d\x82\
\x00\x00\x00\xba\x00\x00\x00\x00\x00\x01\x00\x01\xa2\x69\
-\x00\x00\x03\xaa\x00\x00\x00\x00\x00\x01\x00\x08\x5a\x26\
-\x00\x00\x03\x0e\x00\x00\x00\x00\x00\x01\x00\x06\xbe\x78\
+\x00\x00\x03\xbe\x00\x00\x00\x00\x00\x01\x00\x08\x84\x42\
+\x00\x00\x03\x22\x00\x00\x00\x00\x00\x01\x00\x06\xe8\x94\
\x00\x00\x01\xb2\x00\x00\x00\x00\x00\x01\x00\x02\x56\x3b\
-\x00\x00\x02\x76\x00\x00\x00\x00\x00\x01\x00\x03\xd3\x4a\
-\x00\x00\x03\x62\x00\x00\x00\x00\x00\x01\x00\x06\xd7\xc3\
-\x00\x00\x02\xf6\x00\x00\x00\x00\x00\x01\x00\x05\xa3\x68\
+\x00\x00\x02\x8a\x00\x00\x00\x00\x00\x01\x00\x03\xfd\x66\
+\x00\x00\x03\x76\x00\x00\x00\x00\x00\x01\x00\x07\x01\xdf\
+\x00\x00\x03\x0a\x00\x00\x00\x00\x00\x01\x00\x05\xcd\x84\
\x00\x00\x01\x26\x00\x00\x00\x00\x00\x01\x00\x01\xc8\xbd\
-\x00\x00\x04\x00\x00\x00\x00\x00\x00\x01\x00\x08\x91\xf0\
+\x00\x00\x04\x14\x00\x00\x00\x00\x00\x01\x00\x08\xbc\x0c\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x00\x88\x00\x00\x00\x00\x00\x01\x00\x01\x8c\x5a\
-\x00\x00\x03\x28\x00\x00\x00\x00\x00\x01\x00\x06\xc4\x9b\
+\x00\x00\x03\x3c\x00\x00\x00\x00\x00\x01\x00\x06\xee\xb7\
\x00\x00\x00\x50\x00\x00\x00\x00\x00\x01\x00\x01\x19\xe2\
\x00\x00\x01\x40\x00\x00\x00\x00\x00\x01\x00\x01\xd0\xc0\
\x00\x00\x01\x5e\x00\x00\x00\x00\x00\x01\x00\x01\xe1\xff\
\x00\x00\x00\x74\x00\x00\x00\x00\x00\x01\x00\x01\x31\x6a\
\x00\x00\x00\x3a\x00\x00\x00\x00\x00\x01\x00\x01\x12\x63\
-\x00\x00\x02\xd6\x00\x00\x00\x00\x00\x01\x00\x05\x93\x1f\
-\x00\x00\x04\xd0\x00\x00\x00\x00\x00\x01\x00\x09\x2a\x9a\
-\x00\x00\x05\x8a\x00\x00\x00\x00\x00\x01\x00\x09\x9a\xd1\
-\x00\x00\x04\xa4\x00\x00\x00\x00\x00\x01\x00\x09\x11\x4d\
-\x00\x00\x05\x02\x00\x00\x00\x00\x00\x01\x00\x09\x35\x91\
-\x00\x00\x04\x66\x00\x00\x00\x00\x00\x01\x00\x08\xbb\xbd\
-\x00\x00\x05\x6c\x00\x00\x00\x00\x00\x01\x00\x09\x92\x54\
-\x00\x00\x04\xea\x00\x00\x00\x00\x00\x01\x00\x09\x34\x5f\
-\x00\x00\x05\x38\x00\x00\x00\x00\x00\x01\x00\x09\x41\x69\
-\x00\x00\x05\x52\x00\x00\x00\x00\x00\x01\x00\x09\x52\x6e\
-\x00\x00\x05\x1a\x00\x00\x00\x00\x00\x01\x00\x09\x3e\xac\
-\x00\x00\x04\x86\x00\x00\x00\x00\x00\x01\x00\x09\x00\x34\
+\x00\x00\x02\xea\x00\x00\x00\x00\x00\x01\x00\x05\xbd\x3b\
+\x00\x00\x04\xe4\x00\x00\x00\x00\x00\x01\x00\x09\x54\xb6\
+\x00\x00\x05\x80\x00\x00\x00\x00\x00\x01\x00\x09\xbc\x70\
+\x00\x00\x04\xb8\x00\x00\x00\x00\x00\x01\x00\x09\x3b\x69\
+\x00\x00\x05\x16\x00\x00\x00\x00\x00\x01\x00\x09\x5f\xad\
+\x00\x00\x04\x7a\x00\x00\x00\x00\x00\x01\x00\x08\xe5\xd9\
+\x00\x00\x04\xfe\x00\x00\x00\x00\x00\x01\x00\x09\x5e\x7b\
+\x00\x00\x05\x4c\x00\x00\x00\x00\x00\x01\x00\x09\x6b\x85\
+\x00\x00\x05\x66\x00\x00\x00\x00\x00\x01\x00\x09\x7c\x8a\
+\x00\x00\x05\x2e\x00\x00\x00\x00\x00\x01\x00\x09\x68\xc8\
+\x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x09\x2a\x50\
"
def qInitResources():
diff --git a/src/openmolar/qt4gui/schema_updater.py b/src/openmolar/qt4gui/schema_updater.py
index c7d3f98..64fd420 100644
--- a/src/openmolar/qt4gui/schema_updater.py
+++ b/src/openmolar/qt4gui/schema_updater.py
@@ -1,14 +1,26 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 2 of the License, or
-# version 3 of the License, or (at your option) any later version. It is
-# provided for educational purposes and is distributed in the hope that
-# it will be useful, but WITHOUT ANY WARRANTY; without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
-# the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module is called when the schema is found to be out of date
@@ -24,31 +36,32 @@ from openmolar.dbtools import schema_version
LOGGER = logging.getLogger("openmolar")
-MESSAGE = "<h3>%s</h3>%s<br />%s {OLD} %s {NEW}<hr />%s<br /><b>%s</b>" %(
-_("Update required"),
-_("Your Openmolar database schema is out of date "
-"for this version of the client."),
-("Your database is at version"),
-("The required version is"),
-_("Would you like to Upgrade Now?"),
-_("WARNING - PLEASE ENSURE ALL OTHER STATIONS ARE LOGGED OFF")
+MESSAGE = "<h3>%s</h3>%s<br />%s {OLD} %s {NEW}<hr />%s<br /><b>%s</b>" % (
+ _("Update required"),
+ _("Your Openmolar database schema is out of date "
+ "for this version of the client."),
+ ("Your database is at version"),
+ ("The required version is"),
+ _("Would you like to Upgrade Now?"),
+ _("WARNING - PLEASE ENSURE ALL OTHER STATIONS ARE LOGGED OFF")
)
ABORT_MESSAGE = _('Sorry, you cannot run this version of the '
-'openmolar client without updating your database schema.')
-
-FAILURE_MESSAGE = "<p>%s</p><p>%s</p><p>%s></p>" %(
-_("Sorry, we seem unable to update your schema at this point, "
-"Perhaps you have grabbed a development version of the program?"),
-("If so, please revert to a release version."),
-_("If this is not the case, something odd has happened, "
-"please let the developers of openmolar know ASAP.")
+ 'openmolar client without updating your database schema.')
+
+FAILURE_MESSAGE = "<p>%s</p><p>%s</p><p>%s></p>" % (
+ _("Sorry, we seem unable to update your schema at this point, "
+ "Perhaps you have grabbed a development version of the program?"),
+ ("If so, please revert to a release version."),
+ _("If this is not the case, something odd has happened, "
+ "please let the developers of openmolar know ASAP.")
)
class UserQuit(Exception):
pass
+
def proceed():
'''
on to the main gui.
@@ -57,10 +70,13 @@ def proceed():
localsettings.loadFeeTables()
sys.exit(maingui.main(QtGui.QApplication.instance()))
+
def user_quit():
- raise UserQuit, "user has quit the update"
+ raise UserQuit("user has quit the update")
+
class SchemaUpdater(object):
+
def __init__(self):
self.pb = QtGui.QProgressDialog()
self.pb.canceled.connect(user_quit)
@@ -68,11 +84,15 @@ class SchemaUpdater(object):
required = localsettings.CLIENT_SCHEMA_VERSION
self.current = schema_version.getVersion()
- message = MESSAGE.replace("{OLD}",self.current).replace("{NEW}", required)
+ message = MESSAGE.replace(
+ "{OLD}",
+ self.current).replace(
+ "{NEW}",
+ required)
if QtGui.QMessageBox.question(None, "Update Schema",
- message, QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
+ message, QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
self.pb.setWindowTitle("openMolar")
self.pb.show()
else:
@@ -87,35 +107,35 @@ class SchemaUpdater(object):
self.completed(False, FAILURE_MESSAGE)
def updateProgress(self, arg, message):
- LOGGER.info("%s %s"% (arg, message))
+ LOGGER.info("%s %s" % (arg, message))
self.pb.setLabelText(message)
self.pb.setValue(arg)
QtGui.QApplication.instance().processEvents()
def apply_update(self):
self.updateProgress(1,
- "%s %s"% (_("upgrading to schema version"), self.next_version))
+ "%s %s" % (_("upgrading to schema version"), self.next_version))
QtCore.QObject.connect(self.dbu,
- QtCore.SIGNAL("progress"), self.updateProgress)
+ QtCore.SIGNAL("progress"), self.updateProgress)
QtCore.QObject.connect(self.dbu,
- QtCore.SIGNAL("completed"), self.completed)
+ QtCore.SIGNAL("completed"), self.completed)
try:
if self.dbu.run():
localsettings.DB_SCHEMA_VERSION = self.next_version
else:
self.completed(False,
- _('Conversion to %s failed')% self.next_version)
+ _('Conversion to %s failed') % self.next_version)
except UserQuit:
LOGGER.warning("user quit the database upgrade")
completed(False, "Schema Upgrade Halted")
except Exception as exc:
LOGGER.exception("unexpected exception")
- #fatal error!
+ # fatal error!
completed(False, ('Unexpected Error updating the schema '
- 'please file a bug at http:www.openmolar.com'))
+ 'please file a bug at http:www.openmolar.com'))
def completed(self, sucess, message):
def accept():
@@ -127,106 +147,106 @@ class SchemaUpdater(object):
m.setStandardButtons(QtGui.QMessageBox.NoButton)
m.setWindowTitle(_("OpenMolar"))
m.setModal(False)
- QtCore.QTimer.singleShot(3*1000, accept)
+ QtCore.QTimer.singleShot(3 * 1000, accept)
m.exec_()
m.move(0, 0)
else:
- LOGGER.warning("failure - %s"% message)
- QtGui.QMessageBox.warning(self.pb, "Failure", message )
+ LOGGER.warning("failure - %s" % message)
+ QtGui.QMessageBox.warning(self.pb, "Failure", message)
QtGui.QApplication.instance().closeAllWindows()
sys.exit("FAILED TO UPGRADE SCHEMA")
def apply_updates(self):
- ##################### UPDATE TO SCHEMA 1.1 ########################
+ # UPDATE TO SCHEMA 1.1 ########################
self.next_version = "1.1"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema1_0to1_1 as upmod
self.dbu = upmod.dbUpdater(self.pb)
self.apply_update()
- ##################### UPDATE TO SCHEMA 1.2 ########################
+ # UPDATE TO SCHEMA 1.2 ########################
self.next_version = "1.2"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema1_1to1_2 as upmod
self.dbu = upmod.dbUpdater(self.pb)
self.apply_update()
- ##################### UPDATE TO SCHEMA 1.3 ########################
+ # UPDATE TO SCHEMA 1.3 ########################
self.next_version = "1.3"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema1_2to1_3 as upmod
self.dbu = upmod.dbUpdater(self.pb)
self.apply_update()
- ##################### UPDATE TO SCHEMA 1.4 ########################
+ # UPDATE TO SCHEMA 1.4 ########################
self.next_version = "1.4"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema1_3to1_4 as upmod
self.dbu = upmod.dbUpdater(self.pb)
self.apply_update()
- ##################### UPDATE TO SCHEMA 1.5 ########################
+ # UPDATE TO SCHEMA 1.5 ########################
self.next_version = "1.5"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema1_4to1_5 as upmod
self.dbu = upmod.dbUpdater(self.pb)
self.apply_update()
- ##################### UPDATE TO SCHEMA 1.6 ########################
+ # UPDATE TO SCHEMA 1.6 ########################
self.next_version = "1.6"
if self.current < self.next_version:
self.apply_update()
- ##################### UPDATE TO SCHEMA 1.7 ########################
+ # UPDATE TO SCHEMA 1.7 ########################
self.next_version = "1.7"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema1_6to1_7 as upmod
self.dbu = upmod.dbUpdater(self.pb)
self.apply_update()
- ##################### UPDATE TO SCHEMA 1.8 ########################
+ # UPDATE TO SCHEMA 1.8 ########################
self.next_version = "1.8"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema1_7to1_8 as upmod
self.dbu = upmod.dbUpdater(self.pb)
self.apply_update()
- ##################### UPDATE TO SCHEMA 1.9 ########################
+ # UPDATE TO SCHEMA 1.9 ########################
self.next_version = "1.9"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema1_8to1_9 as upmod
self.dbu = upmod.dbUpdater(self.pb)
self.apply_update()
- ##################### UPDATE TO SCHEMA 2.0 ########################
+ # UPDATE TO SCHEMA 2.0 ########################
self.next_version = "2.0"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema1_9to2_0 as upmod
self.dbu = upmod.dbUpdater(self.pb)
self.apply_update()
- ##################### UPDATE TO SCHEMA 2.1 ########################
+ # UPDATE TO SCHEMA 2.1 ########################
self.next_version = "2.1"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema2_0to2_1 as upmod
self.dbu = upmod.dbUpdater(self.pb)
self.apply_update()
- ##################### UPDATE TO SCHEMA 2.2 ########################
+ # UPDATE TO SCHEMA 2.2 ########################
self.next_version = "2.2"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema2_1to2_2 as upmod
self.dbu = upmod.dbUpdater(self.pb)
self.apply_update()
- ##################### UPDATE TO SCHEMA 2.3 ########################
+ # UPDATE TO SCHEMA 2.3 ########################
self.next_version = "2.3"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema2_2to2_3 as upmod
self.dbu = upmod.dbUpdater(self.pb)
self.apply_update()
- ##################### UPDATE TO SCHEMA 2.4 ########################
+ # UPDATE TO SCHEMA 2.4 ########################
self.next_version = "2.4"
if self.current < self.next_version:
from openmolar.schema_upgrades import schema2_3to2_4 as upmod
@@ -247,18 +267,19 @@ if __name__ == "__main__":
LOGGER.debug("starting schema_updater")
import os
- def determine_path ():
+
+ def determine_path():
"""Borrowed from wxglade.py"""
try:
root = __file__
- if os.path.islink (root):
- root = os.path.realpath (root)
- retarg = os.path.dirname (os.path.abspath (root))
+ if os.path.islink(root):
+ root = os.path.realpath(root)
+ retarg = os.path.dirname(os.path.abspath(root))
return retarg
except:
print "I'm sorry, but something is wrong."
print "There is no __file__ variable. Please contact the author."
- sys.exit ()
+ sys.exit()
wkdir = determine_path()
sys.path.append(os.path.dirname(wkdir))
diff --git a/src/openmolar/qt4gui/tools/__init__.py b/src/openmolar/qt4gui/tools/__init__.py
index e69de29..c701215 100644
--- a/src/openmolar/qt4gui/tools/__init__.py
+++ b/src/openmolar/qt4gui/tools/__init__.py
@@ -0,0 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/openmolar/qt4gui/tools/apptTools.py b/src/openmolar/qt4gui/tools/apptTools.py
index 96accb8..30b0643 100644
--- a/src/openmolar/qt4gui/tools/apptTools.py
+++ b/src/openmolar/qt4gui/tools/apptTools.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from PyQt4 import QtGui, QtCore
@@ -16,11 +33,12 @@ from openmolar.dbtools import extend_books, db_settings
class apptTools(Ui_apptTools.Ui_MainWindow):
+
def __init__(self, parent=None):
self.parent = parent
self.setupUi(parent)
self.signals()
-
+
def advise(self, arg, warning_level=1):
'''
inform the user of events -
@@ -29,68 +47,69 @@ class apptTools(Ui_apptTools.Ui_MainWindow):
warning level 2 critical (and logged)
'''
if warning_level == 0:
- self.statusbar.showMessage(arg, 5000) #5000 milliseconds=5secs
+ self.statusbar.showMessage(arg, 5000) # 5000 milliseconds=5secs
elif warning_level == 1:
QtGui.QMessageBox.information(self.parent, _("Advisory"), arg)
elif warning_level == 2:
- now=QtCore.QTime.currentTime()
+ now = QtCore.QTime.currentTime()
QtGui.QMessageBox.warning(self.parent, _("Error"), arg)
#--for logging purposes
- print "%d:%02d ERROR MESSAGE"%(now.hour(), now.minute()), arg
-
+ print "%d:%02d ERROR MESSAGE" % (now.hour(), now.minute()), arg
+
def openDay(self):
print "openDay called"
- Dialog=QtGui.QDialog(self.parent)
- dl=apptOpenDay.apptDialog(Dialog)
+ Dialog = QtGui.QDialog(self.parent)
+ dl = apptOpenDay.apptDialog(Dialog)
if dl.exec_():
print "openDay returned True"
else:
print "openDay returned False"
-
+
def extendBooks(self):
print "extending books"
-
- message = "%s %s %s %s"%( _("Books Currently end on"),
- localsettings.formatDate(localsettings.bookEnd),"<br />",
- _("extend the books now?"))
-
- result = QtGui.QMessageBox.question(self.parent, _("Confirm"),
- message,QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes )
-
+
+ message = "%s %s %s %s" % (_("Books Currently end on"),
+ localsettings.formatDate(
+ localsettings.bookEnd), "<br />",
+ _("extend the books now?"))
+
+ result = QtGui.QMessageBox.question(self.parent, _("Confirm"),
+ message, QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes)
+
if result == QtGui.QMessageBox.No:
return
else:
- months, result = QtGui.QInputDialog.getInteger(self.parent,
- _("Extend Books"), _("How many months?"))
-
+ months, result = QtGui.QInputDialog.getInteger(self.parent,
+ _("Extend Books"), _("How many months?"))
+
if result:
-
+
newBookEnd = QtCore.QDate(
- localsettings.bookEnd).addMonths(months).toPyDate()
-
+ localsettings.bookEnd).addMonths(months).toPyDate()
+
if extend_books.extend(localsettings.apptix.values(),
- localsettings.bookEnd, newBookEnd):
- #now put this date into the settings database.
-
- db_format= "%s,%s,%s"% newBookEnd.timetuple()[:3]
+ localsettings.bookEnd, newBookEnd):
+ # now put this date into the settings database.
+
+ db_format = "%s,%s,%s" % newBookEnd.timetuple()[:3]
db_settings.insertData(
- "bookend", db_format, localsettings.operator)
-
+ "bookend", db_format, localsettings.operator)
+
def removeOld(self):
'''
throw the old diaries away now?
'''
print "removing old weeks"
self.advise(_("not yet implemented"))
-
+
def editWeeks(self):
'''
edit the working hours for a standard week for a dentist/hygenist
'''
print "editing weeks"
self.advise(_("not yet implemented"))
-
+
def blocks(self):
'''
insert blocks and appointments
@@ -99,27 +118,26 @@ class apptTools(Ui_apptTools.Ui_MainWindow):
Dialog = QtGui.QDialog(self.parent)
dl = block_wizard.blocker(Dialog)
Dialog.exec_()
-
-
+
def signals(self):
'''
connect signals
'''
QtCore.QObject.connect(self.openDay_pushButton,
- QtCore.SIGNAL("clicked()"), self.openDay)
-
+ QtCore.SIGNAL("clicked()"), self.openDay)
+
QtCore.QObject.connect(self.extendBook_pushButton,
- QtCore.SIGNAL("clicked()"), self.extendBooks)
-
+ QtCore.SIGNAL("clicked()"), self.extendBooks)
+
QtCore.QObject.connect(self.editWeeks_pushButton,
- QtCore.SIGNAL("clicked()"), self.editWeeks)
+ QtCore.SIGNAL("clicked()"), self.editWeeks)
QtCore.QObject.connect(self.removeOld_pushButton,
- QtCore.SIGNAL("clicked()"), self.removeOld)
-
+ QtCore.SIGNAL("clicked()"), self.removeOld)
+
QtCore.QObject.connect(self.blocks_pushButton,
- QtCore.SIGNAL("clicked()"), self.blocks)
-
+ QtCore.SIGNAL("clicked()"), self.blocks)
+
if __name__ == "__main__":
localsettings.initiate()
import sys
@@ -128,4 +146,3 @@ if __name__ == "__main__":
ui = apptTools(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/qt4gui/tools/new_setup.py b/src/openmolar/qt4gui/tools/new_setup.py
index 51baeb9..d6e8ddc 100644
--- a/src/openmolar/qt4gui/tools/new_setup.py
+++ b/src/openmolar/qt4gui/tools/new_setup.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import datetime
import re
@@ -13,13 +30,15 @@ from xml.dom import minidom
from openmolar.settings import localsettings
from openmolar.qt4gui.compiled_uis import Ui_initialise
-PRACTICE_ATTRIBS = ("name","add1","add2","add3", "town", "county",
-"pcde_zip", "tel", "fax", "web", "email")
+PRACTICE_ATTRIBS = ("name", "add1", "add2", "add3", "town", "county",
+ "pcde_zip", "tel", "fax", "web", "email")
USER_ATTRIBS = ("user_id", "user_inits", "user_name", 'user_group',
-'active', 'deactivation_dt')
+ 'active', 'deactivation_dt')
+
class om_user():
+
def __init__(self, parent_ui):
self.id = None
self.inits = ""
@@ -28,15 +47,15 @@ class om_user():
self.deactivation_dt = None
self.active = False
self.parent_ui = parent_ui
-
+
def toTuple(self):
'''
- changes the class to a tuple of xml friendly attribs, consistent with
+ changes the class to a tuple of xml friendly attribs, consistent with
the USER_ATTRIBS expected
'''
- return (str(self.id), self.inits.upper(), self.name, self.group,
- str(self.active), str(self.deactivation_dt))
-
+ return (str(self.id), self.inits.upper(), self.name, self.group,
+ str(self.active), str(self.deactivation_dt))
+
def fromTuple(self, tup):
'''
reloads the values from a tuple
@@ -48,9 +67,9 @@ class om_user():
self.active = tup[4] == "True"
if not self.active:
da = tup[5].split("-")
- self.deactivation_dt = datetime.date(int(da[0]), int(da[1]),
- int(da[2]))
-
+ self.deactivation_dt = datetime.date(int(da[0]), int(da[1]),
+ int(da[2]))
+
def load(self):
'''
grab the user entered values
@@ -58,10 +77,10 @@ class om_user():
self.inits = str(self.parent_ui.userInits_lineEdit.text().toAscii())
self.name = str(self.parent_ui.userName_lineEdit.text().toAscii())
self.group = str(
- self.parent_ui.userGroup_comboBox.currentText().toAscii())
+ self.parent_ui.userGroup_comboBox.currentText().toAscii())
self.deactivation_dt = self.parent_ui.user_dateEdit.date().toPyDate()
self.active = self.parent_ui.userActive_checkBox.isChecked()
-
+
def verifies(self):
'''
check the data for integrity, return (True,"") if ok
@@ -69,10 +88,10 @@ class om_user():
'''
error = ""
if self.inits == "":
- error = "<p>%s</p>"% _("Please enter initials for this user")
+ error = "<p>%s</p>" % _("Please enter initials for this user")
if self.name == "":
- error += "<p>%s</p>"% _("Please set a name for this user")
-
+ error += "<p>%s</p>" % _("Please set a name for this user")
+
return (error == "", error)
def toNode(self):
@@ -90,7 +109,7 @@ class om_user():
unode.appendChild(c)
i += 1
return unode
-
+
def fromNode(self, unode):
'''
creates an instance from existing xml
@@ -106,14 +125,17 @@ class om_user():
except IndexError:
value = None
tup.append(value)
-
- self.fromTuple(tuple(tup))
-
+
+ self.fromTuple(tuple(tup))
+
+
class setup_gui(QtGui.QMainWindow):
+
'''
a ui for customising the database of openmolar
set details for a practice, patient categories etc...
'''
+
def __init__(self, app):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_initialise.Ui_MainWindow()
@@ -125,7 +147,7 @@ class setup_gui(QtGui.QMainWindow):
self.template.appendChild(self.template.createElement("template"))
self.ui.user_dateEdit.setDate(QtCore.QDate.currentDate())
self.ui.user_dateEdit.hide()
- self.ui.user_date_label.hide()
+ self.ui.user_date_label.hide()
self.ui.user_groupBox.hide()
self.ui.modifyUser_pushButton.hide()
self.signals()
@@ -138,25 +160,26 @@ class setup_gui(QtGui.QMainWindow):
warning level 2 critical (and logged)
'''
if warning_level == 0:
- self.ui.statusbar.showMessage(arg, 5000) #5000 milliseconds=5secs
+ self.ui.statusbar.showMessage(arg, 5000) # 5000 milliseconds=5secs
elif warning_level == 1:
QtGui.QMessageBox.information(self, _("Advisory"), arg)
elif warning_level == 2:
- now=QtCore.QTime.currentTime()
+ now = QtCore.QTime.currentTime()
QtGui.QMessageBox.warning(self, _("Error"), arg)
#--for logging purposes
- print "%d:%02d ERROR MESSAGE"%(now.hour(), now.minute()), arg
+ print "%d:%02d ERROR MESSAGE" % (now.hour(), now.minute()), arg
def confirmDataOverwrite(self):
'''
check that the user is prepared to lose any changes
'''
result = QtGui.QMessageBox.question(self, _("confirm"),
- "<p>%s<br />%s</p>"% (
- _("this action will overwrite any current data stored"),
- _("proceed?")),
- QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
- QtGui.QMessageBox.Ok )
+ "<p>%s<br />%s</p>" % (
+ _(
+ "this action will overwrite any current data stored"),
+ _("proceed?")),
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Ok)
return result == QtGui.QMessageBox.Ok
def save_template(self):
@@ -165,8 +188,9 @@ class setup_gui(QtGui.QMainWindow):
'''
try:
filepath = QtGui.QFileDialog.getSaveFileName(self,
- _("save template file"),"",
- _("openmolar template files ")+"(*.om_xml)")
+ _(
+ "save template file"), "",
+ _("openmolar template files ") + "(*.om_xml)")
if filepath != '':
if not re.match(".*\.om_xml$", filepath):
filepath += ".om_xml"
@@ -176,8 +200,8 @@ class setup_gui(QtGui.QMainWindow):
self.advise(_("Template Saved"), 1)
else:
self.advise(_("operation cancelled"), 1)
- except Exception, e:
- self.advise(_("Template not saved")+" - %s"% e, 2)
+ except Exception as e:
+ self.advise(_("Template not saved") + " - %s" % e, 2)
def load_template(self):
'''
@@ -186,16 +210,17 @@ class setup_gui(QtGui.QMainWindow):
if not self.confirmDataOverwrite():
return
filename = QtGui.QFileDialog.getOpenFileName(self,
- _("load an existing template file"),"",
- _("openmolar template files")+" (*.om_xml)")
-
+ _(
+ "load an existing template file"), "",
+ _("openmolar template files") + " (*.om_xml)")
+
if filename != '':
try:
self.template = minidom.parse(str(filename))
- self.advise(_("template loaded sucessfully"),1)
+ self.advise(_("template loaded sucessfully"), 1)
self.tab_navigated(self.ui.tabWidget.currentIndex(), False)
- except Exception, e:
- self.advise(_("error parsing template file")+" - %s"% e, 2)
+ except Exception as e:
+ self.advise(_("error parsing template file") + " - %s" % e, 2)
else:
self.advise(_("operation cancelled"), 1)
@@ -205,20 +230,20 @@ class setup_gui(QtGui.QMainWindow):
current tab is i
previous tab stored in self.previousTabIndex
'''
- if updateTemplate:
- #always true unless called following a load from file
+ if updateTemplate:
+ # always true unless called following a load from file
if self.previousTabIndex == 1:
self.save_addy()
- if i == 1: #practice addy
+ if i == 1: # practice addy
self.load_addy()
- elif i == 2: #users
+ elif i == 2: # users
self.load_users()
- elif i == 9: #XML viewer
+ elif i == 9: # XML viewer
self.ui.xml_label.setText(self.template.toprettyxml())
self.previousTabIndex = i
-
+
def blankdb_radioButton(self, i):
'''
user has altered the state of the newdb from template checkbox
@@ -240,11 +265,11 @@ class setup_gui(QtGui.QMainWindow):
d = self.template.getElementsByTagName("practice")
if d:
d[0].parentNode.removeChild(d[0])
- foundText = False # a bool to prevent unnecessary nodes
+ foundText = False # a bool to prevent unnecessary nodes
d = self.template.createElement("practice")
i = 0
for widg in self.ui.practice_frame.children():
- if type(widg) == QtGui.QLineEdit:
+ if isinstance(widg, QtGui.QLineEdit):
attrib = PRACTICE_ATTRIBS[i]
value = str(widg.text().toAscii())
if value != "":
@@ -252,11 +277,11 @@ class setup_gui(QtGui.QMainWindow):
new_element = self.template.createElement(attrib)
d.appendChild(new_element)
new_element.appendChild(
- self.template.createTextNode(value))
+ self.template.createTextNode(value))
i += 1
if foundText:
self.template.childNodes[0].appendChild(d)
-
+
def load_addy(self):
'''
load the practice address
@@ -264,11 +289,11 @@ class setup_gui(QtGui.QMainWindow):
d = self.template.getElementsByTagName("practice")
i = 0
for widg in self.ui.practice_frame.children():
- if type(widg) == QtGui.QLineEdit:
+ if isinstance(widg, QtGui.QLineEdit):
attrib = PRACTICE_ATTRIBS[i]
try:
value = \
- d[0].getElementsByTagName(attrib)[0].firstChild.data
+ d[0].getElementsByTagName(attrib)[0].firstChild.data
except IndexError:
value = ""
widg.setText(value)
@@ -292,7 +317,7 @@ class setup_gui(QtGui.QMainWindow):
user has clicked the button to add a new user
'''
if self.ui.newUser_pushButton.text() in (
- _("Apply Now"), _("Modify Now")) :
+ _("Apply Now"), _("Modify Now")):
user = om_user(self.ui)
user.load()
result, error = user.verifies()
@@ -305,20 +330,20 @@ class setup_gui(QtGui.QMainWindow):
if self.ui.newUser_pushButton.text() == _("Modify Now"):
selected = self.ui.users_tableWidget.currentItem().row()
d.removeChild(d.childNodes[selected])
- self.ui.users_tableWidget.setCurrentCell(-1,-1)
+ self.ui.users_tableWidget.setCurrentCell(-1, -1)
self.ui.modifyUser_pushButton.hide()
-
+
d.appendChild(user.toNode())
self.template.childNodes[0].appendChild(d)
self.ui.user_groupBox.hide()
self.ui.userName_lineEdit.setText("")
self.ui.userGroup_comboBox.setCurrentIndex(0)
self.ui.newUser_pushButton.setText(_("Add New User"))
-
+
self.tab_navigated(self.ui.tabWidget.currentIndex(), False)
else:
- self.advise(error,1)
-
+ self.advise(error, 1)
+
else:
self.ui.users_tableWidget.setCurrentCell(-1, -1)
self.ui.user_groupBox.show()
@@ -334,7 +359,7 @@ class setup_gui(QtGui.QMainWindow):
self.ui.modifyUser_pushButton.show()
else:
self.ui.modifyUser_pushButton.hide()
-
+
def modifyUser(self):
'''
modify user pushButton ha been pressed
@@ -355,15 +380,14 @@ class setup_gui(QtGui.QMainWindow):
self.ui.user_dateEdit.setDate(user.deactivation_dt)
except TypeError:
self.ui.user_dateEdit.setDate(QtCore.QDate.currentDate())
-
-
+
def handleUserActive(self, arg):
'''
hide/show the deactivation date
'''
self.ui.user_dateEdit.setVisible(not arg)
self.ui.user_date_label.setVisible(not arg)
-
+
def load_users(self):
'''
populate the user table from the template
@@ -380,45 +404,47 @@ class setup_gui(QtGui.QMainWindow):
self.ui.users_tableWidget.setItem(rowno, colno, item)
colno += 1
rowno += 1
-
+
def signals(self):
'''
set up signals/slots
'''
QtCore.QObject.connect(self.ui.action_Save_Template,
- QtCore.SIGNAL("triggered()"), self.save_template)
+ QtCore.SIGNAL("triggered()"), self.save_template)
QtCore.QObject.connect(self.ui.actionLoad_Template,
- QtCore.SIGNAL("triggered()"), self.load_template)
-
+ QtCore.SIGNAL("triggered()"), self.load_template)
+
QtCore.QObject.connect(self.ui.blankdb_radioButton,
- QtCore.SIGNAL("toggled (bool)"), self.blankdb_radioButton)
-
+ QtCore.SIGNAL("toggled (bool)"), self.blankdb_radioButton)
+
QtCore.QObject.connect(self.ui.newdb_template_radioButton,
- QtCore.SIGNAL("toggled (bool)"), self.newdb_from_template_radioButton)
-
+ QtCore.SIGNAL("toggled (bool)"), self.newdb_from_template_radioButton)
+
QtCore.QObject.connect(self.ui.tabWidget,
- QtCore.SIGNAL("currentChanged(int)"), self.tab_navigated)
-
+ QtCore.SIGNAL("currentChanged(int)"), self.tab_navigated)
+
QtCore.QObject.connect(self.ui.userName_lineEdit,
- QtCore.SIGNAL("textChanged (const QString&)"), self.nameEntered)
-
+ QtCore.SIGNAL("textChanged (const QString&)"), self.nameEntered)
+
QtCore.QObject.connect(self.ui.newUser_pushButton,
- QtCore.SIGNAL("clicked()"), self.add_modify_User)
-
+ QtCore.SIGNAL("clicked()"), self.add_modify_User)
+
QtCore.QObject.connect(self.ui.users_tableWidget,
- QtCore.SIGNAL("itemSelectionChanged()"), self.userSelected)
-
+ QtCore.SIGNAL("itemSelectionChanged()"), self.userSelected)
+
QtCore.QObject.connect(self.ui.users_tableWidget,
- QtCore.SIGNAL("itemDoubleClicked (QTableWidgetItem *)"),
- self.modifyUser)
-
+ QtCore.SIGNAL(
+ "itemDoubleClicked (QTableWidgetItem *)"),
+ self.modifyUser)
+
QtCore.QObject.connect(self.ui.modifyUser_pushButton,
- QtCore.SIGNAL("clicked()"), self.modifyUser)
-
+ QtCore.SIGNAL("clicked()"), self.modifyUser)
+
QtCore.QObject.connect(self.ui.userActive_checkBox,
- QtCore.SIGNAL("stateChanged (int)"), self.handleUserActive)
-
+ QtCore.SIGNAL("stateChanged (int)"), self.handleUserActive)
+
+
def main(args):
app = QtGui.QApplication(args)
ui = setup_gui(app)
@@ -427,5 +453,5 @@ def main(args):
if __name__ == "__main__":
-
+
main(sys.argv)
diff --git a/src/openmolar/qt4gui/tools/recordtools.py b/src/openmolar/qt4gui/tools/recordtools.py
index 8bd9293..8429205 100644
--- a/src/openmolar/qt4gui/tools/recordtools.py
+++ b/src/openmolar/qt4gui/tools/recordtools.py
@@ -1,9 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import re
from PyQt4 import QtGui, QtCore
@@ -12,12 +29,14 @@ from openmolar.settings import localsettings
from openmolar.qt4gui.compiled_uis import Ui_record_tools
TEETH = (
-'ur8', 'ur7', 'ur6', 'ur5', 'ur4', 'ur3', 'ur2', 'ur1',
-'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8',
-'ll8', 'll7', 'll6', 'll5', 'll4', 'll3', 'll2', 'll1',
-'lr1', 'lr2', 'lr3', 'lr4', 'lr5', 'lr6', 'lr7', 'lr8')
+ 'ur8', 'ur7', 'ur6', 'ur5', 'ur4', 'ur3', 'ur2', 'ur1',
+ 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8',
+ 'll8', 'll7', 'll6', 'll5', 'll4', 'll3', 'll2', 'll1',
+ 'lr1', 'lr2', 'lr3', 'lr4', 'lr5', 'lr6', 'lr7', 'lr8')
+
class recordTools(Ui_record_tools.Ui_Dialog):
+
def __init__(self, om_gui):
self.om_gui = om_gui
self.dialog = QtGui.QDialog(om_gui)
@@ -37,7 +56,7 @@ class recordTools(Ui_record_tools.Ui_Dialog):
loads the money at startup
'''
self.total_label.setText(localsettings.formatMoney(
- self.om_gui.pt.fees))
+ self.om_gui.pt.fees))
self.money0_spinBox.setValue(self.om_gui.pt.money0)
self.money1_spinBox.setValue(self.om_gui.pt.money1)
@@ -57,9 +76,9 @@ class recordTools(Ui_record_tools.Ui_Dialog):
updates the money label
'''
fees = (self.money0_spinBox.value() + self.money1_spinBox.value() +
- self.money9_spinBox.value() + self.money10_spinBox.value() +
- self.money11_spinBox.value() - self.money2_spinBox.value() -
- self.money3_spinBox.value() - self.money8_spinBox.value())
+ self.money9_spinBox.value() + self.money10_spinBox.value() +
+ self.money11_spinBox.value() - self.money2_spinBox.value() -
+ self.money3_spinBox.value() - self.money8_spinBox.value())
self.total_label.setText(localsettings.formatMoney(fees))
@@ -93,7 +112,7 @@ class recordTools(Ui_record_tools.Ui_Dialog):
except TypeError:
self.pd5_dateEdit.hide()
QtCore.QObject.connect(self.pd5_pushButton,
- QtCore.SIGNAL("clicked()"), self.pd5_dateEdit.show)
+ QtCore.SIGNAL("clicked()"), self.pd5_dateEdit.show)
try:
self.pd6_dateEdit.setDate(self.om_gui.pt.pd6)
@@ -101,7 +120,7 @@ class recordTools(Ui_record_tools.Ui_Dialog):
except TypeError:
self.pd6_dateEdit.hide()
QtCore.QObject.connect(self.pd6_pushButton,
- QtCore.SIGNAL("clicked()"), self.pd6_dateEdit.show)
+ QtCore.SIGNAL("clicked()"), self.pd6_dateEdit.show)
try:
self.pd7_dateEdit.setDate(self.om_gui.pt.pd7)
@@ -109,7 +128,7 @@ class recordTools(Ui_record_tools.Ui_Dialog):
except TypeError:
self.pd7_dateEdit.hide()
QtCore.QObject.connect(self.pd7_pushButton,
- QtCore.SIGNAL("clicked()"), self.pd7_dateEdit.show)
+ QtCore.SIGNAL("clicked()"), self.pd7_dateEdit.show)
try:
self.pd8_dateEdit.setDate(self.om_gui.pt.pd8)
@@ -117,7 +136,7 @@ class recordTools(Ui_record_tools.Ui_Dialog):
except TypeError:
self.pd8_dateEdit.hide()
QtCore.QObject.connect(self.pd8_pushButton,
- QtCore.SIGNAL("clicked()"), self.pd8_dateEdit.show)
+ QtCore.SIGNAL("clicked()"), self.pd8_dateEdit.show)
try:
self.pd9_dateEdit.setDate(self.om_gui.pt.pd9)
@@ -125,7 +144,7 @@ class recordTools(Ui_record_tools.Ui_Dialog):
except TypeError:
self.pd9_dateEdit.hide()
QtCore.QObject.connect(self.pd9_pushButton,
- QtCore.SIGNAL("clicked()"), self.pd9_dateEdit.show)
+ QtCore.SIGNAL("clicked()"), self.pd9_dateEdit.show)
try:
self.pd10_dateEdit.setDate(self.om_gui.pt.pd10)
@@ -133,7 +152,7 @@ class recordTools(Ui_record_tools.Ui_Dialog):
except TypeError:
self.pd10_dateEdit.hide()
QtCore.QObject.connect(self.pd10_pushButton,
- QtCore.SIGNAL("clicked()"), self.pd10_dateEdit.show)
+ QtCore.SIGNAL("clicked()"), self.pd10_dateEdit.show)
try:
self.billdate_dateEdit.setDate(self.om_gui.pt.billdate)
@@ -141,7 +160,7 @@ class recordTools(Ui_record_tools.Ui_Dialog):
except TypeError:
self.billdate_dateEdit.hide()
QtCore.QObject.connect(self.billdate_pushButton,
- QtCore.SIGNAL("clicked()"), self.billdate_dateEdit.show)
+ QtCore.SIGNAL("clicked()"), self.billdate_dateEdit.show)
def changeDates(self):
'''
@@ -161,7 +180,7 @@ class recordTools(Ui_record_tools.Ui_Dialog):
self.om_gui.pt.pd10 = self.pd10_dateEdit.date().toPyDate()
if self.billdate_dateEdit.isVisible():
self.om_gui.pt.billdate = \
- self.billdate_dateEdit.date().toPyDate()
+ self.billdate_dateEdit.date().toPyDate()
self.om_gui.updateDetails()
self.om_gui.advise(_("date changes applied"), 1)
@@ -171,15 +190,15 @@ class recordTools(Ui_record_tools.Ui_Dialog):
set up the plan page
'''
glayout = QtGui.QGridLayout(self.chartplan_frame)
- #glayout.setSpacing(0)
- row=0
+ # glayout.setSpacing(0)
+ row = 0
for tooth in TEETH:
label = QtGui.QLabel()
label.setText(tooth)
self.chartplan_lineEdits[tooth] = QtGui.QLineEdit()
self.chartplan_lineEdits[tooth].setMaxLength(34)
self.chartplan_lineEdits[tooth].setText(
- self.om_gui.pt.treatment_course.__dict__.get(tooth+"pl"))
+ self.om_gui.pt.treatment_course.__dict__.get(tooth + "pl"))
glayout.addWidget(label, row, 0)
glayout.addWidget(self.chartplan_lineEdits[tooth], row, 1)
@@ -189,7 +208,8 @@ class recordTools(Ui_record_tools.Ui_Dialog):
self.periopl_lineEdit.setText(self.om_gui.pt.treatment_course.periopl)
self.anaespl_lineEdit.setText(self.om_gui.pt.treatment_course.anaespl)
self.otherpl_lineEdit.setText(self.om_gui.pt.treatment_course.otherpl)
- self.custompl_lineEdit.setText(self.om_gui.pt.treatment_course.custompl)
+ self.custompl_lineEdit.setText(
+ self.om_gui.pt.treatment_course.custompl)
self.ndupl_lineEdit.setText(self.om_gui.pt.treatment_course.ndupl)
self.ndlpl_lineEdit.setText(self.om_gui.pt.treatment_course.ndlpl)
self.odupl_lineEdit.setText(self.om_gui.pt.treatment_course.odupl)
@@ -218,7 +238,7 @@ class recordTools(Ui_record_tools.Ui_Dialog):
apply date changes
'''
for tooth in TEETH:
- self.om_gui.pt.treatment_course.__dict__[tooth+"pl"] = \
+ self.om_gui.pt.treatment_course.__dict__[tooth + "pl"] = \
self.planEntryCheck(self.chartplan_lineEdits[tooth])
course = self.om_gui.pt.treatment_course
@@ -237,15 +257,15 @@ class recordTools(Ui_record_tools.Ui_Dialog):
set up the plan page
'''
glayout = QtGui.QGridLayout(self.chartcompleted_frame)
- #glayout.setSpacing(0)
- row=0
+ # glayout.setSpacing(0)
+ row = 0
for tooth in TEETH:
label = QtGui.QLabel()
label.setText(tooth)
self.chartcompleted_lineEdits[tooth] = QtGui.QLineEdit()
self.chartcompleted_lineEdits[tooth].setMaxLength(34)
self.chartcompleted_lineEdits[tooth].setText(
- self.om_gui.pt.treatment_course.__dict__.get(tooth+"cmp"))
+ self.om_gui.pt.treatment_course.__dict__.get(tooth + "cmp"))
glayout.addWidget(label, row, 0)
glayout.addWidget(self.chartcompleted_lineEdits[tooth], row, 1)
@@ -267,9 +287,9 @@ class recordTools(Ui_record_tools.Ui_Dialog):
apply date changes
'''
for tooth in TEETH:
- self.om_gui.pt.treatment_course.__dict__[tooth+"cmp"] = \
+ self.om_gui.pt.treatment_course.__dict__[tooth + "cmp"] = \
self.planEntryCheck(self.chartcompleted_lineEdits[tooth])
-
+
course = self.om_gui.pt.treatment_course
course.xraycmp = self.planEntryCheck(self.xraycmp_lineEdit)
@@ -289,7 +309,7 @@ class recordTools(Ui_record_tools.Ui_Dialog):
self.hidden_notes_tableWidget.clear()
self.hidden_notes_tableWidget.setColumnCount(2)
self.hidden_notes_tableWidget.setRowCount(
- len(self.om_gui.pt.HIDDENNOTES))
+ len(self.om_gui.pt.HIDDENNOTES))
header = self.hidden_notes_tableWidget.horizontalHeader()
self.hidden_notes_tableWidget.setHorizontalHeaderLabels(
["type", "note"])
@@ -311,7 +331,7 @@ class recordTools(Ui_record_tools.Ui_Dialog):
note = self.hidden_notes_tableWidget.item(row_no, 1).text()
HN.append((ntype, note))
-
+
self.om_gui.pt.HIDDENNOTES = HN
self.om_gui.updateHiddenNotesLabel()
self.om_gui.advise(_("updated hidden notes list"), 1)
@@ -321,24 +341,24 @@ class recordTools(Ui_record_tools.Ui_Dialog):
connect signals
'''
for widg in self.money_scrollAreaWidgetContents.children():
- if type(widg) == QtGui.QSpinBox:
+ if isinstance(widg, QtGui.QSpinBox):
QtCore.QObject.connect(widg,
- QtCore.SIGNAL("valueChanged (int)"), self.updateMoneyTotal)
+ QtCore.SIGNAL("valueChanged (int)"), self.updateMoneyTotal)
QtCore.QObject.connect(self.money_pushButton,
- QtCore.SIGNAL("clicked()"), self.changeMoney)
+ QtCore.SIGNAL("clicked()"), self.changeMoney)
QtCore.QObject.connect(self.dates_pushButton,
- QtCore.SIGNAL("clicked()"), self.changeDates)
+ QtCore.SIGNAL("clicked()"), self.changeDates)
QtCore.QObject.connect(self.plan_pushButton,
- QtCore.SIGNAL("clicked()"), self.changePlan)
+ QtCore.SIGNAL("clicked()"), self.changePlan)
QtCore.QObject.connect(self.completed_pushButton,
- QtCore.SIGNAL("clicked()"), self.changeCompleted)
+ QtCore.SIGNAL("clicked()"), self.changeCompleted)
QtCore.QObject.connect(self.hidden_notes_pushButton,
- QtCore.SIGNAL("clicked()"), self.changeHidden_notes)
+ QtCore.SIGNAL("clicked()"), self.changeHidden_notes)
def exec_(self):
self.dialog.exec_()
@@ -352,11 +372,10 @@ if __name__ == "__main__":
om_gui = maingui.OpenmolarGui()
om_gui.getrecord(1)
om_gui.pt.HIDDENNOTES = [
- ('COURSE OPENED', '= = = = = '),
+ ('COURSE OPENED', '= = = = = '),
('TC: EXAM', 'CE')
- ]
+ ]
ui = recordTools(om_gui)
ui.exec_()
sys.exit(app.exec_())
-
diff --git a/src/openmolar/resources/Makefile b/src/openmolar/resources/Makefile
deleted file mode 100644
index 1298696..0000000
--- a/src/openmolar/resources/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-#MakeFile
-
-resources:
- pyrcc4 -py2 resources.qrc > ../qt4gui/resources_rc.py
diff --git a/src/openmolar/resources/feescales/feescale_schema.xsd b/src/openmolar/resources/feescales/feescale_schema.xsd
index 9060a00..cd3a7bc 100644
--- a/src/openmolar/resources/feescales/feescale_schema.xsd
+++ b/src/openmolar/resources/feescales/feescale_schema.xsd
@@ -142,6 +142,7 @@
<xs:element ref="fs_chart_button" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="endo_chart_button" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="surgical_chart_button" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="post_chart_button" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
@@ -180,6 +181,13 @@
<xs:attribute name="tooltip" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
+ <xs:element name="post_chart_button">
+ <xs:complexType>
+ <xs:attribute name="shortcut" type="xs:string" use="required"/>
+ <xs:attribute name="description" type="xs:string" use="required"/>
+ <xs:attribute name="tooltip" type="xs:string" use="optional"/>
+ </xs:complexType>
+ </xs:element>
diff --git a/src/openmolar/resources/icons/down.jpg b/src/openmolar/resources/icons/down.jpg
deleted file mode 100644
index 1be26bb..0000000
Binary files a/src/openmolar/resources/icons/down.jpg and /dev/null differ
diff --git a/src/openmolar/resources/icons/expand.png b/src/openmolar/resources/icons/expand.png
deleted file mode 100644
index d44179e..0000000
Binary files a/src/openmolar/resources/icons/expand.png and /dev/null differ
diff --git a/src/openmolar/resources/icons/pin.png b/src/openmolar/resources/icons/pin.png
new file mode 100644
index 0000000..59fbf1a
Binary files /dev/null and b/src/openmolar/resources/icons/pin.png differ
diff --git a/src/openmolar/resources/phrasebook/phrasebook.xsd b/src/openmolar/resources/phrasebook/phrasebook.xsd
index 79c420d..15e8c92 100644
--- a/src/openmolar/resources/phrasebook/phrasebook.xsd
+++ b/src/openmolar/resources/phrasebook/phrasebook.xsd
@@ -10,12 +10,17 @@
<xs:element name="section">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
- <xs:element name="header" type="xs:string"/>
- <xs:element ref="phrase"/>
+ <xs:element ref="header" minOccurs="0" maxOccurs="1"/>
+ <xs:element ref="phrase" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="widget" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
+ <xs:element name="header">
+ <xs:complexType mixed="true">
+ <xs:attribute name="icon" type="xs:string" use="optional"/>
+ </xs:complexType>
+ </xs:element>
<xs:element name="phrase">
<xs:complexType mixed="true">
<xs:attribute name="spacer" type="xs:string" use="optional"/>
diff --git a/src/openmolar/resources/resources.qrc b/src/openmolar/resources/resources.qrc
index 3ae4124..a6c4d05 100644
--- a/src/openmolar/resources/resources.qrc
+++ b/src/openmolar/resources/resources.qrc
@@ -12,7 +12,6 @@
<file alias="upper_implant.svg">icons/upper_implant.svg</file>
<file alias="database.png">icons/database.png</file>
<file>openmolar.svg</file>
- <file>icons/separate.png</file>
<file>appt_ov.png</file>
<file>newlogo_launchpadSize.png</file>
<file>newlogo.png</file>
@@ -51,5 +50,6 @@
<file alias="ps.png">icons/ps.png</file>
<file alias="kfm.png">icons/kfm.png</file>
<file alias="add_user.png">icons/add_user.png</file>
+ <file alias="pin.png">icons/pin.png</file>
</qresource>
</RCC>
diff --git a/src/openmolar/schema_upgrades/__init__.py b/src/openmolar/schema_upgrades/__init__.py
index 8b13789..c701215 100755
--- a/src/openmolar/schema_upgrades/__init__.py
+++ b/src/openmolar/schema_upgrades/__init__.py
@@ -1 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/openmolar/schema_upgrades/formatted_notes1_9.py b/src/openmolar/schema_upgrades/formatted_notes1_9.py
index ba7ffc5..e88d809 100644
--- a/src/openmolar/schema_upgrades/formatted_notes1_9.py
+++ b/src/openmolar/schema_upgrades/formatted_notes1_9.py
@@ -1,4 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from openmolar import connect
from openmolar.ptModules import notes
@@ -6,7 +28,7 @@ from openmolar.ptModules import notes
try:
from collections import OrderedDict
except ImportError:
- #OrderedDict only came in python 2.7
+ # OrderedDict only came in python 2.7
print "using openmolar.backports for OrderedDict"
from openmolar.backports import OrderedDict
@@ -22,7 +44,7 @@ def get_notes(sno):
notes_dict = OrderedDict()
ndate, op = "", ""
- #a line is like ('\x01REC\x0c\x08m\x0c\x08m\n\x08',)
+ # a line is like ('\x01REC\x0c\x08m\x0c\x08m\n\x08',)
for line, in results:
ntype, note, operator, date2 = notes.decipher_noteline(line)
if date2 != "":
@@ -31,7 +53,7 @@ def get_notes(sno):
op = operator
key = (ndate, op)
- if notes_dict.has_key(key):
+ if key in notes_dict:
notes_dict[key].append((ntype, note))
else:
notes_dict[key] = [(ntype, note)]
@@ -40,7 +62,7 @@ def get_notes(sno):
def transfer(sno):
- print "transferring notes for serialnos %s"% sno,
+ print "transferring notes for serialnos %s" % sno,
notes_dict = get_notes(sno)
query = '''insert into formatted_notes
(serialno, ndate, op1 , op2 , ntype, note)
@@ -49,11 +71,11 @@ def transfer(sno):
values = []
for key in notes_dict:
date, ops = key
- op2=None
+ op2 = None
if "/" in ops:
op1, op2 = ops.split("/")
else:
- op1=ops
+ op1 = ops
for ntype, note in notes_dict[key]:
values.append((sno, date, op1, op2, ntype, note))
@@ -61,12 +83,13 @@ def transfer(sno):
db = connect.connect()
cursor = db.cursor()
rows = cursor.executemany(query, values)
- print "%d rows of notes inserted"% rows
+ print "%d rows of notes inserted" % rows
cursor.close()
db.commit()
else:
print "no notes inserted"
+
def get_max_sno():
db = connect.connect()
cursor = db.cursor()
diff --git a/src/openmolar/schema_upgrades/schema1_0to1_1.py b/src/openmolar/schema_upgrades/schema1_0to1_1.py
index 77d55fa..fd95d75 100644
--- a/src/openmolar/schema_upgrades/schema1_0to1_1.py
+++ b/src/openmolar/schema_upgrades/schema1_0to1_1.py
@@ -1,13 +1,29 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
-This module provides a function 'run' which will move data from the estimates
+This module provides a function 'run' which will move data from the estimates
table in schema 1_0 to the newestimates table in schema 1_1
The NewTable schema is contained in module variable NEW_TABLE_SQLSTRINGS
Incidentally - this script introduces the "settings table" in which the schema
@@ -39,10 +55,10 @@ PRIMARY KEY (ix),
KEY (serialno),
KEY (courseno));
''',
-'''
+ '''
CREATE TABLE IF NOT EXISTS settings (
`ix` int(10) unsigned NOT NULL auto_increment ,
-`value` varchar(128),
+`value` varchar(128),
`data` text,
`hostname` varchar(128),
`station` char(20),
@@ -52,24 +68,25 @@ CREATE TABLE IF NOT EXISTS settings (
PRIMARY KEY (ix),
KEY (value));
''',
-'''
+ '''
CREATE TABLE IF NOT EXISTS calendar (
`ix` int(10) unsigned NOT NULL auto_increment ,
-`adate` DATE NOT NULL,
+`adate` DATE NOT NULL,
`memo` char(30),
PRIMARY KEY (ix),
KEY (adate));
'''
-]
+ ]
import sys
-from openmolar.settings import localsettings
+from openmolar.settings import localsettings
from openmolar.dbtools import schema_version
from openmolar import connect
'''this checks for names which have changed.'''
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
@@ -89,20 +106,20 @@ class dbUpdater(QtCore.QThread):
cursor.execute(sql_strings)
db.commit()
return True
- except Exception, e:
+ except Exception as e:
print e
- print "unable to execute createNewEstimates"
-
- def getRowsFromOld(self):
+ print "unable to execute createNewEstimates"
+
+ def getRowsFromOld(self):
'''
get ALL data from the estimates table
- '''
+ '''
db = connect.connect()
- cursor=db.cursor()
- cursor.execute('''select serialno, courseno, type, number, itemcode,
- description, fee, ptfee, feescale, csetype, dent, completed,
+ cursor = db.cursor()
+ cursor.execute('''select serialno, courseno, type, number, itemcode,
+ description, fee, ptfee, feescale, csetype, dent, completed,
carriedover, linked from estimates''')
- rows=cursor.fetchall()
+ rows = cursor.fetchall()
cursor.close()
db.close()
return rows
@@ -111,13 +128,13 @@ class dbUpdater(QtCore.QThread):
'''
convert to the new row type
'''
- retlist=[]
+ retlist = []
progress_var = len(rows)
for row in rows:
newrow = []
for i in range(len(row)):
data = row[i]
- if i == 2: #split the type into the new catergory / type fields
+ if i == 2: # split the type into the new catergory / type fields
try:
splitdata = data.split(" ")
category = splitdata[0]
@@ -130,14 +147,14 @@ class dbUpdater(QtCore.QThread):
elif i == 8:
newrow.append(row[9])
elif i == 9:
- newrow.append(row[8])
+ newrow.append(row[8])
else:
newrow.append(data)
-
+
if i % 100 == 0:
self.progressSig((i / progress_var) * 40 + 20)
- if len(row) != len(newrow)-1:
- print "Error converting ",row
+ if len(row) != len(newrow) - 1:
+ print "Error converting ", row
sys.exit()
retlist.append(newrow)
return retlist
@@ -150,22 +167,21 @@ class dbUpdater(QtCore.QThread):
cursor = db.cursor()
progress_var = len(rows)
i = 0
- query='''insert into newestimates
- (serialno, courseno, category, type, number, itemcode, description,
- fee, ptfee , csetype, feescale, dent, completed, carriedover ,
- linked , modified_by , time_stamp) values (%s, %s, %s, %s, %s, %s,
+ query = '''insert into newestimates
+ (serialno, courseno, category, type, number, itemcode, description,
+ fee, ptfee , csetype, feescale, dent, completed, carriedover ,
+ linked , modified_by , time_stamp) values (%s, %s, %s, %s, %s, %s,
%s, %s, %s, %s, %s, %s, %s, %s, %s, '1_0to1_1script', NOW())'''
-
+
for values in rows:
cursor.execute(query, values)
i += 1
if i % 100 == 0:
self.progressSig((i / progress_var) * 90 + 40)
-
+
db.commit()
db.close()
-
def progressSig(self, val, message=""):
'''
emits a signal showhing how we are proceeding.
@@ -177,7 +193,7 @@ class dbUpdater(QtCore.QThread):
def completeSig(self, arg):
self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
-
+
def run(self):
print "running script to convert from schema 1.0 to 1.1"
try:
@@ -186,19 +202,19 @@ class dbUpdater(QtCore.QThread):
oldrows = self.getRowsFromOld()
self.progressSig(20, "converting data")
newRows = self.convertData(oldrows)
-
+
self.progressSig(40, "exporting into newestimates table")
print 'now exporting, this can take some time'
self.insertRowsIntoNew(newRows)
self.progressSig(90, "updating stored schema version")
schema_version.update(("1.1",), "1_0 to 1_1 script")
-
+
self.progressSig(100)
self.completed = True
self.completeSig("ALL DONE - sucessfully moved db to 1,1")
-
- except Exception, e:
- print "Exception caught",e
+
+ except Exception as e:
+ print "Exception caught", e
self.completeSig(str(e))
return self.completed
diff --git a/src/openmolar/schema_upgrades/schema1_1to1_2.py b/src/openmolar/schema_upgrades/schema1_1to1_2.py
index 5327e7d..88194d3 100644
--- a/src/openmolar/schema_upgrades/schema1_1to1_2.py
+++ b/src/openmolar/schema_upgrades/schema1_1to1_2.py
@@ -1,13 +1,29 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
-This module provides a function 'run' which will move data from the estimates
+This module provides a function 'run' which will move data from the estimates
table in schema 1_0 to the newestimates table in schema 1_1
The NewTable schema is contained in module variable NEW_TABLE_SQLSTRINGS
Incidentally - this script introduces the "settings table" in which the schema
@@ -16,9 +32,9 @@ variable is stored.
from PyQt4 import QtGui, QtCore
SQLSTRINGS = [
-'''alter table forum add column recipient char(8);''',
-'''alter table forum change column comment comment char(255);''',
-'''
+ '''alter table forum add column recipient char(8);''',
+ '''alter table forum change column comment comment char(255);''',
+ '''
CREATE TABLE if not exists forumread (
ix int(10) unsigned NOT NULL auto_increment ,
id int(10) unsigned NOT NULL ,
@@ -26,9 +42,9 @@ op char(8),
readdate DATETIME NOT NULL,
PRIMARY KEY (ix),
KEY (id))''',
-'''
+ '''
CREATE TABLE if not exists tasks (
-ix int(10) unsigned NOT NULL auto_increment,
+ix int(10) unsigned NOT NULL auto_increment,
op char(8),
author char(8),
type char(8),
@@ -41,10 +57,11 @@ PRIMARY KEY (ix))''',
]
import sys
-from openmolar.settings import localsettings
+from openmolar.settings import localsettings
from openmolar.dbtools import schema_version
from openmolar import connect
+
def create_alter_tables():
'''
execute the above commands
@@ -56,25 +73,26 @@ def create_alter_tables():
cursor.execute(sql_string)
db.commit()
return True
-
-def copy_OMforum_into_forum():
+
+
+def copy_OMforum_into_forum():
'''
I am scrapping the omforum table, put these posts into the forum
- '''
+ '''
db = connect.connect()
- cursor=db.cursor()
+ cursor = db.cursor()
cursor.execute('''lock tables omforum read,forum write''')
cursor.execute('''select ix, parent_ix, inits, fdate, topic, comment, open
from omforum order by ix''')
- rows=cursor.fetchall()
-
+ rows = cursor.fetchall()
+
cursor.execute('''select max(ix) from forum''')
- start_ix = cursor.fetchone()[0]+1
- print "start_ix =", start_ix
-
- query = '''insert into forum (parent_ix, inits, fdate, topic, comment,
+ start_ix = cursor.fetchone()[0] + 1
+ print "start_ix =", start_ix
+
+ query = '''insert into forum (parent_ix, inits, fdate, topic, comment,
open) values (%s, %s, %s, %s, %s, %s)'''
-
+
for row in rows:
if row[1]:
parent_ix = row[1] + start_ix
@@ -84,14 +102,16 @@ from omforum order by ix''')
cursor.execute(query, values)
db.commit()
-
+
cursor.execute("unlock tables")
cursor.close()
-
+
db.close()
return True
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
@@ -107,27 +127,27 @@ class dbUpdater(QtCore.QThread):
def completeSig(self, arg):
self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
-
+
def run(self):
print "running script to convert from schema 1.1 to 1.2"
try:
self.progressSig(30, "updating schema to 1,2")
if create_alter_tables():
self.progressSig(50, 'created new table "forumread"')
-
+
if copy_OMforum_into_forum():
- self.progressSig(80,
- 'copied data from obsolete table OMforum')
-
+ self.progressSig(80,
+ 'copied data from obsolete table OMforum')
+
schema_version.update(("1.2",), "1_1 to 1_2 script")
-
+
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- +" 1.2")
-
- except Exception, e:
- print "Exception caught",e
+ + " 1.2")
+
+ except Exception as e:
+ print "Exception caught", e
self.completeSig(str(e))
return self.completed
diff --git a/src/openmolar/schema_upgrades/schema1_2to1_3.py b/src/openmolar/schema_upgrades/schema1_2to1_3.py
index d3b9067..0a3625e 100644
--- a/src/openmolar/schema_upgrades/schema1_2to1_3.py
+++ b/src/openmolar/schema_upgrades/schema1_2to1_3.py
@@ -1,26 +1,42 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
-This module provides a function 'run' which will move data from the estimates
+This module provides a function 'run' which will move data from the estimates
table in schema 1_1 to the newestimates table in schema 1_2
'''
from PyQt4 import QtGui, QtCore
SQLSTRINGS = [
-'''alter table newfeetable drop column spare1''',
-'''alter table newfeetable drop column spare2''',
-'''alter table newfeetable drop column spare3''',
-'''alter table newfeetable drop column spare4''',
-'''alter table newfeetable change column PFC NF09 int(11)''',
-'''alter table newfeetable change column PFI NF09_pt int(11)''',
-'''
+ '''alter table newfeetable drop column spare1''',
+ '''alter table newfeetable drop column spare2''',
+ '''alter table newfeetable drop column spare3''',
+ '''alter table newfeetable drop column spare4''',
+ '''alter table newfeetable change column PFC NF09 int(11)''',
+ '''alter table newfeetable change column PFI NF09_pt int(11)''',
+ '''
CREATE TABLE if not exists clinical_memos (
ix int(10) unsigned NOT NULL auto_increment ,
serialno int(11) unsigned NOT NULL ,
@@ -32,19 +48,20 @@ KEY (serialno))''',
]
import sys
-from openmolar.settings import localsettings
+from openmolar.settings import localsettings
from openmolar.dbtools import schema_version
from openmolar import connect
-
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
self.path = None
self.completed = False
self.MESSAGE = "upating database"
-
+
def create_alter_tables(self):
'''
execute the above commands
@@ -58,16 +75,18 @@ class dbUpdater(QtCore.QThread):
i, commandNo = 0, len(SQLSTRINGS)
for sql_string in SQLSTRINGS:
cursor.execute(sql_string)
- self.progressSig(10+70*i/commandNo,sql_string[:20]+"...")
+ self.progressSig(
+ 10 + 70 * i / commandNo,
+ sql_string[:20] + "...")
sucess = True
- except Exception, e:
+ except Exception as e:
print "FAILURE create_alter_tables", e
db.rollback()
if sucess:
db.commit()
db.autocommit(True)
return sucess
-
+
def progressSig(self, val, message=""):
'''
emits a signal showhing how we are proceeding.
@@ -79,30 +98,30 @@ class dbUpdater(QtCore.QThread):
def completeSig(self, arg):
self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
-
+
def run(self):
print "running script to convert from schema 1.2 to 1.3"
try:
self.progressSig(10, _("creating new tables"))
if self.create_alter_tables():
self.progressSig(90, _('updating settings'))
- print "update database settings..."
-
- #pass a tuple of compatible clients and the "user"
- #who made these changes.
- schema_version.update(("1.2","1.3"), "1_2 to 1_3 script")
-
+ print "update database settings..."
+
+ # pass a tuple of compatible clients and the "user"
+ # who made these changes.
+ schema_version.update(("1.2", "1.3"), "1_2 to 1_3 script")
+
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 1.3")
+ + " 1.3")
else:
localsettings.CLIENT_SCHEMA_VERSION = " 1.2"
self.completeSig(_("couldn't create tables, rolled back to")
- + "1.2")
-
- except Exception, e:
- print "Exception caught",e
+ + "1.2")
+
+ except Exception as e:
+ print "Exception caught", e
self.completeSig(str(e))
return self.completed
diff --git a/src/openmolar/schema_upgrades/schema1_3to1_4.py b/src/openmolar/schema_upgrades/schema1_3to1_4.py
index b433faa..fcfe989 100644
--- a/src/openmolar/schema_upgrades/schema1_3to1_4.py
+++ b/src/openmolar/schema_upgrades/schema1_3to1_4.py
@@ -1,24 +1,40 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
-This module provides a function 'run' which will move data from the estimates
+This module provides a function 'run' which will move data from the estimates
table in schema 1_3 to the newestimates table in schema 1_4
'''
import sys
-from openmolar.settings import localsettings
+from openmolar.settings import localsettings
from openmolar.dbtools import schema_version
from openmolar import connect
from PyQt4 import QtGui, QtCore
SQLSTRINGS = [
-'''
+ '''
CREATE TABLE if not exists feetable_key (
ix int(10) unsigned NOT NULL auto_increment ,
tablename char(30),
@@ -31,16 +47,16 @@ in_use bool NOT NULL default True,
display_order smallint(6),
PRIMARY KEY (ix))
''',
-'''
-INSERT into feetable_key (tablename, categories, description, startdate,
-enddate, display_order, feecoltypes)
-values ("feetable_scotNHS_08_Adult","N",
-"Scottish NHS Adult feescale implemented April 2008",
-20080401, 20090831, 5,
+ '''
+INSERT into feetable_key (tablename, categories, description, startdate,
+enddate, display_order, feecoltypes)
+values ("feetable_scotNHS_08_Adult","N",
+"Scottish NHS Adult feescale implemented April 2008",
+20080401, 20090831, 5,
'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="ptfee">pt_fee</column></columns>'
)
''',
-'''
+ '''
CREATE TABLE if not exists feetable_scotNHS_08_Adult (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
@@ -56,17 +72,17 @@ hide bool NOT NULL default False,
PRIMARY KEY (ix))
''',
-'''
-INSERT into feetable_key (tablename, categories, description, startdate,
-enddate, display_order, feecoltypes)
-values ("feetable_scotNHS_08_Child","C",
-"Scottish NHS Child feescale implemented April 2008",
+ '''
+INSERT into feetable_key (tablename, categories, description, startdate,
+enddate, display_order, feecoltypes)
+values ("feetable_scotNHS_08_Child","C",
+"Scottish NHS Child feescale implemented April 2008",
20080401, 20090831, 6,
'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="ptfee">pt_fee</column></columns>'
)
''',
-'''
+ '''
CREATE TABLE if not exists feetable_scotNHS_08_Child (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
@@ -82,16 +98,16 @@ hide bool NOT NULL default False,
PRIMARY KEY (ix))
''',
-'''
-INSERT into feetable_key (tablename, categories, description, startdate,
-display_order, feecoltypes)
-values ("feetable_scotNHS_09_Adult","N",
-"Scottish NHS Adult feescale implemented September 2009",
-20090901, 3,
+ '''
+INSERT into feetable_key (tablename, categories, description, startdate,
+display_order, feecoltypes)
+values ("feetable_scotNHS_09_Adult","N",
+"Scottish NHS Adult feescale implemented September 2009",
+20090901, 3,
'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="ptfee">pt_fee</column></columns>'
)
''',
-'''
+ '''
CREATE TABLE if not exists feetable_scotNHS_09_Adult (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
@@ -107,16 +123,16 @@ hide bool NOT NULL default False,
PRIMARY KEY (ix))
''',
-'''
-INSERT into feetable_key (tablename, categories, description, startdate,
-display_order, feecoltypes)
-values ("feetable_scotNHS_09_Child","C",
+ '''
+INSERT into feetable_key (tablename, categories, description, startdate,
+display_order, feecoltypes)
+values ("feetable_scotNHS_09_Child","C",
"Scottish NHS Adult feescale implemented September 2009", 20090901, 4,
'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="ptfee">pt_fee</column></columns>'
)
''',
-'''
+ '''
CREATE TABLE if not exists feetable_scotNHS_09_Child (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
@@ -132,16 +148,16 @@ hide bool NOT NULL default False,
PRIMARY KEY (ix))
''',
-'''
-INSERT into feetable_key (tablename, categories, description, startdate,
-display_order, feecoltypes)
-values ("feetable_HDP", "I",
+ '''
+INSERT into feetable_key (tablename, categories, description, startdate,
+display_order, feecoltypes)
+values ("feetable_HDP", "I",
"Highland Dental Plan FeeScale", 20080401, 2,
'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="ptfee">pt_fee</column></columns>'
)
''',
-'''
+ '''
CREATE TABLE if not exists feetable_HDP (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
@@ -157,16 +173,16 @@ hide bool NOT NULL default False,
PRIMARY KEY (ix))
''',
-'''
-INSERT into feetable_key (tablename, categories, description, startdate,
-enddate, display_order, feecoltypes)
-values ("feetable_Private_2009","P,PB,PC,PD",
+ '''
+INSERT into feetable_key (tablename, categories, description, startdate,
+enddate, display_order, feecoltypes)
+values ("feetable_Private_2009","P,PB,PC,PD",
"Private FeeScale", 20080401, 20091231, 1,
'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="fee">feeB</column>
<column type="fee">feeC</column><column type="fee">feeD</column></columns>'
)
''',
-'''
+ '''
CREATE TABLE if not exists feetable_Private_2009 (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
@@ -184,17 +200,17 @@ hide bool NOT NULL default False,
PRIMARY KEY (ix))
''',
-'''
-INSERT into feetable_key (tablename, categories, description, startdate,
-display_order, feecoltypes)
-values ("feetable_Private_2010","P,PB,PC,PD",
+ '''
+INSERT into feetable_key (tablename, categories, description, startdate,
+display_order, feecoltypes)
+values ("feetable_Private_2010","P,PB,PC,PD",
"Private FeeScale", 20100101, 7,
'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="fee">feeB</column>
<column type="fee">feeC</column><column type="fee">feeD</column></columns>'
)
''',
-'''
+ '''
CREATE TABLE if not exists feetable_Private_2010 (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
@@ -212,37 +228,40 @@ hide bool NOT NULL default False,
PRIMARY KEY (ix))
''',
-'''
+ '''
CREATE TABLE if not exists docsimported (
-ix int(10) unsigned NOT NULL auto_increment ,
-serialno int(11) NOT NULL ,
-importdate date ,
-docname char(60),
+ix int(10) unsigned NOT NULL auto_increment ,
+serialno int(11) NOT NULL ,
+importdate date ,
+docname char(60),
data blob ,
PRIMARY KEY (ix),
KEY (serialno))
''',
-'DROP TABLE if exists omforum',
-'DROP TABLE if exists estimates',
+ 'DROP TABLE if exists omforum',
+ 'DROP TABLE if exists estimates',
]
class UpdateException(Exception):
+
'''
A custom exception. If this is thrown the db will be rolled back
'''
pass
-
+
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
self.path = None
self.completed = False
self.MESSAGE = "upating database"
-
+
def progressSig(self, val, message=""):
'''
emits a signal showhing how we are proceeding.
@@ -255,7 +274,7 @@ class dbUpdater(QtCore.QThread):
def create_alter_tables(self):
'''
execute the above commands
- NOTE - this function may fail depending on the mysql permissions
+ NOTE - this function may fail depending on the mysql permissions
in place
'''
db = connect.connect()
@@ -266,9 +285,11 @@ class dbUpdater(QtCore.QThread):
i, commandNo = 0, len(SQLSTRINGS)
for sql_string in SQLSTRINGS:
cursor.execute(sql_string)
- self.progressSig(10+70*i/commandNo,sql_string[:20]+"...")
+ self.progressSig(
+ 10 + 70 * i / commandNo,
+ sql_string[:20] + "...")
sucess = True
- except Exception, e:
+ except Exception as e:
print "FAILURE create_alter_tables", e
db.rollback()
if sucess:
@@ -276,54 +297,54 @@ class dbUpdater(QtCore.QThread):
db.autocommit(True)
else:
raise UpdateException("couldn't create tables!")
-
+
def transferData(self):
'''
move data into the new tables
- '''
+ '''
db = connect.connect()
- cursor=db.cursor()
+ cursor = db.cursor()
for table, vals in (
- ("feetable_scotNHS_08_Adult", "NF08, NF08_pt"),
- ("feetable_scotNHS_08_Child", "NF08, NF08_pt"),
- ("feetable_scotNHS_09_Adult", "NF09, NF09_pt"),
- ("feetable_scotNHS_09_Child", "NF09, NF09_pt"),
- ("feetable_Private_2009", "PFA"),
- ("feetable_Private_2010", "PFA"),
- ("feetable_HDP", "PFA")):
- cursor.execute('lock tables newfeetable read, %s write'% table)
-
- cursor.execute('''select section, code, oldcode, USERCODE,
-regulation, description, description1, %s from newfeetable
-order by code, ix'''% vals)
- rows=cursor.fetchall()
-
- query = 'insert into %s'% table
+ ("feetable_scotNHS_08_Adult", "NF08, NF08_pt"),
+ ("feetable_scotNHS_08_Child", "NF08, NF08_pt"),
+ ("feetable_scotNHS_09_Adult", "NF09, NF09_pt"),
+ ("feetable_scotNHS_09_Child", "NF09, NF09_pt"),
+ ("feetable_Private_2009", "PFA"),
+ ("feetable_Private_2010", "PFA"),
+ ("feetable_HDP", "PFA")):
+ cursor.execute('lock tables newfeetable read, %s write' % table)
+
+ cursor.execute('''select section, code, oldcode, USERCODE,
+regulation, description, description1, %s from newfeetable
+order by code, ix''' % vals)
+ rows = cursor.fetchall()
+
+ query = 'insert into %s' % table
query += ''' (section, code, oldcode, USERCODE,
regulation, description, brief_description, fee'''
-
+
if "," in vals:
query += ' , pt_fee) values (%s, %s, %s, %s, %s, %s, %s, %s, %s)'
else:
query += ') values (%s, %s, %s, %s, %s, %s, %s, %s)'
-
+
values = []
for row in rows:
- if "NHS" in table or row[7] != 0 :
+ if "NHS" in table or row[7] != 0:
values.append(row)
cursor.executemany(query, values)
db.commit()
cursor.execute("unlock tables")
-
+
cursor.close()
db.close()
return True
def completeSig(self, arg):
self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
-
+
def run(self):
print "running script to convert from schema 1.3 to 1.4"
try:
@@ -332,31 +353,31 @@ regulation, description, brief_description, fee'''
self.create_alter_tables()
#- transfer data
- self.progressSig(20,
- _("copying data across from old feetable"))
+ self.progressSig(20,
+ _("copying data across from old feetable"))
self.transferData()
-
+
#- update the schema version
- #pass a tuple of compatible clients and the "user"
- #who made these changes.
- #only 1.4 client will work now.
-
+ # pass a tuple of compatible clients and the "user"
+ # who made these changes.
+ # only 1.4 client will work now.
+
self.progressSig(90, _('updating settings'))
- print "update database settings..."
-
+ print "update database settings..."
+
schema_version.update(("1.4",), "1_3 to 1_4 script")
-
+
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 1.4")
-
- except UpdateException, e:
+ + " 1.4")
+
+ except UpdateException as e:
localsettings.CLIENT_SCHEMA_VERSION = "1.3"
self.completeSig(_("rolled back to") + " 1.3")
-
- except Exception, e:
- print "Exception caught",e
+
+ except Exception as e:
+ print "Exception caught", e
self.completeSig(str(e))
return self.completed
diff --git a/src/openmolar/schema_upgrades/schema1_4to1_5.py b/src/openmolar/schema_upgrades/schema1_4to1_5.py
index 1cc2357..889e21a 100644
--- a/src/openmolar/schema_upgrades/schema1_4to1_5.py
+++ b/src/openmolar/schema_upgrades/schema1_4to1_5.py
@@ -1,30 +1,46 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
-This module provides a function 'run' which will move data
-from the patients table
+This module provides a function 'run' which will move data
+from the patients table
in schema 1_4 to a new exemptions table in schema 1_5
also, remove the key for calendar, it makes more sense to have the date
as the primary key. (cleaner code for updates)
'''
import sys
-from openmolar.settings import localsettings
+from openmolar.settings import localsettings
from openmolar.dbtools import schema_version
from openmolar import connect
from PyQt4 import QtGui, QtCore
SQLSTRINGS = [
-'alter table clinical_memos add column synopsis text',
-'alter table calendar drop column ix',
-'alter table calendar add primary key(adate)',
-'''
+ 'alter table clinical_memos add column synopsis text',
+ 'alter table calendar drop column ix',
+ 'alter table calendar add primary key(adate)',
+ '''
CREATE TABLE if not exists exemptions (
ix int(10) unsigned NOT NULL auto_increment ,
serialno int(11) unsigned NOT NULL ,
@@ -38,19 +54,22 @@ key (serialno))
class UpdateException(Exception):
+
'''
A custom exception. If this is thrown the db will be rolled back
'''
pass
-
+
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
self.path = None
self.completed = False
self.MESSAGE = "upating database"
-
+
def progressSig(self, val, message=""):
'''
emits a signal showhing how we are proceeding.
@@ -63,7 +82,7 @@ class dbUpdater(QtCore.QThread):
def create_alter_tables(self):
'''
execute the above commands
- NOTE - this function may fail depending on the mysql permissions
+ NOTE - this function may fail depending on the mysql permissions
in place
'''
db = connect.connect()
@@ -75,36 +94,38 @@ class dbUpdater(QtCore.QThread):
for sql_string in SQLSTRINGS:
try:
cursor.execute(sql_string)
- except connect.GeneralError, e:
- print "FAILURE in executing sql statement", e
- print "erroneous statement was ",sql_string
+ except connect.GeneralError as e:
+ print "FAILURE in executing sql statement", e
+ print "erroneous statement was ", sql_string
if 1060 in e.args:
print "continuing, as column already exists issue"
- self.progressSig(10+70*i/commandNo,sql_string[:20]+"...")
+ self.progressSig(
+ 10 + 70 * i / commandNo,
+ sql_string[:20] + "...")
sucess = True
- except Exception, e:
- print "FAILURE in executing sql statements", e
+ except Exception as e:
+ print "FAILURE in executing sql statements", e
db.rollback()
if sucess:
db.commit()
db.autocommit(True)
else:
raise UpdateException("couldn't execute all statements!")
-
+
def transferData(self):
'''
move data into the new tables
- '''
+ '''
db = connect.connect()
- cursor=db.cursor()
+ cursor = db.cursor()
cursor.execute('lock tables patients read, exemptions write')
-
+
cursor.execute('select serialno, exmpt, exempttext from patients')
- rows=cursor.fetchall()
-
- query = '''insert into exemptions (serialno, exemption, exempttext)
+ rows = cursor.fetchall()
+
+ query = '''insert into exemptions (serialno, exemption, exempttext)
values (%s, %s, %s)'''
-
+
values = []
for row in rows:
if row[1] != "" or row[2] != "":
@@ -114,14 +135,14 @@ class dbUpdater(QtCore.QThread):
db.commit()
cursor.execute("unlock tables")
-
+
cursor.close()
db.close()
return True
def completeSig(self, arg):
self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
-
+
def run(self):
print "running script to convert from schema 1.4 to 1.5"
try:
@@ -131,7 +152,7 @@ class dbUpdater(QtCore.QThread):
#- transfer data between tables
self.progressSig(50, _('transfering data'))
-
+
print "transfering data to new table, ...",
if self.transferData():
print "ok"
@@ -139,21 +160,21 @@ class dbUpdater(QtCore.QThread):
print "FAILED!!!!!"
self.progressSig(90, _('updating settings'))
- print "update database settings..."
-
+ print "update database settings..."
+
schema_version.update(("1.5",), "1_4 to 1_5 script")
-
+
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 1.5")
-
- except UpdateException, e:
+ + " 1.5")
+
+ except UpdateException as e:
localsettings.CLIENT_SCHEMA_VERSION = "1.4"
self.completeSig(_("rolled back to") + " 1.4")
-
- except Exception, e:
- print "Exception caught",e
+
+ except Exception as e:
+ print "Exception caught", e
self.completeSig(str(e))
return self.completed
diff --git a/src/openmolar/schema_upgrades/schema1_5to1_6.py b/src/openmolar/schema_upgrades/schema1_5to1_6.py
index 70b9d84..1ab0f28 100644
--- a/src/openmolar/schema_upgrades/schema1_5to1_6.py
+++ b/src/openmolar/schema_upgrades/schema1_5to1_6.py
@@ -1,30 +1,46 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
-This module provides a function 'run' which will move data
+This module provides a function 'run' which will move data
to schema 1_6
'''
import sys
-from openmolar.settings import localsettings
+from openmolar.settings import localsettings
from openmolar.dbtools import schema_version
from openmolar import connect
from PyQt4 import QtGui, QtCore
SQLSTRINGS = [
-'''
+ '''
alter table forum change comment comment text not null
''',
-'''
+ '''
drop table docsimported
''',
-'''
+ '''
CREATE TABLE if not exists docsimported (
ix mediumint(8) unsigned NOT NULL auto_increment,
serialno int(11) unsigned NOT NULL default 0,
@@ -35,7 +51,7 @@ filedate datetime NOT NULL default '0000-00-00 00:00:00',
importime timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (ix) )
''',
-'''
+ '''
CREATE TABLE if not exists docsimporteddata (
ix mediumint(8) unsigned NOT NULL auto_increment,
masterid mediumint(8) unsigned NOT NULL default '0',
@@ -46,55 +62,59 @@ KEY master_idx (masterid) )
]
TYPEDICT = {
-"exam" : ('0101', '0111', '0121', '0131', '4701'),
-"xray" : ('0202', '0203', '0204', '0205', '0206', '0207', '0211', '0212', '0213', '0221', '0301',
- '4901', '4911', '4921', '4931', ),
-"perio" : ('1001', '1011', '1021', '1022', '1041', '1100', '1101', '1102', '1103', '1111', '1112',
- '1113', '1121', '1131', '1191'),
-"CHART" : ('1401', '1402', '1403', '1404', '1411', '1412', '1415', '1416', '1417', '1418', '1420',
- '1421', '1422', '1423', '1424', '1425', '1426', '1427', '1431', '1451', '1461', '1462',
- '1470', '1471', '1481', '1482', '1483', '1501', '1502', '1503', '1504', '1511', '1521',
- '1522', '1523', '1531', '1541', '1551', '1600', '1601', '1700', '1701', '1702', '1703',
- '1704', '1705', '1706', '1711', '1712', '1716', '1721', '1722', '1723', '1726', '1731',
- '1732', '1733', '1734', '1735', '1736', '1737', '1738', '1739', '1742', '1743', '1744',
- '1751', '1761', '1762', '1771', '1781', '1782', '1801', '1802', '1803', '1804', '1805',
- '1806', '1807', '1808', '1811', '1812', '1813', '1814', '1815', '1816', '1821', '1822',
- '1823', '1824', '1825', '1826', '1827', '1831', '1832', '1841', '1851', '1852', '1861',
- '1862', '1871', '2101', '2201', '2202', '2203', '2204', '2205', '2206', '2207', '2221',
- '3611', '3661', '3671', '4401', '4402', '4403', '4404', '4405', '4406', '5001', '5112',
- '5021', '5021', '5031', '5032', '5041', '5071', '5075', '5102', '5103', '5103', '5201',
- '5211', '5212', '5213', '5214', '5215', '5216', '5217', '5811', '5812', '5813', '5814',
- '5820', '5821', '5822', '5823', '5824', '5825', '5826', '5827', '5831', '5836', '5837',
- '5838', '5841', '5842', '5843', '6001', '6002', '6003', '6004'),
-"ndu" : ('2711', '2730', '2731', '2733', '2741', '2743', '2744', '2745', '2761', '2771', '2781',
- '5900', '5901', '5903', '5911', '5931', '5941', '5951'),
-"odu" : ('2801', '2803', '2821', '2831', '2851', '2853', '2855', '2861', '2863', '2865', '5501',
- '5503', '5521', '5531', '5551', '5553', '5555', '5561', '5563', '5565'),
-"ndl" : ('2712', '2732', '2735', '2747', '2748', '2749', '2762', '2772', '2782',
- '5902', '5905', '5923', '5932', '5942', '5952'),
-"odl" : ('2802', '2804', '2822', '2832', '2852', '2854', '2856', '2862', '2864', '2866', '5502',
- '5504', '5522', '5532', '5551', '5553', '5555', '5562', '5564', '5566', ),
-
-"ortho" : ('3241', '3242', '3243', '3244', '3245', '3246', '3247', '3248', '3249', '3261', '3262',
- '3263', '3264', '3281', '3282', '3283', '3284', '3285', '3291', '5581', '5582', '5583',
- '5584', '5585', '5586', '5587', '5588', '5589' )
+ "exam": ('0101', '0111', '0121', '0131', '4701'),
+ "xray": ('0202', '0203', '0204', '0205', '0206', '0207', '0211', '0212', '0213', '0221', '0301',
+ '4901', '4911', '4921', '4931', ),
+ "perio": ('1001', '1011', '1021', '1022', '1041', '1100', '1101', '1102', '1103', '1111', '1112',
+ '1113', '1121', '1131', '1191'),
+ "CHART": ('1401', '1402', '1403', '1404', '1411', '1412', '1415', '1416', '1417', '1418', '1420',
+ '1421', '1422', '1423', '1424', '1425', '1426', '1427', '1431', '1451', '1461', '1462',
+ '1470', '1471', '1481', '1482', '1483', '1501', '1502', '1503', '1504', '1511', '1521',
+ '1522', '1523', '1531', '1541', '1551', '1600', '1601', '1700', '1701', '1702', '1703',
+ '1704', '1705', '1706', '1711', '1712', '1716', '1721', '1722', '1723', '1726', '1731',
+ '1732', '1733', '1734', '1735', '1736', '1737', '1738', '1739', '1742', '1743', '1744',
+ '1751', '1761', '1762', '1771', '1781', '1782', '1801', '1802', '1803', '1804', '1805',
+ '1806', '1807', '1808', '1811', '1812', '1813', '1814', '1815', '1816', '1821', '1822',
+ '1823', '1824', '1825', '1826', '1827', '1831', '1832', '1841', '1851', '1852', '1861',
+ '1862', '1871', '2101', '2201', '2202', '2203', '2204', '2205', '2206', '2207', '2221',
+ '3611', '3661', '3671', '4401', '4402', '4403', '4404', '4405', '4406', '5001', '5112',
+ '5021', '5021', '5031', '5032', '5041', '5071', '5075', '5102', '5103', '5103', '5201',
+ '5211', '5212', '5213', '5214', '5215', '5216', '5217', '5811', '5812', '5813', '5814',
+ '5820', '5821', '5822', '5823', '5824', '5825', '5826', '5827', '5831', '5836', '5837',
+ '5838', '5841', '5842', '5843', '6001', '6002', '6003', '6004'),
+ "ndu": ('2711', '2730', '2731', '2733', '2741', '2743', '2744', '2745', '2761', '2771', '2781',
+ '5900', '5901', '5903', '5911', '5931', '5941', '5951'),
+ "odu": ('2801', '2803', '2821', '2831', '2851', '2853', '2855', '2861', '2863', '2865', '5501',
+ '5503', '5521', '5531', '5551', '5553', '5555', '5561', '5563', '5565'),
+ "ndl": ('2712', '2732', '2735', '2747', '2748', '2749', '2762', '2772', '2782',
+ '5902', '5905', '5923', '5932', '5942', '5952'),
+ "odl": ('2802', '2804', '2822', '2832', '2852', '2854', '2856', '2862', '2864', '2866', '5502',
+ '5504', '5522', '5532', '5551', '5553', '5555', '5562', '5564', '5566', ),
+
+ "ortho": ('3241', '3242', '3243', '3244', '3245', '3246', '3247', '3248', '3249', '3261', '3262',
+ '3263', '3264', '3281', '3282', '3283', '3284', '3285', '3291', '5581', '5582', '5583',
+ '5584', '5585', '5586', '5587', '5588', '5589')
}
+
class UpdateException(Exception):
+
'''
A custom exception. If this is thrown the db will be rolled back
'''
pass
-
+
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
self.path = None
self.completed = False
self.MESSAGE = "upating database"
-
+
def progressSig(self, val, message=""):
'''
emits a signal showhing how we are proceeding.
@@ -107,7 +127,7 @@ class dbUpdater(QtCore.QThread):
def create_alter_tables(self):
'''
execute the above commands
- NOTE - this function may fail depending on the mysql permissions
+ NOTE - this function may fail depending on the mysql permissions
in place
'''
db = connect.connect()
@@ -119,70 +139,72 @@ class dbUpdater(QtCore.QThread):
for sql_string in SQLSTRINGS:
try:
cursor.execute(sql_string)
- except connect.GeneralError, e:
- print "FAILURE in executing sql statement", e
- print "erroneous statement was ",sql_string
+ except connect.GeneralError as e:
+ print "FAILURE in executing sql statement", e
+ print "erroneous statement was ", sql_string
if 1060 in e.args:
print "continuing, as column already exists issue"
- self.progressSig(10+70*i/commandNo,sql_string[:20]+"...")
+ self.progressSig(
+ 10 + 70 * i / commandNo,
+ sql_string[:20] + "...")
sucess = True
- except Exception, e:
- print "FAILURE in executing sql statements", e
+ except Exception as e:
+ print "FAILURE in executing sql statements", e
db.rollback()
if sucess:
db.commit()
db.autocommit(True)
else:
raise UpdateException("couldn't execute all statements!")
-
+
def addColumns(self):
'''
fee tables need a new column
'''
-
+
db = connect.connect()
- cursor=db.cursor()
-
+ cursor = db.cursor()
+
cursor.execute('select tablename from feetable_key')
rows = cursor.fetchall()
-
+
for row in rows:
print "altering feetable", row[0]
- query = 'alter table %s add column pl_cmp char(20)'% row[0]
+ query = 'alter table %s add column pl_cmp char(20)' % row[0]
cursor.execute(query)
-
+
db.commit()
-
+
cursor.close()
db.close()
return True
-
+
def insertValues(self):
'''
fee tables need a new column
'''
-
+
db = connect.connect()
- cursor=db.cursor()
-
+ cursor = db.cursor()
+
cursor.execute('select tablename from feetable_key')
rows = cursor.fetchall()
for row in rows:
print "altering feetable", row[0]
- query = 'update %s set pl_cmp=%%s where code=%%s'% row[0]
+ query = 'update %s set pl_cmp=%%s where code=%%s' % row[0]
for key in TYPEDICT:
for code in TYPEDICT[key]:
values = (key, code)
cursor.execute(query, values)
db.commit()
-
+
cursor.close()
db.close()
return True
-
+
def completeSig(self, arg):
self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
-
+
def run(self):
print "running script to convert from schema 1.5 to 1.6"
try:
@@ -192,36 +214,36 @@ class dbUpdater(QtCore.QThread):
#- transfer data between tables
self.progressSig(40, _('transfering data'))
-
+
print "adding columns to the feetables table, ...",
if self.addColumns():
print "ok"
else:
print "FAILED!!!!!"
self.progressSig(60, _('inserting values'))
-
+
print "inserting values"
if self.insertValues():
print "ok"
else:
- print "FAILED!!!!!"
+ print "FAILED!!!!!"
self.progressSig(90, _('updating settings'))
- print "update database settings..."
-
+ print "update database settings..."
+
schema_version.update(("1.6",), "1_5 to 1_6 script")
-
+
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 1.6")
-
- except UpdateException, e:
+ + " 1.6")
+
+ except UpdateException as e:
localsettings.CLIENT_SCHEMA_VERSION = "1.5"
self.completeSig(_("rolled back to") + " 1.5")
-
- except Exception, e:
- print "Exception caught",e
+
+ except Exception as e:
+ print "Exception caught", e
self.completeSig(str(e))
return self.completed
diff --git a/src/openmolar/schema_upgrades/schema1_6to1_7.py b/src/openmolar/schema_upgrades/schema1_6to1_7.py
index 43063c2..403fbd4 100644
--- a/src/openmolar/schema_upgrades/schema1_6to1_7.py
+++ b/src/openmolar/schema_upgrades/schema1_6to1_7.py
@@ -1,17 +1,34 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2010 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
-This module provides a function 'run' which will move data
+This module provides a function 'run' which will move data
to schema 1_7
'''
-import sys, types
-from openmolar.settings import localsettings
+import sys
+import types
+from openmolar.settings import localsettings
from openmolar.dbtools import schema_version
from openmolar import connect
@@ -19,153 +36,169 @@ from openmolar import connect
from PyQt4 import QtGui, QtCore
SQLSTRINGS = [
-'''
+ '''
alter table feetable_key add column data mediumtext
''',
-'''
+ '''
alter table feetable_key change column data data mediumtext
''',
]
-REGEXDICT = {'2733': 'SR P', '0131': 'CTS', '1782': 'reg [ul]lr][1-8]CR,RC',
-'1541': 'reg [ul][lr][1-8]RR$',
-'1461': 'reg u[lr][4-8]GC/[MODBP]$|l[lr][4-8]GC/[MODBL]$|u[lr][1-3]GC/[MIDBP]$|l[lr][1-3]GC/[MIDBL]$',
-'0301': 'PHO',
-'1462': 'reg u[lr][4-8]GC/[MODBP]{2,5}$|l[lr][4-8]GC/[MODBL]{2,5}$|u[lr][1-3]GC/[MIDBP]{2,5}$|l[lr][1-3]GC/[MIDBL]{2,5}',
-'0121': 'FCA',
-'0201': 'S',
-'3641': 'PR',
-'1551': 'reg [ul][lr][A-E]$',
-'1701': 'reg u[lr][4-8]GI/[MODBP]$|l[lr][4-8]GI/[MODBL]$|u[lr][1-3]GI/[MIDBP]$|l[lr][1-3]GI/[MIDBL]$',
-'1702': 'reg u[lr][4-8]GI/[MODBP]{2}$|l[lr][4-8]GI/[MODBL]{2}$|u[lr][1-3]GI/[MDBP]{2}$|l[lr][1-3]GI/[MDBL]{2}$',
-'1703': 'multireg [ul][lr][1-3]GI/.*I _AND_ u[lr][1-3]GI/[MDBPI]{2}$|l[lr][1-3]GI/[MDBLI]{2}$',
-'1704': 'reg u[lr][4-8]GI/[MODBP]{3,5}$|l[lr][4-8]GI/[MODBL]{3,5}$|u[lr][1-3]GI/[MIDBP]{3,5}$|l[lr][1-3]GI/[MIDBL]{3,5}$',
-'1705': 'Gold_3_4',
-'1706': 'CR,GO',
-'1825': 'reg [ul][lr][1-8]BR/P,GO',
-'1827': 'reg [ul][lr][1-8]BR/P,GO',
-'1831': 'reg [ul][lr][1-8]BR/P,V1',
-'4401': 'reg u[lr][DE][MODBP]{1,5}(,CO)?(,GL)?(,AM)?$|l[lr][DE][MODBL]{1,5}(,CO)?(,GL)?(,AM)?$|u[lr][A-C][MIDBP]{1,5}(,CO)?(,GL)?(,AM)?$|l[lr][A-C][MIDBL]{1,5}(,CO)?(,GL)?(,AM)?$',
-'2311': 'IS',
-'1418': 'CO-4surf',
-'4404': 'reg [ul][lr][A-E]RT$',
-'0601': 'OHI',
-'1411': 'reg [ul][lr][4-6]TR/[MD]{1}(,CO)?$',
-'1412': 'reg [ul][lr][4-6]TR/[MD]{2}(,CO)?$',
-'1415': 'CO-1surf',
-'1416': 'CO-2surf',
-'1417': 'CO-3surf',
-'0111': 'ECE',
-'1121': 'CG',
-'1483': 'reg [ul][lr][4-8]FS,GC$',
-'1482': 'reg [ul][lr][4-8]FS,CO$',
-'1481': 'reg [ul][lr][4-8]FS$',
-'5601': 'AC',
-'5701': 'DV1',
-'3671': 'OD',
-'4801': 'PR',
-'1716': 'reg [ul][lr][1-8]CR,PJ',
-'2301': 'AH',
-'1851': 'reg [ul][lr][1-8]BR/T1',
-'1852': 'reg [ul][lr][1-8]BR/T2',
-'2302': 'PSR',
-'0204': 'P',
-'0202': 'M',
-'1521': 'reg [ul][lr][1-3]AP$',
-'1522': 'reg [ul][lr][45]AP$',
-'1523': 'reg u[lr][6-8]AP$',
-'1403': 'reg u[lr][4-8]([BP]{0,2}([MO]{2}|[DO]{2})[BP]{0,2})(,AM)?$|l[lr][4-8][BL]{0,2}([MO]{2}|[DO]{2})[BL]{0,2}(,AM)?$',
-'1402': 'reg u[lr][4-8][OBP]{2,5}(,AM)?$|l[lr][4-8][OBL]{2,5}(,AM)?$|u[lr][4-8][MDBP]{2,5}(,AM)?$|l[lr][4-8][MDBL]{2,5}(,AM)?$|l[lr][1-3][MDBLI]{2,5},AM$|u[lr][1-3][MDBPI]{2,5},AM$',
-'1401': 'reg u[lr][4-8][MODBP]{1}(,AM)?$|l[lr][4-8][MODBL]{1}(,AM)?$|u[lr][1-3][MIDBP]{1},AM$|l[lr][1-3][MIDBL]{1},AM$',
-'1011': 'SP+',
-'1404': 'reg u[lr][4-8][BP]{0,2}([MOD]{3}|[DOM]{3})[BP]{0,2}(,AM)?$|l[lr][4-8][BL]{0,2}([MOD]{3}|[DOM]{3})[BL]{0,2}(,AM)?$',
-'5001': 'DR',
-'2201': 'EX/S1',
-'0101': 'CE',
-'1425': '[ul][lr][456]CT$',
-'5122': 'BR,RC',
-'2206': 'reg l[lr]8EX/S3',
-'1431': '[ul][lr][1-8]PR$',
-'1726': 'reg [ul][lr][1-8]CR,A1',
-'2207': 'reg l[lr]8EX/S4',
-'1722': 'reg [ul][lr][1-8]CR,A1',
-'1721': 'reg [ul][lr][1-8]CR,V1',
-'0211': 'SM1',
-'0213': 'SM',
-'0212': 'SM2',
-'1531': 'reg l[lr][6-8]AP$',
-'1002': 'SP-',
-'1001': 'SP',
-'3611': 'ST',
-'5032': 'PX+',
-'5031': 'PX',
-'1421': 'reg u[lr][1-3][MDBPI]{1}(,CO)?$|l[lr][1-3][MDBIL]{1}(,CO)?$|u[lr][4-8][MDBP]{1},CO$|l[lr][4-8][MDBL]{1},CO$',
-'1420': 'reg u[lr][1-3][MDBPI]{2,5}(,CO)?$|l[lr][1-3][MDBIL]{2,5}(,CO)?$|u[lr][4-8][MDBP]{2},CO$|l[lr][4-8][MDBL]{2},CO$',
-'2202': 'reg [ul][lr][1-3]EX/S2',
-'2203': 'reg [ul][lr][4-7]EX/S2',
-'2204': 'reg u[lr]8EX/S3',
-'2205': 'reg u[lr]8EX/S4',
-'1427': 'reg u[lr][4-8][MODBP]{2,6},GL$|l[lr][4-8][MODBL]{2,6},GL$|u[lr][1-3][MDBPI]{2,6},GL$|l[lr][1-3][MDBLI]{2,6},GL$',
-'1426': 'reg u[lr][1-8][MDBP]{1},GL$|l[lr][1-8][MDBL]{1},GL$|[ul][lr][1-3]I,GL',
-'1731': 'reg [ul][lr][1-8]C1$',
-'1733': 'reg [ul][lr][1-8]C3$',
-'1732': 'reg [ul][lr][1-8]C2$',
-'1734': 'reg [ul][lr][1-8]C4$',
-'5702': 'DV2',
-'5703': 'DV3',
-'1502': 'reg u[lr][45]RT$',
-'1503': 'reg l[lr][45]RT$',
-'1501': 'reg [ul][lr][1-3]RT$',
-'1504': 'reg [ul][lr][6-8]RT$',
-'2121': 'XV',
-'1862': 'reg [ul][lr][1-8]BR,RC',
-'5102': 'CR,TC',
-'2211': 'FR',
-'4403': 'reg [ul][lr][A-E]PX$',
-'5712': 'RA2',
-'5711': 'RA1',
-'2101': 'EX',
-'1742': 'reg [ul][lr][1-8]CR,TC',
-'2734': 'LB -or- PB',
-'2735': 'SR P/',
-'2730': 'SR F/F',
-'2732': 'SR F',
-'5112': 'CR,RC',
-'2738': 'SR',
-'3631': 'SC',
-'5051': 'SC',
-'4001': 'OT',
-'2221': 'EX/S5',
-'2742': 'SS F -or- CC F',
-'0711': 'FL',
-'1751': 'reg [ul]lr][1-8]CR,OT',
-'1712': 'reg [ul][lr][1-8]CR,A2',
-'0221': 'AA',
-'3701': 'AC',
-'5041': 'ST',
-'1807': 'reg [ul][lr][1-8]BR/CR,V1',
-'1806': 'reg [ul][lr][1-8]BR/CR,GO',
-'1041': 'SPL',
-'1804': 'reg [ul][lr][1-8]BR/CR,GO',
-'1601': 'PV',
-'1808': 'reg [ul][lr][1-8]BR/CR,V2',
-'0701': 'FS'}
-
-
-##############################################################################
-## SOME FUNCTIONS SPECIFIC TO this update ##
-##############################################################################
+REGEXDICT = {'2733': 'SR P', '0131': 'CTS', '1782': 'reg [ul]lr][1-8]CR,RC',
+ '1541': 'reg [ul][lr][1-8]RR$',
+ '1461':
+ 'reg u[lr][4-8]GC/[MODBP]$|l[lr][4-8]GC/[MODBL]$|u[lr][1-3]GC/[MIDBP]$|l[lr][1-3]GC/[MIDBL]$',
+ '0301': 'PHO',
+ '1462':
+ 'reg u[lr][4-8]GC/[MODBP]{2,5}$|l[lr][4-8]GC/[MODBL]{2,5}$|u[lr][1-3]GC/[MIDBP]{2,5}$|l[lr][1-3]GC/[MIDBL]{2,5}',
+ '0121': 'FCA',
+ '0201': 'S',
+ '3641': 'PR',
+ '1551': 'reg [ul][lr][A-E]$',
+ '1701':
+ 'reg u[lr][4-8]GI/[MODBP]$|l[lr][4-8]GI/[MODBL]$|u[lr][1-3]GI/[MIDBP]$|l[lr][1-3]GI/[MIDBL]$',
+ '1702':
+ 'reg u[lr][4-8]GI/[MODBP]{2}$|l[lr][4-8]GI/[MODBL]{2}$|u[lr][1-3]GI/[MDBP]{2}$|l[lr][1-3]GI/[MDBL]{2}$',
+ '1703':
+ 'multireg [ul][lr][1-3]GI/.*I _AND_ u[lr][1-3]GI/[MDBPI]{2}$|l[lr][1-3]GI/[MDBLI]{2}$',
+ '1704':
+ 'reg u[lr][4-8]GI/[MODBP]{3,5}$|l[lr][4-8]GI/[MODBL]{3,5}$|u[lr][1-3]GI/[MIDBP]{3,5}$|l[lr][1-3]GI/[MIDBL]{3,5}$',
+ '1705': 'Gold_3_4',
+ '1706': 'CR,GO',
+ '1825': 'reg [ul][lr][1-8]BR/P,GO',
+ '1827': 'reg [ul][lr][1-8]BR/P,GO',
+ '1831': 'reg [ul][lr][1-8]BR/P,V1',
+ '4401':
+ 'reg u[lr][DE][MODBP]{1,5}(,CO)?(,GL)?(,AM)?$|l[lr][DE][MODBL]{1,5}(,CO)?(,GL)?(,AM)?$|u[lr][A-C][MIDBP]{1,5}(,CO)?(,GL)?(,AM)?$|l[lr][A-C][MIDBL]{1,5}(,CO)?(,GL)?(,AM)?$',
+ '2311': 'IS',
+ '1418': 'CO-4surf',
+ '4404': 'reg [ul][lr][A-E]RT$',
+ '0601': 'OHI',
+ '1411': 'reg [ul][lr][4-6]TR/[MD]{1}(,CO)?$',
+ '1412': 'reg [ul][lr][4-6]TR/[MD]{2}(,CO)?$',
+ '1415': 'CO-1surf',
+ '1416': 'CO-2surf',
+ '1417': 'CO-3surf',
+ '0111': 'ECE',
+ '1121': 'CG',
+ '1483': 'reg [ul][lr][4-8]FS,GC$',
+ '1482': 'reg [ul][lr][4-8]FS,CO$',
+ '1481': 'reg [ul][lr][4-8]FS$',
+ '5601': 'AC',
+ '5701': 'DV1',
+ '3671': 'OD',
+ '4801': 'PR',
+ '1716': 'reg [ul][lr][1-8]CR,PJ',
+ '2301': 'AH',
+ '1851': 'reg [ul][lr][1-8]BR/T1',
+ '1852': 'reg [ul][lr][1-8]BR/T2',
+ '2302': 'PSR',
+ '0204': 'P',
+ '0202': 'M',
+ '1521': 'reg [ul][lr][1-3]AP$',
+ '1522': 'reg [ul][lr][45]AP$',
+ '1523': 'reg u[lr][6-8]AP$',
+ '1403':
+ 'reg u[lr][4-8]([BP]{0,2}([MO]{2}|[DO]{2})[BP]{0,2})(,AM)?$|l[lr][4-8][BL]{0,2}([MO]{2}|[DO]{2})[BL]{0,2}(,AM)?$',
+ '1402':
+ 'reg u[lr][4-8][OBP]{2,5}(,AM)?$|l[lr][4-8][OBL]{2,5}(,AM)?$|u[lr][4-8][MDBP]{2,5}(,AM)?$|l[lr][4-8][MDBL]{2,5}(,AM)?$|l[lr][1-3][MDBLI]{2,5},AM$|u[lr][1-3][MDBPI]{2,5},AM$',
+ '1401':
+ 'reg u[lr][4-8][MODBP]{1}(,AM)?$|l[lr][4-8][MODBL]{1}(,AM)?$|u[lr][1-3][MIDBP]{1},AM$|l[lr][1-3][MIDBL]{1},AM$',
+ '1011': 'SP+',
+ '1404':
+ 'reg u[lr][4-8][BP]{0,2}([MOD]{3}|[DOM]{3})[BP]{0,2}(,AM)?$|l[lr][4-8][BL]{0,2}([MOD]{3}|[DOM]{3})[BL]{0,2}(,AM)?$',
+ '5001': 'DR',
+ '2201': 'EX/S1',
+ '0101': 'CE',
+ '1425': '[ul][lr][456]CT$',
+ '5122': 'BR,RC',
+ '2206': 'reg l[lr]8EX/S3',
+ '1431': '[ul][lr][1-8]PR$',
+ '1726': 'reg [ul][lr][1-8]CR,A1',
+ '2207': 'reg l[lr]8EX/S4',
+ '1722': 'reg [ul][lr][1-8]CR,A1',
+ '1721': 'reg [ul][lr][1-8]CR,V1',
+ '0211': 'SM1',
+ '0213': 'SM',
+ '0212': 'SM2',
+ '1531': 'reg l[lr][6-8]AP$',
+ '1002': 'SP-',
+ '1001': 'SP',
+ '3611': 'ST',
+ '5032': 'PX+',
+ '5031': 'PX',
+ '1421':
+ 'reg u[lr][1-3][MDBPI]{1}(,CO)?$|l[lr][1-3][MDBIL]{1}(,CO)?$|u[lr][4-8][MDBP]{1},CO$|l[lr][4-8][MDBL]{1},CO$',
+ '1420':
+ 'reg u[lr][1-3][MDBPI]{2,5}(,CO)?$|l[lr][1-3][MDBIL]{2,5}(,CO)?$|u[lr][4-8][MDBP]{2},CO$|l[lr][4-8][MDBL]{2},CO$',
+ '2202': 'reg [ul][lr][1-3]EX/S2',
+ '2203': 'reg [ul][lr][4-7]EX/S2',
+ '2204': 'reg u[lr]8EX/S3',
+ '2205': 'reg u[lr]8EX/S4',
+ '1427':
+ 'reg u[lr][4-8][MODBP]{2,6},GL$|l[lr][4-8][MODBL]{2,6},GL$|u[lr][1-3][MDBPI]{2,6},GL$|l[lr][1-3][MDBLI]{2,6},GL$',
+ '1426':
+ 'reg u[lr][1-8][MDBP]{1},GL$|l[lr][1-8][MDBL]{1},GL$|[ul][lr][1-3]I,GL',
+ '1731': 'reg [ul][lr][1-8]C1$',
+ '1733': 'reg [ul][lr][1-8]C3$',
+ '1732': 'reg [ul][lr][1-8]C2$',
+ '1734': 'reg [ul][lr][1-8]C4$',
+ '5702': 'DV2',
+ '5703': 'DV3',
+ '1502': 'reg u[lr][45]RT$',
+ '1503': 'reg l[lr][45]RT$',
+ '1501': 'reg [ul][lr][1-3]RT$',
+ '1504': 'reg [ul][lr][6-8]RT$',
+ '2121': 'XV',
+ '1862': 'reg [ul][lr][1-8]BR,RC',
+ '5102': 'CR,TC',
+ '2211': 'FR',
+ '4403': 'reg [ul][lr][A-E]PX$',
+ '5712': 'RA2',
+ '5711': 'RA1',
+ '2101': 'EX',
+ '1742': 'reg [ul][lr][1-8]CR,TC',
+ '2734': 'LB -or- PB',
+ '2735': 'SR P/',
+ '2730': 'SR F/F',
+ '2732': 'SR F',
+ '5112': 'CR,RC',
+ '2738': 'SR',
+ '3631': 'SC',
+ '5051': 'SC',
+ '4001': 'OT',
+ '2221': 'EX/S5',
+ '2742': 'SS F -or- CC F',
+ '0711': 'FL',
+ '1751': 'reg [ul]lr][1-8]CR,OT',
+ '1712': 'reg [ul][lr][1-8]CR,A2',
+ '0221': 'AA',
+ '3701': 'AC',
+ '5041': 'ST',
+ '1807': 'reg [ul][lr][1-8]BR/CR,V1',
+ '1806': 'reg [ul][lr][1-8]BR/CR,GO',
+ '1041': 'SPL',
+ '1804': 'reg [ul][lr][1-8]BR/CR,GO',
+ '1601': 'PV',
+ '1808': 'reg [ul][lr][1-8]BR/CR,V2',
+ '0701': 'FS'}
+
+
+#
+# SOME FUNCTIONS SPECIFIC TO this update ##
+#
from xml.dom import minidom
+
def getFeeDictForModification(table):
'''
a comprehensive dictionary formed from the entire table in the database
'''
- query = '''select column_name from information_schema.columns
+ query = '''select column_name from information_schema.columns
where table_name = %s and table_schema = %s'''
values = (table, connect.myDb)
-
+
db = connect.connect()
cursor = db.cursor()
cursor.execute(query, values)
@@ -174,40 +207,42 @@ def getFeeDictForModification(table):
for row in rows:
header.append(row[0])
- query = 'select * from %s'% table
+ query = 'select * from %s' % table
cursor.execute(query)
rows = cursor.fetchall()
cursor.close()
-
+
return (header, rows)
+
def getAsXML(table):
'''
convert the table to XML
called by schema upgrade script 1_6 to 1_7
'''
- print "converting %s to xml"% table
+ print "converting %s to xml" % table
col_names, rows = getFeeDictForModification(table)
dom = minidom.Document()
tab = dom.createElement("table")
-
+
itemcodeIndex = col_names.index("code")
currentItem = ""
-
+
for row in rows:
newNode = row[itemcodeIndex] != currentItem
currentItem = row[itemcodeIndex]
if newNode:
item = dom.createElement("item")
-
+
i = 0
- fees=[]
- ptfees=[]
+ fees = []
+ ptfees = []
for col in col_names:
- makeNode = (col != "ix" and (newNode or not
- col in ("section", "code", "oldcode","USERCODE","regulation",
- "description","hide","pl_cmp")))
-
+ makeNode = (col != "ix" and (newNode or not
+ col in (
+ "section", "code", "oldcode", "USERCODE", "regulation",
+ "description", "hide", "pl_cmp")))
+
if col.startswith("fee") or col.startswith("pt_fee"):
makeNode = False
try:
@@ -220,12 +255,12 @@ def getAsXML(table):
fees.append(val)
else:
ptfees.append(val)
-
- if makeNode:
+
+ if makeNode:
if col == "USERCODE":
colno = col_names.index("code")
d = dom.createElement("USERCODE")
- val = REGEXDICT.get(row[colno],"")
+ val = REGEXDICT.get(row[colno], "")
d.appendChild(dom.createTextNode(val))
elif row[i]:
d = dom.createElement(col)
@@ -234,39 +269,42 @@ def getAsXML(table):
d.appendChild(dom.createTextNode(val))
item.appendChild(d)
i += 1
-
+
d = dom.createElement("fee")
d.appendChild(dom.createTextNode(str(fees).strip("[]")))
- item.appendChild(d)
+ item.appendChild(d)
p_fees_str = str(ptfees).strip("[]")
if p_fees_str:
d = dom.createElement("pt_fee")
d.appendChild(dom.createTextNode(p_fees_str))
- item.appendChild(d)
-
+ item.appendChild(d)
+
tab.appendChild(item)
dom.appendChild(tab)
-
+
result = dom.toxml()
dom.unlink()
return result
class UpdateException(Exception):
+
'''
A custom exception. If this is thrown the db will be rolled back
'''
pass
-
+
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
self.path = None
self.completed = False
self.MESSAGE = "upating database"
-
+
def progressSig(self, val, message=""):
'''
emits a signal showhing how we are proceeding.
@@ -279,7 +317,7 @@ class dbUpdater(QtCore.QThread):
def create_alter_tables(self):
'''
execute the above commands
- NOTE - this function may fail depending on the mysql permissions
+ NOTE - this function may fail depending on the mysql permissions
in place
'''
db = connect.connect()
@@ -291,50 +329,52 @@ class dbUpdater(QtCore.QThread):
for sql_string in SQLSTRINGS:
try:
cursor.execute(sql_string)
- except connect.GeneralError, e:
- print "FAILURE in executing sql statement", e
- print "erroneous statement was ",sql_string
+ except connect.GeneralError as e:
+ print "FAILURE in executing sql statement", e
+ print "erroneous statement was ", sql_string
if 1060 in e.args:
print "continuing, as column already exists issue"
- self.progressSig(10+70*i/commandNo,sql_string[:20]+"...")
+ self.progressSig(
+ 10 + 70 * i / commandNo,
+ sql_string[:20] + "...")
sucess = True
- except Exception, e:
- print "FAILURE in executing sql statements", e
+ except Exception as e:
+ print "FAILURE in executing sql statements", e
db.rollback()
if sucess:
db.commit()
db.autocommit(True)
else:
raise UpdateException("couldn't execute all statements!")
-
+
def insertValues(self):
'''
fee tables need a new column "Data" to replace the multiple tables
'''
-
+
db = connect.connect()
- cursor=db.cursor()
-
+ cursor = db.cursor()
+
cursor.execute('select ix, tablename from feetable_key')
rows = cursor.fetchall()
for ix, tablename in rows:
print "altering feetable", tablename
-
+
table_xml = getAsXML(tablename)
query = "update feetable_key set data = %s where ix = %s"
values = (table_xml, ix)
cursor.execute(query, values)
-
+
db.commit()
-
+
cursor.close()
db.close()
return True
-
+
def completeSig(self, arg):
self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
-
+
def run(self):
print "running script to convert from schema 1.6 to 1.7"
try:
@@ -344,24 +384,24 @@ class dbUpdater(QtCore.QThread):
#- transfer data between tables
self.progressSig(60, _('inserting values'))
-
+
print "inserting values"
if self.insertValues():
print "ok"
else:
- print "FAILED!!!!!"
+ print "FAILED!!!!!"
self.progressSig(90, _('updating settings'))
- print "update database settings..."
-
- schema_version.update(("1.6","1.7",), "1_6 to 1_7 script")
-
+ print "update database settings..."
+
+ schema_version.update(("1.6", "1.7",), "1_6 to 1_7 script")
+
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 1.7 " + _("you may now remove old feetables"))
-
- except UpdateException, e:
+ + " 1.7 " + _("you may now remove old feetables"))
+
+ except UpdateException as e:
localsettings.CLIENT_SCHEMA_VERSION = "1.6"
self.completeSig(_("rolled back to") + " 1.6")
diff --git a/src/openmolar/schema_upgrades/schema1_7to1_8.py b/src/openmolar/schema_upgrades/schema1_7to1_8.py
index a964d01..3fe7647 100644
--- a/src/openmolar/schema_upgrades/schema1_7to1_8.py
+++ b/src/openmolar/schema_upgrades/schema1_7to1_8.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
This module provides a function 'run' which will move data
@@ -18,24 +34,24 @@ from openmolar import connect
from PyQt4 import QtGui, QtCore
SQLSTRINGS = [
-'''
+ '''
alter table aslot
add column timestamp timestamp not null default CURRENT_TIMESTAMP
''',
-'DROP TABLE if exists phrasebook',
-'''
+ 'DROP TABLE if exists phrasebook',
+ '''
CREATE TABLE if not exists phrasebook (
clinician_id int unsigned NOT NULL,
phrases text,
PRIMARY KEY (clinician_id) )
''',
-'drop table if exists feetable_HDP',
-'drop table if exists feetable_Private_2009',
-'drop table if exists feetable_Private_2010',
-'drop table if exists feetable_scotNHS_08_Adult',
-'drop table if exists feetable_scotNHS_08_Child',
-'drop table if exists feetable_scotNHS_09_Adult',
-'drop table if exists feetable_scotNHS_09_Child',
+ 'drop table if exists feetable_HDP',
+ 'drop table if exists feetable_Private_2009',
+ 'drop table if exists feetable_Private_2010',
+ 'drop table if exists feetable_scotNHS_08_Adult',
+ 'drop table if exists feetable_scotNHS_08_Child',
+ 'drop table if exists feetable_scotNHS_09_Adult',
+ 'drop table if exists feetable_scotNHS_09_Child',
]
EXAMPLE_PHRASEBOOK = '''<?xml version="1.0" ?>
@@ -79,12 +95,15 @@ EXAMPLE_PHRASEBOOK = '''<?xml version="1.0" ?>
class UpdateException(Exception):
+
'''
A custom exception. If this is thrown the db will be rolled back
'''
pass
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
@@ -116,15 +135,17 @@ class dbUpdater(QtCore.QThread):
for sql_string in SQLSTRINGS:
try:
cursor.execute(sql_string)
- except connect.GeneralError, e:
- print "FAILURE in executing sql statement", e
- print "erroneous statement was ",sql_string
+ except connect.GeneralError as e:
+ print "FAILURE in executing sql statement", e
+ print "erroneous statement was ", sql_string
if 1060 in e.args:
print "continuing, as column already exists issue"
- self.progressSig(10+70*i/commandNo,sql_string[:20]+"...")
+ self.progressSig(
+ 10 + 70 * i / commandNo,
+ sql_string[:20] + "...")
sucess = True
- except Exception, e:
- print "FAILURE in executing sql statements", e
+ except Exception as e:
+ print "FAILURE in executing sql statements", e
db.rollback()
if sucess:
db.commit()
@@ -138,7 +159,7 @@ class dbUpdater(QtCore.QThread):
'''
db = connect.connect()
- cursor=db.cursor()
+ cursor = db.cursor()
query = "insert into phrasebook values (%s, %s)"
values = (0, EXAMPLE_PHRASEBOOK)
@@ -174,14 +195,14 @@ class dbUpdater(QtCore.QThread):
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 1.8")
+ + " 1.8")
- except UpdateException, e:
+ except UpdateException as e:
localsettings.CLIENT_SCHEMA_VERSION = "1.7"
self.completeSig(_("rolled back to") + " 1.7")
- except Exception, e:
- print "Exception caught",e
+ except Exception as e:
+ print "Exception caught", e
self.completeSig(str(e))
return self.completed
diff --git a/src/openmolar/schema_upgrades/schema1_8to1_9.py b/src/openmolar/schema_upgrades/schema1_8to1_9.py
index 72f3a04..f8c817f 100644
--- a/src/openmolar/schema_upgrades/schema1_8to1_9.py
+++ b/src/openmolar/schema_upgrades/schema1_8to1_9.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2012 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
This module provides a function 'run' which will move data
@@ -19,26 +35,30 @@ from openmolar import connect
from PyQt4 import QtGui, QtCore
SQLSTRINGS = [
-'''
+ '''
create table formatted_notes (ix serial, serialno int(11),
ndate date, op1 varchar(8), op2 varchar(8), ntype varchar(32),
note varchar(80), timestamp timestamp default NOW());
''',
-'''
+ '''
create index formatted_notes_serialno_index on formatted_notes(serialno);
''',
-'''
+ '''
create index newdocsprinted_serialno_index on newdocsprinted(serialno);
'''
]
+
class UpdateException(Exception):
+
'''
A custom exception. If this is thrown the db will be rolled back
'''
pass
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
@@ -70,15 +90,17 @@ class dbUpdater(QtCore.QThread):
for sql_string in SQLSTRINGS:
try:
cursor.execute(sql_string)
- except connect.GeneralError, e:
- print "FAILURE in executing sql statement", e
- print "erroneous statement was ",sql_string
+ except connect.GeneralError as e:
+ print "FAILURE in executing sql statement", e
+ print "erroneous statement was ", sql_string
if 1060 in e.args:
print "continuing, as column already exists issue"
- self.progressSig(2+70*i/commandNo,sql_string[:40]+"...")
+ self.progressSig(
+ 2 + 70 * i / commandNo,
+ sql_string[:40] + "...")
sucess = True
- except Exception, e:
- print "FAILURE in executing sql statements", e
+ except Exception as e:
+ print "FAILURE in executing sql statements", e
db.rollback()
if sucess:
db.commit()
@@ -93,13 +115,13 @@ class dbUpdater(QtCore.QThread):
from openmolar.schema_upgrades import formatted_notes1_9
max_sno = formatted_notes1_9.get_max_sno()
sno = 0
- print "max_sno in notes = %s "% max_sno
+ print "max_sno in notes = %s " % max_sno
while sno < max_sno:
sno += 1
formatted_notes1_9.transfer(sno)
- progress = int(sno/max_sno * 90)+8
- self.progressSig(progress, "%s %s"% (
+ progress = int(sno / max_sno * 90) + 8
+ self.progressSig(progress, "%s %s" % (
_('converting note'), sno))
QtGui.QApplication.instance().processEvents()
@@ -130,14 +152,14 @@ class dbUpdater(QtCore.QThread):
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 1.9")
+ + " 1.9")
- except UpdateException, e:
+ except UpdateException as e:
localsettings.CLIENT_SCHEMA_VERSION = "1.8"
self.completeSig(_("rolled back to") + " 1.8")
- except Exception, e:
- print "Exception caught",e
+ except Exception as e:
+ print "Exception caught", e
self.completeSig(str(e))
return self.completed
diff --git a/src/openmolar/schema_upgrades/schema1_9to2_0.py b/src/openmolar/schema_upgrades/schema1_9to2_0.py
index 30a8ad9..06afea3 100644
--- a/src/openmolar/schema_upgrades/schema1_9to2_0.py
+++ b/src/openmolar/schema_upgrades/schema1_9to2_0.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2012 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
This module provides a function 'run' which will move data
@@ -19,7 +35,7 @@ from openmolar import connect
from PyQt4 import QtGui, QtCore
SQLSTRINGS_1 = [
-'''
+ '''
create table appt_prefs (
serialno int(11),
recall_active bool not null default True,
@@ -37,23 +53,23 @@ create table appt_prefs (
]
SQLSTRINGS_2 = [
-'''
+ '''
insert into appt_prefs
(serialno, recall_active, recdent, recdent_period)
select serialno, True, recd, 6 from patients
where status != "deceased" and recd>20081231;
''',
-'''
+ '''
update appt_prefs as t1, patients as t2
set t1.recdent_period = 12
where t1.serialno = t2.serialno and t2.memo like "%yearly%";
''',
-'''
+ '''
update appt_prefs as t1, patients as t2
set t1.note = replace(replace(t2.memo,"\n"," "),"\r","")
where t1.serialno = t2.serialno and t2.memo like "%appt%";
''',
-'''
+ '''
update patients as t1, appt_prefs as t2
set t1.memo = ""
where t1.serialno = t2.serialno and t1.memo = t2.note;
@@ -61,13 +77,17 @@ where t1.serialno = t2.serialno and t1.memo = t2.note;
]
+
class UpdateException(Exception):
+
'''
A custom exception. If this is thrown the db will be rolled back
'''
pass
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
@@ -99,15 +119,17 @@ class dbUpdater(QtCore.QThread):
for sql_string in sql_strings:
try:
cursor.execute(sql_string)
- except connect.GeneralError, e:
- print "FAILURE in executing sql statement", e
- print "erroneous statement was ",sql_string
+ except connect.GeneralError as e:
+ print "FAILURE in executing sql statement", e
+ print "erroneous statement was ", sql_string
if 1060 in e.args:
print "continuing, as column already exists issue"
- self.progressSig(2+70*i/commandNo,sql_string[:40]+"...")
+ self.progressSig(
+ 2 + 70 * i / commandNo,
+ sql_string[:40] + "...")
sucess = True
- except Exception, e:
- print "FAILURE in executing sql statements", e
+ except Exception as e:
+ print "FAILURE in executing sql statements", e
db.rollback()
if sucess:
db.commit()
@@ -136,14 +158,14 @@ class dbUpdater(QtCore.QThread):
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 2.0")
+ + " 2.0")
- except UpdateException, e:
+ except UpdateException as e:
localsettings.CLIENT_SCHEMA_VERSION = "1.9"
self.completeSig(_("rolled back to") + " 1.9")
- except Exception, e:
- print "Exception caught",e
+ except Exception as e:
+ print "Exception caught", e
self.completeSig(str(e))
return self.completed
diff --git a/src/openmolar/schema_upgrades/schema2_0to2_1.py b/src/openmolar/schema_upgrades/schema2_0to2_1.py
index 74ede17..663ced7 100644
--- a/src/openmolar/schema_upgrades/schema2_0to2_1.py
+++ b/src/openmolar/schema_upgrades/schema2_0to2_1.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2012 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
This module provides a function 'run' which will move data
@@ -24,9 +40,9 @@ from PyQt4 import QtGui, QtCore
logging.basicConfig()
SQLSTRINGS = [
-'drop table if exists currtrtmt2',
+ 'drop table if exists currtrtmt2',
-'''
+ '''
create table currtrtmt2 (
courseno int(11) unsigned not null auto_increment ,
serialno int(11) ,
@@ -123,85 +139,89 @@ INDEX (serialno)
SOURCE_QUERY = '''
-SELECT courseno, serialno, examt, examd, accd, cmpd,
-xraypl, periopl, anaespl, otherpl, ndupl, ndlpl,
+SELECT courseno, serialno, examt, examd, accd, cmpd,
+xraypl, periopl, anaespl, otherpl, ndupl, ndlpl,
odupl, odlpl, custompl,
-ur8pl, ur7pl, ur6pl, ur5pl, ur4pl, ur3pl, ur2pl, ur1pl, ul1pl, ul2pl,
-ul3pl, ul4pl, ul5pl, ul6pl, ul7pl, ul8pl, ll8pl, ll7pl, ll6pl, ll5pl, ll4pl,
-ll3pl, ll2pl, ll1pl, lr1pl, lr2pl, lr3pl, lr4pl, lr5pl, lr6pl, lr7pl, lr8pl,
-ur8cmp, ur7cmp, ur6cmp, ur5cmp, ur4cmp, ur3cmp, ur2cmp, ur1cmp, ul1cmp,
-ul2cmp, ul3cmp, ul4cmp, ul5cmp, ul6cmp, ul7cmp, ul8cmp, ll8cmp, ll7cmp,
-ll6cmp, ll5cmp, ll4cmp, ll3cmp, ll2cmp, ll1cmp, lr1cmp, lr2cmp, lr3cmp,
+ur8pl, ur7pl, ur6pl, ur5pl, ur4pl, ur3pl, ur2pl, ur1pl, ul1pl, ul2pl,
+ul3pl, ul4pl, ul5pl, ul6pl, ul7pl, ul8pl, ll8pl, ll7pl, ll6pl, ll5pl, ll4pl,
+ll3pl, ll2pl, ll1pl, lr1pl, lr2pl, lr3pl, lr4pl, lr5pl, lr6pl, lr7pl, lr8pl,
+ur8cmp, ur7cmp, ur6cmp, ur5cmp, ur4cmp, ur3cmp, ur2cmp, ur1cmp, ul1cmp,
+ul2cmp, ul3cmp, ul4cmp, ul5cmp, ul6cmp, ul7cmp, ul8cmp, ll8cmp, ll7cmp,
+ll6cmp, ll5cmp, ll4cmp, ll3cmp, ll2cmp, ll1cmp, lr1cmp, lr2cmp, lr3cmp,
lr4cmp, lr5cmp, lr6cmp, lr7cmp, lr8cmp,
-xraycmp, periocmp, anaescmp, othercmp,
-nducmp, ndlcmp, oducmp, odlcmp, customcmp
+xraycmp, periocmp, anaescmp, othercmp,
+nducmp, ndlcmp, oducmp, odlcmp, customcmp
from currtrtmt order by courseno'''
DEST_QUERY = '''
-insert into currtrtmt2 (serialno, examt, examd, accd, cmpd,
-xraypl, periopl, anaespl, otherpl, ndupl, ndlpl,
+insert into currtrtmt2 (serialno, examt, examd, accd, cmpd,
+xraypl, periopl, anaespl, otherpl, ndupl, ndlpl,
odupl, odlpl, custompl,
-ur8pl, ur7pl, ur6pl, ur5pl, ur4pl, ur3pl, ur2pl, ur1pl, ul1pl, ul2pl,
-ul3pl, ul4pl, ul5pl, ul6pl, ul7pl, ul8pl, ll8pl, ll7pl, ll6pl, ll5pl, ll4pl,
-ll3pl, ll2pl, ll1pl, lr1pl, lr2pl, lr3pl, lr4pl, lr5pl, lr6pl, lr7pl, lr8pl,
-ur8cmp, ur7cmp, ur6cmp, ur5cmp, ur4cmp, ur3cmp, ur2cmp, ur1cmp, ul1cmp,
-ul2cmp, ul3cmp, ul4cmp, ul5cmp, ul6cmp, ul7cmp, ul8cmp, ll8cmp, ll7cmp,
-ll6cmp, ll5cmp, ll4cmp, ll3cmp, ll2cmp, ll1cmp, lr1cmp, lr2cmp, lr3cmp,
+ur8pl, ur7pl, ur6pl, ur5pl, ur4pl, ur3pl, ur2pl, ur1pl, ul1pl, ul2pl,
+ul3pl, ul4pl, ul5pl, ul6pl, ul7pl, ul8pl, ll8pl, ll7pl, ll6pl, ll5pl, ll4pl,
+ll3pl, ll2pl, ll1pl, lr1pl, lr2pl, lr3pl, lr4pl, lr5pl, lr6pl, lr7pl, lr8pl,
+ur8cmp, ur7cmp, ur6cmp, ur5cmp, ur4cmp, ur3cmp, ur2cmp, ur1cmp, ul1cmp,
+ul2cmp, ul3cmp, ul4cmp, ul5cmp, ul6cmp, ul7cmp, ul8cmp, ll8cmp, ll7cmp,
+ll6cmp, ll5cmp, ll4cmp, ll3cmp, ll2cmp, ll1cmp, lr1cmp, lr2cmp, lr3cmp,
lr4cmp, lr5cmp, lr6cmp, lr7cmp, lr8cmp,
-xraycmp, periocmp, anaescmp, othercmp,
+xraycmp, periocmp, anaescmp, othercmp,
nducmp, ndlcmp, oducmp, odlcmp, customcmp)
-values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
-%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
-%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
-%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
+values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
+%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
+%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
+%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
'''
-PATIENT_QUERY = '''
+PATIENT_QUERY = '''
update patients set courseno0=%s where serialno=%s and courseno0=%s
'''
-ESTIMATES_QUERY = '''
+ESTIMATES_QUERY = '''
update newestimates set courseno=%s where serialno=%s and courseno=%s
'''
GARBAGE_QUERY = '''
-delete from currtrtmt2
-WHERE examt="" AND xraypl="" AND periopl="" AND anaespl="" AND otherpl=""
-AND ndupl="" AND ndlpl="" AND odupl="" AND odlpl="" AND custompl=""
-AND ur8pl="" AND ur7pl="" AND ur6pl="" AND ur5pl="" AND ur4pl="" AND ur3pl=""
-AND ur2pl="" AND ur1pl="" AND ul1pl="" AND ul2pl="" AND ul3pl="" AND ul4pl=""
-AND ul5pl="" AND ul6pl="" AND ul7pl="" AND ul8pl="" AND ll8pl="" AND ll7pl=""
-AND ll6pl="" AND ll5pl="" AND ll4pl="" AND ll3pl="" AND ll2pl="" AND ll1pl=""
-AND lr1pl="" AND lr2pl="" AND lr3pl="" AND lr4pl="" AND lr5pl="" AND lr6pl=""
-AND lr7pl="" AND lr8pl="" AND
-ur8cmp="" AND ur7cmp="" AND ur6cmp="" AND ur5cmp="" AND ur4cmp="" AND
-ur3cmp="" AND ur2cmp="" AND ur1cmp="" AND ul1cmp="" AND ul2cmp="" AND
-ul3cmp="" AND ul4cmp="" AND ul5cmp="" AND ul6cmp="" AND ul7cmp="" AND
-ul8cmp="" AND ll8cmp="" AND ll7cmp="" AND ll6cmp="" AND ll5cmp="" AND
-ll4cmp="" AND ll3cmp="" AND ll2cmp="" AND ll1cmp="" AND lr1cmp="" AND
-lr2cmp="" AND lr3cmp="" AND lr4cmp="" AND lr5cmp="" AND lr6cmp="" AND
-lr7cmp="" AND lr8cmp="" AND
-xraycmp="" AND periocmp="" AND anaescmp="" AND othercmp="" AND nducmp=""
+delete from currtrtmt2
+WHERE examt="" AND xraypl="" AND periopl="" AND anaespl="" AND otherpl=""
+AND ndupl="" AND ndlpl="" AND odupl="" AND odlpl="" AND custompl=""
+AND ur8pl="" AND ur7pl="" AND ur6pl="" AND ur5pl="" AND ur4pl="" AND ur3pl=""
+AND ur2pl="" AND ur1pl="" AND ul1pl="" AND ul2pl="" AND ul3pl="" AND ul4pl=""
+AND ul5pl="" AND ul6pl="" AND ul7pl="" AND ul8pl="" AND ll8pl="" AND ll7pl=""
+AND ll6pl="" AND ll5pl="" AND ll4pl="" AND ll3pl="" AND ll2pl="" AND ll1pl=""
+AND lr1pl="" AND lr2pl="" AND lr3pl="" AND lr4pl="" AND lr5pl="" AND lr6pl=""
+AND lr7pl="" AND lr8pl="" AND
+ur8cmp="" AND ur7cmp="" AND ur6cmp="" AND ur5cmp="" AND ur4cmp="" AND
+ur3cmp="" AND ur2cmp="" AND ur1cmp="" AND ul1cmp="" AND ul2cmp="" AND
+ul3cmp="" AND ul4cmp="" AND ul5cmp="" AND ul6cmp="" AND ul7cmp="" AND
+ul8cmp="" AND ll8cmp="" AND ll7cmp="" AND ll6cmp="" AND ll5cmp="" AND
+ll4cmp="" AND ll3cmp="" AND ll2cmp="" AND ll1cmp="" AND lr1cmp="" AND
+lr2cmp="" AND lr3cmp="" AND lr4cmp="" AND lr5cmp="" AND lr6cmp="" AND
+lr7cmp="" AND lr8cmp="" AND
+xraycmp="" AND periocmp="" AND anaescmp="" AND othercmp="" AND nducmp=""
AND ndlcmp="" AND oducmp="" AND odlcmp="" AND customcmp=""
'''
-## don't use this one.. seems unnecessary.
+# don't use this one.. seems unnecessary.
CORRECTION_QUERY = '''
-update patients join
-(select serialno, max(courseno) cno from currtrtmt2 group by serialno) as t
-on t.serialno = patients.serialno set courseno0 = cno
+update patients join
+(select serialno, max(courseno) cno from currtrtmt2 group by serialno) as t
+on t.serialno = patients.serialno set courseno0 = cno
where cno > courseno0
'''
+
class UpdateException(Exception):
+
'''
A custom exception. If this is thrown the db will be rolled back
'''
pass
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
@@ -233,15 +253,17 @@ class dbUpdater(QtCore.QThread):
for sql_string in sql_strings:
try:
cursor.execute(sql_string)
- except connect.GeneralError, e:
- print "FAILURE in executing sql statement", e
- print "erroneous statement was ",sql_string
+ except connect.GeneralError as e:
+ print "FAILURE in executing sql statement", e
+ print "erroneous statement was ", sql_string
if 1060 in e.args:
print "continuing, as column already exists issue"
- self.progressSig(2+70*i/commandNo,sql_string[:40]+"...")
+ self.progressSig(
+ 2 + 70 * i / commandNo,
+ sql_string[:40] + "...")
sucess = True
- except Exception, e:
- print "FAILURE in executing sql statements", e
+ except Exception as e:
+ print "FAILURE in executing sql statements", e
db.rollback()
if sucess:
db.commit()
@@ -259,12 +281,12 @@ class dbUpdater(QtCore.QThread):
self.progressSig(5, _("creating currtrtmt2 table"))
self.execute_statements(SQLSTRINGS)
self.progressSig(10, _('transferring data'))
-
+
self.transfer_data()
self.progressSig(95, _("deleting void courses"))
self.execute_statements([GARBAGE_QUERY, CORRECTION_QUERY])
-
+
self.progressSig(97, _('updating settings'))
print "update database settings..."
@@ -273,14 +295,14 @@ class dbUpdater(QtCore.QThread):
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 2.1")
+ + " 2.1")
- except UpdateException, e:
+ except UpdateException as e:
localsettings.CLIENT_SCHEMA_VERSION = "2.0"
self.completeSig(_("rolled back to") + " 2.0")
- except Exception, e:
- print "Exception caught",e
+ except Exception as e:
+ print "Exception caught", e
self.completeSig(str(e))
return self.completed
@@ -297,7 +319,7 @@ class dbUpdater(QtCore.QThread):
rows = cursor.fetchall()
cursor.close()
cursor = db.cursor()
- step = 1 / len(rows)
+ step = 1 / len(rows)
for i, row in enumerate(rows):
courseno = row[0]
serialno = row[1]
@@ -306,8 +328,8 @@ class dbUpdater(QtCore.QThread):
cursor.execute(PATIENT_QUERY, (new_cno, serialno, courseno))
cursor.execute(ESTIMATES_QUERY, (new_cno, serialno, courseno))
if i % 100 == 0:
- self.progressSig(80 * i/len(rows) + 10,
- _("transfering data"))
+ self.progressSig(80 * i / len(rows) + 10,
+ _("transfering data"))
cursor.close()
db.commit()
db.close()
diff --git a/src/openmolar/schema_upgrades/schema2_1to2_2.py b/src/openmolar/schema_upgrades/schema2_1to2_2.py
index 63efc3f..e28c0e8 100644
--- a/src/openmolar/schema_upgrades/schema2_1to2_2.py
+++ b/src/openmolar/schema_upgrades/schema2_1to2_2.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2012 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
This module provides a function 'run' which will move data
@@ -24,16 +40,16 @@ from PyQt4 import QtGui, QtCore
logging.basicConfig()
SQLSTRINGS = [
-'drop table if exists currtrtmt',
-'drop table if exists est_link',
-'drop table if exists feescales',
-'drop table est_logger',
-'update patients set addr2="" where addr2 is NULL',
-'update patients set addr3="" where addr3 is NULL',
-'update patients set town="" where town is NULL',
-'update patients set county="" where town is NULL',
+ 'drop table if exists currtrtmt',
+ 'drop table if exists est_link',
+ 'drop table if exists feescales',
+ 'drop table est_logger',
+ 'update patients set addr2="" where addr2 is NULL',
+ 'update patients set addr3="" where addr3 is NULL',
+ 'update patients set town="" where town is NULL',
+ 'update patients set county="" where town is NULL',
-'''
+ '''
alter table patients
alter column addr2 set default "",
alter column addr3 set default "",
@@ -41,19 +57,19 @@ alter table patients
alter column county set default ""
''',
-'''
+ '''
alter table newestimates modify column itemcode char(5)
''',
-'''
+ '''
update newestimates set itemcode="-----" where itemcode = "4001"
''',
-'''
+ '''
update newestimates set itemcode="CUSTO" where itemcode = "4002"
''',
-'''
+ '''
create table est_link (
ix int(11) unsigned not null auto_increment ,
est_id int(11),
@@ -64,9 +80,9 @@ PRIMARY KEY (ix),
INDEX (est_id)
)''',
-'create index est_link_hash_index on est_link(tx_hash)',
+ 'create index est_link_hash_index on est_link(tx_hash)',
-'''
+ '''
create table feescales (
ix int(11) unsigned not null auto_increment,
in_use bool not null default false,
@@ -76,7 +92,7 @@ create table feescales (
PRIMARY KEY (ix)
)''',
-'''
+ '''
create table est_logger (
ix int(11) unsigned not null auto_increment,
courseno int(11) unsigned not null,
@@ -86,21 +102,21 @@ create table est_logger (
PRIMARY KEY (ix)
)''',
-'update currtrtmt2 set ndlpl = replace(ndlpl, "SR ", "SR_")',
-'update currtrtmt2 set ndlpl = replace(ndlpl, "CC ", "CC_")',
-'update currtrtmt2 set ndupl = replace(ndupl, "SR ", "SR_")',
-'update currtrtmt2 set ndupl = replace(ndupl, "SR ", "SR_")',
-'update currtrtmt2 set ndlcmp = replace(ndlcmp, "SR ", "SR_")',
-'update currtrtmt2 set ndlcmp = replace(ndlcmp, "CC ", "CC_")',
-'update currtrtmt2 set nducmp = replace(nducmp, "SR ", "SR_")',
-'update currtrtmt2 set nducmp = replace(nducmp, "SR ", "SR_")',
+ 'update currtrtmt2 set ndlpl = replace(ndlpl, "SR ", "SR_")',
+ 'update currtrtmt2 set ndlpl = replace(ndlpl, "CC ", "CC_")',
+ 'update currtrtmt2 set ndupl = replace(ndupl, "SR ", "SR_")',
+ 'update currtrtmt2 set ndupl = replace(ndupl, "SR ", "SR_")',
+ 'update currtrtmt2 set ndlcmp = replace(ndlcmp, "SR ", "SR_")',
+ 'update currtrtmt2 set ndlcmp = replace(ndlcmp, "CC ", "CC_")',
+ 'update currtrtmt2 set nducmp = replace(nducmp, "SR ", "SR_")',
+ 'update currtrtmt2 set nducmp = replace(nducmp, "SR ", "SR_")',
-'''
+ '''
update newestimates set type = replace(type, "SR ", "SR_")
where category in ("ndu", "ndl")
''',
-'''
+ '''
update newestimates set type = replace(type, "CC ", "CC_")
where category in ("ndu", "ndl")
'''
@@ -109,16 +125,16 @@ where category in ("ndu", "ndl")
SOURCE_QUERY = ('SELECT courseno, ix, category, type, completed '
-'FROM newestimates '
-'ORDER BY serialno, courseno, category, type, completed DESC')
+ 'FROM newestimates '
+ 'ORDER BY serialno, courseno, category, type, completed DESC')
DEST_QUERY = ('insert into est_link (est_id, tx_hash, completed) '
-'values (%s, %s, %s)')
+ 'values (%s, %s, %s)')
FEESCALE_QUERY = ('insert into feescales (xml_data, in_use, comment) '
-'values (%s, 1, "example feescale")')
+ 'values (%s, 1, "example feescale")')
-#this query gets selected estimate data for all active courses
+# this query gets selected estimate data for all active courses
LOGGER_SELECT_QUERY = '''
select newestimates.courseno, number, itemcode, description, csetype,
feescale, dent, fee, ptfee from newestimates join
@@ -130,15 +146,19 @@ order by newestimates.courseno, newestimates.itemcode, newestimates.ix
'''
LOGGER_INSERT_QUERY = ('insert into est_logger '
-'(courseno, est_data, operator) values (%s,%s, %s)')
+ '(courseno, est_data, operator) values (%s,%s, %s)')
+
class UpdateException(Exception):
+
'''
A custom exception. If this is thrown the db will be rolled back
'''
pass
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
@@ -170,15 +190,17 @@ class dbUpdater(QtCore.QThread):
for sql_string in sql_strings:
try:
cursor.execute(sql_string)
- except connect.GeneralError, e:
- print "FAILURE in executing sql statement", e
- print "erroneous statement was ",sql_string
+ except connect.GeneralError as e:
+ print "FAILURE in executing sql statement", e
+ print "erroneous statement was ", sql_string
if 1060 in e.args:
print "continuing, as column already exists issue"
- self.progressSig(2+70*i/commandNo,sql_string[:40]+"...")
+ self.progressSig(
+ 2 + 70 * i / commandNo,
+ sql_string[:40] + "...")
sucess = True
- except Exception, e:
- print "FAILURE in executing sql statements", e
+ except Exception as e:
+ print "FAILURE in executing sql statements", e
db.rollback()
if sucess:
db.commit()
@@ -210,14 +232,14 @@ class dbUpdater(QtCore.QThread):
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 2.2")
+ + " 2.2")
- except UpdateException, e:
+ except UpdateException as e:
localsettings.CLIENT_SCHEMA_VERSION = "2.1"
self.completeSig(_("rolled back to") + " 2.1")
- except Exception, e:
- print "Exception caught",e
+ except Exception as e:
+ print "Exception caught", e
self.completeSig(str(e))
return self.completed
@@ -239,7 +261,7 @@ class dbUpdater(QtCore.QThread):
prev_hash = None
for i, row in enumerate(rows):
courseno, ix, category, type_, completed = row
- cat_type = "%s%s"% (category, type_)
+ cat_type = "%s%s" % (category, type_)
if courseno != prev_courseno:
count = 1
elif cat_type != prev_cat_type:
@@ -250,15 +272,15 @@ class dbUpdater(QtCore.QThread):
prev_courseno = courseno
prev_cat_type = cat_type
- tx_hash = hash("%s%s%s%s"% (courseno, category, count, type_))
+ tx_hash = hash("%s%s%s%s" % (courseno, category, count, type_))
if completed is None:
completed = False
values = (ix, tx_hash, completed)
cursor.execute(DEST_QUERY, values)
if i % 1000 == 0:
- self.progressSig(50 * i/len(rows) + 10,
- _("transfering data"))
+ self.progressSig(50 * i / len(rows) + 10,
+ _("transfering data"))
cursor.execute(LOGGER_SELECT_QUERY)
rows = cursor.fetchall()
@@ -266,18 +288,18 @@ class dbUpdater(QtCore.QThread):
est_log_text = ""
total, p_total = 0, 0
for i, (courseno, number, itemcode, description, csetype,
- feescale, dent, fee, ptfee) in enumerate(rows):
+ feescale, dent, fee, ptfee) in enumerate(rows):
line_text = \
- "%s || %s || %s || %s || %s || %s || %s || %s||\n"% (
- number, itemcode, description, csetype,
- feescale, dent, fee, ptfee)
+ "%s || %s || %s || %s || %s || %s || %s || %s||\n" % (
+ number, itemcode, description, csetype,
+ feescale, dent, fee, ptfee)
if prev_courseno is None or courseno == prev_courseno:
est_log_text += line_text
total += fee
p_total += ptfee
else:
- est_log_text += "TOTAL || || || || || || %s || %s"% (
+ est_log_text += "TOTAL || || || || || || %s || %s" % (
total, p_total)
values = (prev_courseno, est_log_text, "2_2script")
cursor.execute(LOGGER_INSERT_QUERY, values)
@@ -286,8 +308,8 @@ class dbUpdater(QtCore.QThread):
prev_courseno = courseno
if i % 1000 == 0:
- self.progressSig(30 * i/len(rows) + 60,
- _("transfering data"))
+ self.progressSig(30 * i / len(rows) + 60,
+ _("transfering data"))
db.commit()
db.close()
@@ -298,7 +320,7 @@ class dbUpdater(QtCore.QThread):
def insert_feescales(self):
feescale_path = os.path.join(localsettings.wkdir, 'resources',
- "feescales", "example_feescale.xml")
+ "feescales", "example_feescale.xml")
db = connect.connect()
db.autocommit(False)
try:
diff --git a/src/openmolar/schema_upgrades/schema2_2to2_3.py b/src/openmolar/schema_upgrades/schema2_2to2_3.py
index def768f..a9e276d 100644
--- a/src/openmolar/schema_upgrades/schema2_2to2_3.py
+++ b/src/openmolar/schema_upgrades/schema2_2to2_3.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2012 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
This module provides a function 'run' which will move data
@@ -24,9 +40,9 @@ from PyQt4 import QtGui, QtCore
logging.basicConfig()
SQLSTRINGS = [
-'drop table if exists est_link2',
+ 'drop table if exists est_link2',
-'''
+ '''
create table est_link2 (
ix int(11) unsigned not null auto_increment ,
est_id int(11),
@@ -37,24 +53,24 @@ PRIMARY KEY (ix),
INDEX (est_id)
)''',
-'create index est_link2_hash_index on est_link2(tx_hash)',
+ 'create index est_link2_hash_index on est_link2(tx_hash)',
]
SOURCE_QUERY = ('SELECT courseno, ix, category, type, completed '
-'FROM newestimates where type is not null '
-'ORDER BY serialno, courseno, category, type, completed DESC')
+ 'FROM newestimates where type is not null '
+ 'ORDER BY serialno, courseno, category, type, completed DESC')
DEST_QUERY = ('insert into est_link2 (est_id, tx_hash, completed) '
-'values (%s, %s, %s)')
+ 'values (%s, %s, %s)')
CLEANUPSTRINGS = [
-'''
+ '''
update est_link join est_link2
on est_link.est_id = est_link2.est_id
set est_link2.completed = est_link.completed,
est_link2.daybook_id = est_link.daybook_id
''',
-'''
+ '''
insert into est_link2 (est_id, daybook_id, tx_hash, completed)
select est_link.est_id, est_link.daybook_id, "BAD_HASH",
est_link.completed from est_link left join est_link2
@@ -63,14 +79,16 @@ on est_link.est_id=est_link2.est_id where est_link2.tx_hash is NULL
]
-
class UpdateException(Exception):
+
'''
A custom exception. If this is thrown the db will be rolled back
'''
pass
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
@@ -102,15 +120,17 @@ class dbUpdater(QtCore.QThread):
for sql_string in sql_strings:
try:
cursor.execute(sql_string)
- except connect.GeneralError, e:
- print "FAILURE in executing sql statement", e
- print "erroneous statement was ",sql_string
+ except connect.GeneralError as e:
+ print "FAILURE in executing sql statement", e
+ print "erroneous statement was ", sql_string
if 1060 in e.args:
print "continuing, as column already exists issue"
- self.progressSig(2+70*i/commandNo,sql_string[:40]+"...")
+ self.progressSig(
+ 2 + 70 * i / commandNo,
+ sql_string[:40] + "...")
sucess = True
- except Exception, e:
- print "FAILURE in executing sql statements", e
+ except Exception as e:
+ print "FAILURE in executing sql statements", e
db.rollback()
if sucess:
db.commit()
@@ -142,14 +162,14 @@ class dbUpdater(QtCore.QThread):
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 2.3")
+ + " 2.3")
- except UpdateException, e:
+ except UpdateException as e:
localsettings.CLIENT_SCHEMA_VERSION = "2.2"
self.completeSig(_("rolled back to") + " 2.2")
except Exception as exc:
- logging.exception ("Exception caught")
+ logging.exception("Exception caught")
self.completeSig(str(exc))
return self.completed
@@ -171,7 +191,7 @@ class dbUpdater(QtCore.QThread):
prev_hash = None
for i, row in enumerate(rows):
courseno, ix, category, type_, completed = row
- cat_type = "%s%s"% (category, type_)
+ cat_type = "%s%s" % (category, type_)
if courseno != prev_courseno:
count = 1
elif cat_type != prev_cat_type:
@@ -182,16 +202,16 @@ class dbUpdater(QtCore.QThread):
prev_courseno = courseno
prev_cat_type = cat_type
- tx_hash= localsettings.hash_func(
- "%s%s%s%s"% (courseno, category, count, type_))
+ tx_hash = localsettings.hash_func(
+ "%s%s%s%s" % (courseno, category, count, type_))
if completed is None:
completed = False
values = (ix, tx_hash, completed)
cursor.execute(DEST_QUERY, values)
if i % 1000 == 0:
- self.progressSig(85 * i/len(rows) + 10,
- _("transfering data"))
+ self.progressSig(85 * i / len(rows) + 10,
+ _("transfering data"))
db.commit()
db.close()
except Exception as exc:
diff --git a/src/openmolar/schema_upgrades/schema2_3to2_4.py b/src/openmolar/schema_upgrades/schema2_3to2_4.py
index a65aee1..42b9a99 100644
--- a/src/openmolar/schema_upgrades/schema2_3to2_4.py
+++ b/src/openmolar/schema_upgrades/schema2_3to2_4.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2012 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
This module provides a function 'run' which will move data
@@ -24,9 +40,9 @@ from PyQt4 import QtGui, QtCore
logging.basicConfig()
SQLSTRINGS = [
-'drop table if exists daybook_link',
+ 'drop table if exists daybook_link',
-'''
+ '''
create table daybook_link (
ix int(11) unsigned not null auto_increment ,
daybook_id int(11),
@@ -35,22 +51,25 @@ PRIMARY KEY (ix),
INDEX (daybook_id)
)''',
-'create index daybook_id_index on daybook_link(tx_hash)',
+ 'create index daybook_id_index on daybook_link(tx_hash)',
]
CLEANUPSTRINGS = [
-'drop table if exists est_link', #obsolete since schema 2.2
-'alter table est_link2 drop column daybook_id'
+ 'drop table if exists est_link', # obsolete since schema 2.2
+ 'alter table est_link2 drop column daybook_id'
]
class UpdateException(Exception):
+
'''
A custom exception. If this is thrown the db will be rolled back
'''
pass
+
class dbUpdater(QtCore.QThread):
+
def __init__(self, parent=None):
super(dbUpdater, self).__init__(parent)
self.stopped = False
@@ -82,15 +101,17 @@ class dbUpdater(QtCore.QThread):
for sql_string in sql_strings:
try:
cursor.execute(sql_string)
- except connect.GeneralError, e:
- print "FAILURE in executing sql statement", e
- print "erroneous statement was ",sql_string
+ except connect.GeneralError as e:
+ print "FAILURE in executing sql statement", e
+ print "erroneous statement was ", sql_string
if 1060 in e.args:
print "continuing, as column already exists issue"
- self.progressSig(2+70*i/commandNo,sql_string[:40]+"...")
+ self.progressSig(
+ 2 + 70 * i / commandNo,
+ sql_string[:40] + "...")
sucess = True
- except Exception, e:
- print "FAILURE in executing sql statements", e
+ except Exception as e:
+ print "FAILURE in executing sql statements", e
db.rollback()
if sucess:
db.commit()
@@ -108,8 +129,8 @@ class dbUpdater(QtCore.QThread):
self.progressSig(50, _("creating est_link2 table"))
self.execute_statements(SQLSTRINGS)
- #self.progressSig(30, _("transferring data"))
- #self.transfer_data()
+ # self.progressSig(30, _("transferring data"))
+ # self.transfer_data()
self.progressSig(95, _("executing cleanup statements"))
self.execute_statements(CLEANUPSTRINGS)
@@ -122,14 +143,14 @@ class dbUpdater(QtCore.QThread):
self.progressSig(100, _("updating stored schema version"))
self.completed = True
self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 2.4")
+ + " 2.4")
- except UpdateException, e:
+ except UpdateException as e:
localsettings.CLIENT_SCHEMA_VERSION = "2.3"
self.completeSig(_("rolled back to") + " 2.3")
except Exception as exc:
- logging.exception ("Exception caught")
+ logging.exception("Exception caught")
self.completeSig(str(exc))
return self.completed
diff --git a/src/openmolar/settings/__init__.py b/src/openmolar/settings/__init__.py
index 8b13789..c701215 100755
--- a/src/openmolar/settings/__init__.py
+++ b/src/openmolar/settings/__init__.py
@@ -1 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/openmolar/settings/allowed.py b/src/openmolar/settings/allowed.py
index 9ebfa94..e7f7f03 100644
--- a/src/openmolar/settings/allowed.py
+++ b/src/openmolar/settings/allowed.py
@@ -1,101 +1,120 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License for more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
-#I removed these... '#B', '#B,CO', '#DO', '#MO', '#MOD', '#P,CO', '+P', '+S', '-M,2'
-#and '-D,2', '-M,1', '-M,2',
+backToothCodes = ("+P", "+S", "AP", "AT", "B", "B,AM",
+ "B,CO", "B,CO,CT", "B,CO,PR", "B,CT", "B,CT,CO", "B,GL", "BD", "BDLOM,CO,PR",
+ "BM", "BM,CO", "BMO", "BMODP", "BMOL,CO", "BO", "BO,AM", "BO,CO",
+ "BO,GL", "BOL", "BOM", "BR/CR,A1", "BR/CR,A2", "BR/CR,OT", "BR/CR,V1", "BR/CR,V1,PR",
+ "BR/P,A2", "BR/P,OT", "BR/P,V1", "CR,OPAL", "CR,OPALITE",
+ "CR,LAVA", "CR,EMAX", "CR,EVEREST", "CR,FORT",
+ "CR,A1", "CR,A1,C4", "CR,A1,PR", "CR,A2", "CR,GO",
+ "CR,GO,PR", "CR,OT", "CR,OT,C4", "CR,P1", "CR,P1,C3", "CR,PJ", "CR,V1", "CR,V1,C1",
+ "CR,V1,C2", "CR,V1,C3", "CR,V1,PR", "CR,V2", "CR/MODB,GO", "CR/MODL,GO", "CR/MODP,GO", "D",
+ "D,AM", "D,CO", "D,GL", "DB", "DB,AM", "DB,CO", "DB,CT,CO", "DB,GL",
+ "DBM,CO", "DBO", "DBO,CO", "DL", "DL,CO", "DL,GL", "DMO", "DO",
+ "DO,AM", "DO,CO", "DO,GL", "DO,PR", "DOB", "DOB,AM", "DOB,CO", "DOB,GL",
+ "DOB,PR", "DOB,PR,CO", "DOBL", "DOBL,PR", "DOBM,CO", "DOBM,GL", "DOBP,CO", "DOL",
+ "DOL,CO", "DOL,CO,PR", "DOL,GL", "DOL,PR", "DOLB", "DOM", "DOM,CO", "DOMB",
+ "DOML,PR", "DOMP,CO", "DOP", "DOP,AM", "DOP,CO", "DOP,CO,PR", "DOP,GL", "DOP,PR",
+ "DOP,PR,CO", "DOPM", "DP", "DP,CO", "DP,CT,CO", "DP,GL", "DR", "FA",
+ "FS", "FS,CO", "FS,CO.", "FS,GC", "FS,GL", "GC/DO", "GC/DOL", "GC/MO",
+ "GC/MOD", "GC/MODB", "GC/MODL", "GC/MODP", "GI/DO", "GI/DOBL", "GI/DOL", "GI/MO",
+ "GI/MOD", "GI/MODP", "IM", "L", "L,AM", "L,CO", "L,GL", "LD",
+ "LMBO,GL", "LO", "LO,CO", "LO,GL", "LOM,CO", "M", "M,CO", "M,CO,PR",
+ "M,GL", "MB", "MB,CO", "MB,CT,CO", "MB,GL", "MBD", "MBD,CO", "MDOB",
+ "MDOL", "MDOL,CO", "ML", "ML,CO", "ML,GL", "MLODB,CO", "MLODB,CO,PR", "MO",
+ "MO,AM", "MO,CO", "MO,GL", "MO,PR", "MOB", "MOB,AM", "MOB,CO", "MOB,GL",
+ "MOB,PR", "MOB,PR,CO", "MOBD,CO", "MOBL", "MOBL,CO,PR", "MOBP", "MOBP,CO", "MOBPD",
+ "MOD", "MOD,AM", "MOD,CO", "MOD,CO,PR", "MOD,GL", "MOD,PR", "MODB", "MODB,AM",
+ "MODB,CO", "MODB,CO,PR", "MODB,GL", "MODB,GL,CO", "MODB,PR", "MODB,PR,CO", "MODB,PR,GL", "MODBL",
+ "MODBL,CO", "MODBL,GL", "MODBL,PR", "MODBP", "MODBP,CO", "MODBP,CO,PR", "MODBP,GL", "MODL",
+ "MODL,CO", "MODL,CO,PR", "MODL,GL", "MODL,PR", "MODLB", "MODLB,CO", "MODP", "MODP,AM",
+ "MODP,AM,CO", "MODP,CO", "MODP,CO,PR", "MODP,GL", "MODP,GL,CO", "MODP,GL,PR", "MODP,PR", "MODP,PR,CO",
+ "MODPB", "MODPB,CO", "MOL", "MOL,CO", "MOL,GL", "MOL,PR", "MOL,PR,CO", "MOLD",
+ "MOLD,CO", "MOP", "MOP,CO", "MOP,GL", "MOP,PR,CO", "MOPB", "MOPD", "MOPDB,PR",
+ "MP", "MP,AM", "MP,CO", "MP,CT,CO", "MP,GL", "O", "O,AM", "O,CO",
+ "O,GL", "OB", "OB,AM", "OB,CO", "OB,GL", "OB,GL,CO", "OB,PR", "OD",
+ "ODB,CO", "OE", "OL", "OL,CO", "OL,GL", "OL,GL,GL", "OL,PR", "OM",
+ "OMD", "OML", "OP", "OP,CO", "OP,CO,PR", "OP,GL", "OP,PR", "OPB",
+ "P", "P,AM", "P,CO", "P,CO,PR", "P,CT,CO", "P,CT,PR,CO", "P,GL", "PD",
+ "PE", "PI/", "PI/DO", "PI/DOB", "PI/DOL", "PI/LOB", "PI/MO", "PI/MOB",
+ "PI/MOD", "PI/MODB", "PI/MODBL", "PI/MODBP", "PI/MODL", "PI/MODP", "PI/MODPB", "PI/MOL",
+ "PI/MOPB", "PI/O", "PI/OB", "PO", "PO,CO", "PO,GL", "PV", "RP",
+ "RT", "ST", "TM", "TR/M", "UE")
-backToothCodes=( "+P", "+S", "AP", "AT", "B", "B,AM",
-"B,CO", "B,CO,CT", "B,CO,PR", "B,CT", "B,CT,CO", "B,GL", "BD", "BDLOM,CO,PR",
-"BM", "BM,CO", "BMO", "BMODP", "BMOL,CO", "BO", "BO,AM", "BO,CO",
-"BO,GL", "BOL", "BOM", "BR/CR,A1", "BR/CR,A2", "BR/CR,OT", "BR/CR,V1", "BR/CR,V1,PR",
-"BR/P,A2", "BR/P,OT", "BR/P,V1", "CR,OPAL", "CR,OPALITE",
-"CR,LAVA", "CR,EMAX", "CR,EVEREST", "CR,FORT",
-"CR,A1", "CR,A1,C4", "CR,A1,PR", "CR,A2", "CR,GO",
-"CR,GO,PR", "CR,OT", "CR,OT,C4", "CR,P1", "CR,P1,C3", "CR,PJ", "CR,V1", "CR,V1,C1",
-"CR,V1,C2", "CR,V1,C3", "CR,V1,PR", "CR,V2", "CR/MODB,GO", "CR/MODL,GO", "CR/MODP,GO", "D",
-"D,AM", "D,CO", "D,GL", "DB", "DB,AM", "DB,CO", "DB,CT,CO", "DB,GL",
-"DBM,CO", "DBO", "DBO,CO", "DL", "DL,CO", "DL,GL", "DMO", "DO",
-"DO,AM", "DO,CO", "DO,GL", "DO,PR", "DOB", "DOB,AM", "DOB,CO", "DOB,GL",
-"DOB,PR", "DOB,PR,CO", "DOBL", "DOBL,PR", "DOBM,CO", "DOBM,GL", "DOBP,CO", "DOL",
-"DOL,CO", "DOL,CO,PR", "DOL,GL", "DOL,PR", "DOLB", "DOM", "DOM,CO", "DOMB",
-"DOML,PR", "DOMP,CO", "DOP", "DOP,AM", "DOP,CO", "DOP,CO,PR", "DOP,GL", "DOP,PR",
-"DOP,PR,CO", "DOPM", "DP", "DP,CO", "DP,CT,CO", "DP,GL", "DR", "FA",
-"FS", "FS,CO", "FS,CO.", "FS,GC", "FS,GL", "GC/DO", "GC/DOL", "GC/MO",
-"GC/MOD", "GC/MODB", "GC/MODL", "GC/MODP", "GI/DO", "GI/DOBL", "GI/DOL", "GI/MO",
-"GI/MOD", "GI/MODP", "IM", "L", "L,AM", "L,CO", "L,GL", "LD",
-"LMBO,GL", "LO", "LO,CO", "LO,GL", "LOM,CO", "M", "M,CO", "M,CO,PR",
-"M,GL", "MB", "MB,CO", "MB,CT,CO", "MB,GL", "MBD", "MBD,CO", "MDOB",
-"MDOL", "MDOL,CO", "ML", "ML,CO", "ML,GL", "MLODB,CO", "MLODB,CO,PR", "MO",
-"MO,AM", "MO,CO", "MO,GL", "MO,PR", "MOB", "MOB,AM", "MOB,CO", "MOB,GL",
-"MOB,PR", "MOB,PR,CO", "MOBD,CO", "MOBL", "MOBL,CO,PR", "MOBP", "MOBP,CO", "MOBPD",
-"MOD", "MOD,AM", "MOD,CO", "MOD,CO,PR", "MOD,GL", "MOD,PR", "MODB", "MODB,AM",
-"MODB,CO", "MODB,CO,PR", "MODB,GL", "MODB,GL,CO", "MODB,PR", "MODB,PR,CO", "MODB,PR,GL", "MODBL",
-"MODBL,CO", "MODBL,GL", "MODBL,PR", "MODBP", "MODBP,CO", "MODBP,CO,PR", "MODBP,GL", "MODL",
-"MODL,CO", "MODL,CO,PR", "MODL,GL", "MODL,PR", "MODLB", "MODLB,CO", "MODP", "MODP,AM",
-"MODP,AM,CO", "MODP,CO", "MODP,CO,PR", "MODP,GL", "MODP,GL,CO", "MODP,GL,PR", "MODP,PR", "MODP,PR,CO",
-"MODPB", "MODPB,CO", "MOL", "MOL,CO", "MOL,GL", "MOL,PR", "MOL,PR,CO", "MOLD",
-"MOLD,CO", "MOP", "MOP,CO", "MOP,GL", "MOP,PR,CO", "MOPB", "MOPD", "MOPDB,PR",
-"MP", "MP,AM", "MP,CO", "MP,CT,CO", "MP,GL", "O", "O,AM", "O,CO",
-"O,GL", "OB", "OB,AM", "OB,CO", "OB,GL", "OB,GL,CO", "OB,PR", "OD",
-"ODB,CO", "OE", "OL", "OL,CO", "OL,GL", "OL,GL,GL", "OL,PR", "OM",
-"OMD", "OML", "OP", "OP,CO", "OP,CO,PR", "OP,GL", "OP,PR", "OPB",
-"P", "P,AM", "P,CO", "P,CO,PR", "P,CT,CO", "P,CT,PR,CO", "P,GL", "PD",
-"PE", "PI/", "PI/DO", "PI/DOB", "PI/DOL", "PI/LOB", "PI/MO", "PI/MOB",
-"PI/MOD", "PI/MODB", "PI/MODBL", "PI/MODBP", "PI/MODL", "PI/MODP", "PI/MODPB", "PI/MOL",
-"PI/MOPB", "PI/O", "PI/OB", "PO", "PO,CO", "PO,GL", "PV", "RP",
-"RT", "ST", "TM", "TR/M", "UE" )
+frontToothCodes = ("+P", "+S", "-D,2", "-M,1", "-M,2", "AP", "AP,RR",
+ "AT", "B", "B,AM", "B,AM'", "B,CO", "B,GL", "B,PR", "BD",
+ "BD,AM", "BD,CO", "BDL", "BDLMI,PR", "BDP", "BI", "BIDM", "BIM",
+ "BIP", "BLMD", "BM", "BM,CO", "BM,GL", "BMD", "BMI", "BMIDI",
+ "BMLD,CO", "BMP", "BP", "BP,AM", "BPDM", "BR,RA", "BR/CR,A1", "BR/CR,A1,C4",
+ "BR/CR,A2", "BR/CR,GO", "BR/CR,OT", "BR/CR,V1", "BR/CR,V1,C1", "BR/CR,V1,C2", "BR/CR,V1,C3", "BR/CR,V1,C4",
+ "BR/CR,V1,PR", "BR/CR,V2", "BR/GI/DP", "BR/GI/MPD", "BR/MR", "BR/P,A1", "BR/P,A2", "BR/P,AE",
+ "BR/P,MA", "BR/P,OT", "BR/P,PO", "BR/P,RA", "BR/P,RO", "BR/P,V1", "BR/P,V2", "CR,A1",
+ "CR,A1,C1", "CR,A1,C2", "CR,A2", "CR,GO", "CR,OT", "CR,OT,C1", "CR,OT,C2", "CR,OT,C3",
+ "CR,OT,PR", "CR,P1", "CR,PJ", "CR,PJ,C1", "CR,PJ,C2", "CR,PJ,C3", "CR,PJ,C4", "CR,PJ,PR",
+ "CR,V1", "CR,V1,C1", "CR,V1,C2", "CR,V1,C3", "CR,V1,C4", "CR,V1,PR", "CR,V2", "CR,V2,C2",
+ "CR,V2,C3,PR", "CR,V2,C4,PR", "CR,V2,PR", "CR,V2,PR,C3", "CR/MPD,GO", "D", "D,AM", "D,AM'",
+ "D,CO", "D,GL", "D,PR", "DB", "DB,AM", "DB,CO", "DB,GL", "DBI",
+ "DBM", "DBM,AM", "DBPI,PR", "DI", "DI,A", "DI,A,PR", "DI,AM", "DI,CO",
+ "DI,CO,PR", "DI,GL", "DI,PR", "DIB", "DIB,CO", "DIB,GL", "DIBM", "DIBM,GL,PR",
+ "DIBP", "DIL", "DIL,PR", "DILB", "DILM", "DIMBP", "DIMI", "DIMP",
+ "DIP", "DIP,CO", "DIP,GL", "DIP,PR", "DIPB", "DIPMB", "DL", "DL,AM",
+ "DL,CO", "DL,GL", "DLBI", "DLI", "DLM", "DMB", "DMIBP", "DP",
+ "DP,AM", "DP,AM'", "DP,AM]", "DP,CO", "DP,GL", "DPB", "DPI", "DPIB,PR",
+ "DPM,CO", "DPMI", "DR", "FA", "FS/P", "FS/P,GL", "GI/B", "GI/DBP",
+ "GI/DI", "GI/DIL", "GI/DIP", "GI/DL", "GI/M", "GI/MI", "GI/MIDL", "GI/MIDP",
+ "GI/MIL", "GI/MIP", "GI/MIPD", "GI/MLD", "GI/MPDI", "GI/P", "I", "I,AM",
+ "I,CO", "I,GL", "IM", "L", "L,AM", "L,CO", "L,GL", "LD,AM",
+ "LD,GL", "LI", "LI,CO", "LIM", "M", "M,AM", "M,CO", "M,GL",
+ "M,PR", "MB", "MB,AM", "MB,CO", "MB,GL", "MB,PR", "MB,PR,CO", "MBD",
+ "MBD,GL", "MBDI", "MBDL", "MBDP", "MBI", "MBI,GL", "MBP", "MBPI",
+ "MDB", "MDB,CO", "MDB,GL", "MDBL,PR", "MDBP,GL", "MDBP,PR", "MDBPI", "MDIB,PR",
+ "MDL", "MDLB,GL", "MDP", "MDPB", "MDPBI", "MDPIB", "MI", "MI,AM",
+ "MI,CO", "MI,GL", "MI,PR", "MI,PR,CO", "MIB", "MIB,PR", "MIBD", "MIBD,GL",
+ "MIBD,PR", "MIBDI,PR", "MIBDP", "MIBLD", "MIBP", "MIBP,PR", "MIBPD", "MIBPD,CO",
+ "MIBPD,PR", "MIDB", "MIDB,CO", "MIDB,PR", "MIDBL", "MIDBL,CO,PR", "MIDBP", "MIDBP,CO",
+ "MIDBP,GL", "MIDBP,PR", "MIDI", "MIDI,CO", "MIDIB", "MIDL", "MIDLB,CO", "MIDP",
+ "MIDPB", "MIDPB,PR", "MIL", "MIL,GL", "MIL,PR", "MILD", "MIP", "MIP,CO",
+ "MIP,GL", "MIP,PR", "MIPB", "MIPB,CO,PR", "MIPB,PR", "MIPBD", "MIPBD,CO", "MIPBD,PR",
+ "MIPD", "MIPDB", "MIPDB,PR", "MIPID", "ML", "ML,GL", "MLD", "MLDI",
+ "MLI", "MP", "MP,AM", "MP,CO", "MP,GL", "MPB", "MPD", "MPD,CO",
+ "MPD,GL", "MPDB", "MPI", "MPID,GL", "O", "O,CO", "O,GL", "P",
+ "P,AM", "P,CO", "P,GL", "P,PR", "PB", "PB,GL", "PD", "PD,AM",
+ "PD,GL", "PDB", "PDB,GL", "PDI", "PE", "PI", "PI,GL", "PI/B",
+ "PI/MBDL", "PI/MBPD", "PI/MDBL", "PI/MDBP", "PI/MDLB", "PI/MDPB", "PI/MIDB", "PIB",
+ "PID,CO", "PIM", "PM", "PM,GL", "PMB", "PMI", "PMID", "PV",
+ "RI", "RP", "RT", "ST", "TM", "UE", "VP",
+ "CR,OPAL", "CR,OPALITE",
+ "CR,LAVA", "CR,EMAX", "CR,EVEREST", "CR,FORT",)
-frontToothCodes=( "+P", "+S", "-D,2", "-M,1", "-M,2", "AP", "AP,RR",
-"AT", "B", "B,AM", "B,AM'", "B,CO", "B,GL", "B,PR", "BD",
-"BD,AM", "BD,CO", "BDL", "BDLMI,PR", "BDP", "BI", "BIDM", "BIM",
-"BIP", "BLMD", "BM", "BM,CO", "BM,GL", "BMD", "BMI", "BMIDI",
-"BMLD,CO", "BMP", "BP", "BP,AM", "BPDM", "BR,RA", "BR/CR,A1", "BR/CR,A1,C4",
-"BR/CR,A2", "BR/CR,GO", "BR/CR,OT", "BR/CR,V1", "BR/CR,V1,C1", "BR/CR,V1,C2", "BR/CR,V1,C3", "BR/CR,V1,C4",
-"BR/CR,V1,PR", "BR/CR,V2", "BR/GI/DP", "BR/GI/MPD", "BR/MR", "BR/P,A1", "BR/P,A2", "BR/P,AE",
-"BR/P,MA", "BR/P,OT", "BR/P,PO", "BR/P,RA", "BR/P,RO", "BR/P,V1", "BR/P,V2", "CR,A1",
-"CR,A1,C1", "CR,A1,C2", "CR,A2", "CR,GO", "CR,OT", "CR,OT,C1", "CR,OT,C2", "CR,OT,C3",
-"CR,OT,PR", "CR,P1", "CR,PJ", "CR,PJ,C1", "CR,PJ,C2", "CR,PJ,C3", "CR,PJ,C4", "CR,PJ,PR",
-"CR,V1", "CR,V1,C1", "CR,V1,C2", "CR,V1,C3", "CR,V1,C4", "CR,V1,PR", "CR,V2", "CR,V2,C2",
-"CR,V2,C3,PR", "CR,V2,C4,PR", "CR,V2,PR", "CR,V2,PR,C3", "CR/MPD,GO", "D", "D,AM", "D,AM'",
-"D,CO", "D,GL", "D,PR", "DB", "DB,AM", "DB,CO", "DB,GL", "DBI",
-"DBM", "DBM,AM", "DBPI,PR", "DI", "DI,A", "DI,A,PR", "DI,AM", "DI,CO",
-"DI,CO,PR", "DI,GL", "DI,PR", "DIB", "DIB,CO", "DIB,GL", "DIBM", "DIBM,GL,PR",
-"DIBP", "DIL", "DIL,PR", "DILB", "DILM", "DIMBP", "DIMI", "DIMP",
-"DIP", "DIP,CO", "DIP,GL", "DIP,PR", "DIPB", "DIPMB", "DL", "DL,AM",
-"DL,CO", "DL,GL", "DLBI", "DLI", "DLM", "DMB", "DMIBP", "DP",
-"DP,AM", "DP,AM'", "DP,AM]", "DP,CO", "DP,GL", "DPB", "DPI", "DPIB,PR",
-"DPM,CO", "DPMI", "DR", "FA", "FS/P", "FS/P,GL", "GI/B", "GI/DBP",
-"GI/DI", "GI/DIL", "GI/DIP", "GI/DL", "GI/M", "GI/MI", "GI/MIDL", "GI/MIDP",
-"GI/MIL", "GI/MIP", "GI/MIPD", "GI/MLD", "GI/MPDI", "GI/P", "I", "I,AM",
-"I,CO", "I,GL", "IM", "L", "L,AM", "L,CO", "L,GL", "LD,AM",
-"LD,GL", "LI", "LI,CO", "LIM", "M", "M,AM", "M,CO", "M,GL",
-"M,PR", "MB", "MB,AM", "MB,CO", "MB,GL", "MB,PR", "MB,PR,CO", "MBD",
-"MBD,GL", "MBDI", "MBDL", "MBDP", "MBI", "MBI,GL", "MBP", "MBPI",
-"MDB", "MDB,CO", "MDB,GL", "MDBL,PR", "MDBP,GL", "MDBP,PR", "MDBPI", "MDIB,PR",
-"MDL", "MDLB,GL", "MDP", "MDPB", "MDPBI", "MDPIB", "MI", "MI,AM",
-"MI,CO", "MI,GL", "MI,PR", "MI,PR,CO", "MIB", "MIB,PR", "MIBD", "MIBD,GL",
-"MIBD,PR", "MIBDI,PR", "MIBDP", "MIBLD", "MIBP", "MIBP,PR", "MIBPD", "MIBPD,CO",
-"MIBPD,PR", "MIDB", "MIDB,CO", "MIDB,PR", "MIDBL", "MIDBL,CO,PR", "MIDBP", "MIDBP,CO",
-"MIDBP,GL", "MIDBP,PR", "MIDI", "MIDI,CO", "MIDIB", "MIDL", "MIDLB,CO", "MIDP",
-"MIDPB", "MIDPB,PR", "MIL", "MIL,GL", "MIL,PR", "MILD", "MIP", "MIP,CO",
-"MIP,GL", "MIP,PR", "MIPB", "MIPB,CO,PR", "MIPB,PR", "MIPBD", "MIPBD,CO", "MIPBD,PR",
-"MIPD", "MIPDB", "MIPDB,PR", "MIPID", "ML", "ML,GL", "MLD", "MLDI",
-"MLI", "MP", "MP,AM", "MP,CO", "MP,GL", "MPB", "MPD", "MPD,CO",
-"MPD,GL", "MPDB", "MPI", "MPID,GL", "O", "O,CO", "O,GL", "P",
-"P,AM", "P,CO", "P,GL", "P,PR", "PB", "PB,GL", "PD", "PD,AM",
-"PD,GL", "PDB", "PDB,GL", "PDI", "PE", "PI", "PI,GL", "PI/B",
-"PI/MBDL", "PI/MBPD", "PI/MDBL", "PI/MDBP", "PI/MDLB", "PI/MDPB", "PI/MIDB", "PIB",
-"PID,CO", "PIM", "PM", "PM,GL", "PMB", "PMI", "PMID", "PV",
- "RI", "RP", "RT", "ST", "TM", "UE", "VP",
-"CR,OPAL", "CR,OPALITE",
-"CR,LAVA", "CR,EMAX", "CR,EVEREST", "CR,FORT",)
-
-treatment_only=("EX","EX/S1","EX/S2","CR,RC","PX","PX+") #not exhaustive
+treatment_only = (
+ "EX",
+ "EX/S1",
+ "EX/S2",
+ "CR,RC",
+ "PX",
+ "PX+") # not exhaustive
if __name__ == "__main__":
print "Unique to FrontTeeth"
@@ -108,5 +127,3 @@ if __name__ == "__main__":
for a in backToothCodes:
if not a in frontToothCodes:
print a,
-
-
diff --git a/src/openmolar/settings/appointment_shortcuts.py b/src/openmolar/settings/appointment_shortcuts.py
index 21269d4..7d02661 100644
--- a/src/openmolar/settings/appointment_shortcuts.py
+++ b/src/openmolar/settings/appointment_shortcuts.py
@@ -1,14 +1,31 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
from xml.dom import minidom
from openmolar.settings import localsettings
+
def getShortCuts():
try:
d = minidom.parse(localsettings.appt_shortcut_file)
@@ -19,7 +36,7 @@ def getShortCuts():
description = shortcut.getElementsByTagName("description")
if description:
shortCutDict["description"] = description[0].firstChild.data
- shortCutDict["appointments"]=[]
+ shortCutDict["appointments"] = []
appointments = shortcut.getElementsByTagName("appointment")
for appointment in appointments:
apptDict = {}
@@ -41,27 +58,27 @@ def getShortCuts():
apptDict["trt3"] = trt
length = appointment.getElementsByTagName("length")
if length:
- a_length=int(length[0].firstChild.data)
+ a_length = int(length[0].firstChild.data)
apptDict["length"] = a_length
datespec = appointment.getElementsByTagName("datespec")
if datespec:
- d_spec=datespec[0].firstChild.data
+ d_spec = datespec[0].firstChild.data
apptDict["datespec"] = d_spec
memo = appointment.getElementsByTagName("memo")
if memo:
- memo_=int(length[0].firstChild.data)
+ memo_ = int(length[0].firstChild.data)
apptDict["memo"] = memo_
-
+
shortCutDict["appointments"].append(apptDict)
retarg.append(shortCutDict)
return retarg
-
- except IOError, e:
+
+ except IOError as e:
print "error getting appointment shortcuts",
print localsettings.appt_shortcut_file
#-- return an iterable variable
return ()
-
+
if __name__ == "__main__":
localsettings.initiate()
print getShortCuts()
diff --git a/src/openmolar/settings/fee_tables.py b/src/openmolar/settings/fee_tables.py
index a73e5bc..e727e48 100644
--- a/src/openmolar/settings/fee_tables.py
+++ b/src/openmolar/settings/fee_tables.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# See the GNU General Public License for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import datetime
import logging
@@ -20,12 +36,13 @@ from openmolar.dbtools.feescales import feescale_handler
try:
from collections import OrderedDict
except ImportError:
- #OrderedDict only came in python 2.7
+ # OrderedDict only came in python 2.7
print "using openmolar.backports for OrderedDict"
from openmolar.backports import OrderedDict
LOGGER = logging.getLogger("openmolar")
+
def isParseable(data):
'''
takes a string, tries to parse it.
@@ -38,6 +55,7 @@ def isParseable(data):
return (False, str(exc))
return (True, "")
+
def getListFromNode(node, id):
'''
get the text data from the first child of any such nodes
@@ -50,6 +68,7 @@ def getListFromNode(node, id):
values.append(child.data.strip())
return values
+
def getTextFromNode(node, id):
'''
get the text data from the first child of any such nodes
@@ -62,22 +81,27 @@ def getTextFromNode(node, id):
text += child.data.strip()
return text
+
def getBoolFromNode(node, id, default=False):
'''
get the text data from the first child of any such nodes
'''
if default:
- return not getTextFromNode(node, id) in ("False","0")
+ return not getTextFromNode(node, id) in ("False", "0")
else:
- return getTextFromNode(node, id) in ("True","1")
+ return getTextFromNode(node, id) in ("True", "1")
+
def _stripped(xml_string):
return xml_string.replace(">", ">").replace("<", "<")
+
class FeeTables(object):
+
'''
a wrapper class to contain as many fee tables as the user has outlined.
'''
+
def __init__(self):
self.tables = OrderedDict()
self.warnings = []
@@ -93,7 +117,23 @@ class FeeTables(object):
if not self.default_table:
self.warnings.append("No Feetables Found")
else:
- LOGGER.info("Default FeeTable = %s"% self.default_table)
+ LOGGER.info("Default FeeTable = %s" % self.default_table)
+
+ @property
+ def default_csetype(self):
+ try:
+ return self.default_table.categories[0]
+ except AttributeError:
+ return ""
+
+ @property
+ def csetypes(self):
+ csetypes = []
+ for table in self.tables.values():
+ for cset in table.categories:
+ if not cset in csetypes:
+ csetypes.append(cset)
+ return csetypes
@property
def default_table(self):
@@ -170,20 +210,20 @@ class FeeTables(object):
'''
a readable description of the object
'''
- retarg = "%d Tables \n"% len(self.tables)
+ retarg = "%d Tables \n" % len(self.tables)
for key in self.tables:
table = self.tables[key]
retarg += "===" * 12 + "\n"
- retarg += " table %s - %s\n"% (key, table.briefName)
- retarg += "%s \n"% table.description
- retarg += "valid %s - %s\n"% (
- localsettings.formatDate(table.startDate),
- localsettings.formatDate(table.endDate))
-
- retarg += " categories %s\n"% table.categories
- retarg += " fee cols %s\n"% str(table.feeColNames)
- retarg += " pt_fee cols %s\n"% str(table.pt_feeColNames)
- retarg += " query %s\n"% table.columnQuery
+ retarg += " table %s - %s\n" % (key, table.briefName)
+ retarg += "%s \n" % table.description
+ retarg += "valid %s - %s\n" % (
+ localsettings.formatDate(table.startDate),
+ localsettings.formatDate(table.endDate))
+
+ retarg += " categories %s\n" % table.categories
+ retarg += " fee cols %s\n" % str(table.feeColNames)
+ retarg += " pt_fee cols %s\n" % str(table.pt_feeColNames)
+ retarg += " query %s\n" % table.columnQuery
retarg += "===" * 12 + "\n"
return retarg
@@ -205,21 +245,24 @@ class FeeTables(object):
try:
table.load_from_xml()
except Exception as exc:
- message = "%s %s %s"%(
+ message = "%s %s %s" % (
_("feesscale"),
table.database_ix,
_("Failed to Load")
- )
+ )
LOGGER.exception(message)
- self.warnings.append(message + "<hr /><pre>%s</pre>"% exc)
+ self.warnings.append(message + "<hr /><pre>%s</pre>" % exc)
+
class FeeTable(object):
+
'''
a class to contain and allow quick access to data stored in a fee table
'''
+
def __init__(self, ix, xml_data):
- LOGGER.info("initiating Feetable %s"% ix)
+ LOGGER.info("initiating Feetable %s" % ix)
self.database_ix = ix
self.dom = minidom.parseString(xml_data)
@@ -239,19 +282,19 @@ class FeeTable(object):
self.item_modifiers = []
self.ui_lists = {
- "crown_buttons":[],
- "implant_buttons":[],
- "fs_buttons":[],
- "endo_buttons":[],
- "surgical_buttons":[],
- "post_buttons":[],
- }
+ "crown_buttons": [],
+ "implant_buttons": [],
+ "fs_buttons": [],
+ "endo_buttons": [],
+ "surgical_buttons": [],
+ "post_buttons": [],
+ }
def __repr__(self):
'''
a readable description of the object
'''
- return "FeeTable %s database index %s - has %s feeItems"% (
+ return "FeeTable %s database index %s - has %s feeItems" % (
self.briefName, self.database_ix, len(self.feesDict))
@property
@@ -281,9 +324,9 @@ class FeeTable(object):
try:
text = node.firstChild.data.strip(" \n")
self.categories.append(text)
- except AttributeError: #no categories
+ except AttributeError: # no categories
pass
- LOGGER.debug("categories = %s"% str(self.categories))
+ LOGGER.debug("categories = %s" % str(self.categories))
def setSectionHeaders(self):
'''
@@ -295,7 +338,7 @@ class FeeTable(object):
id = node.getAttribute("id")
text = node.childNodes[0].data.strip(" \n")
self.headers[id] = text
- LOGGER.debug("section headers = %s"% sorted(self.headers))
+ LOGGER.debug("section headers = %s" % sorted(self.headers))
def setTableDescription(self):
'''
@@ -305,7 +348,7 @@ class FeeTable(object):
node = self.dom.getElementsByTagName("feescale_description")[0]
text = node.childNodes[0].data.strip(" \n")
self.description = text
- LOGGER.info("Feetable description = %s"% self.description)
+ LOGGER.info("Feetable description = %s" % self.description)
def setStartDate(self):
'''
@@ -317,7 +360,7 @@ class FeeTable(object):
month = start_node.getElementsByTagName("month")[0].childNodes[0].data
year = start_node.getElementsByTagName("year")[0].childNodes[0].data
self.startDate = datetime.date(int(year), int(month), int(day))
- LOGGER.debug("startDate = %s"% self.startDate)
+ LOGGER.debug("startDate = %s" % self.startDate)
def setEndDate(self):
'''
@@ -334,12 +377,12 @@ class FeeTable(object):
month = end_node.getElementsByTagName("month")[0].childNodes[0].data
year = end_node.getElementsByTagName("year")[0].childNodes[0].data
self.endDate = datetime.date(int(year), int(month), int(day))
- LOGGER.debug("endDate = %s"% self.endDate)
+ LOGGER.debug("endDate = %s" % self.endDate)
def get_ui_buttons(self, tagname):
for ix, node in enumerate(self.dom.getElementsByTagName(tagname)):
chart_button = namedtuple('Button',
- ("ix", "shortcut", "description", "tooltip"))
+ ("ix", "shortcut", "description", "tooltip"))
chart_button.ix = ix
chart_button.description = node.getAttribute("description")
chart_button.tooltip = node.getAttribute("tooltip")
@@ -363,7 +406,7 @@ class FeeTable(object):
if fee_item.usercode is None:
pass
elif fee_item.is_regex:
- #use pre-compiled regex as the key
+ # use pre-compiled regex as the key
key = re.compile(fee_item.usercode)
if fee_item.pt_attribute == "chart":
self.chartRegexCodes[key] = item_code
@@ -405,10 +448,10 @@ class FeeTable(object):
shortcut will be something like "CR,GO" or "MOD,CO"
if not found, "-----" will be returned
'''
- LOGGER.debug("getToothCode for %s%s"% (tooth, shortcut))
+ LOGGER.debug("getToothCode for %s%s" % (tooth, shortcut))
for key in self.chartRegexCodes:
- if key.match(tooth+shortcut):
+ if key.match(tooth + shortcut):
return self.chartRegexCodes[key]
return self.chartPlainCodes.get(shortcut, "-----")
@@ -416,7 +459,7 @@ class FeeTable(object):
'''
return the itemcode associated with it, otherwise, return "-----"
'''
- LOGGER.debug("looking up usercode %s"% arg)
+ LOGGER.debug("looking up usercode %s" % arg)
for key in self.otherRegexCodes:
if key.match(arg):
return self.otherRegexCodes[key]
@@ -427,12 +470,12 @@ class FeeTable(object):
'''
returns a tuple of (fee, ptfee) for an item
'''
- LOGGER.debug("%s %s %s"% ('looking up a fee for', itemcode, shortcut))
+ LOGGER.debug("%s %s %s" % ('looking up a fee for', itemcode, shortcut))
try:
fee_item = self.feesDict[itemcode]
except KeyError:
- LOGGER.warning("itemcode %s not found in feetable %s"% (
+ LOGGER.warning("itemcode %s not found in feetable %s" % (
itemcode, self.database_ix))
return (0, 0)
@@ -442,15 +485,15 @@ class FeeTable(object):
if fee_item.has_fee_shortcuts:
return fee_item.get_fees_from_fee_shortcuts(shortcut)
- #complex codes have a different fee if there are multiple
- #in the estimate already
+ # complex codes have a different fee if there are multiple
+ # in the estimate already
existing_no = 0
for existing_est in pt.estimates:
if (existing_est.itemcode == itemcode and
- csetype == existing_est.csetype):
+ csetype == existing_est.csetype):
existing_no += 1
- return fee_item.get_fees(existing_no+1)
+ return fee_item.get_fees(existing_no + 1)
def getFees(self, itemcode, pt, csetype, shortcut):
'''
@@ -464,13 +507,13 @@ class FeeTable(object):
'''
returns a tuple of (fee, ptfee) for an item
'''
- LOGGER.debug("recalculating fee for itemcode %s with %d items"% (
+ LOGGER.debug("recalculating fee for itemcode %s with %d items" % (
itemcode, item_no))
try:
fee_item = self.feesDict[itemcode]
except KeyError:
- LOGGER.warning("itemcode %s not found in feetable %s"% (
+ LOGGER.warning("itemcode %s not found in feetable %s" % (
itemcode, self.database_ix))
return (0, 0)
@@ -479,7 +522,7 @@ class FeeTable(object):
def apply_modifiers(self, gross, charge, itemcode, pt):
for modifier in self.item_modifiers:
- LOGGER.debug("checking modifier %s"% modifier)
+ LOGGER.debug("checking modifier %s" % modifier)
if modifier.condition_met(pt) and modifier.item_id_match(itemcode):
return modifier.gross_mod(gross), modifier.charge_mod(charge)
return gross, charge
@@ -492,7 +535,7 @@ class FeeTable(object):
try:
return self.feesDict[itemcode].description
except KeyError:
- return u"%s (%s)"% (_("OTHER TREATMENT"), usercode)
+ return u"%s (%s)" % (_("OTHER TREATMENT"), usercode)
@property
def other_shortcuts(self):
@@ -505,12 +548,14 @@ class FeeTable(object):
class FeeItem(object):
+
'''
this class handles the calculation of fees
part of the challenge is recognising the fact that
2x an item is not necessarily
the same as double the fee for a single item etc..
'''
+
def __init__(self, table, itemcode, element):
self.table = table
self.itemcode = itemcode
@@ -563,7 +608,7 @@ class FeeItem(object):
fee = int(getTextFromNode(node, "gross"))
self.fees.append(fee)
- try: # charge is an optional field.
+ try: # charge is an optional field.
charge = int(getTextFromNode(node, "charge"))
self.ptFees.append(charge)
except ValueError:
@@ -577,13 +622,13 @@ class FeeItem(object):
self.fee_shortcuts.append(re.compile(shortcut_match))
def __repr__(self):
- return "FeeItem '%s' %s %s %s %s"% (
+ return "FeeItem '%s' %s %s %s %s" % (
self.itemcode,
self.description,
str(self.fees),
str(self.ptFees),
str(self.brief_descriptions)
- )
+ )
@property
def has_pt_fees(self):
@@ -606,10 +651,10 @@ class FeeItem(object):
fsfd = self.fee_shortcuts[index].pattern
if self.pt_attribute == "chart":
return fsfd
- return "%s %s"% (self.pt_attribute, fsfd)
+ return "%s %s" % (self.pt_attribute, fsfd)
except IndexError:
pass
- except AttributeError: #not regex? I can't see this happening?
+ except AttributeError: # not regex? I can't see this happening?
pass
return self.usercode
@@ -619,7 +664,7 @@ class FeeItem(object):
return None
if self.pt_attribute == "chart":
return self.shortcut
- return"%s %s"% (self.pt_attribute, self.shortcut)
+ return"%s %s" % (self.pt_attribute, self.shortcut)
@property
def forbid_reason(self):
@@ -635,7 +680,7 @@ class FeeItem(object):
fee = self.get_fee(item_no)
ptFee = self.get_fee(item_no, charge=True)
- if ptFee == None:
+ if ptFee is None:
return (fee, fee)
else:
return (fee, ptFee)
@@ -648,8 +693,8 @@ class FeeItem(object):
but that has only 1 itemcode on NHS feescale :(
'''
for i, compiled_regex in enumerate(self.fee_shortcuts):
- LOGGER.debug("Comparing '%s' with regex '%s'"% (
- shortcut, compiled_regex.pattern))
+ LOGGER.debug("Comparing '%s' with regex '%s'" % (
+ shortcut, compiled_regex.pattern))
if compiled_regex.match(shortcut):
fee = self.fees[i]
@@ -660,7 +705,7 @@ class FeeItem(object):
return fee, charge
LOGGER.warning(
- "error getting fee from fee_shortcut. returning default")
+ "error getting fee from fee_shortcut. returning default")
return self.get_fees()
def get_fee(self, item_no=1, charge=False):
@@ -669,7 +714,7 @@ class FeeItem(object):
if charge is true, then return the "charge" rather than the gross fee
'''
LOGGER.debug(
- "FeeItem.get_fee(item_no=%d, charge=%s)"% (item_no, charge))
+ "FeeItem.get_fee(item_no=%d, charge=%s)" % (item_no, charge))
if charge:
if self.ptFees == []:
return None
@@ -679,42 +724,45 @@ class FeeItem(object):
if self.is_simple or item_no == 1:
fee = feeList[0]
- LOGGER.debug("simple addition of 1st item, fee=%s"% fee)
+ LOGGER.debug("simple addition of 1st item, fee=%s" % fee)
return fee
- LOGGER.warning("Complex FeeItem fee lookup, item_no=%d"% item_no)
+ LOGGER.warning("Complex FeeItem fee lookup, item_no=%d" % item_no)
for i, condition in enumerate(self.conditions):
- LOGGER.debug("checking condition '%s'"% condition)
- if condition == "item_no=%d"% item_no:
+ LOGGER.debug("checking condition '%s'" % condition)
+ if condition == "item_no=%d" % item_no:
fee = feeList[i]
- LOGGER.debug("condition met '%s' fee=%s"% (condition, fee))
+ LOGGER.debug("condition met '%s' fee=%s" % (condition, fee))
return fee
m = re.match("item_no>(\d+)", condition)
if m and item_no > int(m.groups()[0]):
fee = feeList[i]
- LOGGER.debug("condition met '%s' fee=%s"% (condition, fee))
+ LOGGER.debug("condition met '%s' fee=%s" % (condition, fee))
return fee
m = re.match("item_no<(\d+)", condition)
if m and item_no < int(m.groups()[0]):
fee = feeList[i]
- LOGGER.debug("condition met '%s' fee=%s"% (condition, fee))
+ LOGGER.debug("condition met '%s' fee=%s" % (condition, fee))
return fee
m = re.match("(\d+)<item_no<(\d+)", condition)
if m and int(m.groups()[0]) < item_no < int(m.groups()[1]):
fee = feeList[i]
- LOGGER.debug("condition met '%s' fee=%s"% (condition, fee))
+ LOGGER.debug("condition met '%s' fee=%s" % (condition, fee))
return fee
- #if all has failed.... go with the simple one
+ # if all has failed.... go with the simple one
LOGGER.debug("no conditions met... returning simple fee")
return feeList[0]
+
class ComplexShortcut(object):
+
'''
this class allows complex logic to be placed into an xml feescale
complex shortcuts are checked for a match with treatment items
before the simple one-to-one feeitems are considered.
'''
+
def __init__(self, element):
shortcut_node = element.getElementsByTagName("shortcut")[0]
@@ -722,9 +770,9 @@ class ComplexShortcut(object):
self.pt_attribute = shortcut_node.getAttribute("att")
shortcut = shortcut_node.childNodes[0].data
- LOGGER.debug("Complex shortcut %s %s"% (self.pt_attribute, shortcut))
+ LOGGER.debug("Complex shortcut %s %s" % (self.pt_attribute, shortcut))
if self.pt_attribute != "chart":
- shortcut = "%s %s"% (self.pt_attribute, shortcut)
+ shortcut = "%s %s" % (self.pt_attribute, shortcut)
if self.is_regex:
self.shortcut = re.compile(shortcut)
else:
@@ -756,19 +804,21 @@ class ComplexShortcut(object):
'''
if re.match("[ul][lr][1-8A-E]", att):
if self.is_regex:
- return self.shortcut.match("%s%s"% (att, shortcut))
+ return self.shortcut.match("%s%s" % (att, shortcut))
return self.shortcut == shortcut
else:
- usercode = "%s %s"% (att, shortcut)
+ usercode = "%s %s" % (att, shortcut)
if self.is_regex:
return self.shortcut.match(usercode)
return self.shortcut == usercode
def __repr__(self):
- return ("Complex shortcut, '%s'"% (
+ return ("Complex shortcut, '%s'" % (
self.shortcut if not self.is_regex else self.shortcut.pattern))
+
class CaseAction(object):
+
'''
a simple class to store what should be performed when a ComplexShortcut
is matched
@@ -791,7 +841,7 @@ class CaseAction(object):
self._is_handled = self.NOT_HANDLED
elif handled == "part":
self._is_handled = self.PARTIALLY_HANDLED
- else: #default is fully handled!
+ else: # default is fully handled!
self._is_handled = self.FULLY_HANDLED
removal_nodes = case_node.getElementsByTagName("remove_item")
@@ -821,15 +871,17 @@ class CaseAction(object):
return self._is_handled
def __repr__(self):
- return "CaseAction '%s' '%s'"% (self.condition, self.message)
+ return "CaseAction '%s' '%s'" % (self.condition, self.message)
class Modifier(object):
+
'''
feescales can have modifier elements.
An example of this is you may wish to not charge for some items on certain
age groups.
'''
+
def __init__(self, modifier_node):
self.conditions = []
self.item_ids = []
@@ -847,14 +899,14 @@ class Modifier(object):
self.item_ids.append(item_id)
try:
self._gross_fee = int(modifier_node.getElementsByTagName(
- "gross")[0].firstChild.data)
+ "gross")[0].firstChild.data)
except IndexError:
- pass # no gross fee modification
+ pass # no gross fee modification
try:
self._charge_fee = int(modifier_node.getElementsByTagName(
- "charge")[0].firstChild.data)
+ "charge")[0].firstChild.data)
except IndexError:
- pass # no charge fee modication
+ pass # no charge fee modication
def item_id_match(self, item_id):
LOGGER.debug(item_id)
@@ -878,7 +930,7 @@ class Modifier(object):
if m:
years, months = pt.age_course_start
years_, months_ = int(m.groups()[0]), int(m.groups()[1])
- if years < years_ or ( years == years_ and months < months_):
+ if years < years_ or (years == years_ and months < months_):
return True
m = re.match("cset=(.*)$", condition)
if m and pt.cset == m.groups()[0]:
@@ -905,7 +957,7 @@ class Modifier(object):
return fee
def __repr__(self):
- return "Modifier conditions = %s"% self.conditions
+ return "Modifier conditions = %s" % self.conditions
if __name__ == "__main__":
LOGGER.setLevel(logging.DEBUG)
@@ -918,11 +970,11 @@ if __name__ == "__main__":
print table.hasPtCols
for i, complex_shortcut in enumerate(table.complex_shortcuts):
- print "looking for SP in complex_shortcut %d"% i
+ print "looking for SP in complex_shortcut %d" % i
if complex_shortcut.matches("perio", "SP"):
print " match found"
print table.categories
print table.ui_lists
print fts.ui_crown_chart_buttons
- print fts.ui_implant_chart_buttons
\ No newline at end of file
+ print fts.ui_implant_chart_buttons
diff --git a/src/openmolar/settings/images.py b/src/openmolar/settings/images.py
index 7b96d7b..c9948a6 100644
--- a/src/openmolar/settings/images.py
+++ b/src/openmolar/settings/images.py
@@ -1,31 +1,49 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
-import os, re
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+import os
+import re
from openmolar.settings import localsettings
from PyQt4 import QtGui
TOOTHPIXMAPS = {}
+
def toothPixmaps():
if TOOTHPIXMAPS == {}:
filepath = os.path.join(localsettings.resources_location, "teeth")
for f in os.listdir(filepath):
filename = os.path.basename(f)
- reg = re.match ("([ul][lr][1-8,a-d]).png", filename)
+ reg = re.match("([ul][lr][1-8,a-d]).png", filename)
if reg:
tooth = reg.groups()[0]
TOOTHPIXMAPS[tooth] = QtGui.QPixmap(os.path.join(filepath, f))
- #print TOOTHPIXMAPS
+ # print TOOTHPIXMAPS
return TOOTHPIXMAPS
-if __name__== "__main__":
+if __name__ == "__main__":
app = QtGui.QApplication([])
lab = QtGui.QLabel()
lab.setPixmap(toothPixmaps()["lr6"])
diff --git a/src/openmolar/settings/localsettings.py b/src/openmolar/settings/localsettings.py
index 67874d1..a8aa7c1 100644
--- a/src/openmolar/settings/localsettings.py
+++ b/src/openmolar/settings/localsettings.py
@@ -1,11 +1,28 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+import ConfigParser
import datetime
import hashlib
import logging
@@ -25,7 +42,7 @@ LOGGER = logging.getLogger("openmolar")
SUPERVISOR = '05b1f356646c24bf1765f6f1b65aea3bde7247e1'
DBNAME = "default"
-#updated 28.11.2013
+# updated 28.11.2013
CLIENT_SCHEMA_VERSION = "2.4"
DB_SCHEMA_VERSION = "unknown"
@@ -41,16 +58,17 @@ try:
LOGGER.debug(s)
except NameError:
LOGGER.error("installing gettext for translations")
- ##- an unelegant hack to get _() on the namespace for testing
- ##- main.py will normally do this for us.
+ # - an unelegant hack to get _() on the namespace for testing
+ # - main.py will normally do this for us.
import gettext
gettext.install("openmolar", unicode=True)
+
def showVersion():
'''
push version details to std out
'''
- print ("OpenMolar %s"% VERSION)
+ print ("OpenMolar %s" % VERSION)
if LOGGER.level == logging.DEBUG:
showVersion()
@@ -58,22 +76,21 @@ if LOGGER.level == logging.DEBUG:
PRACTICE_NAME = "The Academy Dental Practice"
APPOINTMENT_CARD_HEADER = \
-"%s, 19 Union Street\nInverness. tel 01463 232423" % PRACTICE_NAME
+ "%s, 19 Union Street\nInverness. tel 01463 232423" % PRACTICE_NAME
APPOINTMENT_CARD_FOOTER = _("Please try and give at least 24 hours notice") +\
-"\n" +_("if you need to change an appointment.")
+ "\n" + _("if you need to change an appointment.")
CORRESPONDENCE_SIG = "The Academy Dental Practice"
MH_HEADER = ("The Academy Dental Practice",
- _("Confidential Medical History Questionaire"))
+ _("Confidential Medical History Questionaire"))
WINDOWS = False
-DEFAULT_COURSETYPE = "P"
-def determine_path ():
+def determine_path():
'''
returns the true working directory, regardless of any symlinks.
Very useful.
@@ -81,9 +98,9 @@ def determine_path ():
'''
try:
root = __file__
- if os.path.islink (root):
- root = os.path.realpath (root)
- retarg = os.path.dirname(os.path.dirname (os.path.abspath (root)))
+ if os.path.islink(root):
+ root = os.path.realpath(root)
+ retarg = os.path.dirname(os.path.dirname(os.path.abspath(root)))
return retarg
except:
#-- this shouldn't happen!
@@ -93,23 +110,24 @@ def determine_path ():
server_names = []
chosenserver = 0
+
def setChosenServer(i):
global DBNAME, chosenserver
chosenserver = i
try:
DBNAME = server_names[i]
- LOGGER.debug("DBNAME = %s"% DBNAME)
+ LOGGER.debug("DBNAME = %s" % DBNAME)
except IndexError:
LOGGER.warning("no server name.. config file is old format?")
wkdir = determine_path()
referralfile = os.path.join(wkdir, "resources", "referral_data.xml")
appt_shortcut_file = os.path.join(wkdir, "resources",
- "appointment_shortcuts.xml")
+ "appointment_shortcuts.xml")
stylesheet = "file://" + os.path.join(wkdir, "resources", "style.css")
printer_png = "file://" + os.path.join(wkdir, "resources", "icons", "ps.png")
money_png = "file://" + os.path.join(wkdir, "resources", "icons", "vcard.png")
-LOGOPATH = "file://" + os.path.join(wkdir,"html","images","newlogo.png")
+LOGOPATH = "file://" + os.path.join(wkdir, "html", "images", "newlogo.png")
resources_location = os.path.join(wkdir, "resources")
resources_path = "file://" + resources_location
@@ -118,81 +136,86 @@ if "win" in sys.platform:
LOGGER.info("Windows OS detected - modifying settings")
#-- sorry about this... but cross platform is a goal :(
global_cflocation = 'C:\\Program Files\\openmolar\\openmolar.conf'
- localFileDirectory = os.path.join(os.environ.get("HOMEPATH"),".openmolar")
+ localFileDirectory = os.path.join(os.environ.get("HOMEPATH"), ".openmolar")
#-- this next line is necessary because I have to resort to relative
#-- imports for the css stuff eg... ../resources/style.css
#-- on linux, the root is always / on windows... ??
os.chdir(wkdir)
resources_path = resources_path.replace(
- "://",":///").replace(" ","%20").replace("\\","/")
+ "://", ":///").replace(" ", "%20").replace("\\", "/")
stylesheet = stylesheet.replace(
- "://",":///").replace(" ","%20").replace("\\","/")
+ "://", ":///").replace(" ", "%20").replace("\\", "/")
printer_png = printer_png.replace(
- "://",":///").replace(" ","%20").replace("\\","/")
- money_png = money_png.replace(
- "://",":///").replace(" ","%20").replace("\\","/")
+ "://", ":///").replace(" ", "%20").replace("\\", "/")
+ money_png = money_png.replace(
+ "://", ":///").replace(" ", "%20").replace("\\", "/")
LOGOPATH = LOGOPATH.replace(
- "://",":///").replace(" ","%20").replace("\\","/")
+ "://", ":///").replace(" ", "%20").replace("\\", "/")
else:
if not "linux" in sys.platform:
LOGGER.warning(
- "unknown system platform (mac?) - defaulting to linux settings")
+ "unknown system platform (mac?) - defaulting to linux settings")
global_cflocation = '/etc/openmolar/openmolar.conf'
- localFileDirectory = os.path.join(os.environ.get("HOME"),".openmolar")
+ localFileDirectory = os.path.join(os.environ.get("HOME"), ".openmolar")
cflocation = os.path.join(localFileDirectory, "openmolar.conf")
+LOGIN_CONF = os.path.join(localFileDirectory, "autologin.conf")
TEMP_PDF = os.path.join(localFileDirectory, "temp.pdf")
DOCS_DIRECTORY = os.path.join(localFileDirectory, "documents")
if not os.path.exists(DOCS_DIRECTORY):
os.makedirs(DOCS_DIRECTORY)
-#this is updated if correct password is given
+# this is updated if correct password is given
successful_login = False
#-- these permissions are for certain admin duties.
permissionsRaised = False
permissionExpire = datetime.datetime.now()
+
def openPDF(filepath=TEMP_PDF):
'''
open a PDF - minimal checks to ensure no malicious files have been
inserted into my sacred filepaths though.....
'''
if not re.match(".*[.]pdf$", filepath):
- raise Exception, "%s is not a pdf file"% filepath
+ raise Exception("%s is not a pdf file" % filepath)
openFile(filepath)
+
def openFile(filepath):
'''
open a File - minimal checks to ensure no malicious files have been
inserted into my sacred filepaths though.....
'''
if not os.path.exists(filepath):
- raise IOError, "%s does not exist"% filepath
+ raise IOError("%s does not exist" % filepath)
if "win" in sys.platform:
os.startfile(filepath)
else:
subprocess.Popen(["xdg-open", filepath])
-################# MESSAGES ####################################################
+# MESSAGES ####################################################
+
+
def about():
return '''<p>
OpenMolar - open Source dental practice management software.<br />
Version %s<br />
Client Schema Version is %s, DataBase is at version %s<br /><hr />
Copyright (C) 2009-2014 Neil A. Wallace B.Ch.D.<br />
-Project Homepage
+Project Homepage
<a href="http://www.openmolar.com">
http://www.openmolar.com</a>.
</p>
Thanks to <a href="http://rfquerin.org">Richard Querin</a>
-for the wonderful icon and Logo.'''%(
- VERSION,
- CLIENT_SCHEMA_VERSION,
- DB_SCHEMA_VERSION)
+for the wonderful icon and Logo.''' % (
+ VERSION,
+ CLIENT_SCHEMA_VERSION,
+ DB_SCHEMA_VERSION)
license = '''<hr />
<p>
@@ -219,8 +242,8 @@ http://www.gnu.org/licenses</a>.</p>'''
OM_DATE_FORMAT = r"%d/%m/%Y"
try:
- OM_DATE_FORMAT = re.sub("y","Y",locale.nl_langinfo(locale.D_FMT))
-except AttributeError: # will happen on windows
+ OM_DATE_FORMAT = re.sub("y", "Y", locale.nl_langinfo(locale.D_FMT))
+except AttributeError: # will happen on windows
OM_DATE_FORMAT = r"%d/%m/%Y"
#-- ditto the qt one
@@ -233,10 +256,11 @@ allowed_logins = []
#-- this list is used for navigating back and forth through the list
recent_snos = []
recent_sno_index = 0
+last_family_no = 0
#-- update whenever a manual search is made
#-- sname,fname dob... etc
-lastsearch = ("", "", datetime.date(1900,1,1), "", "", "")
+lastsearch = ("", "", datetime.date(1900, 1, 1), "", "", "")
#-- used to load combobboxes etc....
activedents = []
@@ -246,9 +270,9 @@ activehyg_ixs = ()
clinicianNo = 0
clinicianInits = ""
-#these times are for the boundaries of the widgets...
-earliestStart = datetime.time(8,0)
-latestFinish = datetime.time(20,0)
+# these times are for the boundaries of the widgets...
+earliestStart = datetime.time(8, 0)
+latestFinish = datetime.time(20, 0)
#--this dictionary is upated when this file is initiate -
#--it links dentist keys with practioners
@@ -267,30 +291,30 @@ apptix_reverse = {}
#-- set a latest possible date for appointments to be made
#--(necessary if a very long appointment goes right on through)
#-- would get maximum recursion, quite quickly!
-##todo - this will need to change!!!!
-bookEnd = datetime.date(2010,12,31)
+# todo - this will need to change!!!!
+bookEnd = datetime.date(2010, 12, 31)
#--treatment codes..
apptTypes = (
-_("EXAM"),
-_("BITE"),
-_("BT"),
-_("FAMILY"),
-_("FILL"),
-_("FIT"),
-_("HYG"),
-_("IMPS"),
-_("LF"),
-_("ORTHO"),
-_("PAIN"),
-_("PREP"),
-_("RCT"),
-_("RECEMENT"),
-_("REVIEW"),
-_("SP"),
-_("TRY"),
-_("XLA")
+ _("EXAM"),
+ _("BITE"),
+ _("BT"),
+ _("FAMILY"),
+ _("FILL"),
+ _("FIT"),
+ _("HYG"),
+ _("IMPS"),
+ _("LF"),
+ _("ORTHO"),
+ _("PAIN"),
+ _("PREP"),
+ _("RCT"),
+ _("RECEMENT"),
+ _("REVIEW"),
+ _("SP"),
+ _("TRY"),
+ _("XLA")
)
#-- default appt font size
@@ -305,32 +329,38 @@ station = "surgery"
surgeryno = -1
#-- pt's are "private, independent, NHS etc...."
-csetypes = ["P","I","N","N OR","N O"]
+CSETYPES = []
+DEFAULT_COURSETYPE = ""
+
#--for debugging purposes... set this to true.- not yet implemented throughout.
#-- self evident
-practiceAddress = ("The Academy Dental Practice","19 Union Street",
-"Inverness","IV1 1PP")
+practiceAddress = ("The Academy Dental Practice", "19 Union Street",
+ "Inverness", "IV1 1PP")
#-- this is updated whenever a patient record loads, for ease of address
#-- manipulation
-LAST_ADDRESS = ("",)*8
+LAST_ADDRESS = ("",) * 8
#-- 1 less dialog box for these lucky people
defaultPrinterforGP17 = False
#-- my own class of excpetion, for when a serialno is called
#--from the database and no match is found
+
+
class PatientNotFoundError(Exception):
pass
+
def hash_func(message):
'''
the function to get a unique value for all treatments in the database
'''
return hashlib.sha1(message).hexdigest()
+
def convert_deciduous(tooth):
'''
if the tooth is a match for ulD or llE etc..
@@ -339,9 +369,10 @@ def convert_deciduous(tooth):
returns tooth unchanged if not a match
'''
def my_sub(m):
- return "%s%s"% (m.groups()[0], "*ABCDE".index(m.groups()[1]))
+ return "%s%s" % (m.groups()[0], "*ABCDE".index(m.groups()[1]))
return re.sub("^([ul][lr])([A-E])", my_sub, tooth)
+
def currentTime():
'''
returns a datetime.datetime.today object
@@ -351,13 +382,15 @@ def currentTime():
'''
return datetime.datetime.today()
+
def int_timestamp():
'''
returns the current time in int format
'''
d = datetime.datetime.now()
- return int("%d%02d"% (d.hour,d.minute))
+ return int("%d%02d" % (d.hour, d.minute))
+
def currentDay():
'''
@@ -365,33 +398,43 @@ def currentDay():
'''
return datetime.date.today()
+
def pence_to_pounds(m):
'''
takes an integer, returns as pounds.pence
eg 1950 -> "19.50"
'''
- return "%d.%02d"% ( m // 100, m % 100)
+ return "%d.%02d" % (m // 100, m % 100)
+
def formatMoney(m):
'''
takes an integer, returns a string
'''
- if type(m) == types.StringType:
+ if isinstance(m, bytes):
try:
retarg = locale.currency(float(m))
return retarg.decode(ENCODING, "replace")
- except Exception, e:
+ except Exception as e:
print "formatMoney error", e
- return "%s"% m
+ return "%s" % m
else:
val = pence_to_pounds(m)
try:
retarg = locale.currency(float(val))
return retarg.decode(ENCODING, "replace")
- except Exception, e:
+ except Exception as e:
LOGGER.exception("formatMoney error")
return val
+
+def previous_sno():
+ try:
+ return recent_snos[recent_sno_index]
+ except IndexError:
+ return None
+
+
def reverseFormatMoney(m):
'''
takes a string (as from above) and returns the value in pence
@@ -399,9 +442,9 @@ def reverseFormatMoney(m):
38723
'''
try:
- numbers = re.findall("\d",m)
+ numbers = re.findall("\d", m)
except TypeError:
- print "unable to convert %s to an integer - returning 0"% m
+ print "unable to convert %s to an integer - returning 0" % m
return 0
retarg = ""
@@ -409,26 +452,27 @@ def reverseFormatMoney(m):
retarg += number
return int(retarg)
+
def GP17formatDate(d):
'''
takes a python date type... formats for use on a NHS form
'''
try:
- return "%02d%02d%04d"% (d.day,d.month,d.year)
+ return "%02d%02d%04d" % (d.day, d.month, d.year)
except AttributeError:
- return " "*8
+ return " " * 8
try:
- DAYNAMES = (locale.nl_langinfo (locale.DAY_2),
- locale.nl_langinfo (locale.DAY_3),
- locale.nl_langinfo (locale.DAY_4),
- locale.nl_langinfo (locale.DAY_5),
- locale.nl_langinfo (locale.DAY_6),
- locale.nl_langinfo (locale.DAY_7),
- locale.nl_langinfo (locale.DAY_1))
-except AttributeError: #WILL happen on windows - no nl_langinfo
- DAYNAMES = (_("Monday"),_("Tuesday"),_("Wednesday"),_("Thursday"),
- _("Friday"),_("Saturday"),_("Sunday"))
+ DAYNAMES = (locale.nl_langinfo(locale.DAY_2),
+ locale.nl_langinfo(locale.DAY_3),
+ locale.nl_langinfo(locale.DAY_4),
+ locale.nl_langinfo(locale.DAY_5),
+ locale.nl_langinfo(locale.DAY_6),
+ locale.nl_langinfo(locale.DAY_7),
+ locale.nl_langinfo(locale.DAY_1))
+except AttributeError: # WILL happen on windows - no nl_langinfo
+ DAYNAMES = (_("Monday"), _("Tuesday"), _("Wednesday"), _("Thursday"),
+ _("Friday"), _("Saturday"), _("Sunday"))
def dayName(d):
@@ -436,10 +480,11 @@ def dayName(d):
expects a datetime object, returns the day
'''
try:
- return DAYNAMES [d.isoweekday()-1]
+ return DAYNAMES[d.isoweekday() - 1]
except IndexError:
return "?day?"
+
def monthName(d):
'''
expects a datetime object, returns the month
@@ -447,36 +492,37 @@ def monthName(d):
try:
try:
return("",
- locale.nl_langinfo (locale.MON_1),
- locale.nl_langinfo (locale.MON_2),
- locale.nl_langinfo (locale.MON_3),
- locale.nl_langinfo (locale.MON_4),
- locale.nl_langinfo (locale.MON_5),
- locale.nl_langinfo (locale.MON_6),
- locale.nl_langinfo (locale.MON_7),
- locale.nl_langinfo (locale.MON_8),
- locale.nl_langinfo (locale.MON_9),
- locale.nl_langinfo (locale.MON_10),
- locale.nl_langinfo (locale.MON_11),
- locale.nl_langinfo (locale.MON_12)
- )[d.month]
- except AttributeError: #WILL happen on windows - no nl_langinfo
- return("",
- _("January"),
- _("February"),
- _("March"),
- _("April"),
- _("May"),
- _("June"),
- _("July"),
- _("August"),
- _("September"),
- _("October"),
- _("November"),
- _("December"))[d.month]
+ locale.nl_langinfo(locale.MON_1),
+ locale.nl_langinfo(locale.MON_2),
+ locale.nl_langinfo(locale.MON_3),
+ locale.nl_langinfo(locale.MON_4),
+ locale.nl_langinfo(locale.MON_5),
+ locale.nl_langinfo(locale.MON_6),
+ locale.nl_langinfo(locale.MON_7),
+ locale.nl_langinfo(locale.MON_8),
+ locale.nl_langinfo(locale.MON_9),
+ locale.nl_langinfo(locale.MON_10),
+ locale.nl_langinfo(locale.MON_11),
+ locale.nl_langinfo(locale.MON_12)
+ )[d.month]
+ except AttributeError: # WILL happen on windows - no nl_langinfo
+ return("",
+ _("January"),
+ _("February"),
+ _("March"),
+ _("April"),
+ _("May"),
+ _("June"),
+ _("July"),
+ _("August"),
+ _("September"),
+ _("October"),
+ _("November"),
+ _("December"))[d.month]
except IndexError:
return "?month?"
+
def longDate(d):
try:
day = str(d.day)
@@ -492,11 +538,12 @@ def longDate(d):
day = day + "rd"
else:
day = day + "th"
- return "%s, %s %s %d"% (dayName(d), day, monthName(d), d.year)
- except Exception, e:
+ return "%s, %s %s %d" % (dayName(d), day, monthName(d), d.year)
+ except Exception as e:
print e
return "date"
+
def readableDate(d):
'''
takes a python date type, returns either the date,
@@ -510,9 +557,10 @@ def readableDate(d):
if d - today == datetime.timedelta(1):
return _("Tomorrow")
if d - today == datetime.timedelta(-1):
- return _("Yesterday")
+ return _("Yesterday")
return longDate(d)
+
def notesDate(d):
'''
takes a python date type, returns either the date,
@@ -522,40 +570,44 @@ def notesDate(d):
if rd in (_("None"), _("Today"), _("Yesterday")):
return rd
try:
- return rd[rd.index(",")+1:]
+ return rd[rd.index(",") + 1:]
except Exception as exc:
return "error getting date"
+
def formatDate(d):
'''takes a date, returns a formatted date string'''
try:
- retarg = d.strftime (OM_DATE_FORMAT)
+ retarg = d.strftime(OM_DATE_FORMAT)
except AttributeError:
retarg = ""
return retarg
+
def wystimeToHumanTime(t):
'''converts a time in the format of 0830 or 1420 to "HH:MM" (string)
>>> wystimeToHumanTime(830)
'8:30'
'''
try:
- hour, min = int(t)//100, int(t)%100
- return "%d:%02d"% (hour, min)
+ hour, min = int(t) // 100, int(t) % 100
+ return "%d:%02d" % (hour, min)
except:
return None
+
def wystimeToPyTime(t):
'''converts a time in the format of 0830 or 1420 to "HH:MM" (string)
>>> wystimeToPyTime(830)
datetime.time(8, 30)
'''
try:
- hour, min = t//100, t%100
+ hour, min = t // 100, t % 100
return datetime.time(hour, min)
except:
return None
+
def humanTimetoWystime(t):
'''reverse function to wystimeToHumanTime
>>> humanTimetoWystime('8:30')
@@ -567,14 +619,16 @@ def humanTimetoWystime(t):
except:
return None
+
def minutesPastMidnighttoWystime(t):
'''
converts minutes past midnight(int) to format HHMM (integer)
>>> minutesPastMidnighttoWystime(100)
140
'''
- hour, min = t//60, int(t)%60
- return hour*100+min
+ hour, min = t // 60, int(t) % 60
+ return hour * 100 + min
+
def pyTimetoWystime(t):
'''
@@ -583,7 +637,8 @@ def pyTimetoWystime(t):
1420
'''
hour, min = t.hour, t.minute
- return hour*100+min
+ return hour * 100 + min
+
def pyTimeToHumantime(t):
'''
@@ -591,22 +646,25 @@ def pyTimeToHumantime(t):
'''
return t.strftime("%H:%M")
+
def minutesPastMidnightToPyTime(t):
'''
converts minutes past midnight(int) to a python datetime.time
>>> minutesPastMidnightToPyTime(100)
datetime.time(1, 40)
'''
- hour, min = t//60, int(t)%60
+ hour, min = t // 60, int(t) % 60
return datetime.time(hour, min)
+
def pyTimeToMinutesPastMidnight(t):
'''
converts python datetime.time to minutes past midnight(int) to a
>>> pyTimeToMinutesPastMidnight(datetime.time(1, 40))
100
'''
- return t.hour*60 + t.minute
+ return t.hour * 60 + t.minute
+
def minutesPastMidnight(t):
'''
@@ -615,8 +673,9 @@ def minutesPastMidnight(t):
>>> minutesPastMidnight(140)
100
'''
- hour, min = int(t)//100, int(t)%100
- return hour*60+min
+ hour, min = int(t) // 100, int(t) % 100
+ return hour * 60 + min
+
def minutesPastMidnighttoPytime(t):
'''
@@ -625,24 +684,52 @@ def minutesPastMidnighttoPytime(t):
>>> minutesPastMidnighttoPytime(100)
datetime.time(1, 40)
'''
- hour, min = t//60, t%60
+ hour, min = t // 60, t % 60
return datetime.time(hour, min)
+
def humanTime(t):
'''
converts minutes past midnight(int) to format 'HH:MM' (string)
>>> humanTime(100)
'1:40'
'''
- hour, min = t//60, int(t)%60
- return "%d:%02d"% (hour, min)
+ hour, min = t // 60, int(t) % 60
+ return "%d:%02d" % (hour, min)
+
def setOperator(u1, u2):
global operator
if u2 == "":
operator = u1
else:
- operator = "%s/%s"% (u1, u2)
+ operator = "%s/%s" % (u1, u2)
+
+
+def autologin():
+ '''
+ look in ~/.openmolar/login.conf for login options
+ '''
+ PASSWORD, USER1, USER2 = "", "", ""
+ scp = ConfigParser.SafeConfigParser()
+ scp.read(LOGIN_CONF)
+ try:
+ try:
+ PASSWORD = scp.get("login", "PASSWORD")
+ except ConfigParser.NoOptionError:
+ PASSWORD = ""
+ try:
+ USER1 = scp.get("login", "USER1")
+ except ConfigParser.NoOptionError:
+ pass
+ try:
+ USER2 = scp.get("login", "USER2")
+ except ConfigParser.NoOptionError:
+ pass
+ except ConfigParser.NoSectionError:
+ LOGGER.exception("autologin")
+ pass
+ return PASSWORD, USER1, USER2
def getLocalSettings():
@@ -661,7 +748,7 @@ def getLocalSettings():
node = dom.getElementsByTagName("surgeryno")
if node and node[0].hasChildNodes():
surgeryno = int(node[0].firstChild.data)
- LOGGER.debug("setting as surgery number %s"% surgeryno)
+ LOGGER.debug("setting as surgery number %s" % surgeryno)
else:
LOGGER.debug("unknown surgery number")
dom.unlink()
@@ -674,12 +761,13 @@ def getLocalSettings():
''')
f.close()
+
def updateLocalSettings(setting, value):
'''
adds or updates node "setting" with text value "value"
'''
localSets = os.path.join(localFileDirectory, "localsettings.conf")
- LOGGER.debug("updating local settings... %s = %s"% (setting, value))
+ LOGGER.debug("updating local settings... %s = %s" % (setting, value))
dom = minidom.parse(localSets)
nodes = dom.getElementsByTagName(setting)
if len(nodes) == 0:
@@ -690,13 +778,14 @@ def updateLocalSettings(setting, value):
dom.firstChild.appendChild(new_node)
else:
nodes[0].firstChild.replaceWholeText(value)
- f = open(localSets,"w")
+ f = open(localSets, "w")
f.write(dom.toxml())
f.close()
dom.unlink()
return True
-def initiateUsers(changedServer = False):
+
+def initiateUsers(changedServer=False):
'''
just grab user names. necessary because the db schema could be OOD here
'''
@@ -711,18 +800,19 @@ def initiateUsers(changedServer = False):
db = connect.connect()
cursor = db.cursor()
cursor.execute("select id from opid")
- #grab initials of those currently allowed to log in
+ # grab initials of those currently allowed to log in
trows = cursor.fetchall()
cursor.close()
allowed_logins = []
for row in trows:
allowed_logins.append(row[0])
-def initiate(changedServer= False, debug = False):
- #print "initiating settings"
+
+def initiate(changedServer=False, debug=False):
+ # print "initiating settings"
global message, dentDict, ops, SUPERVISOR, \
- ops_reverse, activedents, activehygs, activedent_ixs, activehyg_ixs, \
- apptix, apptix_reverse, bookEnd, clinicianNo, clinicianInits, WIKIURL
+ ops_reverse, activedents, activehygs, activedent_ixs, activehyg_ixs, \
+ apptix, apptix_reverse, bookEnd, clinicianNo, clinicianInits, WIKIURL
from openmolar import connect
from openmolar.dbtools import db_settings
@@ -736,32 +826,33 @@ def initiate(changedServer= False, debug = False):
if data:
bookEndVals = data[-1][0].split(",")
bookEnd = datetime.date(int(bookEndVals[0]), int(bookEndVals[1]),
- int(bookEndVals[2]))
+ int(bookEndVals[2]))
data = db_settings.getData("supervisor_pword")
if data:
SUPERVISOR = data[0][0]
else:
- LOGGER.warning("#"*30)
+ LOGGER.warning("#" * 30)
LOGGER.warning(
- "WARNING - no supervisor password is set, restting to default")
- LOGGER.warning("#"*30)
+ "WARNING - no supervisor password is set, restting to default")
+ LOGGER.warning("#" * 30)
db_settings.updateData("supervisor_pword", SUPERVISOR,
- "not found reset")
+ "not found reset")
db = connect.connect()
cursor = db.cursor()
- #set up four lists with key/value pairs reversedto make for easy referencing
+ # set up four lists with key/value pairs reversedto make for easy
+ # referencing
- #first"ops" which is all practitioners
+ # first"ops" which is all practitioners
ops = {}
ops_reverse = {}
apptix_reverse = {}
cursor.execute("select id, inits, apptix from practitioners")
practitioners = cursor.fetchall()
for practitioner in practitioners:
- if practitioner[1] != None:
+ if practitioner[1] is not None:
ops[practitioner[0]] = practitioner[1]
ops_reverse[practitioner[1]] = practitioner[0]
if practitioner[2] != 0:
@@ -771,9 +862,9 @@ def initiate(changedServer= False, debug = False):
ops_reverse["NONE"] = 0
try:
- ##correspondence details for NHS forms
+ # correspondence details for NHS forms
query = ("select id,inits,name,formalname,fpcno,quals "
- "from practitioners where flag0=1")
+ "from practitioners where flag0=1")
cursor.execute(query)
practitioners = cursor.fetchall()
@@ -781,18 +872,18 @@ def initiate(changedServer= False, debug = False):
for practitioner in practitioners:
dentDict[practitioner[0]] = practitioner[1:]
- #now get only practitioners who have an active daybook
+ # now get only practitioners who have an active daybook
query = "select apptix,inits from practitioners where flag3=1"
cursor.execute(query)
practitioners = cursor.fetchall()
apptix = {}
for practitioner in practitioners:
- if practitioner[0] != 0 and practitioner[0] != None: #apptix
+ if practitioner[0] != 0 and practitioner[0] is not None: # apptix
apptix[practitioner[1]] = practitioner[0]
cursor.execute(
- "select apptix, inits from practitioners where flag3=1 and flag0=1")
- #dentists where appts active
+ "select apptix, inits from practitioners where flag3=1 and flag0=1")
+ # dentists where appts active
ixs, activedents = [], []
practitioners = cursor.fetchall()
for ix, inits in practitioners:
@@ -801,8 +892,8 @@ def initiate(changedServer= False, debug = False):
activedent_ixs = tuple(ixs)
cursor.execute(
- "select apptix, inits from practitioners where flag3=1 and flag0=0")
- #hygenists where appts active
+ "select apptix, inits from practitioners where flag3=1 and flag0=0")
+ # hygenists where appts active
practitioners = cursor.fetchall()
ixs, activehygs = [], []
for ix, inits in practitioners:
@@ -830,13 +921,13 @@ def initiate(changedServer= False, debug = False):
</head><body><div align="center">
<img src="%s" width="150", height="100", align="left" />
<img src="%s" width="150", height="100", align="right" />
-<h1>'''% (stylesheet, LOGOPATH, LOGOPATH) +
-_("Welcome to OpenMolar!")+ '''</h1>
+<h1>''' % (stylesheet, LOGOPATH, LOGOPATH) +
+ _("Welcome to OpenMolar!") + '''</h1>
<ul><li class="about">''' + _("Version") + ''' %s</li>
-<li class="about">'''% VERSION +
-'''</li></ul><br clear="all" /><p>''' +
-_("Your Data is Accessible, and the server reports no issues.") +
-'''</p><p>''' + _("Have a great day!") + '''</p></div></body></html>''')
+<li class="about">''' % VERSION +
+ '''</li></ul><br clear="all" /><p>''' +
+ _("Your Data is Accessible, and the server reports no issues.") +
+ '''</p><p>''' + _("Have a great day!") + '''</p></div></body></html>''')
if debug:
print "LOCALSETTINGS CALLED WITH DEBUG = TRUE"
@@ -847,18 +938,23 @@ _("Your Data is Accessible, and the server reports no issues.") +
print "activedents =", activedents
print "activehygs =", activehygs
print "allowed logins =", allowed_logins
- print "stylesheet =",stylesheet
- print "referralfile = ",referralfile
+ print "stylesheet =", stylesheet
+ print "referralfile = ", referralfile
+
def loadFeeTables():
'''
load the feetables (time consuming)
'''
- global FEETABLES
+ global FEETABLES, CSETYPES, DEFAULT_COURSETYPE
+
from openmolar.settings import fee_tables
LOGGER.debug("loading fee and treatment logic tables")
FEETABLES = fee_tables.FeeTables()
+ CSETYPES = FEETABLES.csetypes
+ DEFAULT_COURSETYPE = FEETABLES.default_csetype
+
def _test():
import doctest
diff --git a/src/openmolar/settings/urls.py b/src/openmolar/settings/urls.py
index 4cb57ea..397ad71 100644
--- a/src/openmolar/settings/urls.py
+++ b/src/openmolar/settings/urls.py
@@ -1,30 +1,31 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2011-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
-
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
ROOT = "http://www.openmolar.com"
-OM1_ROOT = "%s/om1"% ROOT
+OM1_ROOT = "%s/om1" % ROOT
-DOCUMENT_HELP = "%s/help/documents"% OM1_ROOT
+DOCUMENT_HELP = "%s/help/documents" % OM1_ROOT
__all__ = (DOCUMENT_HELP, )
@@ -33,5 +34,5 @@ def _test():
for url in __all__:
print url
-if __name__== "__main__":
+if __name__ == "__main__":
_test()
diff --git a/src/openmolar/settings/utilities.py b/src/openmolar/settings/utilities.py
index ca0dfb1..32c7498 100644
--- a/src/openmolar/settings/utilities.py
+++ b/src/openmolar/settings/utilities.py
@@ -1,10 +1,26 @@
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (c) 2009 Neil Wallace. All rights reserved.
-# This program or module is free software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version. See the GNU General Public License
-# for more details.
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import os
import logging
@@ -13,6 +29,7 @@ from openmolar.settings import localsettings
LOGGER = logging.getLogger("openmolar")
+
def getPDF():
'''
get's the pdf which has been created to local file during some print proc
@@ -24,7 +41,8 @@ def getPDF():
return data
except Exception as exc:
LOGGER.exception("exception in utilities.getPdf")
-
+
+
def deleteTempFiles():
'''
delete's any temprorary pdf file
@@ -34,9 +52,9 @@ def deleteTempFiles():
fpath = os.path.join(localsettings.localFileDirectory, name)
if os.path.exists(fpath):
os.remove(fpath)
-
+
if __name__ == "__main__":
'''
testing only
'''
- pass
\ No newline at end of file
+ pass
diff --git a/src/openmolar/settings/version.py b/src/openmolar/settings/version.py
index dbfe35d..d44015a 100644
--- a/src/openmolar/settings/version.py
+++ b/src/openmolar/settings/version.py
@@ -1,34 +1,66 @@
-#!/usr/bin/env python
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+'''
+This file contains the version number for openmolar
+Do not edit this file manually, as it should be updated when git tag is updated.
+'''
+
+VERSION = "0.5.5"
+
+# -------------------------- DEV CODE ---------------------------------------- #
+# this section of code is removed when making a release
+#
import logging
import os
import re
-import subprocess
+
LOGGER = logging.getLogger("openmolar")
-#this is a fallback version, which will be used if
-#openmolar is not run from a git repository
-#or ig git is not installed.
-VERSION = "0.5.0-beta18"
+LOGGER.warning("You are running a development version of OpenMolar!")
try:
- p = subprocess.Popen(
- ["git","describe"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- git_version = p.communicate()[0].strip()
- if git_version:
- VERSION = re.sub("v", "", git_version, 1)
- import git
+ import git
+ repo = git.Repo(os.path.dirname(__file__))
+ if repo.description == "openmolar1":
try:
- repo = git.Repo(os.path.dirname(__file__))
- if repo.is_dirty():
- VERSION += "-dirty"
- except git.InvalidGitRepositoryError:
- LOGGER.debug("library is not a git repository")
-except OSError:
- LOGGER.debug("git not installed")
+ git_version = repo.git.describe()
+ VERSION = re.sub("v", "", git_version, 1)
+ except git.exc.GitCommandError:
+ LOGGER.exception("No git tags found?")
+
+ if repo.is_dirty():
+ VERSION += "-dirty"
+ else:
+ VERSION = "unofficial_build"
except ImportError:
LOGGER.debug("unable to import git")
+ VERSION = "Built without python-git"
+
+# --------------------------END OF DEV CODE ---------------------------------- #
+
if __name__ == '__main__':
- print "version = %s"% VERSION
+ print "version = %s" % VERSION
diff --git a/src/standalone_chart/lib_om_chart/__init__.py b/src/standalone_chart/lib_om_chart/__init__.py
index e69de29..c701215 100644
--- a/src/standalone_chart/lib_om_chart/__init__.py
+++ b/src/standalone_chart/lib_om_chart/__init__.py
@@ -0,0 +1,23 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
diff --git a/src/standalone_chart/lib_om_chart/chart_colours.py b/src/standalone_chart/lib_om_chart/chart_colours.py
index 1392368..40df597 100644
--- a/src/standalone_chart/lib_om_chart/chart_colours.py
+++ b/src/standalone_chart/lib_om_chart/chart_colours.py
@@ -1,11 +1,35 @@
-from PyQt4 import QtGui,QtCore
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
+from PyQt4 import QtGui, QtCore
CHARTTEXT = QtGui.QColor("#111111")
LINEEDIT = QtGui.QColor("#ffffaa")
TOOTHLINES = QtGui.QColor("#aaaaaa")
IVORY = QtGui.QColor("#ffeedd")
-#these numbers are grabbed for the stylesheet of the toothprop buttons
+# these numbers are grabbed for the stylesheet of the toothprop buttons
GI_ = "#75d185"
GOLD_ = "#ffff00"
COMP_ = "#ffffff"
@@ -22,6 +46,6 @@ FISSURE = QtGui.QColor("#bbd0d0")
METAL = QtGui.QColor("#000075")
DRESSING = QtGui.QColor("magenta")
GUTTA_PERCHA = QtGui.QColor("#bb0000")
-FILL_OUTLINE = QtGui.QColor("#333333") #used to be blue
+FILL_OUTLINE = QtGui.QColor("#333333") # used to be blue
TRANSPARENT = QtCore.Qt.transparent
BACKGROUND = QtGui.QPalette().window()
diff --git a/src/standalone_chart/lib_om_chart/chart_widget.py b/src/standalone_chart/lib_om_chart/chart_widget.py
index ae280e6..88cd147 100644
--- a/src/standalone_chart/lib_om_chart/chart_widget.py
+++ b/src/standalone_chart/lib_om_chart/chart_widget.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
has one class, a custom widget which inherits from QWidget
@@ -33,21 +35,24 @@ from PyQt4 import QtGui, QtCore
import chart_colours as colours
+
class ChartWidget(QtGui.QWidget):
+
'''
a custom widget to show a standard UK dental chart
- allows for user navigation with mouse and/or keyboard
'''
+
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
- QtGui.QSizePolicy.Expanding))
+ QtGui.QSizePolicy.Expanding))
- self.grid = (["ur8", "ur7", "ur6", "ur5", 'ur4', 'ur3', 'ur2', 'ur1', \
- 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8'],
- ["lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1', \
- 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'])
+ self.grid = (["ur8", "ur7", "ur6", "ur5", 'ur4', 'ur3', 'ur2', 'ur1',
+ 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8'],
+ ["lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1',
+ 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'])
self.clear()
self.isStaticChart = True
@@ -62,27 +67,27 @@ class ChartWidget(QtGui.QWidget):
'''
#--clear individual teeth
self.ur8, self.ur7, self.ur6, self.ur5, self.ur4, self.ur3, self.ur2, \
- self.ur1 = [] ,[], [], [], [], [], [], []
+ self.ur1 = [], [], [], [], [], [], [], []
self.ul8, self.ul7, self.ul6, self.ul5, self.ul4, self.ul3, self.ul2, \
- self.ul1 = [], [], [], [], [], [], [], []
+ self.ul1 = [], [], [], [], [], [], [], []
self.ll8, self.ll7, self.ll6, self.ll5, self.ll4, self.ll3, self.ll2, \
- self.ll1 = [], [], [], [], [], [], [], []
+ self.ll1 = [], [], [], [], [], [], [], []
self.lr8, self.lr7, self.lr6, self.lr5, self.lr4, self.lr3, self.lr2, \
- self.lr1 = [], [], [], [], [], [], [], []
+ self.lr1 = [], [], [], [], [], [], [], []
#--clear comments
self.commentedTeeth = []
#-- set to an adult dentition
self.chartgrid = {
- 'lr1' : 'lr1', 'lr3' : 'lr3', 'lr2' : 'lr2', 'lr5' : 'lr5',
- 'lr4' : 'lr4', 'lr7' : 'lr7', 'lr6' : 'lr6', 'lr8' : 'lr8',
- 'ul8' : 'ul8', 'ul2' : 'ul2', 'ul3' : 'ul3', 'ul1' : 'ul1',
- 'ul6' : 'ul6', 'ul7' : 'ul7', 'ul4' : 'ul4', 'ul5' : 'ul5',
- 'ur4' : 'ur4', 'ur5' : 'ur5', 'ur6' : 'ur6', 'ur7' : 'ur7',
- 'ur1' : 'ur1', 'ur2' : 'ur2', 'ur3' : 'ur3', 'ur8' : 'ur8',
- 'll8' : 'll8', 'll3' : 'll3', 'll2' : 'll2', 'll1' : 'll1',
- 'll7' : 'll7', 'll6' : 'll6', 'll5' : 'll5', 'll4': 'll4'
+ 'lr1': 'lr1', 'lr3': 'lr3', 'lr2': 'lr2', 'lr5': 'lr5',
+ 'lr4': 'lr4', 'lr7': 'lr7', 'lr6': 'lr6', 'lr8': 'lr8',
+ 'ul8': 'ul8', 'ul2': 'ul2', 'ul3': 'ul3', 'ul1': 'ul1',
+ 'ul6': 'ul6', 'ul7': 'ul7', 'ul4': 'ul4', 'ul5': 'ul5',
+ 'ur4': 'ur4', 'ur5': 'ur5', 'ur6': 'ur6', 'ur7': 'ur7',
+ 'ur1': 'ur1', 'ur2': 'ur2', 'ur3': 'ur3', 'ur8': 'ur8',
+ 'll8': 'll8', 'll3': 'll3', 'll2': 'll2', 'll1': 'll1',
+ 'll7': 'll7', 'll6': 'll6', 'll5': 'll5', 'll4': 'll4'
}
#-- select the ur8
@@ -135,9 +140,9 @@ class ChartWidget(QtGui.QWidget):
for prop in proplist:
if prop != "":
if not re.match("!.*", prop):
- prop = "%s "% prop.lower()
+ prop = "%s " % prop.lower()
else:
- prop = "%s "% prop
+ prop = "%s " % prop
self.__dict__[tooth].append(prop)
def paintEvent(self, event=None):
@@ -165,7 +170,7 @@ class ChartWidget(QtGui.QWidget):
#--big horizontal dissection of entire widget
painter.drawLine(leftpad, self.height() / 2, self.width() - rightpad,
- self.height() / 2)
+ self.height() / 2)
#--vertical dissection of entire widget
painter.drawLine(self.width() / 2, 0, self.width() / 2, self.height())
@@ -175,9 +180,9 @@ class ChartWidget(QtGui.QWidget):
else:
midx = 0
for y in range(2):
- tooth_notation = self.grid[y][x]
- rect = QtCore.QRectF(x * xOffset + midx, y *yOffset,
- xOffset, yOffset).adjusted(0.5, 0.5, -0.5, -0.5)
+ tooth_notation = self.grid[y][x]
+ rect = QtCore.QRectF(x * xOffset + midx, y * yOffset,
+ xOffset, yOffset).adjusted(0.5, 0.5, -0.5, -0.5)
#-- draw a tooth (subroutine)
self.tooth(painter, rect, tooth_notation)
@@ -211,11 +216,11 @@ class ChartWidget(QtGui.QWidget):
if self.showLeftRight:
#--show left/right (this is done here to avoid being overwritten
#--during the rest of the paint job
- painter.drawText(textRect, QtCore.Qt.AlignRight|
- QtCore.Qt.AlignVCenter, (_("Left")))
+ painter.drawText(textRect, QtCore.Qt.AlignRight |
+ QtCore.Qt.AlignVCenter, (_("Left")))
- painter.drawText(textRect, QtCore.Qt.AlignLeft|
- QtCore.Qt.AlignVCenter, (_("Right")))
+ painter.drawText(textRect, QtCore.Qt.AlignLeft |
+ QtCore.Qt.AlignVCenter, (_("Right")))
#--free the painter's saved state
painter.restore()
@@ -231,7 +236,7 @@ class ChartWidget(QtGui.QWidget):
#-- split tooth rectangle into a large graphic square...
#-- and a smaller text square
- thirdheight = rect.height()*1/3
+ thirdheight = rect.height() * 1 / 3
if isUpper:
#-- the 2 allows for the "select" box to be drawn around the tooth
toothRect = rect.adjusted(0, 2, 0, -thirdheight)
@@ -245,13 +250,13 @@ class ChartWidget(QtGui.QWidget):
painter.setBrush(colours.IVORY)
toothid = self.chartgrid[ident]
- ###################### DRAW THE TOOTH's TEXT###########################
+ # DRAW THE TOOTH's TEXT###########################
#--tooth ident is always ur1, ur2 ...
#--tooth name is more flexible for deciduous teeth etc...
toothtext = toothid[2]
- #check for deciduous teeth
+ # check for deciduous teeth
if toothtext in ("A", "B", "C", "D", "E", "*"):
- #################BABY TOOTH###########################
+ # BABY TOOTH###########################
#-- paint deciduous notation in RED
painter.save()
if self.isEnabled():
@@ -262,9 +267,10 @@ class ChartWidget(QtGui.QWidget):
painter.restore()
#-- and "shrink" the tooth
- toothRect = toothRect.adjusted(toothRect.width()*0.1,
- toothRect.height()*0.15,-toothRect.width()*0.1,
- -toothRect.height()*0.15)
+ toothRect = toothRect.adjusted(toothRect.width() * 0.1,
+ toothRect.height(
+ ) * 0.15, -toothRect.width() * 0.1,
+ -toothRect.height() * 0.15)
else:
#--adult tooth
@@ -292,18 +298,18 @@ class ChartWidget(QtGui.QWidget):
painter.drawText(comRect, QtCore.Qt.AlignCenter, "!")
painter.restore()
for prop in ("rt ", "ap ", "-m,1 ", "-m,2 ",
- "+p ", "+s ", "oe", "px", "px+"):
+ "+p ", "+s ", "oe", "px", "px+"):
#-- these properties are written in... not drawn
if prop in props:
painter.save()
comRect = textRect.adjusted(0, 0, -textRect.width() * 0.6,
- 0)
+ 0)
painter.setPen(QtGui.QPen(QtCore.Qt.blue, 1))
painter.drawRect(comRect)
sansFont = QtGui.QFont("Helvetica", 7)
painter.setFont(sansFont)
painter.drawText(comRect, QtCore.Qt.AlignCenter,
- prop.upper())
+ prop.upper())
painter.restore()
toothS = toothSurfaces(self, toothRect, toothid, self.isStaticChart)
@@ -313,10 +319,12 @@ class ChartWidget(QtGui.QWidget):
class toothSurfaces():
+
'''
draws the tooth surfaces
'''
- def __init__(self, parent, rect, ident, isStatic = True):
+
+ def __init__(self, parent, rect, ident, isStatic=True):
'''
initiate using the following args
parent (a Qwidget), rect (a Qrect), ident (eg. ur5),
@@ -351,7 +359,7 @@ class toothSurfaces():
self.props = props
def draw(self, parent, painter=None):
- if painter == None:
+ if painter is None:
self.painter = QtGui.QPainter(parent)
else:
self.painter = painter
@@ -360,8 +368,8 @@ class toothSurfaces():
if re.match("\(.*", prop):
#-- brackets are used to indicate the start/end of a bridge
#--let's see bridge start by shrinking that edge.
- ##TODO - draw a demarcation line here??
- adj = self.rect.width()*0.10
+ # TODO - draw a demarcation line here??
+ adj = self.rect.width() * 0.10
if self.isUpper:
self.rect = self.rect.adjusted(adj, 0, 0, 0)
else:
@@ -372,7 +380,7 @@ class toothSurfaces():
elif re.match(".*\)$", prop):
#--other end of a bridge
- adj = self.rect.width()*0.10
+ adj = self.rect.width() * 0.10
if self.isUpper:
self.rect = self.rect.adjusted(0, 0, -adj, 0)
else:
@@ -380,20 +388,27 @@ class toothSurfaces():
prop = prop.strip(")")
if "br/p" in prop:
- #bridge pontic found - shrink
+ # bridge pontic found - shrink
self.rect = self.rect.adjusted(0, self.rect.height() * 0.10, 0,
- -self.rect.height() * 0.10)
-
+ -self.rect.height() * 0.10)
#--draw the tooth if static chart or properties to show
#--leave blank if treatment chart.
if self.isStatic or self.props != []:
self.painter.drawRect(self.rect)
self.painter.drawRect(self.innerRect)
- self.painter.drawLine(self.rect.topLeft(), self.innerRect.topLeft())
- self.painter.drawLine(self.rect.topRight(), self.innerRect.topRight())
- self.painter.drawLine(self.rect.bottomLeft(), self.innerRect.bottomLeft())
- self.painter.drawLine(self.rect.bottomRight(), self.innerRect.bottomRight())
+ self.painter.drawLine(
+ self.rect.topLeft(),
+ self.innerRect.topLeft())
+ self.painter.drawLine(
+ self.rect.topRight(),
+ self.innerRect.topRight())
+ self.painter.drawLine(
+ self.rect.bottomLeft(),
+ self.innerRect.bottomLeft())
+ self.painter.drawLine(
+ self.rect.bottomRight(),
+ self.innerRect.bottomRight())
#-deciduos (ie. indeterminate) 6, 7, 8 are marked as "*"
#--paint over these.
@@ -405,9 +420,9 @@ class toothSurfaces():
#--set variables for fill draw points
#--this are NOT static as the widget is resizable
- ##TODO I could probably get performance improvement here.
- ##by having a default set which changes only if the "tooth" has been
- ##resized.
+ # TODO I could probably get performance improvement here.
+ # by having a default set which changes only if the "tooth" has been
+ # resized.
if self.props != []:
if self.backTooth:
@@ -459,19 +474,19 @@ class toothSurfaces():
material = ""
self.painter.save()
- prop = prop.strip("#&")
+ prop = prop.strip("#&")
if prop == "pv":
prop = "pv,pj"
if re.match("!.*", prop):
prop = ""
- if "/" in prop:
+ if "/" in prop:
if re.match("\(.*", prop):
#--start of a bridge
leading_bracket = True
prop = prop[1:]
else:
leading_bracket = False
- if re.match("br/.*",prop):
+ if re.match("br/.*", prop):
#--bridge
prop = prop[3:]
if leading_bracket:
@@ -497,14 +512,14 @@ class toothSurfaces():
#-- change this to "mod,gi"
prop = prop[3:] + ",gl"
- if prop[:2] in ("tm","at"):
+ if prop[:2] in ("tm", "at"):
erase_color = parent.palette().background().color()
self.painter.setPen(erase_color)
self.painter.setBrush(erase_color)
self.painter.drawRect(self.rect)
self.painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
self.painter.drawText(self.rect, QtCore.Qt.AlignCenter,
- prop.upper())
+ prop.upper())
prop = ""
if prop[:2] in ("ue", "pe", "oe", "rp"):
@@ -516,16 +531,20 @@ class toothSurfaces():
self.painter.drawRect(self.rect)
self.painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
if self.backTooth:
- self.painter.drawText(self.rect, QtCore.Qt.AlignCenter, prop)
+ self.painter.drawText(
+ self.rect,
+ QtCore.Qt.AlignCenter,
+ prop)
else:
self.painter.drawText(self.rect.adjusted(0,
- self.rect.height() / 2, 0, 0),
- QtCore.Qt.AlignCenter, prop)
+ self.rect.height(
+ ) / 2, 0, 0),
+ QtCore.Qt.AlignCenter, prop)
#--prevent the o's and p's being interpreted as fills
prop = ""
if ",pr" in prop:
- #TODO - pin??
+ # TODO - pin??
prop = prop.replace(",pr", "")
if "," in prop:
@@ -559,7 +578,7 @@ class toothSurfaces():
if material == "co":
self.painter.setBrush(colours.COMP)
elif material in ("pj", "ot", "pi", "a1", "v1", "v2", "opal",
- "opalite", "lava"):
+ "opalite", "lava"):
self.painter.setBrush(colours.PORC)
elif material == "gl":
self.painter.setBrush(colours.GI)
@@ -575,7 +594,7 @@ class toothSurfaces():
self.painter.setPen(QtGui.QPen(colours.FISSURE, 1))
self.painter.setBrush(colours.FISSURE)
else:
- logging.debug("unhandled material colour %s %s %s"% (
+ logging.debug("unhandled material colour %s %s %s" % (
self.toothtext, prop, material))
if self.quadrant[1] == "l" and prop != "dr":
@@ -596,44 +615,60 @@ class toothSurfaces():
crRect = self.rect.adjusted(0, 2, 0, -2)
self.painter.drawRect(crRect)
self.painter.drawRect(self.innerRect)
- self.painter.drawLine(crRect.topLeft(), self.innerRect.topLeft())
- self.painter.drawLine(crRect.topRight(), self.innerRect.topRight())
+ self.painter.drawLine(
+ crRect.topLeft(),
+ self.innerRect.topLeft())
+ self.painter.drawLine(
+ crRect.topRight(),
+ self.innerRect.topRight())
self.painter.drawLine(crRect.bottomLeft(),
- self.innerRect.bottomLeft())
+ self.innerRect.bottomLeft())
self.painter.drawLine(crRect.bottomRight(),
- self.innerRect.bottomRight())
+ self.innerRect.bottomRight())
if self.backTooth:
self.painter.drawText(self.rect, QtCore.Qt.AlignCenter,
- material)
+ material)
else:
self.painter.drawText(self.rect.adjusted(0,
- self.rect.height() / 2, 0, 0), QtCore.Qt.AlignCenter,
- material)
+ self.rect.height(
+ ) / 2, 0, 0), QtCore.Qt.AlignCenter,
+ material)
if prop == "pv" and self.isUpper:
self.painter.drawPolygon(QtGui.QPolygon(
- [self.rect.topLeft().x(), self.rect.topLeft().y(),
- self.rect.topRight().x(), self.rect.topRight().y(),
- self.innerRect.topRight().x(), self.innerRect.topRight().y(),
- self.innerRect.topLeft().x(), self.innerRect.topLeft().y()]))
+ [self.rect.topLeft(
+ ).x(), self.rect.topLeft().y(),
+ self.rect.topRight().x(
+ ), self.rect.topRight(
+ ).y(),
+ self.innerRect.topRight().x(
+ ), self.innerRect.topRight(
+ ).y(),
+ self.innerRect.topLeft().x(), self.innerRect.topLeft().y()]))
self.painter.drawText(self.rect.adjusted(0, 0, 0,
- -self.rect.height() / 2), QtCore.Qt.AlignCenter, prop)
+ -self.rect.height() / 2), QtCore.Qt.AlignCenter, prop)
prop = ""
if prop == "pv" and not self.isUpper:
self.painter.drawPolygon(QtGui.QPolygon(
- [self.rect.bottomLeft().x(), self.rect.bottomLeft().y(),
- self.rect.bottomRight().x(), self.rect.bottomRight().y(),
- self.innerRect.bottomRight().x(), self.innerRect.bottomRight().y(),
- self.innerRect.bottomLeft().x(), self.innerRect.bottomLeft().y()]))
+ [self.rect.bottomLeft(
+ ).x(), self.rect.bottomLeft().y(),
+ self.rect.bottomRight().x(
+ ), self.rect.bottomRight(
+ ).y(),
+ self.innerRect.bottomRight().x(
+ ), self.innerRect.bottomRight(
+ ).y(),
+ self.innerRect.bottomLeft().x(), self.innerRect.bottomLeft().y()]))
self.painter.drawText(self.rect.adjusted(0,
- self.rect.height() / 2, 0, 0),
- QtCore.Qt.AlignCenter, prop)
+ self.rect.height(
+ ) / 2, 0, 0),
+ QtCore.Qt.AlignCenter, prop)
prop = ""
@@ -643,101 +678,101 @@ class toothSurfaces():
self.painter.setPen(QtGui.QPen(QtCore.Qt.red, 4))
self.painter.drawLine(self.rect.topLeft(),
- self.rect.bottomRight())
+ self.rect.bottomRight())
self.painter.drawLine(self.rect.topRight(),
- self.rect.bottomLeft())
+ self.rect.bottomLeft())
self.painter.restore()
- #IGNORE LIST
+ # IGNORE LIST
if prop in ("px", "oe"):
- prop=""
+ prop = ""
prop = prop.replace("l", "p")
shapes = []
if self.backTooth:
if "fs" in prop:
shapes.append(QtGui.QPolygon(
- [dx, ey-1, fx, ey-1, fx+1, ey+1, dx, ey+1]))
+ [dx, ey - 1, fx, ey - 1, fx + 1, ey + 1, dx, ey + 1]))
shapes.append(QtGui.QPolygon(
- [ex-1, dy, ex+1, dy, ex+1, fy, ex-1, fy]))
+ [ex - 1, dy, ex + 1, dy, ex + 1, fy, ex - 1, fy]))
elif "dr" in prop:
n = QtGui.QPolygon([cx, dy, dx, by, fx, by, hx, dy,
- hx, fy, fx, hy, dx, hy, cx, fy])
+ hx, fy, fx, hy, dx, hy, cx, fy])
shapes.append(n)
elif re.match("[modbp]{5}", prop):
n = QtGui.QPolygon([ax, by, cx, dy, dx, dy, dx, by,
- fx, by, fx, dy, gx, dy, ix, by, ix, hy, gx, fy, fx,
- fy, fx, hy, dx, hy, dx, fy, cx, fy, ax, hy])
+ fx, by, fx, dy, gx, dy, ix, by, ix, hy, gx, fy, fx,
+ fy, fx, hy, dx, hy, dx, fy, cx, fy, ax, hy])
shapes.append(n)
elif re.match("[modb]{4}", prop):
n = QtGui.QPolygon([ax, by, dx, dy, dx, by, fx, by,
- fx, dy, ix, by, ix, hy, fx, fy, dx, fy, ax, hy])
+ fx, dy, ix, by, ix, hy, fx, fy, dx, fy, ax, hy])
shapes.append(n)
elif re.match("[modp]{4}", prop):
n = QtGui.QPolygon([ax, by, dx, dy, fx, dy, ix, by,
- ix, hy, fx, fy, fx, hy, dx, hy, dx, fy, ax, hy])
+ ix, hy, fx, fy, fx, hy, dx, hy, dx, fy, ax, hy])
shapes.append(n)
elif re.match("[mod]{3}", prop):
n = QtGui.QPolygon([ax, by, dx, dy, fx, dy, ix, by,
- ix, hy, fx, fy, dx, fy, ax, hy])
+ ix, hy, fx, fy, dx, fy, ax, hy])
shapes.append(n)
elif re.match("[mob]{3}", prop):
n = QtGui.QPolygon([dx, dy, ex, dy, ex, by, fx, by,
- fx, dy, gx, dy, ix, by, ix, hy, gx, fy, dx, fy])
+ fx, dy, gx, dy, ix, by, ix, hy, gx, fy, dx, fy])
shapes.append(n)
elif re.match("[mop]{3}", prop):
n = QtGui.QPolygon([dx, dy, gx, dy, ix, by, ix, hy,
- gx, fy, fx, fy, fx, hy, ex, hy, ex, fy, dx, fy])
+ gx, fy, fx, fy, fx, hy, ex, hy, ex, fy, dx, fy])
shapes.append(n)
elif re.match("[dob]{3}", prop):
n = QtGui.QPolygon([ax, cy, cx, dy, ex, dy, ex, by,
- fx, by, fx, dy, fx, dy, fx, fy, cx, fy, ax, gy])
+ fx, by, fx, dy, fx, dy, fx, fy, cx, fy, ax, gy])
shapes.append(n)
elif re.match("[dop]{3}", prop):
n = QtGui.QPolygon([ax, cy, cx, dy, fx, dy, fx, fy,
- ex, fy, ex, hy, dx, hy, dx, fy, cx, fy, ax, gy])
+ ex, fy, ex, hy, dx, hy, dx, fy, cx, fy, ax, gy])
shapes.append(n)
elif re.match("[mbd]{3}", prop):
n = QtGui.QPolygon([ax, by, dx, ay, fx, ay, ix, by,
- ix, ey, hx, ey, hx, cy, bx, cy, bx, ey, ax, ey])
+ ix, ey, hx, ey, hx, cy, bx, cy, bx, ey, ax, ey])
shapes.append(n)
elif re.match("[mpd]{3}", prop):
n = QtGui.QPolygon([ax, ey, bx, ey, bx, hy, hx, hy,
- hx, ey, ix, ey, ix, gy, gx, iy, bx, iy, ax, gy])
+ hx, ey, ix, ey, ix, gy, gx, iy, bx, iy, ax, gy])
shapes.append(n)
elif re.match("[ob]{2}", prop):
n = QtGui.QPolygon([cx, ay, gx, ay, fx, cy, fx, fy,
- dx, fy, dx, cy])
+ dx, fy, dx, cy])
shapes.append(n)
elif re.match("[op]{2}", prop):
n = QtGui.QPolygon([dx, dy, fx, dy, fx, gy, gx, iy,
- cx, iy, dx, gy])
+ cx, iy, dx, gy])
shapes.append(n)
elif re.match("[mb]{2}", prop):
n = QtGui.QPolygon([dx, ay, fx, ay, ix, by, ix, ey,
- hx, ey, hx, dy, fx, cy, dx, cy, bx, by])
+ hx, ey, hx, dy, fx, cy, dx, cy, bx, by])
shapes.append(n)
elif re.match("[mp]{2}", prop):
n = QtGui.QPolygon([dx, iy, fx, iy, ix, hy, ix, ey,
- hx, ey, hx, fy, fx, gy, dx, gy, bx, hy])
+ hx, ey, hx, fy, fx, gy, dx, gy, bx, hy])
shapes.append(n)
elif re.match("[db]{2}", prop):
n = QtGui.QPolygon([fx, ay, dx, ay, ax, by, ax, ey,
- bx, ey, bx, dy, dx, cy, fx, cy, hx, by])
+ bx, ey, bx, dy, dx, cy, fx, cy, hx, by])
shapes.append(n)
elif re.match("[dp]{2}", prop):
n = QtGui.QPolygon([fx, iy, dx, iy, ax, hy, ax, ey,
- bx, ey, bx, fy, dx, gy, fx, gy, hx, hy])
+ bx, ey, bx, fy, dx, gy, fx, gy, hx, hy])
shapes.append(n)
elif re.match("[mo]{2}", prop):
n = QtGui.QPolygon([dx, dy, gx, dy, ix, cy, ix, gy,
- gx, fy, dx, fy])
+ gx, fy, dx, fy])
shapes.append(n)
elif re.match("[do]{2}", prop):
n = QtGui.QPolygon([ax, cy, cx, dy, fx, dy, fx, fy,
- cx, fy, ax, gy])
+ cx, fy, ax, gy])
shapes.append(n)
elif "o" in prop:
@@ -755,121 +790,129 @@ class toothSurfaces():
elif "b" in prop:
n = QtGui.QPolygon([bx, ay, hx, ay, fx, cy, dx, cy])
shapes.append(n)
- else: #front tooth
+ else: # front tooth
if "dr" in prop:
n = QtGui.QPolygon([cx, dy, dx, by, fx, by, hx, dy,
- hx, fy, fx, hy, dx, hy, cx, fy])
+ hx, fy, fx, hy, dx, hy, cx, fy])
shapes.append(n)
elif re.match("[mbd]{3}", prop):
n = QtGui.QPolygon([ax, by, dx, ay, fx, ay, ix, by,
- ix, ey, hx, ey, hx, cy, bx, cy, bx, ey, ax, ey])
+ ix, ey, hx, ey, hx, cy, bx, cy, bx, ey, ax, ey])
shapes.append(n)
elif re.match("[mpd]{3}", prop):
n = QtGui.QPolygon([ax, ey, bx, ey, bx, hy, hx, hy,
- hx, ey, ix, ey, ix, gy, gx, iy, bx, iy, ax, gy])
+ hx, ey, ix, ey, ix, gy, gx, iy, bx, iy, ax, gy])
shapes.append(n)
elif re.match("[ib]{2}", prop):
n = QtGui.QPolygon([cx, ay, gx, ay, fx, cy, fx, fy,
- dx, fy, dx, cy])
+ dx, fy, dx, cy])
shapes.append(n)
elif re.match("[ip]{2}", prop):
n = QtGui.QPolygon([dx, dy, fx, dy, fx, gy, gx, iy,
- cx, iy, dx, gy])
+ cx, iy, dx, gy])
shapes.append(n)
elif re.match("[mb]{2}", prop):
n = QtGui.QPolygon([dx, ay, fx, ay, ix, by, ix, ey,
- hx, ey, hx, dy, fx, cy, dx, cy, bx, by])
+ hx, ey, hx, dy, fx, cy, dx, cy, bx, by])
shapes.append(n)
elif re.match("[mp]{2}", prop):
n = QtGui.QPolygon([dx, iy, fx, iy, ix, hy, ix, ey,
- hx, ey, hx, fy, fx, gy, dx, gy, bx, hy])
+ hx, ey, hx, fy, fx, gy, dx, gy, bx, hy])
shapes.append(n)
elif re.match("[db]{2}", prop):
n = QtGui.QPolygon([fx, ay, dx, ay, ax, by, ax, ey,
- bx, ey, bx, dy, dx, cy, fx, cy, hx, by])
+ bx, ey, bx, dy, dx, cy, fx, cy, hx, by])
shapes.append(n)
elif re.match("[dp]{2}", prop):
n = QtGui.QPolygon([fx, iy, dx, iy, ax, hy, ax, ey,
- bx, ey, bx, fy, dx, gy, fx, gy, hx, hy])
+ bx, ey, bx, fy, dx, gy, fx, gy, hx, hy])
shapes.append(n)
elif re.match("[mid]{3}", prop):
n = QtGui.QPolygon([ax, cy, cx, dy,
- self.innerRect.topLeft().x(),self.innerRect.topLeft().y(),
- self.innerRect.topRight().x(),self.innerRect.topRight().y(),
- gx, dy, ix, cy, ix, gy, gx, fy,
- self.innerRect.bottomRight().x(),
- self.innerRect.bottomRight().y(),
- self.innerRect.bottomLeft().x(),
- self.innerRect.bottomLeft().y(),cx, fy, ax, gy])
+ self.innerRect.topLeft().x(
+ ), self.innerRect.topLeft().y(),
+ self.innerRect.topRight().x(
+ ), self.innerRect.topRight().y(),
+ gx, dy, ix, cy, ix, gy, gx, fy,
+ self.innerRect.bottomRight().x(),
+ self.innerRect.bottomRight().y(),
+ self.innerRect.bottomLeft().x(),
+ self.innerRect.bottomLeft().y(), cx, fy, ax, gy])
shapes.append(n)
elif re.match("[mi]{2}", prop):
n = QtGui.QPolygon([self.innerRect.topLeft().x(),
- self.innerRect.topLeft().y(),
- self.innerRect.topRight().x(),self.innerRect.topRight().y(),
- gx, dy, ix, cy, ix, gy, gx, fy,
- self.innerRect.bottomRight().x(),
- self.innerRect.bottomRight().y(),
- self.innerRect.bottomLeft().x(),
- self.innerRect.bottomLeft().y(),
- ])
+ self.innerRect.topLeft().y(),
+ self.innerRect.topRight().x(
+ ), self.innerRect.topRight().y(),
+ gx, dy, ix, cy, ix, gy, gx, fy,
+ self.innerRect.bottomRight().x(),
+ self.innerRect.bottomRight().y(),
+ self.innerRect.bottomLeft().x(),
+ self.innerRect.bottomLeft().y(),
+ ])
shapes.append(n)
elif re.match("[di]{2}", prop):
n = QtGui.QPolygon([ax, cy, cx, dy,
- self.innerRect.topLeft().x(),self.innerRect.topLeft().y(),
- self.innerRect.topRight().x(),self.innerRect.topRight().y(),
- self.innerRect.bottomRight().x(),
- self.innerRect.bottomRight().y(),
- self.innerRect.bottomLeft().x(),
- self.innerRect.bottomLeft().y(),
- cx, fy, ax, gy])
+ self.innerRect.topLeft().x(
+ ), self.innerRect.topLeft().y(),
+ self.innerRect.topRight().x(
+ ), self.innerRect.topRight().y(),
+ self.innerRect.bottomRight().x(),
+ self.innerRect.bottomRight().y(),
+ self.innerRect.bottomLeft().x(),
+ self.innerRect.bottomLeft().y(),
+ cx, fy, ax, gy])
shapes.append(n)
elif "i" in prop:
n = QtGui.QPolygon([self.innerRect.topLeft().x(),
- self.innerRect.topLeft().y(),
- self.innerRect.topRight().x(),
- self.innerRect.topRight().y(),
- self.innerRect.bottomRight().x(),
- self.innerRect.bottomRight().y(),
- self.innerRect.bottomLeft().x(),
- self.innerRect.bottomLeft().y()])
+ self.innerRect.topLeft().y(),
+ self.innerRect.topRight().x(),
+ self.innerRect.topRight().y(),
+ self.innerRect.bottomRight().x(),
+ self.innerRect.bottomRight().y(),
+ self.innerRect.bottomLeft().x(),
+ self.innerRect.bottomLeft().y()])
shapes.append(n)
elif "m" in prop:
shapes.append(QtGui.QPolygon(
- [hx, dy, ix, dy, ix, fy, hx, fy, gx, ey]))
+ [hx, dy, ix, dy, ix, fy, hx, fy, gx, ey]))
elif "d" in prop:
shapes.append(QtGui.QPolygon(
- [ax, dy, bx, dy, cx, ey, bx, fy, ax, fy]))
+ [ax, dy, bx, dy, cx, ey, bx, fy, ax, fy]))
elif "p" in prop:
shapes.append(QtGui.QPolygon([cx, hy, cx, gy, ex, fy,
- gx, gy, gx, hy, fx, iy, dx, iy]))
+ gx, gy, gx, hy, fx, iy, dx, iy]))
elif "b" in prop:
shapes.append(QtGui.QPolygon([cx, cy, cx, ay, ex, ay,
- gx, ay, gx, cy, fx, dy, dx, dy]))
+ gx, ay, gx, cy, fx, dy, dx, dy]))
for shape in shapes:
self.painter.drawPolygon(shape)
- ##todo - drawPath may be MUCH better (curvier)
- ##- a lot of work to change though?
+ # todo - drawPath may be MUCH better (curvier)
+ # - a lot of work to change though?
self.painter.restore()
+
class toothImage(QtGui.QWidget):
+
'''
a class to grab an image of the tooth widget
'''
+
def __init__(self, parent=None):
super(toothImage, self).__init__(parent)
def paintEvent(self, event=None):
recd = QtCore.QRectF(0, 0, self.width(), self.height())
toothS = toothSurfaces(self, recd, "ur8")
- toothS.setProps(["m do,gl ",])
+ toothS.setProps(["m do,gl ", ])
toothS.draw(self)
def image(self):
'''
returns a png image of the tooth
'''
- myimage=QtGui.QPixmap.grabWidget(self)
+ myimage = QtGui.QPixmap.grabWidget(self)
return myimage
@@ -878,27 +921,47 @@ if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
form = ChartWidget()
form.chartgrid = {'lr1': 'lr1', 'lr3': 'lr3', 'lr2': 'lr2', 'lr5': 'lr5',
- 'lr4': 'lr4', 'lr7': 'lr7', 'lr6': 'lr6', 'lr8': 'lr8','ul8': '***',
- 'ul2': 'ul2', 'ul3': 'ulC', 'ul1': 'ul1', 'ul6': 'ul6', 'ul7': 'ul7',
- 'ul4': 'ul4', 'ul5': 'ul5', 'ur4': 'ur4','ur5': 'ur5', 'ur6': 'ur6',
- 'ur7': 'ur7', 'ur1': 'ur1', 'ur2': 'ur2', 'ur3': 'ur3', 'ur8': 'ur8',
- 'll8': 'll8', 'll3': 'll3','ll2': 'll2', 'll1': 'll1', 'll7': 'll7',
- 'll6': 'll6', 'll5': 'll5', 'll4': 'll4'}
+ 'lr4': 'lr4',
+ 'lr7': 'lr7',
+ 'lr6': 'lr6',
+ 'lr8': 'lr8',
+ 'ul8': '***',
+ 'ul2': 'ul2',
+ 'ul3': 'ulC',
+ 'ul1': 'ul1',
+ 'ul6': 'ul6',
+ 'ul7': 'ul7',
+ 'ul4': 'ul4',
+ 'ul5': 'ul5',
+ 'ur4': 'ur4',
+ 'ur5': 'ur5',
+ 'ur6': 'ur6',
+ 'ur7': 'ur7',
+ 'ur1': 'ur1',
+ 'ur2': 'ur2',
+ 'ur3': 'ur3',
+ 'ur8': 'ur8',
+ 'll8': 'll8',
+ 'll3': 'll3',
+ 'll2': 'll2',
+ 'll1': 'll1',
+ 'll7': 'll7',
+ 'll6': 'll6', 'll5': 'll5', 'll4': 'll4'}
for properties in (
- ("ur7", "ex "), ("ur6", "gi/modbp mb"), ("ur5", "cr,go mp"),
- ("ur4", "mop,co"), ("ur3", "AT"), ("ur2", "di,co b"), ("ur1", "pv rt"),
- ("ul1", "cr,pj"), ("ul2", "dp,co b,co"), ("ul3","di p,go"),
- ("ll3", "pv"), ("ll2", "dip"), ("ll1", "midi"),
- ("lr1", "mpd"), ("lr2", "mld,gl"), ("lr3", "dr"),
- ("ul4", "do"), ("ul6", "mo"), ("lr8", "("),
- ("ul7", "mop,co"), ("ur8", "mdb,gl mpd,go ob"), ("ll4", "b,gl dl,co"),
- ("ll5", "ob ml"), ("ll6", "mod,co"), ("ll7", "pe"), ("ll8", "ue !watch"),
- ("lr4", "b"), ("lr5", "dr"), ("lr7", "fs"), ("lr6", "modbl,pr")):
+ ("ur7", "ex "), ("ur6", "gi/modbp mb"), ("ur5", "cr,go mp"),
+ ("ur4", "mop,co"), ("ur3", "AT"), ("ur2", "di,co b"), ("ur1", "pv rt"),
+ ("ul1", "cr,pj"), ("ul2", "dp,co b,co"), ("ul3", "di p,go"),
+ ("ll3", "pv"), ("ll2", "dip"), ("ll1", "midi"),
+ ("lr1", "mpd"), ("lr2", "mld,gl"), ("lr3", "dr"),
+ ("ul4", "do"), ("ul6", "mo"), ("lr8", "("),
+ ("ul7", "mop,co"), ("ur8", "mdb,gl mpd,go ob"), ("ll4", "b,gl dl,co"),
+ ("ll5", "ob ml"), ("ll6", "mod,co"), (
+ "ll7", "pe"), ("ll8", "ue !watch"),
+ ("lr4", "b"), ("lr5", "dr"), ("lr7", "fs"), ("lr6", "modbl,pr")):
form.setToothProps(properties[0], properties[1])
form.show()
pixmap = QtGui.QPixmap.grabWidget(form)
pixmap.save("/home/neil/chart.png")
form.selected = [0, 2]
sys.exit(app.exec_())
-
diff --git a/src/standalone_chart/lib_om_chart/config.py b/src/standalone_chart/lib_om_chart/config.py
index f1f3c0e..0d73bcc 100644
--- a/src/standalone_chart/lib_om_chart/config.py
+++ b/src/standalone_chart/lib_om_chart/config.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module has one purpose...
@@ -31,30 +33,31 @@ import logging
import os
CONF_FILE_LOC = os.path.join(os.path.expanduser("~"),
- ".openmolar", "om_chart.conf")
-logging.debug("using conf file at '%s'"% CONF_FILE_LOC)
+ ".openmolar", "om_chart.conf")
+logging.debug("using conf file at '%s'" % CONF_FILE_LOC)
try:
parser = ConfigParser.SafeConfigParser()
parser.read(CONF_FILE_LOC)
KWARGS = {
- "host":parser.get("Database","host"),
- "port":int(parser.get("Database","port")),
- "user":parser.get("Database","user"),
- "passwd": base64.b64decode(parser.get("Database","password")),
- "db":parser.get("Database","db_name"),
- "use_unicode":True,
- "charset":"utf8"
- }
+ "host": parser.get("Database", "host"),
+ "port": int(parser.get("Database", "port")),
+ "user": parser.get("Database", "user"),
+ "passwd": base64.b64decode(parser.get("Database", "password")),
+ "db": parser.get("Database", "db_name"),
+ "use_unicode": True,
+ "charset": "utf8"
+ }
- SURGERY_NO = int(parser.get("Surgery","number"))
+ SURGERY_NO = int(parser.get("Surgery", "number"))
except ConfigParser.NoSectionError:
logging.error("unable to parse config file - first run??")
KWARGS = {}
SURGERY_NO = 0
+
def write_config(host, port, db_name, user, passwd, surgery, ssl=True):
parser = ConfigParser.RawConfigParser()
diff --git a/src/standalone_chart/lib_om_chart/config_dialog.py b/src/standalone_chart/lib_om_chart/config_dialog.py
index d22d6bb..c08441a 100644
--- a/src/standalone_chart/lib_om_chart/config_dialog.py
+++ b/src/standalone_chart/lib_om_chart/config_dialog.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
has one class, a dialog to write the config
@@ -31,21 +33,23 @@ from PyQt4 import QtGui, QtCore
import config
+
class ConfigDialog(QtGui.QDialog):
+
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
- label = QtGui.QLabel(u"<b>%s</b>"% _(
+ label = QtGui.QLabel(u"<b>%s</b>" % _(
"Please complete the following form"))
label.setAlignment(QtCore.Qt.AlignCenter)
frame = QtGui.QFrame()
form_layout = QtGui.QFormLayout(frame)
- self.host_le= QtGui.QLineEdit()
- self.port_le= QtGui.QLineEdit()
- self.database_le= QtGui.QLineEdit()
- self.user_le= QtGui.QLineEdit()
- self.password_le= QtGui.QLineEdit()
+ self.host_le = QtGui.QLineEdit()
+ self.port_le = QtGui.QLineEdit()
+ self.database_le = QtGui.QLineEdit()
+ self.user_le = QtGui.QLineEdit()
+ self.password_le = QtGui.QLineEdit()
self.password_le.setEchoMode(QtGui.QLineEdit.Password)
self.surgery_sb = QtGui.QSpinBox()
@@ -59,7 +63,7 @@ class ConfigDialog(QtGui.QDialog):
self.button_box = QtGui.QDialogButtonBox(self)
self.button_box.setOrientation(QtCore.Qt.Horizontal)
self.button_box.setStandardButtons(
- self.button_box.Cancel|self.button_box.Apply)
+ self.button_box.Cancel | self.button_box.Apply)
self.button_box.setCenterButtons(True)
layout = QtGui.QVBoxLayout(self)
@@ -68,7 +72,6 @@ class ConfigDialog(QtGui.QDialog):
layout.addStretch()
layout.addWidget(self.button_box)
-
self.button_box.clicked.connect(self._clicked)
def sizeHint(self):
@@ -79,7 +82,7 @@ class ConfigDialog(QtGui.QDialog):
if role == self.button_box.ApplyRole:
self.accept()
else:
- self.reject()
+ self.reject()
@property
def host(self):
@@ -109,13 +112,13 @@ class ConfigDialog(QtGui.QDialog):
@property
def has_acceptable_values(self):
return (
- self.host !="" and
+ self.host != "" and
self.user != "" and
self.port != 0 and
self.password != "" and
self.db_name != "" and
self.surgery != 0
- )
+ )
def exec_(self, reconfigure=False):
result = True
@@ -149,4 +152,4 @@ if __name__ == "__main__":
app = QtGui.QApplication([])
dl = ConfigDialog()
if dl.exec_():
- dl.write_config()
\ No newline at end of file
+ dl.write_config()
diff --git a/src/standalone_chart/lib_om_chart/connect.py b/src/standalone_chart/lib_om_chart/connect.py
index 17ac8df..ddc43f4 100644
--- a/src/standalone_chart/lib_om_chart/connect.py
+++ b/src/standalone_chart/lib_om_chart/connect.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
this module has one purpose... provide a connection to the mysqldatabase
@@ -31,6 +33,7 @@ import sys
import time
import MySQLdb
+
class Connection(object):
_connection = None
@@ -50,16 +53,16 @@ class Connection(object):
while not (self._connection and self._connection.open):
logging.debug("New connection needed")
logging.debug(
- "connecting to %s on %s port %s"% (
+ "connecting to %s on %s port %s" % (
config.KWARGS.get("host"),
config.KWARGS.get("db"),
config.KWARGS.get("port"))
- )
+ )
try:
self._connection = MySQLdb.connect(**config.KWARGS)
except MySQLdb.Error as exc:
- logging.error("failed to connect, attempt %s"% attempts)
+ logging.error("failed to connect, attempt %s" % attempts)
time.sleep(2)
attempts += 1
if attempts >= 10:
diff --git a/src/standalone_chart/lib_om_chart/main_window.py b/src/standalone_chart/lib_om_chart/main_window.py
index ddca68d..94743ac 100644
--- a/src/standalone_chart/lib_om_chart/main_window.py
+++ b/src/standalone_chart/lib_om_chart/main_window.py
@@ -1,24 +1,26 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2010-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
'''
provides the BaseMainWindow class
@@ -33,7 +35,9 @@ from lib_openmolar.common.qt4.widgets import Advisor, DockableMenuBar
logging.basicConfig(level=logging.DEBUG)
+
class BaseMainWindow(QtGui.QMainWindow, Advisor):
+
'''
This class is a MainWindow, with menu, toolbar and statusbar.
Some of the layout signals/slots already connected.
@@ -51,7 +55,7 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
self.setMinimumSize(300, 300)
- ##### setup menu and headers ####
+ # setup menu and headers ####
#: a pointer to the main toolbar
self.main_toolbar = QtGui.QToolBar()
@@ -61,12 +65,12 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
#: a pointer to the :doc:`DockableMenuBar`
menubar = DockableMenuBar(self)
- ## add them to the app
+ # add them to the app
self.setMenuBar(menubar)
self.addToolBar(QtCore.Qt.TopToolBarArea, self.main_toolbar)
- #### setup a statusbar with a label ####
+ # setup a statusbar with a label ####
#: a pointer to the QtGui.QStatusBar
self.statusbar = QtGui.QStatusBar()
@@ -91,7 +95,7 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
self.menu_help = QtGui.QMenu(_("&Help"), self)
menubar.addMenu(self.menu_help)
- #### file menu ####
+ # file menu ####
icon = QtGui.QIcon.fromTheme("application-exit")
@@ -101,7 +105,7 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
self.menu_file.addSeparator()
self.menu_file.addAction(self.action_quit)
- #### edit menu ####
+ # edit menu ####
icon = QtGui.QIcon.fromTheme("preferences-desktop")
#: a pointer to the preferences qAction
@@ -109,7 +113,7 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
self.menu_edit.addAction(self.action_preferences)
- #### view menu ####
+ # view menu ####
#: a pointer to the show statusbar qaction
self.action_show_statusbar = QtGui.QAction(_("Show Status&bar"), self)
@@ -118,7 +122,8 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
icon = QtGui.QIcon.fromTheme("view-fullscreen")
#: a pointer to the fullscreen mode qaction
- self.action_fullscreen = QtGui.QAction(icon, _("FullScreen Mode"), self)
+ self.action_fullscreen = QtGui.QAction(
+ icon, _("FullScreen Mode"), self)
self.action_fullscreen.setCheckable(True)
self.action_fullscreen.setShortcut("f11")
@@ -126,7 +131,7 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
self.menu_view.addAction(self.action_show_statusbar)
self.menu_view.addAction(self.action_fullscreen)
- #### about menu ####
+ # about menu ####
icon = QtGui.QIcon.fromTheme("help-about")
#: a pointer to the about qaction
@@ -149,8 +154,8 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
self.menu_help.addSeparator()
self.menu_help.addAction(self.action_help)
- #### toolbar ####
- #### add selected menu items to the toolbar ####
+ # toolbar ####
+ # add selected menu items to the toolbar ####
#:
self.help_toolbar = QtGui.QToolBar()
@@ -168,7 +173,7 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
:func:`__init__`
'''
self.connect(self.action_quit, QtCore.SIGNAL("triggered()"),
- QtGui.QApplication.instance().closeAllWindows)
+ QtGui.QApplication.instance().closeAllWindows)
self.action_preferences.triggered.connect(self.show_preferences_dialog)
@@ -180,7 +185,7 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
self.action_license.triggered.connect(self.show_license)
self.connect(self.action_about_qt, QtCore.SIGNAL("triggered()"),
- QtGui.qApp, QtCore.SLOT("aboutQt()"))
+ QtGui.qApp, QtCore.SLOT("aboutQt()"))
self.action_help.triggered.connect(self.show_help)
@@ -194,8 +199,8 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
for l in traceback.format_exception(exc_type, exc_val, tracebackobj):
message += l
- self.log.error('UNHANDLED EXCEPTION!\n\n%s\n'% message)
- self.advise('UNHANDLED EXCEPTION!<hr /><pre>%s'% message, 2)
+ self.log.error('UNHANDLED EXCEPTION!\n\n%s\n' % message)
+ self.advise('UNHANDLED EXCEPTION!<hr /><pre>%s' % message, 2)
def resizeEvent(self, event):
'''
@@ -228,7 +233,7 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
yield all toolbars of the application
'''
for child in self.children():
- if type(child) == QtGui.QToolBar:
+ if isinstance(child, QtGui.QToolBar):
yield child
def insertToolBar(self, *args):
@@ -256,7 +261,7 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
if sep:
insertpoint = self.main_toolbar.insertSeparator(insertpoint)
added.append(insertpoint)
- if type(action) == QtGui.QAction:
+ if isinstance(action, QtGui.QAction):
added.append(self.main_toolbar.insertAction(insertpoint, action))
else:
added.append(self.main_toolbar.insertWidget(insertpoint, action))
@@ -267,7 +272,7 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
load settings from QtCore.QSettings.
'''
settings = QtCore.QSettings()
- #Qt settings
+ # Qt settings
self.restoreGeometry(settings.value("geometry").toByteArray())
self.restoreState(settings.value("windowState").toByteArray())
statusbar_hidden = settings.value("statusbar_hidden").toBool()
@@ -293,7 +298,7 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
save settings from QtCore.QSettings
'''
settings = QtCore.QSettings()
- #Qt settings
+ # Qt settings
settings.setValue("geometry", self.saveGeometry())
settings.setValue("windowState", self.saveState())
settings.setValue("statusbar_hidden", self.statusbar.isHidden())
@@ -301,7 +306,6 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
settings.setValue("Toolbar", self.main_toolbar.toolButtonStyle())
settings.setValue("TinyMenu", not self.menuBar().isVisible())
-
def show_toolbar(self):
if self.action_show_toolbar.isChecked():
self.main_toolbar.show()
@@ -316,8 +320,8 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
def reimplement_needed(self, func_name):
QtGui.QMessageBox.information(self, "please re-implement",
- '''please overwrite function <b>'%s'</b><br />
- in any class which inherits from 'BaseMainWindow' '''% func_name)
+ '''please overwrite function <b>'%s'</b><br />
+ in any class which inherits from 'BaseMainWindow' ''' % func_name)
def show_preferences_dialog(self):
self.reimplement_needed('show_preferences_dialog')
@@ -385,7 +389,7 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
event.ignore()
def get_confirm(self, message,
- accept="ok", reject="cancel", default="accept"):
+ accept="ok", reject="cancel", default="accept"):
'''
a convenience function to raise a dialog for confirmation of an action
'''
@@ -399,11 +403,11 @@ class BaseMainWindow(QtGui.QMainWindow, Advisor):
elif reject == "no":
reject_but = QtGui.QMessageBox.No
- buttons = accept_but|reject_but
+ buttons = accept_but | reject_but
default_but = accept_but if default == "accept" else reject_but
- return QtGui.QMessageBox.question(self,_("Confirm"),
- message, buttons, default_but) == accept_but
+ return QtGui.QMessageBox.question(self, _("Confirm"),
+ message, buttons, default_but) == accept_but
if __name__ == "__main__":
diff --git a/src/standalone_chart/lib_om_chart/patient.py b/src/standalone_chart/lib_om_chart/patient.py
index 60ac127..aed7351 100644
--- a/src/standalone_chart/lib_om_chart/patient.py
+++ b/src/standalone_chart/lib_om_chart/patient.py
@@ -1,32 +1,36 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import logging
from connect import Connection
+
class PatientNotFoundException(Exception):
pass
+
def from_signed_byte(val):
'''
this returns a bit by bit representation of a signed byte -
@@ -35,7 +39,7 @@ def from_signed_byte(val):
if val is None:
val = 0
if val >= 0:
- base = (128,64,32,16,8,4,2,1)
+ base = (128, 64, 32, 16, 8, 4, 2, 1)
bstring = ""
for b in base:
if val >= b:
@@ -44,34 +48,35 @@ def from_signed_byte(val):
else:
bstring += "0"
else:
- base=(-64,-32,-16,-8,-4,-2,-1)
- bstring="1" #set the negative bit
+ base = (-64, -32, -16, -8, -4, -2, -1)
+ bstring = "1" # set the negative bit
for b in base:
- if val<b:
- bstring+="0"
- val-=b
+ if val < b:
+ bstring += "0"
+ val -= b
else:
- bstring+="1"
+ bstring += "1"
return bstring
class Patient(object):
+
'''
has a tiny percentage of the footprint (and loading time) of the
main patient class
'''
TOOTH_FIELDS = (
- "ur8", "ur7", "ur6", "ur5", 'ur4', 'ur3', 'ur2', 'ur1',
- 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8',
- "lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1',
- 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'
- )
+ "ur8", "ur7", "ur6", "ur5", 'ur4', 'ur3', 'ur2', 'ur1',
+ 'ul1', 'ul2', 'ul3', 'ul4', 'ul5', 'ul6', 'ul7', 'ul8',
+ "lr8", "lr7", "lr6", "lr5", 'lr4', 'lr3', 'lr2', 'lr1',
+ 'll1', 'll2', 'll3', 'll4', 'll5', 'll6', 'll7', 'll8'
+ )
DECIDUOUS = (
- '***','***','***','ulE','ulD','ulC','ulB','ulA',
- 'urA','urB','urC','urD','urE','***','***','***',
- '***','***','***','lrE','lrD','lrC','lrB','lrA',
- 'llA','llB','llC','llD','llE','***','***','***'
- )
+ '***', '***', '***', 'ulE', 'ulD', 'ulC', 'ulB', 'ulA',
+ 'urA', 'urB', 'urC', 'urD', 'urE', '***', '***', '***',
+ '***', '***', '***', 'lrE', 'lrD', 'lrC', 'lrB', 'lrA',
+ 'llA', 'llB', 'llC', 'llD', 'llE', '***', '***', '***'
+ )
connection = Connection()
@@ -91,36 +96,36 @@ class Patient(object):
if not row:
raise PatientNotFoundException
- self.dent1,self.dent0,self.dent3,self.dent2 = row[:4]
+ self.dent1, self.dent0, self.dent3, self.dent2 = row[:4]
for i, field in enumerate(self.TOOTH_FIELDS):
- self.__dict__[field] = row[i+4]
+ self.__dict__[field] = row[i + 4]
@property
def query(self):
query = 'SELECT dent1, dent0, dent3, dent2, '
for field in self.TOOTH_FIELDS:
- query += "%sst, "% field
- return '%s from patients where serialno = %%s'% query.rstrip(", ")
+ query += "%sst, " % field
+ return '%s from patients where serialno = %%s' % query.rstrip(", ")
#@property
def chartgrid(self):
- grid=""
+ grid = ""
chart_dict = {}
- for quad in (self.dent1,self.dent0,self.dent3,self.dent2):
+ for quad in (self.dent1, self.dent0, self.dent3, self.dent2):
grid += from_signed_byte(quad)
for i, tooth in enumerate(self.TOOTH_FIELDS):
- if grid[i]=="0":
- chart_dict[tooth]=tooth
+ if grid[i] == "0":
+ chart_dict[tooth] = tooth
else:
- chart_dict[tooth]=self.DECIDUOUS[i]
+ chart_dict[tooth] = self.DECIDUOUS[i]
return chart_dict
-if __name__ =="__main__":
+if __name__ == "__main__":
try:
- serialno=int(sys.argv[len(sys.argv)-1])
+ serialno = int(sys.argv[len(sys.argv) - 1])
except:
- serialno=11956
+ serialno = 11956
pt = Patient(serialno)
- print pt.__dict__
\ No newline at end of file
+ print pt.__dict__
diff --git a/src/standalone_chart/lib_om_chart/restorable_app.py b/src/standalone_chart/lib_om_chart/restorable_app.py
index 3402e37..9687ab3 100644
--- a/src/standalone_chart/lib_om_chart/restorable_app.py
+++ b/src/standalone_chart/lib_om_chart/restorable_app.py
@@ -1,39 +1,44 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2010-2012, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import sys
from PyQt4 import QtGui
+
class RestorableApplication(QtGui.QApplication):
+
'''
A subclass which play ball if app state is to be remembered by an X11
Session manager.
Will write settings to ~/.config/application_name on linux systems
'''
+
def __init__(self, name):
'''
the name given here is important as is used in saving the settings
'''
- #super(RestorableApplication, self).__init__(sys.argv)
+ # super(RestorableApplication, self).__init__(sys.argv)
QtGui.QApplication.__init__(self, sys.argv)
self.setOrganizationName(name)
self.setApplicationName(name)
diff --git a/src/standalone_chart/om_chart.py b/src/standalone_chart/om_chart.py
index a4f11e1..86f55a0 100755
--- a/src/standalone_chart/om_chart.py
+++ b/src/standalone_chart/om_chart.py
@@ -1,24 +1,26 @@
-#! /usr/bin/python
+#! /usr/bin/env python
# -*- coding: utf-8 -*-
-###############################################################################
-## ##
-## Copyright 2013, Neil Wallace <neil at openmolar.com> ##
-## ##
-## This program is free software: you can redistribute it and/or modify ##
-## it under the terms of the GNU General Public License as published by ##
-## the Free Software Foundation, either version 3 of the License, or ##
-## (at your option) any later version. ##
-## ##
-## This program is distributed in the hope that it will be useful, ##
-## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
-## GNU General Public License for more details. ##
-## ##
-## You should have received a copy of the GNU General Public License ##
-## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
-## ##
-###############################################################################
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
import gettext
import logging
@@ -37,9 +39,11 @@ from lib_om_chart.config import SURGERY_NO
from lib_om_chart.config_dialog import ConfigDialog
from lib_om_chart.connect import Connection
+
class MainWindow(QtGui.QMainWindow):
connection = Connection()
_loaded_serialno = None
+
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
@@ -83,7 +87,7 @@ class MainWindow(QtGui.QMainWindow):
load settings from QtCore.QSettings.
'''
settings = QtCore.QSettings()
- #Qt settings
+ # Qt settings
self.restoreGeometry(settings.value("geometry").toByteArray())
self.restoreState(settings.value("windowState").toByteArray())
@@ -92,19 +96,19 @@ class MainWindow(QtGui.QMainWindow):
save settings from QtCore.QSettings
'''
settings = QtCore.QSettings()
- #Qt settings
+ # Qt settings
settings.setValue("geometry", self.saveGeometry())
settings.setValue("windowState", self.saveState())
-
+
def closeEvent(self, event=None):
'''
re-implement the close event of QtGui.QMainWindow, and check the user
really meant to do this.
'''
- result = QtGui.QMessageBox.question(self,_("Confirm"),
- _("Quit Application?"),
- QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel,
- QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Ok
+ result = QtGui.QMessageBox.question(self, _("Confirm"),
+ _("Quit Application?"),
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Ok
if result:
self.saveSettings()
@@ -120,13 +124,13 @@ class MainWindow(QtGui.QMainWindow):
cursor = db.cursor()
cursor.execute("select max(serialno) from patients")
row = cursor.fetchone()
- return row[0] + 10 #allow for a few new patients.
-
+ return row[0] + 10 # allow for a few new patients.
+
def get_patient(self):
sno, result = QtGui.QInputDialog.getInt(self,
- _("Manual Select"),
- _("Select a serialno to load"),
- 1, 1, self.max_sno)
+ _("Manual Select"),
+ _("Select a serialno to load"),
+ 1, 1, self.max_sno)
if result:
self.load_patient(sno)
@@ -138,14 +142,14 @@ class MainWindow(QtGui.QMainWindow):
self.chart_widget.clear()
QtGui.QApplication.instance().setOverrideCursor(
- QtCore.Qt.WaitCursor)
- logging.debug("loading patient %s"% sno)
+ QtCore.Qt.WaitCursor)
+ logging.debug("loading patient %s" % sno)
try:
pt = Patient(sno)
self.chart_widget.chartgrid = pt.chartgrid()
#--sets the tooth numbering
- row=0
+ row = 0
for tooth in pt.TOOTH_FIELDS:
static_text = pt.__dict__[tooth]
@@ -154,7 +158,7 @@ class MainWindow(QtGui.QMainWindow):
except PatientNotFoundException:
self._message_box = QtGui.QMessageBox(self)
- self._message_box.setText("Patient Serialno %s not found!"% sno)
+ self._message_box.setText("Patient Serialno %s not found!" % sno)
self._message_box.setIcon(self._message_box.Warning)
self._message_box.setWindowTitle("whoops")
self._message_box.show()
@@ -172,13 +176,14 @@ class MainWindow(QtGui.QMainWindow):
def check_reconfigure(self):
if QtGui.QMessageBox.question(self, _("confirm"),
- _("Do you really want to reconfigure this application?"),
- QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel,
- QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Ok:
+ _(
+ "Do you really want to reconfigure this application?"),
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Cancel) == QtGui.QMessageBox.Ok:
self.reconfigure()
def configure(self):
- self.reconfigure(reconfigure = False)
+ self.reconfigure(reconfigure=False)
def reconfigure(self, reconfigure=True):
dl = ConfigDialog(self)
@@ -200,7 +205,7 @@ class MainWindow(QtGui.QMainWindow):
for l in traceback.format_exception(exc_type, exc_val, tracebackobj):
message += l
QtGui.QMessageBox.warning(self, _("Error"),
- 'UNHANDLED EXCEPTION!<hr /><pre>%s</pre>'% message)
+ 'UNHANDLED EXCEPTION!<hr /><pre>%s</pre>' % message)
self.timer.start()
def check_record_in_use(self):
@@ -217,13 +222,13 @@ class MainWindow(QtGui.QMainWindow):
if serialno and serialno != self._loaded_serialno:
self.load_patient(serialno)
self._loaded_serialno = serialno
- #self.setWindowState(
+ # self.setWindowState(
# QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive)
self.activateWindow()
if __name__ == "__main__":
gettext.install("openmolar")
- logging.basicConfig(level = logging.DEBUG)
+ logging.basicConfig(level=logging.DEBUG)
app = RestorableApplication("om_charter")
mw = MainWindow()
sys.excepthook = mw.excepthook
diff --git a/src/tests/appt_drag_test.py b/src/tests/appt_drag_test.py
index b9b2d5b..98eb266 100644
--- a/src/tests/appt_drag_test.py
+++ b/src/tests/appt_drag_test.py
@@ -1,3 +1,27 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# ############################################################################ #
+# # # #
+# # Copyright (c) 2009-2014 Neil Wallace <neil at openmolar.com> # #
+# # # #
+# # This file is part of OpenMolar. # #
+# # # #
+# # OpenMolar is free software: you can redistribute it and/or modify # #
+# # it under the terms of the GNU General Public License as published by # #
+# # the Free Software Foundation, either version 3 of the License, or # #
+# # (at your option) any later version. # #
+# # # #
+# # OpenMolar is distributed in the hope that it will be useful, # #
+# # but WITHOUT ANY WARRANTY; without even the implied warranty of # #
+# # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # #
+# # GNU General Public License for more details. # #
+# # # #
+# # You should have received a copy of the GNU General Public License # #
+# # along with OpenMolar. If not, see <http://www.gnu.org/licenses/>. # #
+# # # #
+# ############################################################################ #
+
import datetime
import cPickle
import pickle
@@ -14,6 +38,7 @@ from openmolar.qt4gui.appointment_gui_modules.list_models \
class _DragTestDialog(QtGui.QDialog):
+
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setWindowTitle("Drag Drop Test")
@@ -39,50 +64,48 @@ class _DragTestDialog(QtGui.QDialog):
self.book.setStartTime(1015)
self.book.setEndTime(1145)
for appoint in (
- (1, 1030, 1045, 'MCDONALD I', 6155L, 'EXAM', '', '', '', 1, 73, 0,
- 0, datetime.datetime.now())
-
- ,(1, 1115, 1130, 'EMERGENCY', 0L, '', '', '', '', -128, 0, 0,
- 0, datetime.datetime.now())):
+ (1, 1030, 1045, 'MCDONALD I', 6155, 'EXAM', '', '', '', 1, 73, 0,
+ 0, datetime.datetime.now()), (1, 1115, 1130, 'EMERGENCY', 0, '', '', '', '', -128, 0, 0,
+ 0, datetime.datetime.now())):
self.book.setAppointment(appoint)
self.OVbook = AppointmentOverviewWidget("1000", "1200", 15, 2, self)
d1 = appointments.DentistDay(1)
- d1.start=1015
- d1.end=1145
- d1.memo="hello"
+ d1.start = 1015
+ d1.end = 1145
+ d1.memo = "hello"
d2 = appointments.DentistDay(4)
- d2.start=1015
- d2.end=1145
+ d2.start = 1015
+ d2.end = 1145
- self.OVbook.dents=[d1,d2]
+ self.OVbook.dents = [d1, d2]
self.OVbook.clear()
self.OVbook.init_dicts()
- for d in (d1,d2):
+ for d in (d1, d2):
self.OVbook.setStartTime(d)
self.OVbook.setEndTime(d)
self.OVbook.setMemo(d)
self.OVbook.setFlags(d)
- slot = appointments.FreeSlot(datetime.datetime(2009,2,2,10,45),
- 1,20)
- slot2 = appointments.FreeSlot(datetime.datetime(2009,2,2,11,05),
- 4,60)
+ slot = appointments.FreeSlot(datetime.datetime(2009, 2, 2, 10, 45),
+ 1, 20)
+ slot2 = appointments.FreeSlot(datetime.datetime(2009, 2, 2, 11, 0o5),
+ 4, 60)
self.OVbook.addSlot(slot)
self.OVbook.addSlot(slot2)
appt = appointments.WeekViewAppointment()
- appt.mpm = 10*60+30
+ appt.mpm = 10 * 60 + 30
appt.length = 15
appt.dent = 1
self.OVbook.appts[1] = (appt,)
emerg = appointments.WeekViewAppointment()
- emerg.mpm = 11*60+15
+ emerg.mpm = 11 * 60 + 15
emerg.length = 15
emerg.reason = "emergency"
self.OVbook.eTimes[1] = (emerg,)
@@ -92,21 +115,20 @@ class _DragTestDialog(QtGui.QDialog):
self.tw.addTab(self.book, "day")
self.tw.addTab(self.OVbook, "week")
- layout.addWidget(self.appt_listView,0,0)
- layout.addWidget(self.blockView,2,0)
+ layout.addWidget(self.appt_listView, 0, 0)
+ layout.addWidget(self.blockView, 2, 0)
- layout.addWidget(self.tw,0,1,3,1)
- #self.tw.setCurrentIndex(1)
+ layout.addWidget(self.tw, 0, 1, 3, 1)
+ # self.tw.setCurrentIndex(1)
self.model.appointment_selected.connect(slot_catcher)
-
if __name__ == "__main__":
from openmolar.qt4gui.customwidgets import appointmentwidget
from openmolar.qt4gui.customwidgets.appointment_overviewwidget \
- import AppointmentOverviewWidget
+ import AppointmentOverviewWidget
from openmolar.dbtools import appointments
from openmolar.settings import localsettings
@@ -116,6 +138,7 @@ if __name__ == "__main__":
print arg
class duckPt(object):
+
def __init__(self):
self.serialno = 11956
self.title = "Mr"
@@ -126,4 +149,3 @@ if __name__ == "__main__":
app = QtGui.QApplication([])
dl = _DragTestDialog()
dl.exec_()
-
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/openmolar.git
More information about the debian-med-commit
mailing list