[med-svn] [openmolar] 01/01: Imported Upstream version 0.6.0
Dmitry Smirnov
onlyjob at moszumanska.debian.org
Fri Jul 4 06:53:46 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 cbb542a (upstream)
Author: Dmitry Smirnov <onlyjob at member.fsf.org>
Date: Fri Jul 4 06:48:09 2014
Imported Upstream version 0.6.0
---
.gitignore | 5 -
MANIFEST | 470 ++
PKG-INFO | 10 +
README.md | 6 -
TODO.txt | 126 -
bin/openmolar.1 | 22 +-
build_scripts/Makefile | 118 -
build_scripts/code_cleaner.py | 228 -
build_scripts/get_git_branch.py | 60 -
build_scripts/om_pyuic4.py | 160 -
setup.py | 1 -
src/openmolar/GPLv3.txt | 674 --
src/openmolar/__init__.py | 1 +
src/openmolar/backports/advisor.py | 288 +
src/openmolar/connect.py | 202 +-
src/openmolar/create_db.py | 142 +
src/openmolar/createdemodatabase.py | 87 -
src/openmolar/dbtools/accounts.py | 17 +-
src/openmolar/dbtools/appointments.py | 135 +-
src/openmolar/dbtools/brief_patient.py | 2 +-
src/openmolar/dbtools/cashbook.py | 13 +-
src/openmolar/dbtools/courseHistory.py | 401 +-
src/openmolar/dbtools/daybook.py | 46 +
src/openmolar/dbtools/db_patients.py | 2 +-
src/openmolar/dbtools/db_settings.py | 326 +-
src/openmolar/dbtools/distinct_statuses.py | 8 +-
src/openmolar/dbtools/estimate_synopsis.py | 6 +-
src/openmolar/dbtools/estimates.py | 252 +
src/openmolar/dbtools/estimatesHistory.py | 93 +-
src/openmolar/dbtools/extend_books.py | 65 -
src/openmolar/dbtools/families.py | 21 +-
src/openmolar/dbtools/feescales.py | 113 +-
src/openmolar/dbtools/patient_class.py | 235 +-
src/openmolar/dbtools/patient_write_changes.py | 533 +-
src/openmolar/dbtools/paymentHistory.py | 5 +-
src/openmolar/dbtools/queries.py | 46 +-
src/openmolar/dbtools/recall.py | 20 +-
src/openmolar/dbtools/referral.py | 190 +
src/openmolar/dbtools/schema_version.py | 40 +-
src/openmolar/dbtools/search.py | 100 +-
src/openmolar/dbtools/treatment_course.py | 275 +-
src/openmolar/dbtools/writeNewPatient.py | 6 +-
src/openmolar/firstRun.py | 465 --
.../images/thumbs/Screenshot-Patient Finder.png | Bin 16324 -> 0 bytes
src/openmolar/html/images/thumbs/Screenshot.png | Bin 25066 -> 0 bytes
src/openmolar/html/images/thumbs/altered_db.png | Bin 23820 -> 0 bytes
.../html/images/thumbs/appointment_diff_dent.png | Bin 7151 -> 0 bytes
src/openmolar/html/images/thumbs/appt_ov.png | Bin 24423 -> 0 bytes
src/openmolar/html/images/thumbs/appts.png | Bin 23867 -> 0 bytes
.../images/thumbs/complete_tooth_treatment.png | Bin 12623 -> 0 bytes
.../html/images/thumbs/complete_treatment.png | Bin 14804 -> 0 bytes
src/openmolar/html/images/thumbs/confirm_appt.png | Bin 5835 -> 0 bytes
src/openmolar/html/images/thumbs/cpitn.png | Bin 6372 -> 0 bytes
src/openmolar/html/images/thumbs/crown_choice.png | Bin 6975 -> 0 bytes
.../images/thumbs/dayllis_printing_wiizard.png | Bin 15202 -> 0 bytes
.../html/images/thumbs/edit_patient_details.png | Bin 15131 -> 0 bytes
.../html/images/thumbs/enter_appointment.png | Bin 8479 -> 0 bytes
.../html/images/thumbs/estimates_plan.png | Bin 12609 -> 0 bytes
src/openmolar/html/images/thumbs/exam_wizard.png | Bin 15716 -> 0 bytes
src/openmolar/html/images/thumbs/exit_record.png | Bin 10147 -> 0 bytes
src/openmolar/html/images/thumbs/feescales.png | Bin 12000 -> 0 bytes
src/openmolar/html/images/thumbs/find.png | Bin 16296 -> 0 bytes
.../html/images/thumbs/hygenist_wizard.png | Bin 20093 -> 0 bytes
src/openmolar/html/images/thumbs/letter_review.png | Bin 12408 -> 0 bytes
.../html/images/thumbs/letter_text_entry.png | Bin 5585 -> 0 bytes
.../html/images/thumbs/make_appointment.png | Bin 15873 -> 0 bytes
.../html/images/thumbs/make_appointment_any.png | Bin 20575 -> 0 bytes
src/openmolar/html/images/thumbs/newPt.png | Bin 13821 -> 0 bytes
src/openmolar/html/images/thumbs/newlogo.png | Bin 17370 -> 0 bytes
src/openmolar/html/images/thumbs/notes.png | Bin 18490 -> 0 bytes
src/openmolar/html/images/thumbs/perio_charts.png | Bin 27081 -> 0 bytes
.../html/images/thumbs/place_appointment.png | Bin 9694 -> 0 bytes
src/openmolar/html/images/thumbs/plan_treament.png | Bin 9584 -> 0 bytes
.../html/images/thumbs/plan_treatment.png | Bin 10535 -> 0 bytes
src/openmolar/html/images/thumbs/reception.png | Bin 12647 -> 0 bytes
.../images/thumbs/reception_welcome_screen.png | Bin 9852 -> 0 bytes
src/openmolar/html/images/thumbs/startscreen.png | Bin 14540 -> 0 bytes
.../html/images/thumbs/surgery_welcome.png | Bin 12991 -> 0 bytes
.../html/images/thumbs/toothplan_screen.png | Bin 21155 -> 0 bytes
.../html/images/thumbs/treatment_plan_page.png | Bin 14986 -> 0 bytes
src/openmolar/html/images/thumbs/whats_changed.png | Bin 10969 -> 0 bytes
src/openmolar/locale/messages.pot | 7143 +++++++++++---------
src/openmolar/main.py | 360 +-
src/openmolar/ptModules/course_checker.py | 194 +
src/openmolar/ptModules/debug_html.py | 2 -
src/openmolar/ptModules/estimates.py | 31 +-
src/openmolar/ptModules/hidden_notes.py | 5 +-
src/openmolar/ptModules/patientDetails.py | 154 +-
src/openmolar/ptModules/perio.py | 79 -
src/openmolar/ptModules/plan.py | 85 +-
src/openmolar/ptModules/reception_summary.py | 2 +-
src/openmolar/ptModules/referral.py | 129 -
src/openmolar/qt-designer/activeDentStartFinish.ui | 89 -
src/openmolar/qt-designer/addTreatment.ui | 115 -
src/openmolar/qt-designer/appointment_length.ui | 137 -
src/openmolar/qt-designer/apptOpenDay.ui | 307 -
src/openmolar/qt-designer/apptTools.ui | 100 -
src/openmolar/qt-designer/apptWizard.ui | 103 -
src/openmolar/qt-designer/apptWizardItem.ui | 69 -
src/openmolar/qt-designer/aslotEdit.ui | 245 -
src/openmolar/qt-designer/blockSlot.ui | 342 -
src/openmolar/qt-designer/block_wizard.ui | 270 -
src/openmolar/qt-designer/bridge_denture.ui | 242 -
src/openmolar/qt-designer/bulkmail_options.ui | 179 -
src/openmolar/qt-designer/choose_clinicians.ui | 77 -
src/openmolar/qt-designer/choose_language.ui | 165 -
src/openmolar/qt-designer/choose_tooth.ui | 93 -
src/openmolar/qt-designer/codeChecker.ui | 141 -
src/openmolar/qt-designer/completionDate.ui | 157 -
src/openmolar/qt-designer/customTreatment.ui | 151 -
src/openmolar/qt-designer/daylist_print.ui | 203 -
src/openmolar/qt-designer/diary_widget.ui | 953 ---
src/openmolar/qt-designer/editmemos.ui | 123 -
src/openmolar/qt-designer/enter_letter_text.ui | 80 -
src/openmolar/qt-designer/exam_wizard.ui | 171 -
src/openmolar/qt-designer/finalise_appt_time.ui | 148 -
src/openmolar/qt-designer/forumPost.ui | 162 -
src/openmolar/qt-designer/hygenist_wizard.ui | 233 -
src/openmolar/qt-designer/initialise.ui | 890 ---
src/openmolar/qt-designer/main.ui | 5491 ---------------
src/openmolar/qt-designer/medhist.ui | 362 -
src/openmolar/qt-designer/memo_item.ui | 62 -
src/openmolar/qt-designer/newBPE.ui | 309 -
src/openmolar/qt-designer/newCourse.ui | 146 -
src/openmolar/qt-designer/newSetup.ui | 686 --
src/openmolar/qt-designer/ortho_ref_wizard.ui | 406 --
src/openmolar/qt-designer/patient_diary.ui | 270 -
src/openmolar/qt-designer/patient_finder.ui | 319 -
src/openmolar/qt-designer/payments.ui | 419 --
src/openmolar/qt-designer/permissions.ui | 88 -
src/openmolar/qt-designer/quick_daylist_print.ui | 105 -
src/openmolar/qt-designer/record_tools.ui | 1053 ---
src/openmolar/qt-designer/saveMemo.ui | 152 -
src/openmolar/qt-designer/select_patient.ui | 73 -
src/openmolar/qt-designer/showMemo.ui | 107 -
src/openmolar/qt-designer/specify_appointment.ui | 420 --
src/openmolar/qt-designer/staff_diary.ui | 212 -
src/openmolar/qt-designer/startscreen.ui | 301 -
src/openmolar/qt-designer/surgeryNumber.ui | 135 -
src/openmolar/qt-designer/toothPerioProps.ui | 330 -
src/openmolar/qt-designer/toothProps.ui | 548 --
src/openmolar/qt-designer/toothprops_full_edit.ui | 143 -
src/openmolar/qt-designer/treatmentItemWidget.ui | 56 -
.../qt4gui/appointment_gui_modules/list_models.py | 8 +-
.../appointment_gui_modules/pt_diary_treemodel.py | 2 +
src/openmolar/qt4gui/charts/charts_gui.py | 62 +-
.../qt4gui/compiled_uis/Ui_apptOpenDay.py | 219 -
src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py | 98 -
.../qt4gui/compiled_uis/Ui_block_wizard.py | 162 -
.../qt4gui/compiled_uis/Ui_bridge_denture.py | 164 -
.../qt4gui/compiled_uis/Ui_completionDate.py | 104 -
src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py | 90 -
src/openmolar/qt4gui/compiled_uis/Ui_initialise.py | 637 --
src/openmolar/qt4gui/compiled_uis/Ui_main.py | 377 +-
src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py | 64 -
src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py | 408 --
.../qt4gui/compiled_uis/Ui_patient_finder.py | 6 +-
.../qt4gui/compiled_uis/Ui_permissions.py | 70 -
.../qt4gui/compiled_uis/Ui_record_tools.py | 362 +-
.../qt4gui/compiled_uis/Ui_select_patient.py | 66 -
.../qt4gui/compiled_uis/Ui_startscreen.py | 186 -
.../qt4gui/compiled_uis/Ui_toothPerioProps.py | 183 -
.../qt4gui/customwidgets/appointmentwidget.py | 2 +-
src/openmolar/qt4gui/customwidgets/aptOVcontrol.py | 92 +-
src/openmolar/qt4gui/customwidgets/calendars.py | 172 +-
.../qt4gui/customwidgets/dent_hyg_selector.py | 65 +-
.../qt4gui/customwidgets/estimate_item_widget.py | 51 +-
.../qt4gui/customwidgets/estimate_widget.py | 65 +-
.../qt4gui/customwidgets/fiveminutetimeedit.py | 15 +-
.../qt4gui/customwidgets/perioChartWidget.py | 247 -
src/openmolar/qt4gui/customwidgets/toothProps.py | 43 +-
.../qt4gui/customwidgets/upper_case_line_edit.py | 5 +-
.../qt4gui/customwidgets/warning_label.py | 46 +-
src/openmolar/qt4gui/dialogs/__init__.py | 54 -
.../qt4gui/dialogs/add_clinician_dialog.py | 206 +
src/openmolar/qt4gui/dialogs/add_user_dialog.py | 100 +
.../dialogs/advanced_record_management_dialog.py | 290 +
src/openmolar/qt4gui/dialogs/alterAday.py | 4 +-
.../qt4gui/dialogs/alter_cashbook_dialog.py | 9 +-
.../qt4gui/dialogs/alter_denture_dialog.py | 9 +-
.../dialogs/appointments_insert_blocks_dialog.py | 252 +
.../qt4gui/dialogs/appointments_memo_dialog.py | 155 +
src/openmolar/qt4gui/dialogs/apptOpenDay.py | 235 -
src/openmolar/qt4gui/dialogs/base_dialogs.py | 44 +-
src/openmolar/qt4gui/dialogs/block_wizard.py | 137 -
src/openmolar/qt4gui/dialogs/blockslot.py | 20 +-
src/openmolar/qt4gui/dialogs/bridge_denture.py | 161 -
.../qt4gui/dialogs/close_course_dialog.py | 103 +
.../qt4gui/dialogs/complete_treatment_dialog.py | 2 -
.../qt4gui/dialogs/course_consistency_dialog.py | 107 +
src/openmolar/qt4gui/dialogs/course_edit_dialog.py | 143 +
.../course_history_options_dialog.py} | 76 +-
.../qt4gui/dialogs/course_merge_dialog.py | 180 +
.../qt4gui/dialogs/daybook_edit_dialog.py | 1 +
src/openmolar/qt4gui/dialogs/denture_dialog.py | 2 +-
.../dialogs/{__init__.py => dialog_collection.py} | 36 +-
.../qt4gui/dialogs/duplicate_receipt_dialog.py | 10 +-
.../qt4gui/dialogs/edit_practice_dialog.py | 116 +
.../qt4gui/dialogs/edit_referral_centres_dialog.py | 305 +
.../qt4gui/dialogs/edit_treatment_dialog.py | 141 +
.../qt4gui/dialogs/estimate_edit_dialog.py | 135 +
src/openmolar/qt4gui/dialogs/exam_wizard.py | 43 +-
.../qt4gui/dialogs/family_manage_dialog.py | 4 +-
.../qt4gui/dialogs/find_patient_dialog.py | 117 +-
src/openmolar/qt4gui/dialogs/first_run_dialog.py | 789 +++
.../qt4gui/dialogs/initial_check_dialog.py | 155 +
src/openmolar/qt4gui/dialogs/login_dialog.py | 307 +
src/openmolar/qt4gui/dialogs/newBPE.py | 21 +-
src/openmolar/qt4gui/dialogs/new_denture_dialog.py | 88 +-
src/openmolar/qt4gui/dialogs/permissions.py | 110 +-
.../{denture_dialog.py => recall_prompt_dialog.py} | 91 +-
.../qt4gui/dialogs/save_discard_cancel.py | 15 +-
src/openmolar/qt4gui/diary_widget.py | 206 +-
src/openmolar/qt4gui/fees/course_module.py | 197 +-
src/openmolar/qt4gui/fees/fees_module.py | 10 +-
src/openmolar/qt4gui/fees/manipulate_plan.py | 101 +-
.../qt4gui/feescale_editor/feescale_editor.py | 79 +-
src/openmolar/qt4gui/maingui.py | 1425 ++--
src/openmolar/qt4gui/new_patient_gui.py | 27 +-
src/openmolar/qt4gui/printing/bulk_mail.py | 4 +-
src/openmolar/qt4gui/printing/gp17/gp17_data.py | 13 +-
src/openmolar/qt4gui/printing/gp17/gp17v1_front.py | 6 +
src/openmolar/qt4gui/printing/mh_print.py | 5 +-
src/openmolar/qt4gui/printing/om_printing.py | 33 +-
src/openmolar/qt4gui/printing/recallprint.py | 190 +-
src/openmolar/qt4gui/pt_diary_widget.py | 7 +-
src/openmolar/qt4gui/schema_updater.py | 319 +-
src/openmolar/qt4gui/tools/__init__.py | 23 -
src/openmolar/qt4gui/tools/apptTools.py | 148 -
src/openmolar/qt4gui/tools/new_setup.py | 457 --
src/openmolar/qt4gui/tools/recordtools.py | 381 --
src/openmolar/resources/demodump.sql | 1306 ----
src/openmolar/resources/referral_data.xml | 136 -
src/openmolar/resources/schema.sql | 1619 +++++
.../schema_upgrades/database_updater_thread.py | 152 +
.../schema_upgrades/formatted_notes1_9.py | 107 -
src/openmolar/schema_upgrades/schema1_0to1_1.py | 138 +-
src/openmolar/schema_upgrades/schema1_1to1_2.py | 157 +-
src/openmolar/schema_upgrades/schema1_2to1_3.py | 121 +-
src/openmolar/schema_upgrades/schema1_3to1_4.py | 239 +-
src/openmolar/schema_upgrades/schema1_4to1_5.py | 154 +-
src/openmolar/schema_upgrades/schema1_5to1_6.py | 176 +-
src/openmolar/schema_upgrades/schema1_6to1_7.py | 321 +-
src/openmolar/schema_upgrades/schema1_7to1_8.py | 127 +-
src/openmolar/schema_upgrades/schema1_8to1_9.py | 180 +-
src/openmolar/schema_upgrades/schema1_9to2_0.py | 106 +-
src/openmolar/schema_upgrades/schema2_0to2_1.py | 144 +-
src/openmolar/schema_upgrades/schema2_1to2_2.py | 265 +-
src/openmolar/schema_upgrades/schema2_2to2_3.py | 172 +-
src/openmolar/schema_upgrades/schema2_3to2_4.py | 110 +-
src/openmolar/schema_upgrades/schema2_4to2_5.py | 132 +
src/openmolar/schema_upgrades/schema2_5to2_6.py | 91 +
src/openmolar/schema_upgrades/schema2_6to2_7.py | 166 +
src/openmolar/schema_upgrades/schema2_7to2_8.py | 320 +
src/openmolar/schema_upgrades/schema2_8to2_9.py | 92 +
src/openmolar/settings/localsettings.py | 310 +-
src/openmolar/settings/version.py | 34 +-
src/standalone_chart/lib_om_chart/__init__.py | 23 -
src/standalone_chart/lib_om_chart/chart_colours.py | 51 -
src/standalone_chart/lib_om_chart/chart_widget.py | 967 ---
src/standalone_chart/lib_om_chart/config.py | 83 -
src/standalone_chart/lib_om_chart/config_dialog.py | 155 -
src/standalone_chart/lib_om_chart/connect.py | 77 -
src/standalone_chart/lib_om_chart/main_window.py | 421 --
src/standalone_chart/lib_om_chart/patient.py | 131 -
.../lib_om_chart/restorable_app.py | 56 -
src/standalone_chart/om_chart.py | 236 -
src/tests/appt_drag_test.py | 151 -
268 files changed, 16685 insertions(+), 37353 deletions(-)
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index aba5e9f..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-*.pyc
-*~
-builds/*
-dist/*
-MANIFEST
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..82411cf
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,470 @@
+# file GENERATED by distutils, do NOT edit
+INSTALL.txt
+LICENSE
+MANIFEST
+MANIFEST.in
+README
+openmolar
+setup.py
+bin/openmolar.1
+bin/openmolar.desktop
+bin/openmolar.svg
+src/openmolar/__init__.py
+src/openmolar/connect.py
+src/openmolar/create_db.py
+src/openmolar/main.py
+src/openmolar/backports/__init__.py
+src/openmolar/backports/advisor.py
+src/openmolar/backports/ordered_dict.py
+src/openmolar/backports/printed_form.py
+src/openmolar/dbtools/__init__.py
+src/openmolar/dbtools/accounts.py
+src/openmolar/dbtools/appointments.py
+src/openmolar/dbtools/appt_prefs.py
+src/openmolar/dbtools/brief_patient.py
+src/openmolar/dbtools/calldurr.py
+src/openmolar/dbtools/cashbook.py
+src/openmolar/dbtools/courseHistory.py
+src/openmolar/dbtools/day_class.py
+src/openmolar/dbtools/daybook.py
+src/openmolar/dbtools/daybookHistory.py
+src/openmolar/dbtools/db_notes.py
+src/openmolar/dbtools/db_patients.py
+src/openmolar/dbtools/db_settings.py
+src/openmolar/dbtools/distinct_statuses.py
+src/openmolar/dbtools/docsimported.py
+src/openmolar/dbtools/docsprinted.py
+src/openmolar/dbtools/est_logger.py
+src/openmolar/dbtools/estimate_synopsis.py
+src/openmolar/dbtools/estimates.py
+src/openmolar/dbtools/estimatesHistory.py
+src/openmolar/dbtools/families.py
+src/openmolar/dbtools/feescales.py
+src/openmolar/dbtools/forum.py
+src/openmolar/dbtools/memos.py
+src/openmolar/dbtools/nhs_claims.py
+src/openmolar/dbtools/patient_class.py
+src/openmolar/dbtools/patient_write_changes.py
+src/openmolar/dbtools/paymentHistory.py
+src/openmolar/dbtools/phrasebook.py
+src/openmolar/dbtools/plan_data.py
+src/openmolar/dbtools/queries.py
+src/openmolar/dbtools/recall.py
+src/openmolar/dbtools/referral.py
+src/openmolar/dbtools/schema_version.py
+src/openmolar/dbtools/search.py
+src/openmolar/dbtools/treatment_course.py
+src/openmolar/dbtools/updateMH.py
+src/openmolar/dbtools/writeNewCourse.py
+src/openmolar/dbtools/writeNewPatient.py
+src/openmolar/html/index.html
+src/openmolar/html/omstyle.css
+src/openmolar/html/firstrun/firstrun0.png
+src/openmolar/html/firstrun/firstrun1.png
+src/openmolar/html/firstrun/firstrun2.png
+src/openmolar/html/firstrun/firstrun3.png
+src/openmolar/html/firstrun/firstrun5.png
+src/openmolar/html/firstrun/firstrun6.png
+src/openmolar/html/firstrun/firstrun7.png
+src/openmolar/html/firstrun/firstrun8.png
+src/openmolar/html/firstrun/index.html
+src/openmolar/html/images/Screenshot-Patient Finder.png
+src/openmolar/html/images/Screenshot.png
+src/openmolar/html/images/altered_db.png
+src/openmolar/html/images/appointment_diff_dent.png
+src/openmolar/html/images/appt_ov.png
+src/openmolar/html/images/appts.png
+src/openmolar/html/images/complete_tooth_treatment.png
+src/openmolar/html/images/complete_treatment.png
+src/openmolar/html/images/confirm_appt.png
+src/openmolar/html/images/cpitn.png
+src/openmolar/html/images/crown_choice.png
+src/openmolar/html/images/dayllis_printing_wiizard.png
+src/openmolar/html/images/edit_patient_details.png
+src/openmolar/html/images/enter_appointment.png
+src/openmolar/html/images/estimates_plan.png
+src/openmolar/html/images/exam_wizard.png
+src/openmolar/html/images/exit_record.png
+src/openmolar/html/images/feescales.png
+src/openmolar/html/images/find.png
+src/openmolar/html/images/hygenist_wizard.png
+src/openmolar/html/images/letter_review.png
+src/openmolar/html/images/letter_text_entry.png
+src/openmolar/html/images/make_appointment.png
+src/openmolar/html/images/make_appointment_any.png
+src/openmolar/html/images/newPt.png
+src/openmolar/html/images/newlogo.png
+src/openmolar/html/images/notes.png
+src/openmolar/html/images/perio_charts.png
+src/openmolar/html/images/place_appointment.png
+src/openmolar/html/images/plan_treament.png
+src/openmolar/html/images/plan_treatment.png
+src/openmolar/html/images/reception.png
+src/openmolar/html/images/reception_welcome_screen.png
+src/openmolar/html/images/startscreen.png
+src/openmolar/html/images/surgery_welcome.png
+src/openmolar/html/images/toothplan_screen.png
+src/openmolar/html/images/treatment_plan_page.png
+src/openmolar/html/images/whats_changed.png
+src/openmolar/locale/af.po
+src/openmolar/locale/da.po
+src/openmolar/locale/de.po
+src/openmolar/locale/el.po
+src/openmolar/locale/en_AU.po
+src/openmolar/locale/en_GB.po
+src/openmolar/locale/es.po
+src/openmolar/locale/fr.po
+src/openmolar/locale/hu.po
+src/openmolar/locale/id.po
+src/openmolar/locale/it.po
+src/openmolar/locale/messages.pot
+src/openmolar/locale/oc.po
+src/openmolar/locale/pl.po
+src/openmolar/locale/pt.po
+src/openmolar/locale/ro.po
+src/openmolar/locale/sk.po
+src/openmolar/locale/tr.po
+src/openmolar/ptModules/__init__.py
+src/openmolar/ptModules/course_checker.py
+src/openmolar/ptModules/debug_html.py
+src/openmolar/ptModules/dec_perm.py
+src/openmolar/ptModules/estimates.py
+src/openmolar/ptModules/formatted_notes.py
+src/openmolar/ptModules/hidden_notes.py
+src/openmolar/ptModules/nhsDetails.py
+src/openmolar/ptModules/notes.py
+src/openmolar/ptModules/patientDetails.py
+src/openmolar/ptModules/plan.py
+src/openmolar/ptModules/planDetails.py
+src/openmolar/ptModules/reception_summary.py
+src/openmolar/ptModules/standardletter.py
+src/openmolar/ptModules/tooth_history.py
+src/openmolar/qt4gui/__init__.py
+src/openmolar/qt4gui/colours.py
+src/openmolar/qt4gui/contract_gui_module.py
+src/openmolar/qt4gui/diary_widget.py
+src/openmolar/qt4gui/forum_gui_module.py
+src/openmolar/qt4gui/maingui.py
+src/openmolar/qt4gui/new_patient_gui.py
+src/openmolar/qt4gui/pt_diary_widget.py
+src/openmolar/qt4gui/resources_rc.py
+src/openmolar/qt4gui/schema_updater.py
+src/openmolar/qt4gui/appointment_gui_modules/__init__.py
+src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py
+src/openmolar/qt4gui/appointment_gui_modules/draggable_list.py
+src/openmolar/qt4gui/appointment_gui_modules/list_models.py
+src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py
+src/openmolar/qt4gui/charts/__init__.py
+src/openmolar/qt4gui/charts/charts_gui.py
+src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py
+src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py
+src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py
+src/openmolar/qt4gui/compiled_uis/Ui_apptWizard.py
+src/openmolar/qt4gui/compiled_uis/Ui_apptWizardItem.py
+src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py
+src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py
+src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py
+src/openmolar/qt4gui/compiled_uis/Ui_choose_clinicians.py
+src/openmolar/qt4gui/compiled_uis/Ui_choose_language.py
+src/openmolar/qt4gui/compiled_uis/Ui_choose_tooth.py
+src/openmolar/qt4gui/compiled_uis/Ui_codeChecker.py
+src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py
+src/openmolar/qt4gui/compiled_uis/Ui_daylist_print.py
+src/openmolar/qt4gui/compiled_uis/Ui_diary_widget.py
+src/openmolar/qt4gui/compiled_uis/Ui_enter_letter_text.py
+src/openmolar/qt4gui/compiled_uis/Ui_exam_wizard.py
+src/openmolar/qt4gui/compiled_uis/Ui_finalise_appt_time.py
+src/openmolar/qt4gui/compiled_uis/Ui_forumPost.py
+src/openmolar/qt4gui/compiled_uis/Ui_hygenist_wizard.py
+src/openmolar/qt4gui/compiled_uis/Ui_main.py
+src/openmolar/qt4gui/compiled_uis/Ui_medhist.py
+src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py
+src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py
+src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py
+src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py
+src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py
+src/openmolar/qt4gui/compiled_uis/Ui_payments.py
+src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py
+src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py
+src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py
+src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py
+src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py
+src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py
+src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py
+src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py
+src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py
+src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py
+src/openmolar/qt4gui/compiled_uis/__init__.py
+src/openmolar/qt4gui/customwidgets/__init__.py
+src/openmolar/qt4gui/customwidgets/appointment_overviewwidget.py
+src/openmolar/qt4gui/customwidgets/appointmentwidget.py
+src/openmolar/qt4gui/customwidgets/aptOVcontrol.py
+src/openmolar/qt4gui/customwidgets/calendars.py
+src/openmolar/qt4gui/customwidgets/chainLabel.py
+src/openmolar/qt4gui/customwidgets/chartwidget.py
+src/openmolar/qt4gui/customwidgets/confirming_check_box.py
+src/openmolar/qt4gui/customwidgets/currency_label.py
+src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py
+src/openmolar/qt4gui/customwidgets/diary_view_controller.py
+src/openmolar/qt4gui/customwidgets/estimate_item_widget.py
+src/openmolar/qt4gui/customwidgets/estimate_widget.py
+src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
+src/openmolar/qt4gui/customwidgets/money_line_edit.py
+src/openmolar/qt4gui/customwidgets/notification_widget.py
+src/openmolar/qt4gui/customwidgets/perioToothProps.py
+src/openmolar/qt4gui/customwidgets/resources_rc.py
+src/openmolar/qt4gui/customwidgets/schedule_control.py
+src/openmolar/qt4gui/customwidgets/simple_chartwidget.py
+src/openmolar/qt4gui/customwidgets/static_control_panel.py
+src/openmolar/qt4gui/customwidgets/toothProps.py
+src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py
+src/openmolar/qt4gui/customwidgets/warning_label.py
+src/openmolar/qt4gui/dialogs/__init__.py
+src/openmolar/qt4gui/dialogs/account_severity_dialog.py
+src/openmolar/qt4gui/dialogs/add_clinician_dialog.py
+src/openmolar/qt4gui/dialogs/add_treatment_dialog.py
+src/openmolar/qt4gui/dialogs/add_user_dialog.py
+src/openmolar/qt4gui/dialogs/address_match_dialog.py
+src/openmolar/qt4gui/dialogs/advanced_record_management_dialog.py
+src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py
+src/openmolar/qt4gui/dialogs/alterAday.py
+src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py
+src/openmolar/qt4gui/dialogs/alter_denture_dialog.py
+src/openmolar/qt4gui/dialogs/alter_todays_notes.py
+src/openmolar/qt4gui/dialogs/appointment_card_dialog.py
+src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py
+src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py
+src/openmolar/qt4gui/dialogs/appt_mode_dialog.py
+src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py
+src/openmolar/qt4gui/dialogs/appt_wizard_dialog.py
+src/openmolar/qt4gui/dialogs/assistant_select_dialog.py
+src/openmolar/qt4gui/dialogs/auto_address_dialog.py
+src/openmolar/qt4gui/dialogs/base_dialogs.py
+src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py
+src/openmolar/qt4gui/dialogs/blockslot.py
+src/openmolar/qt4gui/dialogs/bridge_dialog.py
+src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py
+src/openmolar/qt4gui/dialogs/child_smile_dialog.py
+src/openmolar/qt4gui/dialogs/choose_clinicians.py
+src/openmolar/qt4gui/dialogs/choose_tooth_dialog.py
+src/openmolar/qt4gui/dialogs/clinician_select_dialog.py
+src/openmolar/qt4gui/dialogs/close_course_dialog.py
+src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py
+src/openmolar/qt4gui/dialogs/course_consistency_dialog.py
+src/openmolar/qt4gui/dialogs/course_edit_dialog.py
+src/openmolar/qt4gui/dialogs/course_history_options_dialog.py
+src/openmolar/qt4gui/dialogs/course_merge_dialog.py
+src/openmolar/qt4gui/dialogs/crown_choice_dialog.py
+src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py
+src/openmolar/qt4gui/dialogs/daybook_item_dialog.py
+src/openmolar/qt4gui/dialogs/denture_dialog.py
+src/openmolar/qt4gui/dialogs/dialog_collection.py
+src/openmolar/qt4gui/dialogs/document_dialog.py
+src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py
+src/openmolar/qt4gui/dialogs/edit_practice_dialog.py
+src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py
+src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py
+src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py
+src/openmolar/qt4gui/dialogs/exam_wizard.py
+src/openmolar/qt4gui/dialogs/family_manage_dialog.py
+src/openmolar/qt4gui/dialogs/finalise_appt_time.py
+src/openmolar/qt4gui/dialogs/find_patient_dialog.py
+src/openmolar/qt4gui/dialogs/first_run_dialog.py
+src/openmolar/qt4gui/dialogs/gp17_printdialog.py
+src/openmolar/qt4gui/dialogs/hygTreatWizard.py
+src/openmolar/qt4gui/dialogs/implant_choice_dialog.py
+src/openmolar/qt4gui/dialogs/initial_check_dialog.py
+src/openmolar/qt4gui/dialogs/login_dialog.py
+src/openmolar/qt4gui/dialogs/med_notes_dialog.py
+src/openmolar/qt4gui/dialogs/newBPE.py
+src/openmolar/qt4gui/dialogs/newCourse.py
+src/openmolar/qt4gui/dialogs/new_bridge_dialog.py
+src/openmolar/qt4gui/dialogs/new_denture_dialog.py
+src/openmolar/qt4gui/dialogs/nhs_forms_config_dialog.py
+src/openmolar/qt4gui/dialogs/payment_dialog.py
+src/openmolar/qt4gui/dialogs/permissions.py
+src/openmolar/qt4gui/dialogs/post_choice_dialog.py
+src/openmolar/qt4gui/dialogs/print_record_dialog.py
+src/openmolar/qt4gui/dialogs/recall_dialog.py
+src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py
+src/openmolar/qt4gui/dialogs/saveMemo.py
+src/openmolar/qt4gui/dialogs/save_discard_cancel.py
+src/openmolar/qt4gui/dialogs/select_language.py
+src/openmolar/qt4gui/dialogs/toothprop_fulledit.py
+src/openmolar/qt4gui/fees/__init__.py
+src/openmolar/qt4gui/fees/cashbook_module.py
+src/openmolar/qt4gui/fees/course_module.py
+src/openmolar/qt4gui/fees/daybook_module.py
+src/openmolar/qt4gui/fees/fee_table_model.py
+src/openmolar/qt4gui/fees/fees_module.py
+src/openmolar/qt4gui/fees/feescale_tester.py
+src/openmolar/qt4gui/fees/manipulate_plan.py
+src/openmolar/qt4gui/fees/treatment_list_models.py
+src/openmolar/qt4gui/feescale_editor/__init__.py
+src/openmolar/qt4gui/feescale_editor/feescale_choice_dialog.py
+src/openmolar/qt4gui/feescale_editor/feescale_compare_items_dockwidget.py
+src/openmolar/qt4gui/feescale_editor/feescale_diff_dialog.py
+src/openmolar/qt4gui/feescale_editor/feescale_editor.py
+src/openmolar/qt4gui/feescale_editor/feescale_input_dialogs.py
+src/openmolar/qt4gui/feescale_editor/feescale_list_model.py
+src/openmolar/qt4gui/feescale_editor/feescale_parser.py
+src/openmolar/qt4gui/feescale_editor/feescale_xml_editor.py
+src/openmolar/qt4gui/phrasebook/__init__.py
+src/openmolar/qt4gui/phrasebook/phrasebook_dialog.py
+src/openmolar/qt4gui/phrasebook/phrasebook_editor.py
+src/openmolar/qt4gui/phrasebook/phrasebook_model.py
+src/openmolar/qt4gui/printing/__init__.py
+src/openmolar/qt4gui/printing/accountPrint.py
+src/openmolar/qt4gui/printing/apptcardPrint.py
+src/openmolar/qt4gui/printing/bookprint.py
+src/openmolar/qt4gui/printing/bulk_mail.py
+src/openmolar/qt4gui/printing/chartPrint.py
+src/openmolar/qt4gui/printing/daylistprint.py
+src/openmolar/qt4gui/printing/estimatePrint.py
+src/openmolar/qt4gui/printing/letterprint.py
+src/openmolar/qt4gui/printing/mh_print.py
+src/openmolar/qt4gui/printing/multiDayListPrint.py
+src/openmolar/qt4gui/printing/om_printing.py
+src/openmolar/qt4gui/printing/recallprint.py
+src/openmolar/qt4gui/printing/receiptPrint.py
+src/openmolar/qt4gui/printing/gp17/__init__.py
+src/openmolar/qt4gui/printing/gp17/gp17_back.py
+src/openmolar/qt4gui/printing/gp17/gp17_config.py
+src/openmolar/qt4gui/printing/gp17/gp17_data.py
+src/openmolar/qt4gui/printing/gp17/gp17_front.py
+src/openmolar/qt4gui/printing/gp17/gp17_printer.py
+src/openmolar/qt4gui/printing/gp17/gp17v1_back.py
+src/openmolar/qt4gui/printing/gp17/gp17v1_front.py
+src/openmolar/resources/appointment_shortcuts.xml
+src/openmolar/resources/appt_ov.png
+src/openmolar/resources/hdp.png
+src/openmolar/resources/hdp_small.png
+src/openmolar/resources/logo.png
+src/openmolar/resources/logo1.png
+src/openmolar/resources/newlogo.png
+src/openmolar/resources/newlogo_launchpadSize.png
+src/openmolar/resources/nhs_scot.png
+src/openmolar/resources/openmolar.svg
+src/openmolar/resources/private.png
+src/openmolar/resources/resources.qrc
+src/openmolar/resources/schema.sql
+src/openmolar/resources/style.css
+src/openmolar/resources/feescales/example_feescale.xml
+src/openmolar/resources/feescales/feescale_schema.xsd
+src/openmolar/resources/gp17/back.jpg
+src/openmolar/resources/gp17/front.jpg
+src/openmolar/resources/gp17-1/back.png
+src/openmolar/resources/gp17-1/front.png
+src/openmolar/resources/icons/Speaker_Icon.svg
+src/openmolar/resources/icons/action.png
+src/openmolar/resources/icons/add_user.png
+src/openmolar/resources/icons/agt_back.png
+src/openmolar/resources/icons/agt_family.png
+src/openmolar/resources/icons/agt_forward.png
+src/openmolar/resources/icons/agt_home.png
+src/openmolar/resources/icons/agt_reload.png
+src/openmolar/resources/icons/alert.png
+src/openmolar/resources/icons/back.png
+src/openmolar/resources/icons/button_ok.png
+src/openmolar/resources/icons/chain-broken.png
+src/openmolar/resources/icons/chain.png
+src/openmolar/resources/icons/contract.svg
+src/openmolar/resources/icons/database.png
+src/openmolar/resources/icons/down.png
+src/openmolar/resources/icons/eraser.png
+src/openmolar/resources/icons/exit.png
+src/openmolar/resources/icons/expand.svg
+src/openmolar/resources/icons/gohome.png
+src/openmolar/resources/icons/home.png
+src/openmolar/resources/icons/kaddressbook.png
+src/openmolar/resources/icons/karm.png
+src/openmolar/resources/icons/kdmconfig.png
+src/openmolar/resources/icons/kfm.png
+src/openmolar/resources/icons/kfm_home.png
+src/openmolar/resources/icons/logo.png
+src/openmolar/resources/icons/lower_implant.svg
+src/openmolar/resources/icons/mail_new.png
+src/openmolar/resources/icons/memos.png
+src/openmolar/resources/icons/month.png
+src/openmolar/resources/icons/number1.png
+src/openmolar/resources/icons/pencil.png
+src/openmolar/resources/icons/pin.png
+src/openmolar/resources/icons/ps.png
+src/openmolar/resources/icons/save_all.png
+src/openmolar/resources/icons/schedule.png
+src/openmolar/resources/icons/schedule_active.png
+src/openmolar/resources/icons/search.png
+src/openmolar/resources/icons/separate.png
+src/openmolar/resources/icons/txt.png
+src/openmolar/resources/icons/upper_implant.svg
+src/openmolar/resources/icons/vcalendar.png
+src/openmolar/resources/icons/vcard.png
+src/openmolar/resources/icons/warning.png
+src/openmolar/resources/icons/widelogo.png
+src/openmolar/resources/icons/wikipedia.png
+src/openmolar/resources/phrasebook/phrasebook.xsd
+src/openmolar/resources/teeth/ll1.png
+src/openmolar/resources/teeth/ll2.png
+src/openmolar/resources/teeth/ll3.png
+src/openmolar/resources/teeth/ll4.png
+src/openmolar/resources/teeth/ll5.png
+src/openmolar/resources/teeth/ll6.png
+src/openmolar/resources/teeth/ll7.png
+src/openmolar/resources/teeth/ll8.png
+src/openmolar/resources/teeth/lr1.png
+src/openmolar/resources/teeth/lr2.png
+src/openmolar/resources/teeth/lr3.png
+src/openmolar/resources/teeth/lr4.png
+src/openmolar/resources/teeth/lr5.png
+src/openmolar/resources/teeth/lr6.png
+src/openmolar/resources/teeth/lr7.png
+src/openmolar/resources/teeth/lr8.png
+src/openmolar/resources/teeth/ul1.png
+src/openmolar/resources/teeth/ul2.png
+src/openmolar/resources/teeth/ul3.png
+src/openmolar/resources/teeth/ul4.png
+src/openmolar/resources/teeth/ul5.png
+src/openmolar/resources/teeth/ul6.png
+src/openmolar/resources/teeth/ul7.png
+src/openmolar/resources/teeth/ul8.png
+src/openmolar/resources/teeth/ur1.png
+src/openmolar/resources/teeth/ur2.png
+src/openmolar/resources/teeth/ur3.png
+src/openmolar/resources/teeth/ur4.png
+src/openmolar/resources/teeth/ur5.png
+src/openmolar/resources/teeth/ur6.png
+src/openmolar/resources/teeth/ur7.png
+src/openmolar/resources/teeth/ur8.png
+src/openmolar/resources/user_manual/index.html
+src/openmolar/resources/user_manual/styles.css
+src/openmolar/resources/user_manual/treatment-planning.html
+src/openmolar/schema_upgrades/__init__.py
+src/openmolar/schema_upgrades/database_updater_thread.py
+src/openmolar/schema_upgrades/schema1_0to1_1.py
+src/openmolar/schema_upgrades/schema1_1to1_2.py
+src/openmolar/schema_upgrades/schema1_2to1_3.py
+src/openmolar/schema_upgrades/schema1_3to1_4.py
+src/openmolar/schema_upgrades/schema1_4to1_5.py
+src/openmolar/schema_upgrades/schema1_5to1_6.py
+src/openmolar/schema_upgrades/schema1_6to1_7.py
+src/openmolar/schema_upgrades/schema1_7to1_8.py
+src/openmolar/schema_upgrades/schema1_8to1_9.py
+src/openmolar/schema_upgrades/schema1_9to2_0.py
+src/openmolar/schema_upgrades/schema2_0to2_1.py
+src/openmolar/schema_upgrades/schema2_1to2_2.py
+src/openmolar/schema_upgrades/schema2_2to2_3.py
+src/openmolar/schema_upgrades/schema2_3to2_4.py
+src/openmolar/schema_upgrades/schema2_4to2_5.py
+src/openmolar/schema_upgrades/schema2_5to2_6.py
+src/openmolar/schema_upgrades/schema2_6to2_7.py
+src/openmolar/schema_upgrades/schema2_7to2_8.py
+src/openmolar/schema_upgrades/schema2_8to2_9.py
+src/openmolar/settings/__init__.py
+src/openmolar/settings/allowed.py
+src/openmolar/settings/appointment_shortcuts.py
+src/openmolar/settings/fee_tables.py
+src/openmolar/settings/images.py
+src/openmolar/settings/localsettings.py
+src/openmolar/settings/urls.py
+src/openmolar/settings/utilities.py
+src/openmolar/settings/version.py
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..0bb11b9
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,10 @@
+Metadata-Version: 1.0
+Name: openmolar
+Version: 0.6.0
+Summary: Open Source Dental Practice Management Software
+Home-page: https://www.openmolar.com
+Author: Neil Wallace
+Author-email: neil at openmolar.com
+License: GPL v3
+Description: UNKNOWN
+Platform: UNKNOWN
diff --git a/README.md b/README.md
deleted file mode 100644
index 84379c5..0000000
--- a/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-openmolar1
-==========
-
-Dental Practice Management Software.
-
-see www.openmolar.com for description
diff --git a/TODO.txt b/TODO.txt
deleted file mode 100644
index 4570074..0000000
--- a/TODO.txt
+++ /dev/null
@@ -1,126 +0,0 @@
-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,
- 1st in arch, partial dentures(n teeth)
- tidy up addition from feescale.
- much of this work will be on the database itself,
- but the codebase will also need tweaking
-
- estimates.recalculate_estimate needs to be rewritten
- undoing multiple identical items is problematic (hence the
- "just checking" placeholder currently in use.)
-
-0.4.09
- as a result of 0.4.08 - the deepcopying of the patient class finally
- bit me in the bum (deepcopy does not work with compiled regexes.)
- this version is radically more efficient in the way a snapshot is taken.
- BUGFIX - when completing chart tx by double clicking on the plan chart the
- treatment lineEntry box is updated.
-
-0.4.08
- new feescale logic. An attempt to tighten up on NHS regulations.
-
-0.4.07
- print new gp17-1 for courses started after 1st July 2013
-
-0.4.06
- pt refund addeed to payment dialog functionality
-
-0.4.05
- ordereddict backports method fix (phrasebook was out of order!)
-
-0.4.04
- GP17 date issue fixed
-
-0.4.03
- GP17 form
- printing badly from some stations.
-
-
-0.4.02
- BUGFIXES.
- FindPatientDialog throwing an exception when called via diary widget
- pt_diary update is unnecessary (and fails) if no patient is loaded
- fixed print dialog parent when printing gp17
-
- NEW FUNCTIONALITY
- when synching addresses, it is not always obvious which is the best one
- NHS form printing - should now always raise print dialog to
- allow printer choice.
- Phrasebook - allow subheadings and spacers
- opalite cr recognition by feescales - ordered dict issue??
-
-0.4.0
- reception front page better html
- Tidied up recall bulk mail
-
-0.3.9
- NEW FUNCTIONALITY
- Ability to print out a personalised MH form from record card
-
- UNDECIDED (not yet implemented
- Ability to print out a personalised MH form for all patients
- attending today. Suggest alphabetical order?
-
-0.3.8
- NEW FUNCTIONALITY
- MRS or MISS when entering patient details should toggle sex
- Alert the user (not just via terminal) if a feescale doesnt parse!
- Add a patient to a known family set.
- Allow easy change of address to the stored value
- (not just for new patients)
-
-0.3.7
- NEW FUNCTIONALITY
- allow modification of todays cashbook entries
- (+ more advanced edits for supervisors)
-
-
-0.3.6
- BUGS FIXED
- hidden notes is not working when user deletes (
- as opposed to uncompletes using the check box) treatments.
-
- dialog that pops up for multiple items on the estimate will now
- self close if it is no longer required (prevents an index error)
-
-0.3.5 (bzr 810)
- BUGS FIXED
- possible to create 2 open course on one day.
- this can be fixed with SQL, however, the client needs to give
- appropriate messages.
-
- advanced record tools fails to parse hidden notes.
-
-
-0.3.4 (bzr 807)
- BUGS FIXED.
- save new patient -> "patient already loaded"
-
- pt diary not collapsing past appointments
-
-0.3.3 (bzr 805)
- BUG FIXES.
- patient records do not "reload" when clicking on current patient
- in the appointment book, hence save dialog comes up.
- (fixed with 801)
-
- bulk mailer needs to use appt_prefs!
- fixed with 802
-
- recall changes when doing an exam should inform the user more.
- done with 805
-
-
-
-0.3.2 BUG FIXES.
- entering notes mode of diary doesnt show notes widget
- fixed with 799
- diary widget "advise" function is a problem on older Qts (lucid)
- fixed with 799
- user not informed if recall is set to "do not recall"
- fixed with 799
diff --git a/bin/openmolar.1 b/bin/openmolar.1
index b6b2035..ff1de28 100644
--- a/bin/openmolar.1
+++ b/bin/openmolar.1
@@ -1,12 +1,22 @@
-.TH OPENMOLAR "1" "March 2014" "OpenMolar 0.5.0" "User Commands"
+.\" Manpage for openmolar.
+.\" Contact neil at openmolar.com to correct errors or typos.
+.TH OPENMOLAR "1" "June 2014" "OpenMolar 0.5.6" "User Commands"
.SH NAME
OpenMolar \- dental practice management software.
.SH DESCRIPTION
dental practice management software.
+.SH SYNOPSIS
+openmolar [-v -q --firstrun --version --help]
.SH OPTIONS
.TP
+\fB\-q\fR
+quiet (minimal logging to console)
+.TP
+\fB\-v\fR
+verbose logging to console (for debugging)
+.TP
\fB\-\-help\fR
-show this text
+show command line options
.TP
\fB\-\-firstrun\fR
offer the firstrun config and demodatabase generation
@@ -16,3 +26,11 @@ takes you to the admin page
.TP
\fB\-\-version\fR
show the versioning and exit
+.TP
+\fB\-\-no\-dev\-login\fR
+Ignore dev login (advanced)
+.TP
+\fB\-\-ignore\-schema\-check\fR
+proceed even if client and database versions clash (NOT ADVISABLE!)
+.SH AUTHOR
+Neil Wallace (neil at openmolar.com)
diff --git a/build_scripts/Makefile b/build_scripts/Makefile
deleted file mode 100755
index 08286c6..0000000
--- a/build_scripts/Makefile
+++ /dev/null
@@ -1,118 +0,0 @@
-define USEAGE
-This is the build script for openmolar tarballs.
-
-USAGE
- make [options] target
-
-TARGETS
- version
- git_tag
- tarball
-
-EXAMPLES
- 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
-
-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)/
-BUILDS_DIR=$(HEAD)builds/
-
-DIST_DIR=$(HEAD)dist/
-
-#VERSION=`git describe | sed s/v//`
-VERSION=`python $(HEAD)setup.py --version`
-
-ifeq ($(NEW_VERSION), )
- NEW_VERSION=$(VERSION)
-endif
-
-ifeq ($(FORCE), true)
- FORCE_TAG=-f
-endif
-
-
-TARBALL = $(PACKAGE)-$(VERSION).tar.gz
-
-TMP_DIR=$(HEAD)tmp/
-
-.phony:
- make help
-
-help:
- @echo "$$USEAGE"
-
-examples:
- @echo "$$EXAMPLES"
-
-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 $(BUILDS_DIR)
- echo "moving tarball to $(BUILDS_DIR)"
- cp -av $(DIST_DIR)$(TARBALL) $(BUILDS_DIR);
- @echo "tarball is located $(BUILDS_DIR)$(TARBALL)"
-
- @if [ -e "$(BUILDS_DIR)$(TARBALL)" ]; then echo "SUCCESS!"; fi
-
-sign_tarball:
- cd $(BUILDS_DIR) ;\
- gpg --armor --sign --detach-sig -u rowinggolfer at googlemail.com $(TARBALL) ;\
- md5sum $(TARBALL) | sed "s/ .*//" > $(PACKAGE)-$(VERSION)_md5.txt
-
-
diff --git a/build_scripts/code_cleaner.py b/build_scripts/code_cleaner.py
deleted file mode 100755
index cfd1933..0000000
--- a/build_scripts/code_cleaner.py
+++ /dev/null
@@ -1,228 +0,0 @@
-#! /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/get_git_branch.py b/build_scripts/get_git_branch.py
deleted file mode 100755
index 8422e28..0000000
--- a/build_scripts/get_git_branch.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#! /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
- 'get_git_branch.py main' to return path to the maingui.py file
- 'get_git_branch.py module' to return the path which contains the openmolar modules"
-'''
-import git
-import os
-import sys
-
-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)
-
-try:
- repo = git.Repo(file_path)
-except git.InvalidGitRepositoryError:
- sys.exit(1)
-
-module_path = os.path.join(repo.working_dir, "src")
-main_path = os.path.join(module_path, "openmolar", "qt4gui", "maingui.py")
-
-if "help" in sys.argv or "--help" in sys.argv:
- print (__doc__)
-elif "module" in sys.argv:
- print (module_path)
-elif "main" in sys.argv:
- print (main_path)
-else:
- print (repo.working_dir)
-
-if __name__ == "__main__":
- sys.exit(0)
diff --git a/build_scripts/om_pyuic4.py b/build_scripts/om_pyuic4.py
deleted file mode 100755
index f007b58..0000000
--- a/build_scripts/om_pyuic4.py
+++ /dev/null
@@ -1,160 +0,0 @@
-#! /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
-pygettext style translations
-'''
-
-import git
-import logging
-import re
-import os
-import sys
-
-from PyQt4 import uic
-
-logging.basicConfig(level=logging.INFO)
-
-logger = logging.getLogger("om_pyuic4")
-
-# can be switched off so generated files are not executable
-MAKE_EX = True
-
-# change the commented line if you want all redone!!
-CHANGED_ONLY = True
-if "ALL" in sys.argv:
- CHANGED_ONLY = False
-
-REMOVALS = [
- '''try:
- _encoding = QtGui.QApplication.UnicodeUTF8
- def _translate(context, text, disambig):
- return QtGui.QApplication.translate(context, text, disambig, _encoding)
-except AttributeError:
- def _translate(context, text, disambig):
- return QtGui.QApplication.translate(context, text, disambig)
-'''
-]
-
-REPLACEMENT1 = (
- "import resources_rc",
- "from openmolar.qt4gui import resources_rc"
-)
-
-REPLACEMENT2 = (
- '''if __name__ == "__main__":
-''',
- '''if __name__ == "__main__":
- import gettext
- gettext.install("openmolar")
-''')
-
-
-def translate_middle(match):
- 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")
- pyfile = os.path.join(outdir, outname)
-
- 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?
- pass
- finally:
- f.close()
-
- f = open(pyfile, "r")
- data = f.read()
- f.close()
-
- newdata = data
- for removal in REMOVALS:
- newdata = newdata.replace(removal, "")
-
- newdata = re.sub('_translate\(".*?", (".*?"), None\)', translate_middle,
- newdata, 0, re.DOTALL)
-
- orig, new = REPLACEMENT1
- newdata = newdata.replace(orig, new)
-
- if MAKE_EX:
- orig, new = REPLACEMENT2
- newdata = newdata.replace(orig, new)
-
- # some hacks for 4.5/4.6 compatibility
- # newdata = newdata.replace('setShowSortIndicator',"setSortIndicatorShown")
-
- if newdata != data:
- f = open(pyfile, "w")
- f.write(newdata)
- f.close()
- else:
- logger.warning("om_pyuic made no changes to the standard uic output!")
-
- return pyfile
-
-
-def get_changed_ui_files(repo):
- files = repo.git.status("--porcelain")
- for file_ in files.split("\n"):
- 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):
- yield ui_file
-
-if __name__ == "__main__":
- repo = git.Repo(os.getcwd())
-
- uipath = os.path.join(repo.working_dir, "src", "openmolar", "qt-designer")
-
- outpath = os.path.join(
- repo.working_dir, "src", "openmolar", "qt4gui", "compiled_uis")
-
- if CHANGED_ONLY:
- logger.info("using only ui files modified since last commit")
- ui_files = get_changed_ui_files(repo)
- else:
- logger.info("converting all ui files")
- ui_files = get_all_ui_files(uipath)
-
- for ui_file in ui_files:
- path = os.path.join(uipath, os.path.basename(ui_file))
- pyfile = compile_ui(path, outpath)
- if pyfile:
- print "created/updated py file", pyfile
-
- logger.info("ALL DONE!")
diff --git a/setup.py b/setup.py
index 1232ac2..fe98557 100755
--- a/setup.py
+++ b/setup.py
@@ -147,7 +147,6 @@ setup(
'openmolar.qt4gui.phrasebook',
'openmolar.qt4gui.printing',
'openmolar.qt4gui.printing.gp17',
- 'openmolar.qt4gui.tools',
'openmolar.settings',
'openmolar.ptModules'],
package_data={'openmolar': ['resources/icons/*.*',
diff --git a/src/openmolar/GPLv3.txt b/src/openmolar/GPLv3.txt
deleted file mode 100644
index 94a9ed0..0000000
--- a/src/openmolar/GPLv3.txt
+++ /dev/null
@@ -1,674 +0,0 @@
- 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 f61f321..9993dbe 100755
--- a/src/openmolar/__init__.py
+++ b/src/openmolar/__init__.py
@@ -45,6 +45,7 @@ if "-q" in sys.argv:
LOGGER.setLevel(logging.WARNING)
elif "-v" in sys.argv:
LOGGER.setLevel(logging.DEBUG)
+ LOGGER.warning("verbose logging called by -v flag in sys.argv")
else:
LOGGER.setLevel(logging.INFO)
diff --git a/src/openmolar/backports/advisor.py b/src/openmolar/backports/advisor.py
new file mode 100644
index 0000000..2245a98
--- /dev/null
+++ b/src/openmolar/backports/advisor.py
@@ -0,0 +1,288 @@
+#! /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
+
+
+class MessagePopup(QtGui.QWidget):
+
+ '''
+ A custom Widget which can be used as a brief non-modal message box.
+ '''
+
+ def __init__(self, message, parent=None):
+ super(MessagePopup, self).__init__(parent)
+ padding = 12
+
+ # create a QTextDocument, which will handle any rich text in our
+ # messages.
+ doc = QtGui.QTextDocument(self)
+ doc.setHtml(message)
+ doc.setDocumentMargin(padding)
+ doc.adjustSize()
+ self.doc = doc
+
+ doc_width, doc_height = doc.size().width(), doc.size().height()
+
+ icon = QtGui.QIcon(":/openmolar.svg")
+ self.pixmap = icon.pixmap(48, 48)
+
+ pic_width, pic_height = self.pixmap.width(), self.pixmap.height()
+
+ self.setBrushes()
+
+ self.setMouseTracking(True)
+
+ width = doc_width + pic_width + padding * 2
+ if width < self.minimumWidth():
+ width = self.minimumWidth()
+
+ height = doc_height
+ if height < pic_height:
+ height = pic_height
+ height += padding * 2
+
+ self.setFixedSize(width, height)
+
+ # values required at painttime.
+ self.rect_f = QtCore.QRectF(0, 0, width, height)
+
+ self.text_rectf = QtCore.QRectF(padding, padding, doc_width,
+ doc_height)
+
+ self.icon_rectf = QtCore.QRectF(padding + doc_width,
+ padding, pic_width, pic_height)
+
+ def setIcon(self, icon):
+ self.pixmap = icon.pixmap(30, 30)
+ self.pixmapRect = QtCore.QRectF(self.pixmap.rect())
+
+ def setBrushes(self, alpha=150):
+ self.fully_visible = alpha == 150
+
+ pal = self.palette()
+
+ col = pal.shadow().color()
+ col.setAlpha(alpha)
+ self.border_brush = QtGui.QBrush(col)
+
+ col = pal.toolTipBase().color()
+ col.setAlpha(alpha)
+ self.back_brush = QtGui.QBrush(col)
+
+ pen_colour = pal.toolTipText().color()
+ pen_colour.setAlpha(alpha + 50)
+ self.pen = QtGui.QPen(pen_colour)
+
+ def minimumWidth(self):
+ w = 300
+ if self.parent() is not None:
+ if self.parent().width() > w * 4:
+ w = self.parent().width() / 4
+ return w
+
+ def toggleMouseEvents(self, off=True):
+ self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents, off)
+
+ def mouseMoveEvent(self, event):
+ self.update()
+
+ def mousePressEvent(self, event):
+ self.toggleMouseEvents()
+
+ def leaveEvent(self, *args):
+ # gets called after toggleMouseEvents :(
+ self.update()
+
+ def leaveEvent_(self, *args):
+ '''
+ widget won't be mouse aware for leaveEvent..
+ so this has to be called by parent
+ '''
+ self.toggleMouseEvents(False)
+ self.update()
+
+ def paintEvent(self, event):
+ cursor_pos = self.mapFromGlobal(self.cursor().pos())
+ if self.rect().contains(cursor_pos):
+ self.setBrushes(40)
+ else:
+ self.setBrushes()
+
+ painter = QtGui.QPainter(self)
+
+ rect_f = self.rect_f.adjusted(0, 0, -1, -1)
+ # above line allows for pen width
+
+ painter.setPen(QtGui.QPen(self.border_brush, 1))
+ painter.setBrush(self.border_brush)
+ painter.drawRoundedRect(rect_f, 15, 15)
+
+ rect_f = rect_f.adjusted(5, 5, -5, -5)
+ painter.setPen(QtGui.QPen(self.back_brush, 1))
+ painter.setBrush(self.back_brush)
+ painter.drawRoundedRect(rect_f, 15, 15)
+
+ painter.drawPixmap(self.icon_rectf, self.pixmap,
+ QtCore.QRectF(self.pixmap.rect()))
+
+ painter.setPen(self.pen)
+
+ # a hack because documentLayout.drawText method is sluggish
+ # when used with a semi-transparent pen.
+ # faint version will lack italics and bold styles etc.. but isn't
+ # an issue in practice!
+ if self.fully_visible:
+ dl = self.doc.documentLayout()
+ dl.draw(painter, dl.PaintContext())
+ else:
+ option = QtGui.QTextOption()
+ option.setWrapMode(option.WrapAnywhere)
+ painter.drawText(self.text_rectf, self.doc.toPlainText(), option)
+
+
+class Advisor(QtGui.QWidget):
+
+ '''
+ provides various notifications to the user
+ '''
+
+ def __init__(self, parent=None):
+ '''
+ Advisor.__init__(self, parent=None)
+ '''
+ QtGui.QWidget.__init__(self, parent)
+ self.brief_messages = []
+ self.briefMessagePosition = QtCore.QPoint(10, 10)
+
+ self.brief_message_box = None
+ self.single_shot = QtCore.QTimer(self)
+ self.single_shot.setSingleShot(True)
+ self.single_shot.timeout.connect(self.hide_brief_message)
+
+ self.right_to_left = False
+
+ def setBriefMessagePosition(self, point, right_to_left=False):
+ '''
+ set the position the brief message label will appear
+ arg is QtCore.QPoint,
+ if right_to_left is true, then this point is the top right of the box.
+ '''
+ self.briefMessagePosition = point
+ self.right_to_left = right_to_left
+
+ def hide_brief_message(self):
+ if self.brief_message_box:
+ self.brief_message_box.hide()
+ self.brief_message_box.deleteLater()
+ self.brief_message_box = None
+
+ def advise_dl(self, message):
+ '''
+ convenience function which calls advise with a default of 1.
+ useful when connected to a signal
+ '''
+ self.advise(message, 1)
+
+ def advise_err(self, message):
+ '''
+ convenience function which calls advise with a default of 1.
+ useful when connected to a signal
+ '''
+ self.advise(message, 2)
+
+ def advise(self, message, warning_level=0):
+ '''
+ inform the user of events -
+ warning level0 = no interaction popup.
+ warning level 1 advisory, requires user response.
+ warning level 2 warning, and logged in output.
+ '''
+ def show_brief_messages():
+ self.hide_brief_message()
+ full_message = u"<body>"
+ for mess in self.brief_messages:
+ full_message += u"%s <hr />" % mess
+ full_message = full_message.rstrip("<hr />") + "</body>"
+ self.brief_message_box = MessagePopup(full_message, self)
+ self.brief_message_box.right_to_left = self.right_to_left
+ self.brief_message_box.show()
+ self.brief_message_box.raise_()
+ if self.right_to_left:
+ x = (self.briefMessagePosition.x() -
+ self.brief_message_box.width())
+ pos = QtCore.QPoint(x, self.briefMessagePosition.y())
+ else:
+ pos = self.briefMessagePosition
+ self.brief_message_box.move(pos)
+ app = QtGui.QApplication.instance()
+ if app:
+ app.processEvents()
+
+ def hide_brief_message():
+ first_message = self.brief_messages[0]
+ self.brief_messages.remove(first_message)
+ if self.brief_messages == []:
+ self.single_shot.setInterval(2000)
+ self.single_shot.start()
+ else:
+ self.single_shot.stop()
+ show_brief_messages()
+
+ if warning_level == 0:
+ self.brief_messages.append(message)
+ show_brief_messages()
+ QtCore.QTimer.singleShot(7000, hide_brief_message) # 7 seconds
+
+ try:
+ self.statusbar.showMessage(message, 10000)
+ except AttributeError as a:
+ pass
+
+ elif warning_level == 1:
+ QtGui.QMessageBox.information(self, _("Advisory"), message)
+
+ elif warning_level == 2:
+ QtGui.QMessageBox.warning(self, _("Error"), message)
+
+ def wait(self, waiting=True):
+ app = QtGui.QApplication.instance()
+ if waiting:
+ app.setOverrideCursor(QtCore.Qt.WaitCursor)
+ else:
+ app.restoreOverrideCursor()
+
+
+if __name__ == "__main__":
+ import gettext
+ gettext.install("")
+
+ app = QtGui.QApplication([])
+
+ advisor = Advisor()
+ advisor.show()
+ advisor.advise("hello world")
+ advisor.advise("hello world", 1)
+ advisor.advise("hello world", 2)
+ app.exec_()
diff --git a/src/openmolar/connect.py b/src/openmolar/connect.py
index 0b4e4fc..9eed67d 100755
--- a/src/openmolar/connect.py
+++ b/src/openmolar/connect.py
@@ -43,61 +43,84 @@ if __name__ == "__main__":
mainconnection = None
-LOGGER.debug("parsing the global settings file")
-dom = minidom.parse(localsettings.cflocation)
-
-settingsversion = dom.getElementsByTagName("version")[0].firstChild.data
-sysPassword = dom.getElementsByTagName("system_password")[0].firstChild.data
-
-xmlnode = dom.getElementsByTagName("server")[localsettings.chosenserver]
-command_nodes = xmlnode.getElementsByTagName("command")
-for command_node in command_nodes:
- LOGGER.info("commands found in conf file!")
- commands = command_node.getElementsByTagName("str")
- command_list = []
- for command in commands:
- command_list.append(command.firstChild.data)
- if command_list:
- LOGGER.info("executing %s" % str(command_list))
- subprocess.Popen(command_list)
-
-myHost = xmlnode.getElementsByTagName("location")[0].firstChild.data
-myPort = int(xmlnode.getElementsByTagName("port")[0].firstChild.data)
-sslnode = xmlnode.getElementsByTagName("ssl")
-
-xmlnode = dom.getElementsByTagName("database")[localsettings.chosenserver]
-myUser = xmlnode.getElementsByTagName("user")[0].firstChild.data
-myPassword = xmlnode.getElementsByTagName("password")[0].firstChild.data
-if settingsversion == "1.1":
- myPassword = base64.b64decode(myPassword)
-
-myDb = xmlnode.getElementsByTagName("dbname")[0].firstChild.data
-
-
-def database_name():
- 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":
- #-- to enable ssl... add <ssl>True</ssl> to the conf file
- LOGGER.debug("using ssl")
- #-- note, dictionary could have up to 5 params.
- #-- ca, cert, key, capath and cipher
- #-- however, IIUC, just using ca will encrypt the data
- kwargs["ssl_settings"] = {'ca': '/etc/mysql/ca-cert.pem'}
-else:
- LOGGER.warning("not using ssl (you really should!)")
-
-dom.unlink()
+
+class DB_Params(object):
+
+ def __init__(self):
+ self.host = ""
+ self.port = 0
+ self.user = ""
+ self.db_name = ""
+ try:
+ self.reload()
+ except IOError:
+ LOGGER.warning("no such file exists %s", localsettings.cflocation)
+
+ def reload(self):
+ dom = minidom.parse(localsettings.cflocation)
+ settingsversion = dom.getElementsByTagName(
+ "version")[0].firstChild.data
+ xmlnode = dom.getElementsByTagName(
+ "server")[localsettings.chosenserver]
+ command_nodes = xmlnode.getElementsByTagName("command")
+ for command_node in command_nodes:
+ LOGGER.info("commands found in conf file!")
+ commands = command_node.getElementsByTagName("str")
+ command_list = []
+ for command in commands:
+ command_list.append(command.firstChild.data)
+ if command_list:
+ LOGGER.info("executing %s" % str(command_list))
+ subprocess.Popen(command_list)
+
+ self.host = xmlnode.getElementsByTagName("location")[0].firstChild.data
+ self.port = int(
+ xmlnode.getElementsByTagName("port")[0].firstChild.data)
+ sslnode = xmlnode.getElementsByTagName("ssl")
+ self.use_ssl = sslnode and sslnode[0].firstChild.data == "True"
+
+ xmlnode = dom.getElementsByTagName(
+ "database")[localsettings.chosenserver]
+ self.user = xmlnode.getElementsByTagName("user")[0].firstChild.data
+ self.password = xmlnode.getElementsByTagName(
+ "password")[0].firstChild.data
+ if settingsversion == "1.1":
+ self.password = base64.b64decode(self.password)
+
+ self.db_name = xmlnode.getElementsByTagName(
+ "dbname")[0].firstChild.data
+
+ if not self.use_ssl:
+ #-- to enable ssl... add <ssl>True</ssl> to the conf file
+ LOGGER.debug("using ssl")
+ else:
+ LOGGER.warning("not using ssl (you really should!)")
+
+ dom.unlink()
+
+ @property
+ def kwargs(self):
+ kwargs = {
+ "host": self.host,
+ "port": self.port,
+ "user": self.user,
+ "passwd": self.password,
+ "db": self.db_name,
+ "use_unicode": True,
+ "charset": "utf8"
+ }
+ if self.use_ssl:
+ #-- note, dictionary could have up to 5 params.
+ #-- ca, cert, key, capath and cipher
+ #-- however, IIUC, just using ca will encrypt the data
+ kwargs["ssl_settings"] = {'ca': '/etc/mysql/ca-cert.pem'}
+ return kwargs
+
+ @property
+ def database_name(self):
+ return "%s %s:%s" % (self.db_name, self.host, self.port)
+
+params = DB_Params()
GeneralError = MySQLdb.Error
ProgrammingError = MySQLdb.ProgrammingError
@@ -105,49 +128,6 @@ 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
- self.result = False
-
- def __nonzero__(self):
- '''
- used in case the class is used thus
- if omSQLresult:
- '''
- return self.result
-
- def setMessage(self, arg):
- '''
- set the message associated with the result
- '''
- self.message = arg
-
- def getMessage(self):
- '''
- get the message associated with the result
- '''
- return self.message
-
- def setNumber(self, arg):
- '''
- set the number of rows grabbed by the result
- '''
- self.number = arg
-
- def getNumber(self):
- '''
- get the number of rows grabbed by the result
- '''
- return self.number
-
-
def connect():
'''
returns a MySQLdb object, connected to the database specified in the
@@ -159,10 +139,8 @@ def connect():
try:
if not (mainconnection and mainconnection.open):
LOGGER.info("New database connection needed")
- LOGGER.debug(
- "connecting to %s on %s port %s" % (myDb, myHost, myPort))
-
- mainconnection = MySQLdb.connect(**kwargs)
+ LOGGER.debug("connecting to %s", params.database_name)
+ mainconnection = MySQLdb.connect(**params.kwargs)
mainconnection.autocommit(True)
else:
mainconnection.commit()
@@ -178,32 +156,26 @@ def connect():
raise exc
if __name__ == "__main__":
- import time
- from openmolar.settings import localsettings
- localsettings.initiate()
-
- LOGGER.setLevel(logging.DEBUG)
-
LOGGER.debug("using conffile - %s" % localsettings.cflocation)
for i in range(1, 11):
try:
LOGGER.debug("connecting....")
dbc = connect()
- LOGGER.info(dbc.info())
+ LOGGER.info(dbc)
LOGGER.debug('ok... we can make Mysql connections!!')
LOGGER.debug(" loop no %d " % i)
if i == 2:
# 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
- c = dbc.cursor()
- c.execute(
- 'update patients set dob="196912091" where serialno=4')
- c.close()
+ LOGGER.debug(
+ "making a slightly bad query... let's check we get a warning")
+ cursor = dbc.cursor()
+ cursor.execute(
+ 'update new_patients set dob="196912091" where serialno=4')
+ cursor.close()
except Exception as exc:
LOGGER.exception("exception caught?")
-
time.sleep(5)
dbc.close()
diff --git a/src/openmolar/create_db.py b/src/openmolar/create_db.py
new file mode 100644
index 0000000..58311ea
--- /dev/null
+++ b/src/openmolar/create_db.py
@@ -0,0 +1,142 @@
+#! /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 takes the demo dump and creates a database from it with the
+correct user permissions.
+'''
+
+import logging
+import os
+
+import MySQLdb
+from openmolar.settings import localsettings
+
+LOGGER = logging.getLogger("openmolar")
+
+DROP_QUERY = "DROP DATABASE IF EXISTS %s"
+CREATE_QUERY = "CREATE DATABASE %s"
+
+#-- note for production deployments, only grant
+#-- select,insert,update,delete privileges
+PRIVS_QUERY = "GRANT ALL PRIVILEGES ON %s.* TO '%s'@'%s' IDENTIFIED BY '%s'"
+
+
+def exists_already(host_, port_, db_name, privileged_user_pass,
+privileged_user="root"):
+ '''
+ returns true if database 'db_name' exists
+ '''
+ try:
+ db = MySQLdb.connect(host=host_,
+ port=port_,
+ user=privileged_user,
+ passwd=privileged_user_pass,
+ db=db_name
+ )
+ if db.open:
+ db.close()
+ return True
+ except:
+ LOGGER.warning("exists already through error, passing silently")
+ pass
+ return False
+
+def create_database(host_, port_, user_, pass_wd, db_name,
+privileged_user_pass, privileged_user="root"):
+ '''
+ creates a database called "db_name" on host_, port_, passwd,
+ '''
+ try:
+ #-- connect as mysqlroot to create the database
+ db = MySQLdb.connect(host=host_,
+ port=port_,
+ user=privileged_user,
+ passwd=privileged_user_pass
+ )
+
+ cursor = db.cursor()
+ LOGGER.info("deleting any existing openmolar_demo database....")
+ cursor.execute(DROP_QUERY % db_name)
+
+ LOGGER.info("creating database %s", db_name)
+ cursor.execute(CREATE_QUERY % db_name)
+
+ LOGGER.info("setting privileges for '%s'", user_)
+ cursor.execute(PRIVS_QUERY % (db_name, user_, host_, pass_wd))
+ cursor.close()
+ db.commit()
+ db.close()
+ LOGGER.info("db created successfully")
+ return True
+ except:
+ LOGGER.exception("error creating database")
+
+
+def create_tables(host_, port_, user_, pass_wd, db_name):
+ try:
+ wkdir = localsettings.determine_path()
+ f = open(os.path.join(wkdir, "resources", "schema.sql"), "r")
+ sql_statements = f.read()
+ f.close()
+
+ db = MySQLdb.connect(host=host_,
+ port=port_,
+ user=user_,
+ db=db_name,
+ passwd=pass_wd)
+
+ cursor = db.cursor()
+ cursor.execute(sql_statements)
+ cursor.close()
+ db.commit()
+ db.close()
+ return True
+ except:
+ LOGGER.exception("error creating database tables")
+
+if __name__ == "__main__":
+ root_pass = raw_input("please enter your MySQL root users password :")
+ print "exists already", exists_already("localhost",
+ 3306,
+ "openmolar_demo",
+ root_pass
+ )
+
+ if create_database("localhost",
+ 3306,
+ "openmolar",
+ "password",
+ "openmolar_demo",
+ root_pass
+ ):
+ LOGGER.debug("New database created successfully")
+
+ create_tables(
+ "localhost",
+ 3306,
+ "openmolar",
+ "password",
+ "openmolar_demo")
+
diff --git a/src/openmolar/createdemodatabase.py b/src/openmolar/createdemodatabase.py
deleted file mode 100644
index 75aa53e..0000000
--- a/src/openmolar/createdemodatabase.py
+++ /dev/null
@@ -1,87 +0,0 @@
-#! /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 takes the demo dump and creates a database from it with the
-correct user permissions.
-'''
-
-import MySQLdb
-import os
-from openmolar.settings import localsettings
-
-
-def create_database(myhost, myport, myuser, mypassword, databaseName,
- rootMySQLpassword):
- #-- connect as mysqlroot to create the database
-
- db = MySQLdb.connect(
- 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)
- except:
- print "non found... skipping"
- pass
- print "creating database...",
- 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
- cursor.execute(query)
- cursor.close()
- db.commit()
- db.close()
- 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")
- dumpString = f.read()
- f.close()
- print myhost, myport, myuser, databaseName, mypassword
- db = MySQLdb.connect(host=myhost, port=myport,
- user=myuser, db=databaseName, passwd=mypassword)
-
- cursor = db.cursor()
- cursor.execute(dumpString)
- cursor.close()
- db.commit()
- db.close()
- return True
-
-if __name__ == "__main__":
- rootpass = raw_input("please enter your MySQL root users password :")
- if create_database("localhost", 3306, "OMuser", "password",
- "openmolar_demo", rootpass):
- print "New database created sucessfully"
-
- loadTables("localhost", 3306, "OMuser", "password", "openmolar_demo")
diff --git a/src/openmolar/dbtools/accounts.py b/src/openmolar/dbtools/accounts.py
index 3f43597..dd4663b 100644
--- a/src/openmolar/dbtools/accounts.py
+++ b/src/openmolar/dbtools/accounts.py
@@ -29,6 +29,14 @@ module to retrieve a list of patients who owe money
from openmolar.settings import localsettings
from openmolar.connect import connect
+QUERY = '''select dnt1, serialno, cset, fname, sname, dob, memo, pd4,
+billdate, billtype, billct, courseno0,
+(money0 + money1 + money9 + money10 - money2 - money3 - money8) as fees
+from new_patients join patient_money on serialno = patient_money.pt_sno
+join patient_dates on serialno = patient_dates.pt_sno
+where (money0 + money1 + money9 + money10 - money2 - money3 - money8) > 0
+order by pd4 desc'''
+
def details():
'''
@@ -36,16 +44,9 @@ def details():
'''
db = connect()
cursor = db.cursor()
- query = '''select dnt1,serialno ,cset, fname,sname,dob,memo,pd4,billdate,
- billtype,billct,courseno0,
- (money0 + money1 + money9 + money10 - money2 - money3 - money8) as fees
- from patients where
- (money0 + money1 + money9 + money10 - money2 - money3 - money8) > 0
- order by pd4 desc'''
- cursor.execute(query)
+ cursor.execute(QUERY)
rows = cursor.fetchall()
cursor.close()
- # db.close()
return rows
if __name__ == "__main__":
diff --git a/src/openmolar/dbtools/appointments.py b/src/openmolar/dbtools/appointments.py
index 76c1b96..a721bf5 100755
--- a/src/openmolar/dbtools/appointments.py
+++ b/src/openmolar/dbtools/appointments.py
@@ -26,11 +26,21 @@ import datetime
import logging
from openmolar.settings import localsettings
-from openmolar.connect import (connect,
- omSQLresult, ProgrammingError, OperationalError)
+from openmolar.connect import connect, ProgrammingError, OperationalError
LOGGER = logging.getLogger("openmolar")
+INSERT_APPT_QUERY = '''INSERT INTO aslot (adate,apptix,start,end,name,serialno,
+code0,code1,code2,note,flag0,flag1,flag2,flag3)
+VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'''
+
+APPOINTMENTS_QUERY = '''
+SELECT start, end, name, concat(title," ",fname," ",sname),
+new_patients.serialno, concat(code0," ",code1," ",code2),
+note, cset
+FROM new_patients right join aslot on new_patients.serialno=aslot.serialno
+WHERE adate = %s and apptix = %s order by start'''
+
class FreeSlot(object):
@@ -669,67 +679,23 @@ def getLengthySlots(slots, length):
return retlist
-def updateAday(uddate, arg):
+def updateAday(date_, data):
'''
takes an instance of the workingDay class
and updates the database
- returns an omSQLresult
'''
db = connect()
cursor = db.cursor()
- result = omSQLresult()
query = '''insert into aday (memo, adate, apptix, start, end, flag)
values (%s,%s, %s, %s, %s, %s)
on duplicate key
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
-
- result.setNumber(cursor.execute(query, values))
-
- if result:
- db.commit()
- return result
-
-
-def alterDay(arg):
- '''
- takes a DentistDay object tries to change the aday table
- returns an omSQLresult
- '''
- #-- this method is called from the apptOpenDay Dialog, which is deprecated!!
- print "DEPRECATED FUNCTION CALLED alterDay"
- db = connect()
- cursor = db.cursor()
- result = omSQLresult()
- query = 'SELECT flag FROM aday WHERE adate="%s" and apptix=%d' % (
- arg.date, arg.apptix)
-
- if cursor.execute(query):
- #-- dentists diary includes this date
- query = '''update aday set start=%s,end=%s,flag=%s, memo=%s
- where adate=%s and apptix=%s'''
- values = (arg.start, arg.end, arg.flag, arg.memo, arg.date,
- arg.ix)
-
- result.setNumber(cursor.execute(query, values))
+ values = (data.memo, date_, data.apptix, data.sqlStart(), data.sqlFinish(),
+ data.active) * 2
- 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.")
-
- 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),))
-
- return result
+ n_rows = cursor.execute(query, values)
+ return n_rows
def todays_patients(dents):
@@ -880,6 +846,22 @@ def getBankHol(adate):
return retarg
+def getMemos(adate):
+ '''
+ get Memos for one specific date
+ '''
+ db = connect()
+ cursor = db.cursor()
+
+ query = '''SELECT apptix, memo FROM aday WHERE adate=%s'''
+ cursor.execute(query, (adate, ))
+ dict_ = {}
+ for apptix, memo in cursor.fetchall():
+ dict_[apptix] = memo
+ cursor.close()
+ return dict_
+
+
def getGlobalMemo(date):
'''
get global memo for one specific date
@@ -1065,12 +1047,7 @@ def printableDaylistData(adate, dent):
retlist.append(daydata[0][2])
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(APPOINTMENTS_QUERY, values)
results = cursor.fetchall()
@@ -1384,16 +1361,13 @@ code2, note, flag0, flag1, flag2, flag3):
db = connect()
cursor = db.cursor()
- query = '''INSERT INTO aslot (adate,apptix,start,end,name,serialno,
- code0,code1,code2,note,flag0,flag1,flag2,flag3)
- VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'''
values = (make_date, apptix, start, end, name, serialno, code0,
code1, code2, note, flag0, flag1, flag2, flag3)
result = False
try:
- result = cursor.execute(query, values)
+ result = cursor.execute(INSERT_APPT_QUERY, values)
except OperationalError as exc:
LOGGER.exception("couldn't insert into aslot %s %s %s serialno %d" % (
make_date, apptix, start, serialno))
@@ -1631,51 +1605,42 @@ def future_slots(startdate, enddate, dents, override_emergencies=False):
get a list of possible appointment positions
(between startdate and enddate) that can be offered to the patient
'''
- if dents == ():
+ if len(dents) == 0:
return ()
db = connect()
cursor = db.cursor()
- values = [startdate, enddate]
+ values = [startdate, enddate] + list(dents)
- mystr = " and ("
- for dent in dents:
- mystr += "apptix=%s or "
- values.append(dent)
- mystr = mystr[0:mystr.rindex(" or")] + ")"
-
- if override_emergencies:
- emer_sql = ' and name!="emergency" '
- else:
- emer_sql = ""
+ format_dents = ",".join(('%s',) * len(dents)) # %s, %s, %s
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
+ WHERE adate>=%%s AND adate<=%%s AND (flag=1 OR flag= 2) AND apptix in (%s)
+ ORDER BY adate''' % format_dents
cursor.execute(fullquery, values)
-
possible_days = cursor.fetchall()
+ cursor.close()
+ cursor = db.cursor()
+
#--get days when a suitable appointment is possible
- query = ""
+ #--flag0!=72 necessary to avoid zero length apps like pain/double/fam
+
+ query = '''select start, end from aslot
+ where adate = %%s and apptix = %%s and flag0!=72 %s order by start
+ ''' % (' and name!="emergency" ' if override_emergencies else "")
+
slotlist = []
#--now get data for those days so that we can find slots within
for day in possible_days:
adate, apptix, daystart, dayfin = day
values = (adate, apptix)
- query = '''select start, end from aslot
- where adate = %%s and apptix = %%s and flag0!=72 %s order by start
- ''' % emer_sql
- #--flag0!=72 necessary to avoid zero length apps like pain/double/fam
cursor.execute(query, values)
-
results = cursor.fetchall()
- slotlist += slots(
- adate, apptix, daystart, results, dayfin)
+ slotlist += slots(adate, apptix, daystart, results, dayfin)
cursor.close()
- # db.close()
return slotlist
if __name__ == "__main__":
diff --git a/src/openmolar/dbtools/brief_patient.py b/src/openmolar/dbtools/brief_patient.py
index 200da23..9712865 100644
--- a/src/openmolar/dbtools/brief_patient.py
+++ b/src/openmolar/dbtools/brief_patient.py
@@ -32,7 +32,7 @@ from openmolar.dbtools.appt_prefs import ApptPrefs
LOGGER = logging.getLogger("openmolar")
QUERY = '''SELECT title, fname, sname, dob, cset, dnt1, dnt2
-from patients where serialno = %s'''
+from new_patients where serialno = %s'''
class BriefPatient(object):
diff --git a/src/openmolar/dbtools/cashbook.py b/src/openmolar/dbtools/cashbook.py
index 08955d9..4456aa1 100644
--- a/src/openmolar/dbtools/cashbook.py
+++ b/src/openmolar/dbtools/cashbook.py
@@ -72,7 +72,7 @@ class CashBookCodesDict(dict):
rows = cursor.fetchall()
for row in rows:
self[int(row[0])] = row[1]
- LOGGER.debug("cashbook codes loaded sucessfully")
+ LOGGER.debug("cashbook codes loaded successfully")
except Exception as exc:
LOGGER.exception("error loading cashbook codes")
finally:
@@ -185,7 +185,7 @@ def details(dent, startdate, enddate,
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])
+ CODE = localsettings.cashbookCodesDict.get(row[4])
retarg += '<td>%s</td>' % CODE
amt = row[5]
amt_str = localsettings.formatMoney(amt)
@@ -244,12 +244,7 @@ def details(dent, startdate, enddate,
# db.close()
return retarg
-#--initiate the cashbook dictionary on module import
-cashbookCodesDict = CashBookCodesDict()
-
if __name__ == "__main__":
- from PyQt4.QtCore import QDate
-
localsettings.initiate()
- print cashbookCodesDict
- print cashbookCodesDict.viewitems()
+ print localsettings.cashbookCodesDict
+ print localsettings.cashbookCodesDict.viewitems()
diff --git a/src/openmolar/dbtools/courseHistory.py b/src/openmolar/dbtools/courseHistory.py
index 843bf6d..00785f3 100644
--- a/src/openmolar/dbtools/courseHistory.py
+++ b/src/openmolar/dbtools/courseHistory.py
@@ -26,231 +26,224 @@
a module to search for previous course items
'''
+import datetime
+import logging
+
from openmolar.settings import localsettings
from openmolar.connect import connect
-from openmolar.dbtools.treatment_course import CURRTRT_ATTS
+from openmolar.dbtools.treatment_course import TreatmentCourse
from openmolar.dbtools import estimatesHistory
+from openmolar.dbtools import daybook
-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
-
- headers = [("Acceptance Date", self.accd),
- ("Completion Date", self.cmpd)]
+from openmolar.ptModules.course_checker import CourseChecker
- for header in headers:
- 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 != "":
- 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)
- rows.append(cells)
+LOGGER = logging.getLogger("openmolar")
- 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])
- rows.append(cells)
+QUERY = '''SELECT courseno FROM currtrtmt2 WHERE serialno=%s
+ORDER BY courseno desc, accd desc'''
- dentureWork = ""
- for att in ('ndu', 'ndl', 'odu', 'odl'):
- 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)
+ALLOW_EDIT = False
- rows.append(cells)
- showChart = False
- cells = '''<th%s>Chart</th><td>
- <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>"
- for att in uppers:
- 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 += "</tr><tr>"
- for att in lowers:
- work = self.__dict__[att + planned]
- cells += '<td align = "center"%s>%s</td>' % (
- bgcolor, work)
- showChart = showChart or work != ""
-
- cells += "</tr></table></td>"
-
- if showChart:
- rows.append(cells)
-
- row_span = len(rows)
-
- if rows != []:
- 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
- else:
- retarg += "<tr>%s</tr>\n" % row
-
- retarg += '</table>\n'
- return retarg
-
-
-def details(sno):
- '''
- returns an html page showing pt's Treatment History
- '''
+def _get_courses(sno, current_csno):
+ # query allows exclusion of current course.
+ if current_csno is None:
+ query = QUERY
+ values = (sno,)
+ else:
+ query = QUERY.replace("ORDER", " AND courseno!=%s ORDER")
+ values = (sno, current_csno)
db = connect()
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)
-
- else:
- query += field + ","
-
- query = query.strip(",")
-
- cursor.execute('''SELECT %s from currtrtmt2 where serialno = %d
- order by courseno desc''' % (query, sno))
-
+ cursor.execute(query, values)
rows = cursor.fetchall()
cursor.close()
- courses = []
for row in rows:
- course = txCourse(row)
- courses.append(course)
-
- claimNo = len(courses)
- retarg = "<h2>Past Courses of Treatment - %d rows found</h2>" % claimNo
-
- for course in courses:
- retarg += course.toHtml()
- retarg += "<br /><hr /><br />"
- # db.close()
- return retarg
+ yield TreatmentCourse(sno, row[0])
-def all_details(sno):
+def details(sno, current_csno, include_estimates=False, include_daybook=False):
'''
- returns an html page showing pt's Treatment History
+ returns an html page showing pt's Treatment History along with estimates
'''
- db = connect()
- 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)
-
- else:
- query += field + ","
-
- query = query.strip(",")
-
- cursor.execute('''SELECT %s from currtrtmt2 where serialno = %d
- order by courseno desc''' % (query, sno))
-
- rows = cursor.fetchall()
- cursor.close()
-
- courses = []
- for row in rows:
- course = txCourse(row)
- courses.append(course)
-
- claimNo = len(courses)
- 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
- estTableStarted = True
- retarg += est.htmlHeader()
- retarg += est.toHtmlRow()
+ courses = list(_get_courses(sno, current_csno))
+ estimates_list = estimatesHistory.getEsts(sno) if include_estimates else []
+ daybook_list = list(daybook.all_data(sno)) if include_daybook else []
+ daybook_course_guesses = {}
+ displayed_ests = []
+ course_checker_errors = 0
+
+ html = "<body><html><!-- ERRORS --><!-- ORPHANS --><h2>%s - %d %s</h2>" % (
+ _("Past Courses of Treatment"),
+ len(courses),
+ _("found")
+ )
+
+ if current_csno is not None:
+ html += "<strong>%s %s %s</strong><br />" % (
+ _("Ignoring course number"),
+ current_csno,
+ _("as this is active")
+ )
+
+ days_elapsed = None
+
+ for i, course in enumerate(courses):
+ course_html = course.to_html(ALLOW_EDIT, days_elapsed)
+ course_ests = []
+
+ if include_estimates:
+ est_table_init = False
+ for est in estimates_list:
+ if est.courseno == course.courseno:
+ course_ests.append(est)
+ if not est_table_init:
+ header = est.htmlHeader()
+ if estimatesHistory.ALLOW_EDIT:
+ header = header.replace(
+ "<!--editlink-->",
+ estimatesHistory.EDIT_STRING % est.courseno)
+ course_html += (
+ '<table width="100%%" border="1">%s ' % header)
+ est_table_init = True
+ course_html += est.toHtmlRow()
+
+ if est_table_init:
+ course_html += '</table>\n'
+ else:
+ course_html += "%s %d" % (_("no estimate found for courseno"),
+ course.courseno)
+ displayed_ests += course_ests
+
+ if include_daybook:
+ daybook_html = ""
+ if course.accd is None:
+ accd = datetime.date(1980, 1, 1)
+ course_html += "<em>%s</em><br />" % _(
+ "Warning - No course acceptance date")
+ else:
+ accd = course.accd
+ if course.cmpd is None:
+ cmpd = datetime.date.today()
+ course_html += "<em>%s</em><br />" % _(
+ "Warning - No course completion date, "
+ "using today to gather daybook items.")
+ else:
+ cmpd = course.cmpd
+ for daybook_entry in daybook_list:
+ if accd <= daybook_entry.date <= cmpd:
+ try:
+ daybook_course_guesses[course.courseno].append(
+ daybook_entry)
+ except KeyError:
+ daybook_course_guesses[
+ course.courseno] = [
+ daybook_entry]
+
+ gap = cmpd - daybook_entry.date
+ if daybook.ALLOW_TX_EDITS:
+ id_col = '<a href="daybook_id_edit?%s">%s</a>' % (
+ daybook_entry.id, _("Edit Tx"))
+ else:
+ id_col = str(daybook_entry.id)
+ daybook_html += "<tr><td>%s</td></tr>" % (
+ "</td><td> ".join(
+ (localsettings.formatDate(daybook_entry.date),
+ daybook_entry.coursetype,
+ localsettings.ops.get(daybook_entry.dntid),
+ localsettings.ops.get(daybook_entry.trtid, "-"),
+ daybook_entry.diagn, daybook_entry.perio,
+ daybook_entry.anaes, daybook_entry.misc,
+ daybook_entry.ndu, daybook_entry.ndl,
+ daybook_entry.odu, daybook_entry.odl, daybook_entry.other,
+ daybook_entry.chart.strip(chr(0) + " \n"),
+ localsettings.formatMoney(daybook_entry.feesa),
+ localsettings.formatMoney(daybook_entry.feesb),
+ id_col))
+ )
+ if daybook_html:
+ header_rows = daybook.all_data_header()
+ if course.cmpd is None:
+ header_rows = header_rows.replace(
+ "<!--gap-->", _("Course is Ongoing"))
+ elif gap.days != 0:
+ header_rows = header_rows.replace(
+ "<!--gap-->",
+ "%s %s %s" % (_("Course closed"),
+ gap.days,
+ _("days after last treatment")))
+ course_html += '<table width="100%%" border=1>%s%s</table>' % (
+ header_rows, daybook_html)
+ else:
+ course_html += "%s<br />" % _(
+ "Course dates not found in daybook")
+
+ if include_estimates and include_daybook:
+ course_check = CourseChecker(
+ course,
+ course_ests,
+ daybook_course_guesses.get(course.courseno, []))
+
+ if course_check.has_errors:
+ course_checker_errors += 1
+ course_html += course_check.results
+ course_html += '''<br />
+ <a href="consistent_courseno?%s">%s</a>''' % (
+ course.courseno, _("Examine these Issues."))
+
+ days_elapsed = ""
+ try:
+ prev_course = courses[i + 1]
+ if ALLOW_EDIT:
+ merge_link = '<br /><a href="merge_courses?%s+%s">%s?</a>' % (
+ course.courseno, prev_course.courseno,
+ _("Merge with previous course")
+ )
+ course_html = course_html.replace("<!--merge-->", merge_link)
+ days_elapsed = (course.accd - prev_course.cmpd).days
+ except IndexError:
+ days_elapsed = None
+ pass
+ except TypeError:
+ pass
+ finally:
+ course_html += '<br /><hr /><br />'
+
+ html += course_html
+
+ html += "</html></body>"
+
+ orphaned_html = ""
+ i = 0
+ for est in estimates_list:
+ if not est in displayed_ests:
+ if i == 0:
+ orphaned_html += '''<h1>%s %s</h1>
+ <table width="100%%" border="1">%s ''' % (
+ _("WARNING"),
+ _("ORPHANED ESTIMATE DATA"),
+ est.htmlHeader().replace("#ffff99", "red")
+ )
+ orphaned_html += est.toHtmlRow()
+ i += 1
- if estTableStarted:
- retarg += '</table>\n'
- else:
- retarg += "no estimate found for courseno %d" % course.courseno
- retarg += "<br /><hr /><br />"
- # db.close()
- return retarg
+ if course_checker_errors:
+ html = html.replace(
+ "<!-- ERRORS -->",
+ "<h3>%d %s</h3>" % (course_checker_errors, _("Errors Found"))
+ )
+ if i == 0:
+ return html
+ return html.replace("<!-- ORPHANS -->",
+ "%s</table><em>%s</em><br />" % (
+ orphaned_html,
+ _("This shouldn't happen!"))
+ )
if __name__ == "__main__":
+ from gettext import gettext as _
+ # ALLOW_EDIT = True
localsettings.initiate()
- print'<html><body>'
- print details(17322)
- print "</body></html>"
+ print details(27107, 0, True, True).encode("ascii", "replace")
diff --git a/src/openmolar/dbtools/daybook.py b/src/openmolar/dbtools/daybook.py
index ccdae96..f0d432d 100644
--- a/src/openmolar/dbtools/daybook.py
+++ b/src/openmolar/dbtools/daybook.py
@@ -26,6 +26,7 @@
this module provides read/write tools for the daybook database table
'''
+from collections import namedtuple
import logging
from PyQt4.QtCore import QDate
@@ -58,6 +59,11 @@ DETAILS_QUERY = '''select DATE_FORMAT(date,'%s'), daybook.serialno,
date >= %%s and date <= %%s {{FILTERS}} order by date''' % (
localsettings.OM_DATE_FORMAT.replace("%", "%%"))
+DAYBOOK_QUERY = '''select date, coursetype, dntid,
+ trtid, diagn, perio, anaes, misc, ndu, ndl, odu, odl, other, chart,
+ feesa, feesb, feesc, id
+ from daybook where serialno=%s order by date'''
+
FIELD_NAMES_QUERY = '''
SELECT concat(table_name, ".", column_name) as fieldname FROM
information_schema.columns
@@ -76,11 +82,20 @@ 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')
+# custom class for daybook data
+DaybookEntry = namedtuple('DaybookEntry',
+ ('date', 'coursetype', 'dntid', 'trtid', 'diagn', 'perio',
+ 'anaes', 'misc', 'ndu', 'ndl', 'odu', 'odl', 'other', 'chart',
+ 'feesa', 'feesb', 'feesc', 'id')
+ )
+
def add(sno, cset, dent, trtid, t_dict, fee, ptfee, tx_hashes):
'''
add a row to the daybook table
'''
+ if trtid in (0, None):
+ LOGGER.warning("no clinician login - daybook will contain junk!")
db = connect.connect()
cursor = db.cursor()
@@ -287,6 +302,36 @@ def delete_row(id):
return result
+def all_data(serialno):
+ db = connect.connect()
+ cursor = db.cursor()
+ cursor.execute(DAYBOOK_QUERY, (serialno,))
+ rows = cursor.fetchall()
+ cursor.close()
+ for row in rows:
+ yield DaybookEntry(*row)
+
+
+def all_data_header():
+ color_string = ' bgcolor="#ffff99"'
+
+ return '''
+ <tr>
+ <th%s colspan="14">%s</th><th%s colspan="3"><!--gap--></th>
+ </tr>
+ <tr><th%s>%s</th></tr>
+ ''' % (color_string,
+ _("Daybook Items during this Period"),
+ color_string, color_string,
+ ("</th><th%s>" % color_string).join(
+ ("date", "cset", "dntid", "trtid",
+ "diagn", "perio", "anaes", "misc",
+ "ndu", "ndl", "odu", "odl", "other",
+ "chart", "feesa", "feesb", "id")
+ )
+ )
+
+
class FilterHelp(object):
_field_names = None
@@ -325,6 +370,7 @@ class FilterHelp(object):
_filter_help = FilterHelp()
+
def filter_help_text():
return _filter_help.help_text()
diff --git a/src/openmolar/dbtools/db_patients.py b/src/openmolar/dbtools/db_patients.py
index eda3423..51f5ceb 100644
--- a/src/openmolar/dbtools/db_patients.py
+++ b/src/openmolar/dbtools/db_patients.py
@@ -32,7 +32,7 @@ from openmolar.settings.localsettings import PatientNotFoundError
def name(serialno):
- query = 'SELECT title, fname, sname from patients where serialno = %s'
+ query = 'SELECT title, fname, sname from new_patients where serialno = %s'
db = connect()
cursor = db.cursor()
diff --git a/src/openmolar/dbtools/db_settings.py b/src/openmolar/dbtools/db_settings.py
index ad754f9..4657f96 100644
--- a/src/openmolar/dbtools/db_settings.py
+++ b/src/openmolar/dbtools/db_settings.py
@@ -25,74 +25,310 @@
'''
this module reads and write to the settings table of the database
'''
+import datetime
+import logging
+import re
from openmolar import connect
+from openmolar.settings import localsettings
+LOGGER = logging.getLogger("openmolar")
-def getData(value):
- try:
- db = connect.connect()
- cursor = db.cursor()
- query = 'select data from settings where value = %s'
- cursor.execute(query, value)
- rows = cursor.fetchall()
- cursor.close()
- return rows
- except connect.ProgrammingError:
- return ()
+PT_COUNT_QUERY = "select count(*) from new_patients"
+# PRACTITIONERS_QUERY = "select id, inits, apptix from practitioners"
+DENTIST_DATA_QUERY = "select id,inits,name,formalname,fpcno,quals from practitioners where flag0=1"
+# APPTIX_QUERY = "select apptix,inits from practitioners where flag3=1"
+# ACTIVE_DENTS_QUERY = "select apptix, inits from practitioners where flag3=1 and flag0=1"
+# ACTIVE_HYGS_QUERY = "select apptix, inits from practitioners where
+# flag3=1 and flag0=0"
+
+
+CLINICIANS_QUERY = '''
+SELECT ix, apptix, initials, name, formal_name, qualifications, type,
+speciality, data, start_date, end_date FROM
+clinicians JOIN clinician_dates on clinicians.ix = clinician_dates.clinician_ix
+LEFT JOIN diary_link on ix = diary_link.clinician_ix
+'''
+
+ACTIVE_CLINICIANS_QUERY = CLINICIANS_QUERY + \
+ '''WHERE start_date<now() AND (end_date IS NULL OR end_date>now());'''
+LOGINS_QUERY = "select id from opid"
+INSERT_OPID_QUERY = "INSERT INTO opid (id) values (%s)"
-def insertData(value, data, user):
+INSERT_CLINICIAN_QUERIES = (
+ '''INSERT INTO clinicians
+(initials, name, formal_name, qualifications, type, speciality, data, comments)
+ VALUES(%s, %s, %s, %s, %s, %s, %s, %s)
+''',
'''
- insert a setting (leaving old values behind)
+INSERT INTO clinician_dates(clinician_ix, start_date, end_date)
+VALUES (%s, %s, %s)
+''',
'''
+INSERT INTO diary_link(clinician_ix, apptix)
+VALUES (%s, %s)
+''')
+
+INSERT_SETTING_QUERY = \
+ '''INSERT INTO settings (value, data, modified_by, time_stamp)
+values (%s, %s, %s, NOW())'''
+
+UPDATE_SETTING_QUERY = \
+ '''UPDATE settings SET data = %s, modified_by = %s, time_stamp = NOW()
+where value=%s'''
+
+
+def insert_login(opid):
db = connect.connect()
cursor = db.cursor()
- query = '''insert into settings (value,data,modified_by,time_stamp)
- values (%s, %s, %s, NOW())'''
+ result = cursor.execute(INSERT_OPID_QUERY, (opid,))
+ cursor.close()
+ return result
+
+
+def insertData(value, data, user=None):
+ '''
+ insert a setting (leaving old values behind)
+ '''
+ LOGGER.info("saving setting (%s, %s) to settings table", value, data)
+ if user is None:
+ user = localsettings.operator
values = (value, data, user)
- print "saving setting (%s, %s) to settings table" % (value, data)
- cursor.execute(query, values)
- db.commit()
+ db = connect.connect()
+ cursor = db.cursor()
+ result = cursor.execute(INSERT_SETTING_QUERY, values)
+ cursor.close()
return True
-def updateData(value, data, user):
+def updateData(value, data, user=None):
'''
- update a setting
+ update a setting - if no update occurs, will insert
'''
+ LOGGER.info("updating setting (%s, %s) to settings table", value, data)
+ if user is None:
+ user = localsettings.operator
+ values = (data, user, value)
db = connect.connect()
cursor = db.cursor()
- 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)
- if not cursor.execute(query, values):
- return insertData(value, data, user)
- else:
- db.commit()
+ if cursor.execute(UPDATE_SETTING_QUERY, values):
+ cursor.close()
return True
+ return insertData(value, data, user)
-def getWikiUrl():
- '''
- the database may know of the url (presumably an internally facing ip)
- for the practice wiki??
- '''
+def insert_practice_name(practice_name):
+ return insertData("practice name", practice_name)
+
+
+def insert_practice_address(address):
+ return insertData("practice address", address)
+
+
+def insert_clinician(clinician):
+ result = False
+ comments = "added by client - %s" % datetime.datetime.now().strftime(
+ "%m %h %Y %H:%M")
+ db = connect.connect()
try:
- db = connect.connect()
+ db.autocommit = False
cursor = db.cursor()
- query = 'select data from settings where value = "wikiurl"'
- cursor.execute(query)
- rows = cursor.fetchall()
- 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/"
+ cursor.execute(INSERT_CLINICIAN_QUERIES[0],
+ (clinician.initials,
+ clinician.name,
+ clinician.formal_name,
+ clinician.qualifications,
+ clinician.type,
+ clinician.speciality,
+ clinician.data,
+ comments)
+ )
+
+ ix = db.insert_id()
+ cursor.execute(INSERT_CLINICIAN_QUERIES[1], (ix,
+ clinician.start_date,
+ clinician.end_date)
+ )
+
+ if clinician.new_diary:
+ cursor.execute(INSERT_CLINICIAN_QUERIES[2], (ix, ix))
+ cursor.close()
+ db.commit()
+ result = True
+ except:
+ LOGGER.exception("failed to insert clinician")
+ db.rollback()
+ finally:
+ db.autocommit = True
+ return result
+
+
+class SettingsFetcher(object):
+
+ def __init__(self):
+ self._cursor = None
+ self.loaded = False
+ self.PT_COUNT = 0
+
+ @property
+ def cursor(self):
+ if self._cursor is None:
+ db = connect.connect()
+ self._cursor = db.cursor()
+ return self._cursor
+
+ def close_cursor(self):
+ if self._cursor is not None:
+ self._cursor.close()
+ self._cursor = None
+
+ def fetch(self):
+ self.cursor.execute(PT_COUNT_QUERY)
+ self.PT_COUNT = self.cursor.fetchone()[0]
+ self._get_clinicians()
+ self.loaded = True
+ self.close_cursor()
+
+ def getData(self, key):
+ try:
+ query = 'select data from settings where value = %s order by ix'
+ self.cursor.execute(query, (key,))
+ rows = self.cursor.fetchall()
+ return rows
+ except connect.ProgrammingError:
+ return ()
+
+ def get_unique_value(self, key):
+ '''
+ get a single value from the settings table.
+ by default gets the last entry
+ '''
+ try:
+ return self.getData(key)[-1][0]
+ except IndexError:
+ LOGGER.warning("no key '%s' found in settings", key)
+
+ @property
+ def allowed_logins(self):
+ self.cursor.execute(LOGINS_QUERY)
+ # grab initials of those currently allowed to log in
+ trows = self.cursor.fetchall()
+ allowed_logins = []
+ for row in trows:
+ allowed_logins.append(row[0])
+ return allowed_logins
+
+ @property
+ def wiki_url(self):
+ '''
+ the database may know of the url (presumably an internally facing ip)
+ for the practice wiki??
+ '''
+ wiki_url = self.get_unique_value("wikiurl")
+ return wiki_url if wiki_url else "http://openmolar.com/wiki"
+
+ @property
+ def book_end(self):
+ book_end = self.get_unique_value("bookend")
+ try:
+ year, month, day = book_end.split(",")
+ return datetime.date(int(year), int(month), int(day))
+ except AttributeError:
+ pass
+ except ValueError:
+ LOGGER.warning("Badly formatted value for bookend in settings")
+ return datetime.date.today() + datetime.timedelta(days=183)
+
+ @property
+ def practice_name(self):
+ name = self.get_unique_value("practice name")
+ if name:
+ return name
+ return _("Example Dental Practice")
+
+ @property
+ def practice_address(self):
+ address = self.get_unique_value("practice address")
+ address_list = [self.practice_name]
+ try:
+ for line_ in address.split("|"):
+ address_list.append(line_)
+ except AttributeError:
+ address_list += ["My Street", "My Town", "POST CODE"]
+ except ValueError:
+ LOGGER.warning(
+ "Badly formatted value for practice_address in settings")
+ address_list.append(unicode(address))
+ return tuple(address_list)
+
+ @property
+ def supervisor_pword(self):
+ hash_ = self.get_unique_value("supervisor_pword")
+ if hash_:
+ return hash_
+ LOGGER.warning("#" * 30)
+ LOGGER.warning("WARNING - no supervisor password is set")
+ LOGGER.warning("#" * 30)
+ # hash of salted ""
+ return "c1219df26de403348e211a314ff2fce58aa6e28d"
+
+ def _get_clinicians(self):
+ '''
+ poll the database and retrieve all practitioners (past and present)
+ '''
+ self.ops, self.ops_reverse = {}, {}
+ self.apptix_dict, self.apptix_reverse = {}, {}
+ active_dent_initials, active_dent_ixs = [], []
+ active_hyg_initials, active_hyg_ixs = [], []
+ self.dentist_data = {}
+
+ self.cursor.execute(CLINICIANS_QUERY)
+ rows = self.cursor.fetchall()
+ for (ix, apptix, initials, name, formal_name, qualifications, type_,
+ speciality, data, start_date, end_date) in rows:
+ self.ops[ix] = initials
+ self.ops_reverse[initials] = ix
+ today = datetime.date.today()
+
+ if apptix:
+ self.apptix_reverse[apptix] = initials
+ if start_date <= today and (end_date is None or end_date >= today):
+ if apptix:
+ self.apptix_dict[initials] = apptix
+ if type_ == 1:
+ active_dent_initials.append(initials)
+ active_dent_ixs.append(ix)
+ elif type_ in (2, 3): # hygienist and therapist
+ active_hyg_initials.append(initials)
+ active_hyg_ixs.append(ix)
+ if type_ == 1:
+ list_no = ""
+ if data:
+ m = re.search("list_no=([^ ]*)", data)
+ if m:
+ list_no = m.groups()[0]
+
+ self.dentist_data[ix] = (
+ initials,
+ name,
+ formal_name,
+ list_no,
+ qualifications)
+
+ self.active_dents = tuple(active_dent_initials), tuple(active_dent_ixs)
+ self.active_hygs = tuple(active_hyg_initials), tuple(active_hyg_ixs)
if __name__ == "__main__":
- print getData("enddate")
+ sf = SettingsFetcher()
+ sf.fetch()
+
+ print sf.PT_COUNT
+ print sf.wiki_url
+ print sf.book_end
+ print sf.supervisor_pword
+ print sf.getData("enddate")
+ print sf.active_dents
+ print sf.active_hygs
+ print sf.dentist_data
diff --git a/src/openmolar/dbtools/distinct_statuses.py b/src/openmolar/dbtools/distinct_statuses.py
index bc8bbf3..c770cf3 100644
--- a/src/openmolar/dbtools/distinct_statuses.py
+++ b/src/openmolar/dbtools/distinct_statuses.py
@@ -27,7 +27,7 @@ from openmolar import connect
LOGGER = logging.getLogger("openmolar")
-QUERY = "select distinct status from patients"
+QUERY = "select distinct status from new_patients"
class DistinctStatuses(object):
@@ -42,12 +42,12 @@ class DistinctStatuses(object):
rows = cursor.fetchall()
cursor.close()
- self._distinct_statuses = []
+ self._distinct_statuses = set(["", _("DECEASED")])
for row in sorted(rows):
if row[0] not in (None, "BAD DEBT"):
- self._distinct_statuses.append(row[0])
+ self._distinct_statuses.add(row[0])
- return self._distinct_statuses
+ return sorted(self._distinct_statuses)
if __name__ == "__main__":
ds = DistinctStatuses()
diff --git a/src/openmolar/dbtools/estimate_synopsis.py b/src/openmolar/dbtools/estimate_synopsis.py
index 510f113..38ea612 100644
--- a/src/openmolar/dbtools/estimate_synopsis.py
+++ b/src/openmolar/dbtools/estimate_synopsis.py
@@ -27,11 +27,11 @@ from openmolar.connect import connect
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'''
+where serialno=%s AND courseno=%s order by itemcode, description'''
-def html(courseno):
- values = (courseno,)
+def html(serialno, courseno):
+ values = (serialno, courseno)
db = connect()
cursor = db.cursor()
cursor.execute(QUERY, values)
diff --git a/src/openmolar/dbtools/estimates.py b/src/openmolar/dbtools/estimates.py
new file mode 100644
index 0000000..37bf35d
--- /dev/null
+++ b/src/openmolar/dbtools/estimates.py
@@ -0,0 +1,252 @@
+#! /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 openmolar import connect
+from openmolar.settings import localsettings
+from openmolar.ptModules.estimates import TXHash, Estimate
+
+
+LOGGER = logging.getLogger("openmolar")
+
+
+ESTS_QUERY = '''SELECT newestimates.ix, number, itemcode, description,
+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 and courseno=%s order by itemcode, ix'''
+
+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())')
+
+EST_LINK_INS_QUERY = (
+ '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"
+
+ESTS_UPDATE_QUERY = '''UPDATE newestimates SET
+number=%s, itemcode=%s, description=%s, fee=%s, ptfee=%s, feescale=%s,
+csetype=%s, dent=%s, modified_by=%s, time_stamp=NOW() WHERE ix=%s
+'''.replace("\n", " ")
+
+
+# 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'
+]
+
+
+def get_ests(serialno, courseno):
+ '''
+ get estimate data
+ '''
+ db = connect.connect()
+ cursor = db.cursor()
+
+ cursor.execute(ESTS_QUERY, (serialno, courseno))
+
+ rows = cursor.fetchall()
+ ests = []
+
+ for row in rows:
+ hash_ = row[10]
+ completed = bool(row[9])
+
+ tx_hash = TXHash(hash_, completed)
+
+ ix = row[0]
+
+ found = False
+ # use existing est if one relates to multiple treatments
+ for existing_est in ests:
+ if existing_est.ix == ix:
+ existing_est.tx_hashes.append(tx_hash)
+ found = True
+ break
+ if found:
+ continue
+
+ # initiate a custom data class
+ est = Estimate()
+
+ est.ix = ix
+ est.courseno = row[11]
+ est.number = row[1]
+ est.itemcode = row[2]
+ est.description = row[3]
+ est.fee = row[4]
+ est.ptfee = row[5]
+ est.feescale = row[6]
+ est.csetype = row[7]
+ est.dent = row[8]
+
+ est.tx_hashes = [tx_hash]
+ ests.append(est)
+
+ cursor.close()
+ return ests
+
+
+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
+ db = connect.connect()
+ cursor = db.cursor()
+ 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
+ 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))
+
+
+def apply_changes(pt, old_ests, new_ests):
+
+ LOGGER.info("APPLY ESTIMATE CHANGES")
+ estimate_insertions = []
+ estimate_updates = []
+ estimate_deletions = []
+ post_cleanup_commands = []
+
+ result = True
+
+ old_ests_dict = {}
+
+ for est in old_ests:
+ if est.ix is not None:
+ old_ests_dict[est.ix] = est
+
+ for est in new_ests:
+ 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)
+
+ estimate_insertions.append((ESTS_INS_QUERY, values, est.tx_hashes))
+
+ elif est.ix in old_ests_dict.keys():
+ oldEst = old_ests_dict[est.ix]
+ if oldEst != est:
+ values = (est.number,
+ est.itemcode, est.description,
+ est.fee, est.ptfee, est.feescale, est.csetype,
+ est.dent, localsettings.operator, est.ix)
+
+ estimate_updates.append((ESTS_UPDATE_QUERY, values, est))
+ for tx_hash in est.tx_hashes:
+ values = (pt.serialno, tx_hash)
+ post_cleanup_commands.append(
+ (update_daybook_after_estimate_change, values))
+
+ old_ests_dict.pop(est.ix)
+
+ #-- all that is left in old_ests_dict now are items which
+ #-- have been removed.
+ #-- so remove from database if they are current course!
+ for ix, old_est in old_ests_dict.iteritems():
+ #--removed
+ if old_est.courseno == pt.courseno0:
+ values = (ix,)
+ estimate_deletions.append((EST_DEL_QUERY, values))
+ estimate_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))
+
+ db = connect.connect()
+ cursor = db.cursor()
+
+ for query, values, tx_hashes in estimate_insertions:
+ LOGGER.debug(query)
+ LOGGER.debug(values)
+ cursor.execute(query, values)
+ ix = cursor.lastrowid
+ for tx_hash in tx_hashes:
+ vals = (ix, tx_hash.hash, tx_hash.completed)
+ cursor.execute(EST_LINK_INS_QUERY, vals)
+
+ for query, values, estimate in estimate_updates:
+ LOGGER.debug(query)
+ LOGGER.debug(values)
+ cursor.execute(query, values)
+ 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)
+ )
+
+ for query, values in estimate_deletions:
+ LOGGER.debug(query)
+ LOGGER.debug(values)
+ cursor.execute(query, values)
+
+ cursor.close()
+
+ for func, values in post_cleanup_commands:
+ func.__call__(values)
+
+ return result
+
+
+if __name__ == "__main__":
+ ests = get_ests(11956, 29749)
+ print ests
+ print "equality test (should be True) ", ests[0] == ests[0]
+ print "inequality test (should also be True)", ests[0] != ests[1]
diff --git a/src/openmolar/dbtools/estimatesHistory.py b/src/openmolar/dbtools/estimatesHistory.py
index c458497..2b03c87 100644
--- a/src/openmolar/dbtools/estimatesHistory.py
+++ b/src/openmolar/dbtools/estimatesHistory.py
@@ -26,20 +26,38 @@ from openmolar.settings import localsettings
from openmolar.connect import connect
from openmolar.ptModules.estimates import Estimate, TXHash
+try:
+ from collections import OrderedDict
+except ImportError:
+ # OrderedDict only came in python 2.7
+ LOGGER.warning("using openmolar.backports for OrderedDict")
+ from openmolar.backports import OrderedDict
+
QUERY = '''SELECT newestimates.ix, number, itemcode, description,
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'''
+COURSE_QUERY = QUERY.replace(
+ "order by courseno desc,", "and courseno = %s order by")
+
+ALLOW_EDIT = False
+
+EDIT_STRING = '<a href="edit_estimate?%%s">%s</a>' % _("Edit this Estimate")
-def getEsts(sno):
+
+def getEsts(sno, courseno=None):
db = connect()
cursor = db.cursor()
- cursor.execute(QUERY, (sno,))
+
+ if courseno is None:
+ cursor.execute(QUERY, (sno,))
+ else:
+ cursor.execute(COURSE_QUERY, (sno, courseno))
rows = cursor.fetchall()
cursor.close()
- estimates = []
+ estimates = OrderedDict()
for row in rows:
hash_ = row[10]
@@ -49,19 +67,7 @@ def getEsts(sno):
ix = row[0]
- found = False
- # 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)
- found = True
- break
- if found:
- continue
-
- # initiate a custom data class
- est = Estimate()
-
+ est = estimates.get(ix, Estimate())
est.ix = ix
est.courseno = row[11]
est.number = row[1]
@@ -72,42 +78,49 @@ def getEsts(sno):
est.feescale = row[6]
est.csetype = row[7]
est.dent = row[8]
+ try:
+ est.tx_hashes.append(tx_hash)
+ except AttributeError:
+ est.tx_hashes = [tx_hash]
- # est.category = "TODO"
- # est.type_ = "TODO"
-
- est.tx_hashes = [tx_hash]
- estimates.append(est)
-
- cursor.close()
+ estimates[ix] = est
- return estimates
+ return estimates.values()
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
+ estimates = getEsts(sno)
+ claimNo = len(estimates)
+ html = "<h2>%s - %d %s</h2>" % (
+ _("Past Estimates"),
+ claimNo,
+ _("found")
+ )
if claimNo == 0:
- return retarg
- courseno = -1
- firstRow = True
- for est in estimatesList:
+ return html
+ courseno = None
+
+ for i, est in enumerate(estimates):
if est.courseno != courseno:
- if not firstRow:
- retarg += "</table>"
- firstRow = False
- retarg += '''</table><h3>Estimate for course number %d</h3>
- <table width="100%%" border="1">''' % est.courseno
- retarg += est.htmlHeader()
+ header = est.htmlHeader()
+ if ALLOW_EDIT:
+ header = header.replace(
+ "<!--editlink-->",
+ EDIT_STRING % est.courseno
+ )
+
+ if i > 0:
+ html += "</table><hr />"
+ html += '<table width="100%%" border="1">%s' % header
courseno = est.courseno
- retarg += est.toHtmlRow()
- retarg += '</table>\n'
- return retarg
+ html += est.toHtmlRow()
+ html += '</table>\n'
+
+ return html
if __name__ == "__main__":
localsettings.initiate()
diff --git a/src/openmolar/dbtools/extend_books.py b/src/openmolar/dbtools/extend_books.py
deleted file mode 100644
index c6d7cc9..0000000
--- a/src/openmolar/dbtools/extend_books.py
+++ /dev/null
@@ -1,65 +0,0 @@
-#! /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
-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()
-
- for dent in dents:
- curdate = startdate
- while curdate <= enddate:
- values = (curdate, dent, 0, 0, 0, "")
- try:
- if cursor.execute(query, values):
- print "successfully added %s for dent %s" % (curdate, dent)
- except IntegrityError:
- print "%s already present for dent %s" % (curdate, dent)
- curdate += delta
-
- cursor.close()
- db.commit()
- return True
-
-
-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)
diff --git a/src/openmolar/dbtools/families.py b/src/openmolar/dbtools/families.py
index 17a6555..0c29189 100644
--- a/src/openmolar/dbtools/families.py
+++ b/src/openmolar/dbtools/families.py
@@ -26,21 +26,22 @@ 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
+addr1, addr2, addr3, town, county, pcde, dob, status, tel1 from new_patients
where familyno = %s order by dob'''
PATIENT_QUERY = QUERY.replace("familyno", "serialno")
-LINK_QUERY = 'update patients set familyno=%s where serialno=%s'
+LINK_QUERY = 'update new_patients set familyno=%s where serialno=%s'
-SYNC_QUERY = '''update patients set
+SYNC_QUERY = '''update new_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"
+NEXT_FAMILYNO_QUERY = "select max(familyno)+1 from new_patients"
+NEW_GROUP_QUERY = "update new_patients set familyno=%s where serialno=%s"
-DELETE_FAMILYNO_QUERY = "update patients set familyno=NULL where familyno=%s"
+DELETE_FAMILYNO_QUERY = \
+ "update new_patients set familyno=NULL where familyno=%s"
ADDRESS_MATCH_QUERY = '''select
case when addr1 = %s then 4 else 0 end +
@@ -50,11 +51,11 @@ ADDRESS_MATCH_QUERY = '''select
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
+from new_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
+(addr2 != "" and addr2 like %s) or
+(town != "" and town like %s) or
(pcde=%s and pcde != "")
order by matches desc
limit 12
@@ -69,6 +70,8 @@ def new_group(serialno):
cursor = db.cursor()
cursor.execute(NEXT_FAMILYNO_QUERY)
family_no = cursor.fetchone()[0]
+ if family_no is None:
+ family_no = 1
cursor.execute(NEW_GROUP_QUERY, (family_no, serialno))
cursor.close()
return family_no
diff --git a/src/openmolar/dbtools/feescales.py b/src/openmolar/dbtools/feescales.py
index b169997..4845235 100644
--- a/src/openmolar/dbtools/feescales.py
+++ b/src/openmolar/dbtools/feescales.py
@@ -35,13 +35,25 @@ from openmolar.settings import localsettings
LOGGER = logging.getLogger("openmolar")
+def FEESCALE_DIR():
+ '''
+ this is dynamic in case user switches database
+ '''
+ return os.path.join(
+ localsettings.localFileDirectory,
+ "feescales",
+ connect.params.database_name.replace(" ", "_").replace(":", "_PORT_")
+ )
+
+
def write_readme():
- LOGGER.info("creating directory %s" % FEESCALE_DIR)
- os.makedirs(FEESCALE_DIR)
- f = open(os.path.join(FEESCALE_DIR, "README.txt"), "w")
+ dir_path = FEESCALE_DIR()
+ LOGGER.info("creating directory %s" % dir_path)
+ os.makedirs(dir_path)
+ f = open(os.path.join(dir_path, "README.txt"), "w")
f.write('''
This folder is created by openmolar to store xml copies of the feescales in
-your database (see feescales table).
+database %s.
Filenames herein are IMPORTANT!
feescale1.xml relates to the xml stored in row 1 of that table
feescale2.xml relates to the xml stored in row 2 of that table
@@ -50,13 +62,11 @@ whilst you are free to edit these files using an editor of your choice,
validation against feescale_schema.xsd is highly recommended.
note - openmolar has a build in application for doing this.
- ''')
- f.close()
+in addition - why not use some version control for this folder?
+ ''' % connect.params.database_name)
+ f.close()
-FEESCALE_DIR = os.path.join(localsettings.localFileDirectory, "feescales")
-if not os.path.exists(FEESCALE_DIR):
- write_readme()
QUERY = 'select ix, xml_data from feescales'
@@ -67,7 +77,19 @@ UPDATE_QUERY = "update feescales set xml_data = %s where ix = %s"
NEW_FEESCALE_QUERY = "insert into feescales (xml_data) values(%s)"
+def get_digits(string_value):
+ '''
+ used as a key for sort function for filenames.
+ I want foo_10 to be after foo_9 etc..
+ '''
+ m = re.search("(\d+)", string_value)
+ if not m:
+ return None
+ return int(m.groups()[0])
+
+
class FeescaleHandler(object):
+ ixs_in_db = set([])
def get_feescale_from_database(self, ix):
'''
@@ -90,6 +112,8 @@ class FeescaleHandler(object):
query = QUERY
if in_use_only:
query += ' where in_use = True'
+ else: # if called by feescale editor
+ self.ixs_in_db = set([])
if priority_order:
query += ' order by priority desc'
db = connect.connect()
@@ -98,6 +122,8 @@ class FeescaleHandler(object):
rows = cursor.fetchall()
cursor.close()
LOGGER.debug("%d feescales retrieved" % len(rows))
+ for ix, xml_data in rows:
+ self.ixs_in_db.add(ix)
return rows
def save_file(self, ix, xml_data):
@@ -115,9 +141,6 @@ class FeescaleHandler(object):
yield xml_file
- # self.save_file(ix, xml_data)
- # LOGGER.info("feescales data written to local filesystem")
-
def non_existant_and_modified_local_files(self):
'''
returns 2 lists
@@ -136,25 +159,50 @@ 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)
+
+ def check_dir(self):
+ if not os.path.exists(FEESCALE_DIR()):
+ write_readme()
@property
def local_files(self):
- for file_ in sorted(os.listdir(FEESCALE_DIR)):
- m = re.match(".*(\d+)\.xml$", file_)
+ self.check_dir()
+ dirname = FEESCALE_DIR()
+ for file_ in sorted(os.listdir(dirname), key=get_digits):
+ m = re.match("feescale_(\d+)\.xml$", file_)
if m:
ix = int(m.groups()[0])
- yield ix, os.path.join(FEESCALE_DIR, file_)
+ yield ix, os.path.join(dirname, file_)
+
+ def temp_move(self, file_ix):
+ '''
+ after insert, a local file may need to move.
+ this is done cautiously as could overwrite another
+ '''
+ path = self.index_to_local_filepath(file_ix)
+ shutil.move(path, path + "temp")
+
+ def final_move(self, file_ix, db_ix):
+ '''
+ finalised temp_move
+ '''
+ temp_path = self.index_to_local_filepath(file_ix) + "temp"
+ final_path = self.index_to_local_filepath(db_ix)
+ shutil.move(temp_path, final_path)
def update_db_all(self):
'''
apply all local file changes to the database.
'''
message = ""
+ insert_ids = []
for ix, filepath in self.local_files:
- message += self.update_db(ix)
-
- return message
+ if ix in self.ixs_in_db:
+ message += self.update_db(ix)
+ else:
+ insert_ids.append(ix)
+ return message, insert_ids
def update_db(self, ix):
message = ""
@@ -182,6 +230,31 @@ class FeescaleHandler(object):
return message
+ def insert_db(self, ix):
+ message = ""
+ filepath = self.index_to_local_filepath(ix)
+ LOGGER.debug("inserting new feescale into database %s" % ix)
+ if not os.path.isfile(filepath):
+ message = "FATAL %s does not exist!" % filepath
+ else:
+ db = connect.connect()
+ cursor = db.cursor()
+
+ f = open(filepath)
+ data = f.read()
+ f.close()
+
+ values = (data,)
+ cursor.execute(NEW_FEESCALE_QUERY, values)
+ db_ix = db.insert_id()
+ self.ixs_in_db.add(db_ix)
+
+ r_message = "inserting new feescale '%s' to database." % filepath
+ db.close()
+
+ LOGGER.info(r_message)
+ return db_ix
+
def save_xml(self, ix, xml):
file_path = self.index_to_local_filepath(ix)
LOGGER.info("saving %s" % file_path)
@@ -206,4 +279,6 @@ if __name__ == "__main__":
fh = FeescaleHandler()
fh.get_feescales_from_database()
+ for ix, local_file in fh.local_files:
+ print ix, local_file
print fh.non_existant_and_modified_local_files()
diff --git a/src/openmolar/dbtools/patient_class.py b/src/openmolar/dbtools/patient_class.py
index 46cd57d..7b98e75 100644
--- a/src/openmolar/dbtools/patient_class.py
+++ b/src/openmolar/dbtools/patient_class.py
@@ -29,15 +29,17 @@ import re
import sys
from openmolar import connect
-from openmolar.ptModules import perio, dec_perm, estimates, notes, formatted_notes
+from openmolar.ptModules import dec_perm, formatted_notes
from openmolar.settings import localsettings
from openmolar.dbtools.appt_prefs import ApptPrefs
from openmolar.dbtools.treatment_course import TreatmentCourse
from openmolar.dbtools.plan_data import PlanData
from openmolar.dbtools.est_logger import EstLogger
+from openmolar.dbtools import estimates as db_estimates
-from openmolar.dbtools.queries import ESTS_QUERY, PATIENT_QUERY
+from openmolar.dbtools.queries import \
+ PATIENT_QUERY_FIELDS, PATIENT_QUERY, FUTURE_EXAM_QUERY, PSN_QUERY, FAMILY_COUNT_QUERY
LOGGER = logging.getLogger("openmolar")
@@ -49,53 +51,35 @@ dateFields = ("dob", "pd0", "pd1", "pd2", "pd3", "pd4", "pd5", "pd6",
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',
+ 'sname', 'fname', 'title', 'sex', 'dob',
+ 'addr1', 'addr2', 'addr3', 'pcde', 'town', 'county',
+ 'tel1', 'tel2', 'mobile', 'fax', 'email1', 'email2',
+ 'occup', 'nhsno', 'cnfd', 'cset', 'dnt1', 'dnt2', 'courseno0',
+ 'billdate', 'billct', 'billtype', 'familyno', 'memo', 'status'
+)
+
+money_table_atts = ('money0', 'money1', 'money2', 'money3', 'money4',
+ 'money5', 'money6', 'money7', 'money8', 'money9', 'money10', 'money11')
+
+nhs_table_atts = ('initaccept', 'lastreaccept', 'lastclaim', 'expiry',
+ 'cstatus', 'transfer', 'pstatus')
+
+static_table_atts = (
'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')
+ 'dent0', 'dent1', 'dent2', 'dent3')
-exemptionTableAtts = ('exemption', 'exempttext')
+date_table_atts = (
+ 'pd0', 'pd1', 'pd2', 'pd3', 'pd4', 'pd5', 'pd6', 'pd7', 'pd8', 'pd9',
+ 'pd10', 'pd11', 'pd12', 'pd13', 'pd14')
-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)
+exemptionTableAtts = ('exemption', 'exempttext')
bpeTableAtts = ('bpedate', 'bpe')
bpeTableVals = (nullDate, '', ())
-perioTableAtts = ('chartdate', 'chartdata')
-
mnhistTableAtts = ('chgdate', 'ix', 'note')
notesTableAtts = ('lineno', 'line')
@@ -112,6 +96,14 @@ decidmouth = ['***', '***', '***', 'ulE', 'ulD', 'ulC', 'ulB', 'ulA',
clinical_memos = ("synopsis",)
+_atts = []
+for att in PATIENT_QUERY_FIELDS:
+ if re.match("[ul][lr]\d$", att):
+ _atts.append(att + "st")
+ else:
+ _atts.append(att)
+patient_query_atts = tuple(_atts)
+
class patient(object):
@@ -126,25 +118,6 @@ class patient(object):
# patient table atts
self.courseno0 = None
- self.pf0 = 0
- self.pf1 = 0
- self.pf2 = 0
- self.pf3 = 0
- self.pf4 = 0
- self.pf5 = 0
- self.pf6 = 0
- self.pf7 = 0
- self.pf8 = 0
- self.pf9 = 0
- self.pf10 = 0
- self.pf11 = 0
- self.pf12 = 0
- self.pf14 = 0
- self.pf15 = 0
- self.pf16 = 0
- self.pf17 = 0
- self.pf18 = 0
- self.pf19 = 0
self.money0 = 0
self.money1 = 0
self.money2 = 0
@@ -185,11 +158,9 @@ class patient(object):
self.occup = ''
self.nhsno = ''
self.cnfd = None
- self.psn = ''
self.cset = ''
self.dnt1 = 0
self.dnt2 = 0
- self.courseno1 = 0
self.ur8st = ''
self.ur7st = ''
self.ur6st = ''
@@ -226,15 +197,10 @@ class patient(object):
self.dent1 = 0
self.dent2 = 0
self.dent3 = 0
- self.dmask = "YYYYYYY"
- self.minstart = 0
- self.maxend = 0
self.billdate = None
self.billct = 0
self.billtype = None
- self.pf20 = 0
self.money11 = 0
- self.pf13 = 0
self.familyno = localsettings.last_family_no
self.memo = ''
self.town = ''
@@ -244,9 +210,6 @@ class patient(object):
self.email1 = ''
self.email2 = ''
self.status = ''
- self.source = ''
- self.enrolled = ''
- self.archived = None
self.initaccept = 0
self.lastreaccept = None
self.lastclaim = None
@@ -254,7 +217,6 @@ class patient(object):
self.cstatus = None
self.transfer = 0
self.pstatus = None
- self.courseno2 = 0
# TABLE 'mnhist'#######
self.chgdate = nullDate # date YES None
@@ -269,7 +231,6 @@ class patient(object):
# NEIL'S STUFF####
self.exemption = ""
self.exempttext = ""
- self.perioData = {}
self.bpe = []
self.bpedate = nullDate
self.chartdate = nullDate
@@ -284,6 +245,9 @@ class patient(object):
self._dayBookHistory = None
self.treatment_course = None
self.est_logger = None
+ self._most_recent_daybook_entry = None
+ self._has_exam_booked = None
+ self._previous_surnames = None
if self.serialno == 0:
return
@@ -302,7 +266,7 @@ class patient(object):
if values == ():
raise localsettings.PatientNotFoundError
- for i, att in enumerate(patientTableAtts):
+ for i, att in enumerate(patient_query_atts):
value = values[0][i]
if value is not None:
self.__dict__[att] = value
@@ -335,17 +299,6 @@ class patient(object):
self.getNotesTuple()
- query = 'select chartdate,chartdata from perio where serialno=%s'
- cursor.execute(query, self.serialno)
- perioData = cursor.fetchall()
-
- for data in perioData:
- self.perioData[localsettings.formatDate(data[0])] = (
- 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'
@@ -393,6 +346,36 @@ class patient(object):
cursor.close()
return self._dayBookHistory
+ @property
+ def last_treatment_date(self):
+ max_date = localsettings.currentDay()
+ if (self.treatment_course.cmp_txs !=
+ self.dbstate.treatment_course.cmp_txs):
+ return max_date
+ if self._most_recent_daybook_entry is None:
+ db = connect.connect()
+ cursor = db.cursor()
+ query = 'select max(date) from daybook where serialno=%s'
+ if cursor.execute(query, self.serialno):
+ max_date = cursor.fetchone()[0]
+ cursor.close()
+ self._most_recent_daybook_entry = max_date
+ return self._most_recent_daybook_entry
+
+ def forget_exam_booked(self):
+ self._has_exam_booked = None
+
+ @property
+ def has_exam_booked(self):
+ if self._has_exam_booked is None:
+ db = connect.connect()
+ cursor = db.cursor()
+ cursor.execute(FUTURE_EXAM_QUERY, self.serialno)
+ self._has_exam_booked = bool(cursor.fetchone()[0])
+ cursor.close()
+
+ return self._has_exam_booked
+
def __repr__(self):
return "'Patient_class instance - serialno %d'" % self.serialno
@@ -477,7 +460,7 @@ class patient(object):
cse_accd = localsettings.currentDay()
else:
cse_accd = self.treatment_course.accd
- for table in localsettings.FEETABLES.tables.values():
+ for table in reversed(localsettings.FEETABLES.tables.values()):
LOGGER.debug(
"checking feescale %s to see if suitable a feetable" % (
table))
@@ -502,51 +485,7 @@ class patient(object):
'''
get estimate data
'''
- db = connect.connect()
- cursor = db.cursor()
-
- cursor.execute(ESTS_QUERY, (self.serialno, self.courseno0))
-
- rows = cursor.fetchall()
- self.estimates = []
-
- for row in rows:
- hash_ = row[10]
- completed = bool(row[9])
-
- tx_hash = estimates.TXHash(hash_, completed)
-
- ix = row[0]
-
- found = False
- # 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)
- found = True
- break
- if found:
- continue
-
- # initiate a custom data class
- est = estimates.Estimate()
-
- est.ix = ix
- est.courseno = row[11]
- est.number = row[1]
- est.itemcode = row[2]
- est.description = row[3]
- est.fee = row[4]
- est.ptfee = row[5]
- est.feescale = row[6]
- est.csetype = row[7]
- est.dent = row[8]
-
- est.tx_hashes = [tx_hash]
- self.estimates.append(est)
-
- cursor.close()
-
+ self.estimates = db_estimates.get_ests(self.serialno, self.courseno0)
self.est_logger = EstLogger(self.courseno0)
def getSynopsis(self):
@@ -697,8 +636,7 @@ class patient(object):
for est in self.estimates:
if (est.csetype.startswith("N") and
(not completed_only or est.completed == 2)
- ):
- # yield est
+ ):
claims.append(est)
return claims
@@ -706,9 +644,8 @@ class patient(object):
'''
re-written for schema 1.9
'''
- LOGGER.info(
- "patient.addHiddenNote(ntype='%s',note='%s', attempt_delete='%s'" % (
- ntype, note, attempt_delete))
+ LOGGER.info("(ntype='%s',note='%s', attempt_delete='%s'",
+ ntype, note, attempt_delete)
HN = ()
if ntype == "payment":
@@ -737,7 +674,8 @@ class patient(object):
HN = ("INTERIM: ", note)
if not HN:
- print "unable to add Hidden Note notetype '%s' not found" % ntype
+ LOGGER.warning(
+ "unable to add Hidden Note notetype '%s' not found", ntype)
return
reversing_note = ("UNCOMPLETED", "{%s}" % note)
@@ -746,6 +684,8 @@ class patient(object):
try:
self.HIDDENNOTES.remove(HN)
except ValueError:
+ LOGGER.debug("'%s' not in hiddenotes", HN)
+ LOGGER.debug(self.HIDDENNOTES)
self.HIDDENNOTES.append(reversing_note)
else:
try:
@@ -784,12 +724,31 @@ class patient(object):
self.title, self.fname, self.sname)
@property
+ def psn(self):
+ '''
+ previous surname
+ '''
+ try:
+ return self.previous_surnames[0]
+ except IndexError:
+ return ""
+
+ @property
+ def previous_surnames(self):
+ if self._previous_surnames is None:
+ db = connect.connect()
+ cursor = db.cursor()
+ cursor.execute(PSN_QUERY, (self.serialno,))
+ self._previous_surnames = [s[0] for s in cursor.fetchall()]
+ cursor.close()
+ return self._previous_surnames
+
+ @property
def n_family_members(self):
if self._n_family_members is None:
db = connect.connect()
cursor = db.cursor()
- cursor.execute("select count(*) from patients where familyno=%s",
- (self.familyno,))
+ cursor.execute(FAMILY_COUNT_QUERY, (self.familyno,))
self._n_family_members = cursor.fetchone()[0]
return self._n_family_members
@@ -811,9 +770,9 @@ class patient(object):
'''
these are what is copied over into pt.dbstate
'''
- return (patientTableAtts +
+ return (patient_query_atts +
exemptionTableAtts + bpeTableAtts + mnhistTableAtts +
- perioTableAtts + clinical_memos + (
+ clinical_memos + (
"fees", "estimate_charges", "serialno", "estimates",
"appt_prefs", "treatment_course", "chartgrid"))
diff --git a/src/openmolar/dbtools/patient_write_changes.py b/src/openmolar/dbtools/patient_write_changes.py
index f77aa33..6465e3b 100644
--- a/src/openmolar/dbtools/patient_write_changes.py
+++ b/src/openmolar/dbtools/patient_write_changes.py
@@ -31,7 +31,9 @@ import MySQLdb
from openmolar.connect import connect
from openmolar.settings import localsettings
from openmolar.dbtools import patient_class
+from openmolar.dbtools import estimates
from openmolar.dbtools.treatment_course import CURRTRT_ATTS
+from openmolar.dbtools.treatment_course import UPDATE_CURRTTMT2_QUERY
LOGGER = logging.getLogger("openmolar")
@@ -42,76 +44,12 @@ EXMPT_INS_QUERY = ('insert into exemptions '
'(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())')
-
-EST_LINK_INS_QUERY = (
- '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))
if changes == []:
@@ -120,229 +58,202 @@ def all_changes(pt, changes):
pt.serialno)
)
return True
- else:
- # set up some booleans to prevent multiple updates of the same data
- # example exemption AND exemption text have changed..
- exemptionsHandled = False
-
- if pt.HIDDENNOTES != []:
- #-- hidden notes is
- #-- treatment codes... money, printing etc..
- LOGGER.debug("saving hiddennotes")
- toNotes(pt.serialno, pt.HIDDENNOTES)
- pt.clearHiddenNotes()
-
- sqlcommands = {}
- estimate_commands = {}
- patchanges, patvalues = "", []
- trtchanges, trtvalues = "", []
- post_cleanup_commands = []
-
- for change in changes:
- if change == "courseno":
- 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)
-
- elif change in patient_class.patientTableAtts:
- patvalues.append(pt.__dict__[change])
- patchanges += '%s = %%s,' % change
-
- elif (change in patient_class.exemptionTableAtts and
- 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),)
-
- elif change == "synopsis":
- values = (pt.serialno, pt.synopsis,
- localsettings.operator)
-
- 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:
- #-- generate a dictionary with the
- #-- autogenerated db indexas key
- if est.ix is not None:
- oldEstDict[est.ix] = est
-
- for est in pt.estimates:
- 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)
-
- 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):
- #-- have to use the str because est class does not
- #-- have a _eq_ property ??
- query = 'update newestimates set '
- values = []
- if oldEst.number != est.number:
- query += "number=%s,"
- values.append(est.number)
- if oldEst.itemcode != est.itemcode:
- query += 'itemcode=%s,'
- values.append(est.itemcode)
- if oldEst.description != est.description:
- query += 'description=%s,'
- values.append(est.description)
- if oldEst.fee != est.fee:
- query += 'fee=%s,'
- values.append(est.fee)
- if oldEst.ptfee != est.ptfee:
- query += "ptfee=%s,"
- values.append(est.ptfee)
- if oldEst.feescale != est.feescale:
- query += 'feescale=%s,'
- values.append(pt.feescale)
- if oldEst.csetype != est.csetype:
- query += 'csetype=%s,'
- values.append(est.csetype)
- if oldEst.dent != est.dent:
- query += 'dent=%d,'
- values.append(est.dent)
-
- query += ('modified_by = %s, '
- 'time_stamp = NOW() where ix = %s')
-
- values.append(localsettings.operator)
- values.append(est.ix)
-
- estimate_commands["updates"].append(
- (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!
- for ix, old_est in oldEstDict.iteritems():
- #--removed
- if old_est.courseno == pt.courseno0:
- values = (ix,)
- 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:
- 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
- trtvalues.append(value)
-
- elif change == "appt_prefs":
- pt.appt_prefs.commit_changes()
-
- result = True
- if patchanges != "":
+ success = True
+ # set up some booleans to prevent multiple updates of the same data
+ # example exemption AND exemption text have changed..
+ exemptionsHandled = False
+
+ if pt.HIDDENNOTES != []:
+ #-- hidden notes is
+ #-- treatment codes... money, printing etc..
+ LOGGER.debug("saving hiddennotes")
+ toNotes(pt.serialno, pt.HIDDENNOTES)
+ pt.clearHiddenNotes()
+
+ sqlcommands = {}
+ estimate_commands = {}
+ patchanges, patvalues = [], []
+ static_changes, static_values = [], []
+ date_changes, date_values = [], []
+ nhs_changes, nhs_values = [], []
+ trtchanges, trtvalues = "", []
+
+ # money handled slightly differently. more complex query.
+ money_changes, money_values = [], []
+
+ for change in changes:
+ if change == "courseno":
+ pass # these values should never get munged.
+
+ elif change in patient_class.money_table_atts:
+ money_changes.append(change)
+ money_values.append(pt.__dict__[change])
+
+ elif change in patient_class.patientTableAtts:
+ # patchanges += '%s = %%s,' % change
+ patchanges.append(change)
+ patvalues.append(pt.__dict__[change])
+
+ elif change in patient_class.date_table_atts:
+ date_changes.append(change)
+ date_values.append(pt.__dict__[change])
+
+ elif change in patient_class.static_table_atts:
+ static_changes.append(change.rstrip("st"))
+ static_values.append(pt.__dict__[change])
+
+ elif change in patient_class.nhs_table_atts:
+ nhs_changes.append(change)
+ nhs_values.append(pt.__dict__[change])
+
+ elif (change in patient_class.exemptionTableAtts and
+ 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),)
+
+ elif change == "synopsis":
+ values = (pt.serialno, pt.synopsis,
+ localsettings.operator)
+
+ sqlcommands['clinical_memos'] = ((SYNOPSIS_INS_QUERY, values),)
+
+ 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
+ trtvalues.append(value)
+
+ elif change == "appt_prefs":
+ pt.appt_prefs.commit_changes()
+
+ elif change == "estimates":
+ pass # dealt with below
+
+ if patchanges:
+ query = "update new_patients SET %s where serialno=%%s" % \
+ ", ".join(["%s = %%s" % change for change in patchanges])
patvalues.append(pt.serialno)
- values = tuple(patvalues)
+ sqlcommands['patients'] = ((query, patvalues),)
+
+ if static_changes:
+ LOGGER.warning(
+ "applying static_changes %s values %s",
+ static_changes,
+ static_values)
+ query = '''insert into static_chart (pt_sno, %s) values (%%s, %s)
+ on duplicate key update %s''' % (
+ ", ".join(static_changes),
+ ", ".join(("%s",) * len(static_changes)),
+ ", ".join(["%s = %%s" % change for change in static_changes])
+ )
+ values = [pt.serialno] + static_values * 2
+ sqlcommands['static'] = ((query, values),)
- query = "update patients SET %s where serialno=%%s" % patchanges.strip(
- ",")
+ if nhs_changes:
+ LOGGER.warning(
+ "applying nhs_changes %s values %s",
+ nhs_changes,
+ nhs_values)
+ query = '''insert into patient_nhs (pt_sno, %s) values (%%s, %s)
+ on duplicate key update %s''' % (
+ ", ".join(nhs_changes),
+ ", ".join(("%s",) * len(nhs_changes)),
+ ", ".join(["%s = %%s" % change for change in nhs_changes])
+ )
+ values = [pt.serialno] + nhs_values * 2
+ sqlcommands['nhs'] = ((query, values),)
- sqlcommands['patients'] = ((query, values),)
+ if date_changes:
+ LOGGER.warning(
+ "applying date_changes %s values %s",
+ date_changes,
+ date_values)
+ query = '''insert into patient_dates (pt_sno, %s) values (%%s, %s)
+ on duplicate key update %s''' % (
+ ", ".join(date_changes),
+ ", ".join(("%s",) * len(date_changes)),
+ ", ".join(["%s = %%s" % change for change in date_changes])
+ )
+ values = [pt.serialno] + date_values * 2
+ sqlcommands['patient_dates'] = ((query, values),)
+
+ if money_changes:
+ update_money_values = []
+ update_query = "update "
+ for i, change in enumerate(money_changes):
+ if change in ("money0", "money1"):
+ diff = pt.__dict__[change] - pt.dbstate.__dict__[change]
+ update_money_values.append(diff)
+ update_query += "%s=%s +%%s, " % (change, change)
+ else:
+ update_money_values.append(money_values[i])
+ update_query += "%s=%%s, " % change
+
+ LOGGER.warning(
+ "applying money_changes %s values %s addition_values %s",
+ money_changes,
+ money_values,
+ update_money_values)
+ query = '''insert into patient_money (pt_sno, %s) values (%%s, %s)
+ on duplicate key %s''' % (
+ ", ".join(money_changes),
+ ", ".join(("%s",) * len(money_changes)),
+ update_query.rstrip(", ")
+ )
+ values = [pt.serialno] + money_values + update_money_values
+ LOGGER.debug(query.replace("\n", " "))
+ LOGGER.debug(values)
+ sqlcommands['patient_money'] = ((query, values),)
if trtchanges != "":
trtvalues.append(pt.serialno)
trtvalues.append(pt.treatment_course.courseno)
- values = tuple(trtvalues)
- query = ('update currtrtmt2 SET '
- '%s where serialno=%%s and courseno=%%s' % (trtchanges.strip(",")))
- sqlcommands['currtrtmt'] = ((query, values),)
+ query = UPDATE_CURRTTMT2_QUERY % (trtchanges.strip(","))
+ sqlcommands['currtrtmt'] = ((query, trtvalues),)
- if sqlcommands != {} or estimate_commands != {}:
- LOGGER.debug(sqlcommands)
- LOGGER.debug(estimate_commands)
+ try:
db = connect()
- cursor = db.cursor()
- tables = sqlcommands.keys()
- for table in tables:
- for query, values in sqlcommands[table]:
- try:
- cursor.execute(query, values)
- except Exception as exc:
- LOGGER.exception("error executing query %s" % query)
- result = False
-
- insert_commands = estimate_commands.get("insertions", [])
- for query, values, tx_hashes in insert_commands:
- try:
- cursor.execute(query, values)
- ix = cursor.lastrowid
- try:
- for tx_hash in tx_hashes:
- 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" % (
- EST_LINK_INS_QUERY, vals))
- result = False
- except Exception as exc:
- LOGGER.exception("error executing query\n %s\n %s" % (
- query, str(values)))
- result = False
-
- update_commands = estimate_commands.get("updates", [])
- for query, values, estimate in update_commands:
- try:
- cursor.execute(query, values)
- 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)
- )
- except Exception as exc:
- LOGGER.exception("error updating estimate %s" % estimate)
- result = False
-
- cursor.close()
-
- for func, values in post_cleanup_commands:
- func.__call__(values)
-
+ db.autocommit = False
+
+ if sqlcommands != {}:
+ LOGGER.debug(sqlcommands)
+ cursor = db.cursor()
+ tables = sqlcommands.keys()
+ for table in tables:
+ for query, values in sqlcommands[table]:
+ try:
+ cursor.execute(query, values)
+ except Exception as exc:
+ LOGGER.error("error executing query %s" % query)
+ raise exc
+
+ cursor.close()
+
+ if "estimates" in changes:
+ estimates.apply_changes(pt, pt.dbstate.estimates, pt.estimates)
db.commit()
- return result
+ except Exception as exc:
+ LOGGER.exception("rolling back database")
+ db.rollback()
+ success = False
+ raise exc
+ finally:
+ db.autocommit = True
+
+ return success
def toNotes(serialno, newnotes):
@@ -406,42 +317,50 @@ def toNotes(serialno, newnotes):
return rows > 0
-def discreet_changes(pt_changed, changes):
+def discreet_changes(pt, changes):
'''
this updates only the selected atts
(usually called by automated proc such as recalls...
and accounts) only updates the patients table
'''
- LOGGER.debug("write changes - discreet changes")
+ LOGGER.warning("discreet changes sno=%s %s", pt.serialno, changes)
+ if not changes:
+ LOGGER.error("no changes passed")
+ values = []
+ for change in changes:
+ values.append(pt.__dict__[change])
+ values.append(pt.serialno)
+
+ query = "update new_patients SET %s where serialno=%%s" % \
+ ", ".join(["%s = %%s" % change for change in changes])
- sqlcond = ""
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(query, values)
+ db.commit()
+ cursor.close()
+ return True
+
+
+def discreet_money_changes(pt, changes):
+ '''
+ update patient_monet attributes.
+ '''
+ LOGGER.warning("discreet_money_changes sno=%s %s", pt.serialno, changes)
+ if not changes:
+ LOGGER.error("no changes passed!")
+ return
+ values = []
for change in changes:
- value = pt_changed.__dict__[change]
- LOGGER.debug("discreet change %s %s" % (change, type(value)))
- if change in patient_class.dateFields:
- 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)
-
- sqlcommand = "update patients SET %s where serialno=%%s" % (
- sqlcond.strip(","))
-
- LOGGER.debug("%s (%s,)" % (sqlcommand, pt_changed.serialno))
-
- result = True
- if sqlcond != "":
- db = connect()
- cursor = db.cursor()
- try:
- cursor.execute(sqlcommand, (pt_changed.serialno,))
- db.commit()
- except Exception as e:
- LOGGER.exception("unable to write discreet changes")
- result = False
- cursor.close()
- return result
+ values.append(pt.__dict__[change])
+ values.append(pt.serialno)
+
+ query = "update patient_money SET %s where pt_sno=%%s" % \
+ ", ".join(["%s = %%s" % change for change in changes])
+
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(query, values)
+ db.commit()
+ cursor.close()
+ return True
diff --git a/src/openmolar/dbtools/paymentHistory.py b/src/openmolar/dbtools/paymentHistory.py
index 889562b..80558ea 100644
--- a/src/openmolar/dbtools/paymentHistory.py
+++ b/src/openmolar/dbtools/paymentHistory.py
@@ -25,7 +25,6 @@
from __future__ import division
from openmolar.settings import localsettings
from openmolar.connect import connect
-from openmolar.dbtools.cashbook import cashbookCodesDict
HEADERS = (
_("Date"),
@@ -81,7 +80,7 @@ def summary_details(sno, start_date):
retarg += '<td>%s</td>' % (row[0])
retarg += '<td>%s</td>' % localsettings.ops.get(row[1])
- CODE = cashbookCodesDict.get(row[2], "UNKNOWN")
+ CODE = localsettings.cashbookCodesDict.get(row[2], "UNKNOWN")
retarg += '<td>%s</td>' % CODE
amt = row[3]
@@ -137,7 +136,7 @@ def details(sno):
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")
+ CODE = localsettings.cashbookCodesDict.get(row[3], "UNKNOWN")
retarg += '<td>%s</td>' % CODE
amt = row[4]
amt_str = localsettings.formatMoney(amt)
diff --git a/src/openmolar/dbtools/queries.py b/src/openmolar/dbtools/queries.py
index be17ce0..3125d34 100644
--- a/src/openmolar/dbtools/queries.py
+++ b/src/openmolar/dbtools/queries.py
@@ -22,22 +22,32 @@
# # # #
# ############################################################################ #
-ESTS_QUERY = '''SELECT newestimates.ix, number, itemcode, description,
-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 and courseno=%s order by itemcode, ix'''
+PATIENT_QUERY_FIELDS = (
+"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", "cset", "dnt1", "dnt2", "courseno0",
+"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", "dent0",
+"dent1", "dent2", "dent3", "billdate", "billct", "billtype",
+"money11", "familyno", "memo", "town", "county", "mobile", "fax", "email1",
+"email2", "status", "initaccept", "lastreaccept",
+"lastclaim", "expiry", "cstatus", "transfer", "pstatus"
+)
-PATIENT_QUERY = '''SELECT 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
-from patients where serialno = %s'''
+PATIENT_QUERY = '''SELECT %s
+from new_patients
+left join patient_money on serialno = patient_money.pt_sno
+left join static_chart on serialno = static_chart.pt_sno
+left join patient_dates on serialno = patient_dates.pt_sno
+left join patient_nhs on serialno = patient_nhs.pt_sno
+where serialno = %%s''' % ", ".join(PATIENT_QUERY_FIELDS)
+
+FUTURE_EXAM_QUERY = '''select count(*) from aslot
+where serialno=%s
+and (code0="EXAM" or code1="EXAM" or code2="EXAM") and adate >= CURDATE()'''
+
+PSN_QUERY = "select psn from previous_snames where serialno=%s order by ix desc"
+
+FAMILY_COUNT_QUERY = "select count(*) from new_patients where familyno=%s"
diff --git a/src/openmolar/dbtools/recall.py b/src/openmolar/dbtools/recall.py
index d1b725c..e2803bc 100644
--- a/src/openmolar/dbtools/recall.py
+++ b/src/openmolar/dbtools/recall.py
@@ -35,6 +35,16 @@ HEADERS = (
_("County"), _("PostCode"), _("Dentist"), _("Family No"), _("Recall Date"))
+# note the word CONDITIONS in this query - replaced dynamically at runtime
+RECALL_QUERY = '''
+select new_patients.serialno, title, fname, sname, dnt1, familyno, dob,
+addr1, addr2, addr3, town, county, pcde, recdent
+from new_patients join appt_prefs
+on new_patients.serialno = appt_prefs.serialno
+where CONDITIONS and status != "DECEASED"
+order by familyno DESC, addr1, dob, fname, sname'''
+
+
class RecalledPatient(object):
'''
@@ -142,14 +152,8 @@ def getpatients(conditions="", values=()):
'''
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
- from patients join appt_prefs on patients.serialno = appt_prefs.serialno
- where CONDITIONS and status != "DECEASED"
- order by familyno DESC, addr1, dob, fname, sname'''
- query = query.replace("CONDITIONS", conditions)
+ query = RECALL_QUERY.replace("CONDITIONS", conditions)
db = connect()
cursor = db.cursor()
@@ -176,7 +180,7 @@ def getpatients(conditions="", values=()):
if __name__ == "__main__":
localsettings.initiate()
- conditions = "recd>=%s and recd<=%s and dnt1=%s"
+ conditions = "recdent>=%s and recdent<=%s and dnt1=%s"
values = date(2012, 7, 1), date(2012, 7, 31), 6
patients = getpatients(conditions, values)
print patients
diff --git a/src/openmolar/dbtools/referral.py b/src/openmolar/dbtools/referral.py
new file mode 100644
index 0000000..5bfe5f8
--- /dev/null
+++ b/src/openmolar/dbtools/referral.py
@@ -0,0 +1,190 @@
+#! /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 time
+import datetime
+from collections import namedtuple
+
+from openmolar.settings import localsettings
+from openmolar.connect import connect
+
+QUERY = "SELECT description FROM referral_centres"
+
+ADDRESS_QUERY = '''
+SELECT greeting, addr1, addr2, addr3, addr4, addr5, addr6, addr7
+FROM referral_centres where description = %s'''
+
+EDIT_QUERY = '''SELECT ix, description, greeting, addr1, addr2,
+addr3, addr4, addr5, addr6, addr7 FROM referral_centres order by ix'''
+
+UPDATE_QUERY = '''UPDATE referral_centres
+SET description=%s, greeting=%s, addr1=%s, addr2=%s,
+addr3=%s, addr4=%s, addr5=%s, addr6=%s, addr7=%s WHERE ix=%s'''
+
+INSERT_QUERY = '''INSERT INTO referral_centres
+(description, greeting, addr1, addr2, addr3, addr4, addr5, addr6, addr7)
+VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)'''
+
+DELETE_QUERY = 'DELETE FROM referral_centres WHERE ix=%s'
+
+HTML = '''
+<html><body>
+<br /><br /><br /><br /><br /><br />
+<b>%s</b><!-- referral centre postal address -->
+<br /><br />
+%s<!-- date -->
+<br /><br />
+%s<!-- greeting -->
+<br />
+<div align="center">
+<b>%s %s %s - %s %s</b><br /><!-- patient name and dob -->
+%s<!-- patient address -->
+<br />
+%s<!-- patient tel -->
+</div>
+<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
+%s<!-- sign off -->
+<br /><br />
+</body></html>'''
+
+
+ReferralCentre = namedtuple('ReferralCentre',
+ ('ix', 'description', 'greeting', 'addr1', 'addr2',
+'addr3', 'addr4', 'addr5', 'addr6', 'addr7')
+ )
+
+
+def getDescriptions():
+ descriptions = []
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(QUERY)
+ for row in cursor.fetchall():
+ descriptions.append(row[0])
+ cursor.close()
+ return descriptions
+
+def get_referral_centres():
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(EDIT_QUERY)
+ for row in cursor.fetchall():
+ yield ReferralCentre(*row)
+ cursor.close()
+
+def insert_centres(centres):
+ values = []
+ for centre in centres:
+ values.append((centre.description,
+ centre.greeting,
+ centre.addr1,
+ centre.addr2,
+ centre.addr3,
+ centre.addr4,
+ centre.addr5,
+ centre.addr6,
+ centre.addr7)
+ )
+ if values != []:
+ db = connect()
+ cursor = db.cursor()
+ cursor.executemany(INSERT_QUERY, values)
+ cursor.close()
+
+def update_centres(centres):
+ values = []
+ for centre in centres:
+ values.append((centre.description,
+ centre.greeting,
+ centre.addr1,
+ centre.addr2,
+ centre.addr3,
+ centre.addr4,
+ centre.addr5,
+ centre.addr6,
+ centre.addr7,
+ centre.ix)
+ )
+ if values != []:
+ db = connect()
+ cursor = db.cursor()
+ cursor.executemany(UPDATE_QUERY, values)
+ cursor.close()
+
+def delete_centres(centres):
+ values = []
+ for centre in centres:
+ values.append((centre.ix,))
+ if values != []:
+ db = connect()
+ cursor = db.cursor()
+ cursor.executemany(DELETE_QUERY, values)
+ cursor.close()
+
+def getHtml(description, pt):
+ '''
+ get the HTML for a letter to
+ referral_centre identified by description about this pt
+ '''
+ descriptions = []
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(ADDRESS_QUERY, (description,))
+ row = cursor.fetchone()
+ cursor.close()
+ if not row:
+ return HTML
+
+ greeting, addr1, addr2, addr3, addr4, addr5, addr6, addr7 = row
+
+ tel = _("Telephone") + " :- "
+ for i, val in enumerate((pt.tel1, pt.tel2, pt.mobile)):
+ if val != "":
+ tel += "%s %s " % (
+ (_("home"), _("work "), _("mobile "))[i],
+ val)
+
+ return HTML % (
+
+ "<br />".join(
+ [a for a in (
+ addr1, addr2, addr3, addr4, addr5, addr6, addr7) if a != ""]),
+ localsettings.longDate(localsettings.currentDay()),
+ greeting,
+ pt.title.title(), pt.fname.title(), pt.sname.title(),
+ _("D.O.B."), localsettings.formatDate(pt.dob),
+ ",".join(
+ [a for a in
+ (pt.addr1, pt.addr2, pt.addr3, pt.town,
+ pt.county, pt.pcde) if a != ""]),
+ tel,
+ _("Yours Sincerely"))
+
+if __name__ == "__main__":
+ localsettings.initiate()
+ from openmolar.dbtools import patient_class
+ pt = patient_class.patient(4)
+ d = getDescriptions()
+ print d
+ print getHtml(d[0], pt)
diff --git a/src/openmolar/dbtools/schema_version.py b/src/openmolar/dbtools/schema_version.py
index 26d15d4..57ed5ab 100644
--- a/src/openmolar/dbtools/schema_version.py
+++ b/src/openmolar/dbtools/schema_version.py
@@ -28,24 +28,27 @@ from openmolar.settings import localsettings
LOGGER = logging.getLogger("openmolar")
+SELECT_QUERY = 'select max(data) from settings where value = "Schema_Version"'
+
+INSERT_QUERY = '''insert into settings (value,data,modified_by,time_stamp)
+values (%s, %s, %s, NOW())'''
+
+DELETE_QUERY = 'delete from settings where value = "compatible_clients"'
+
+COMPAT_QUERY = '''insert into settings (value, data, modified_by, time_stamp)
+values ("compatible_clients", %s, 'Update script', NOW())'''
+
def getVersion():
try:
db = connect.connect()
cursor = db.cursor()
- query = 'select data from settings where value = "Schema_Version"'
- cursor.execute(query)
- rows = cursor.fetchall()
+ cursor.execute(SELECT_QUERY)
+ version = cursor.fetchone()[0]
except connect.ProgrammingError as ex:
LOGGER.warning("no settings table! %s" % ex)
LOGGER.warning("schema assumed to be 1.0")
- return "1.0"
-
- version = ""
- for row in rows:
- data = row[0]
- if data > version:
- version = data
+ version = "1.0"
localsettings.DB_SCHEMA_VERSION = version
return version
@@ -76,21 +79,16 @@ def update(schemas, user):
latest_schema = schemas[-1]
db = connect.connect()
cursor = db.cursor()
- query = '''insert into settings (value,data,modified_by,time_stamp)
- values (%s, %s, %s, NOW())'''
values = ("Schema_Version", latest_schema, user)
LOGGER.info("making the db aware of it's schema version")
- cursor.execute(query, values)
+ cursor.execute(INSERT_QUERY, values)
+
+ LOGGER.info("disabling ALL old clients")
+ cursor.execute(DELETE_QUERY)
- LOGGER.info("disabling old clients")
- query = '''delete from settings where value = "compatible_clients"'''
- cursor.execute(query)
- db.commit()
+ LOGGER.info("enabling compatible clients")
for schema in schemas:
- query = '''insert into settings (value, data, modified_by, time_stamp)
- values ("compatible_clients", %s, 'Update script', NOW())'''
values = (schema,)
- cursor.execute(query, values)
- db.commit()
+ cursor.execute(COMPAT_QUERY, values)
return True
diff --git a/src/openmolar/dbtools/search.py b/src/openmolar/dbtools/search.py
index 015a2e6..1aac891 100644
--- a/src/openmolar/dbtools/search.py
+++ b/src/openmolar/dbtools/search.py
@@ -25,72 +25,88 @@
'''this script connects to the database and performs searches'''
import datetime
+import logging
import sys
from openmolar.connect import connect
from openmolar.settings import localsettings
+LOGGER = logging.getLogger("openmolar")
+
+ALL_PATIENTS_QUERY = \
+ '''SELECT serialno, status, title, fname, sname, dob, addr1, addr2, town,
+pcde, tel1, tel2, mobile FROM new_patients ORDER BY sname, fname'''
+
+
+def all_patients():
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(ALL_PATIENTS_QUERY)
+ results = cursor.fetchall()
+ cursor.close()
+
+ return results
+
+
def getcandidates(dob, addr, tel, sname, similar_sname, fname,
similar_fname, pcde):
'''
this searches the database for patients matching the given fields
'''
- query = ''
+ conditions = []
values = []
if addr != '':
- query += '(ADDR1 like %s or ADDR2 like %s) and '
- values.append("%" + addr + "%")
- values.append("%" + addr + "%")
+ conditions.append('(ADDR1 like %s or ADDR2 like %s or town like %s)')
+ values += ["%" + addr + "%"] * 3
if tel != '':
- query += 'tel1 like %s and '
- values.append("%" + tel + "%")
+ conditions.append('tel1 like %s or tel2 like %s or mobile like %s')
+ values += ["%" + tel + "%"] * 3
if dob != datetime.date(1900, 1, 1):
- query += 'dob = %s and '
+ conditions.append('dob = %s')
values.append(dob)
if pcde != '':
- query += 'pcde like %s and '
+ conditions.append('pcde like %s')
values.append("%" + pcde + "%")
if sname != '':
if similar_sname:
- query += 'sname sounds like %s and '
+ conditions.append('sname sounds like %s')
values.append(sname)
else:
sname += "%"
if "'" in sname:
- query += '(sname like %s or sname like %s) and '
+ conditions.append('(sname like %s or sname like %s)')
values.append(sname)
values.append(sname.replace("'", ""))
elif sname[:1] == "o":
- query += '(sname like %s or sname like %s) and '
+ conditions.append('(sname like %s or sname like %s)')
values.append(sname)
values.append("o'" + sname[1:])
elif sname[:2] == "mc":
- query += '(sname like %s or sname like %s) and '
+ conditions.append('(sname like %s or sname like %s)')
values.append(sname)
values.append(sname.replace("mc", "mac"))
elif sname[:3] == "mac":
- query += '(sname like %s or sname like %s) and '
+ conditions.append('(sname like %s or sname like %s)')
values.append(sname)
values.append(sname.replace("mac", "mc"))
else:
- query += 'sname like %s and '
+ conditions.append('sname like %s')
values.append(sname)
if fname != '':
if similar_fname:
- query += 'fname sounds like %s and '
+ conditions.append('fname sounds like %s')
values.append(fname)
else:
- query += 'fname like %s and '
+ conditions.append('fname like %s')
values.append(fname + "%")
- 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[0: query.rindex("and")])
+ if conditions:
+ conditional = "WHERE %s ORDER BY" % " AND ".join(conditions)
+ query = ALL_PATIENTS_QUERY.replace("ORDER BY", conditional)
+ LOGGER.debug(query.replace("\n", " "))
+ LOGGER.debug(values)
db = connect()
cursor = db.cursor()
cursor.execute(query, tuple(values))
@@ -103,24 +119,28 @@ def getcandidates(dob, addr, tel, sname, similar_sname, fname,
def getcandidates_from_serialnos(list_of_snos):
- 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")])
+ '''
+ this probably never actually gets called now, as it relates to a time when
+ "double appointments" were commonplace.
+ '''
+ format_snos = ",". join(('%s',) * len(list_of_snos)) # %s,%s,%s
+ conditional = "WHERE serialno in (%s) ORDER BY" % format_snos
+ query = ALL_PATIENTS_QUERY.replace("ORDER BY", conditional)
- db = connect()
- cursor = db.cursor()
- cursor.execute(query)
- results = cursor.fetchall()
- cursor.close()
- # db.close()
- return results
- else:
- return()
+ db = connect()
+ cursor = db.cursor()
+ cursor.execute(query, list_of_snos)
+ results = cursor.fetchall()
+ cursor.close()
+ return results
if __name__ == '__main__':
- print getcandidates(datetime.date(1900, 1, 1), "", "", "smit", "", "", "", "")
- # print getcandidates_from_serialnos((1,2,3,4))
+ values = (datetime.date(1969, 12, 9), "Gables", "772378",
+ "wallace", "", "neil", "", "IV2")
+ new_vals = getcandidates(*values)
+ for candidate in new_vals:
+ print candidate
+
+ snos = (1, 2, 3)
+ for candidate in getcandidates_from_serialnos(snos):
+ print candidate
diff --git a/src/openmolar/dbtools/treatment_course.py b/src/openmolar/dbtools/treatment_course.py
index 04b1ff6..0c7355e 100644
--- a/src/openmolar/dbtools/treatment_course.py
+++ b/src/openmolar/dbtools/treatment_course.py
@@ -22,39 +22,42 @@
# # # #
# ############################################################################ #
-from copy import deepcopy
import logging
-import re
from openmolar import connect
from openmolar.settings import localsettings
LOGGER = logging.getLogger("openmolar")
-CURRTRT_NON_TOOTH_ATTS = ('xray', 'perio', 'anaes',
- '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')
+CURRTRT_NON_TOOTH_ATTS = (
+ 'xray', 'perio', 'anaes', 'other', 'ndu', 'ndl', 'odu', 'odl', 'custom')
+
+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')
+
+CURRTRT_ROOT_ATTS = CURRTRT_NON_TOOTH_ATTS + UPPERS + LOWERS
+
+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', 'ftr')
QUERY = "SELECT "
for field in CURRTRT_ATTS:
@@ -62,6 +65,61 @@ for field in CURRTRT_ATTS:
QUERY = QUERY.rstrip(", ")
QUERY += " from currtrtmt2 where serialno=%s and courseno=%s"
+MAX_COURSE_QUERY = "select max(courseno) from currtrtmt2 where serialno=%s"
+DATE_QUERY = "select accd, cmpd, examd from currtrtmt2 where courseno=%s"
+UPDATE_DATES_QUERY = "update currtrtmt2 set accd=%s, cmpd=%s where courseno=%s"
+
+UPDATE_CURRTTMT2_QUERY = (
+ 'UPDATE currtrtmt2 SET %s WHERE serialno=%%s and courseno=%%s')
+
+DELETE_CURRTTMT2_QUERY = (
+ 'DELETE from currtrtmt2 WHERE serialno=%s and courseno=%s')
+
+UPDATE_ESTS_COURSENO_QUERY = (
+ 'UPDATE newestimates SET courseno=%s WHERE courseno=%s')
+
+
+def get_course_dates(courseno):
+ db = connect.connect()
+ cursor = db.cursor()
+ cursor.execute(DATE_QUERY, (courseno, ))
+ row = cursor.fetchone()
+ cursor.close()
+ return row
+
+
+def update_course_dates(accd, cmpd, courseno):
+ db = connect.connect()
+ cursor = db.cursor()
+ cursor.execute(UPDATE_DATES_QUERY, (accd, cmpd, courseno, ))
+ cursor.close()
+
+
+def update_estimate_courseno(courseno_orig, courseno_new):
+ db = connect.connect()
+ cursor = db.cursor()
+ cursor.execute(UPDATE_ESTS_COURSENO_QUERY, (courseno_new, courseno_orig))
+ cursor.close()
+
+
+def update_course(query_insert, values, serialno, courseno):
+ assert len(values) == query_insert.count("=")
+ query = UPDATE_CURRTTMT2_QUERY % query_insert
+ values.append(serialno)
+ values.append(courseno)
+ db = connect.connect()
+ cursor = db.cursor()
+ result = cursor.execute(query, values)
+ cursor.close()
+ return result
+
+
+def delete_course(serialno, courseno):
+ db = connect.connect()
+ cursor = db.cursor()
+ cursor.execute(DELETE_CURRTTMT2_QUERY % (serialno, courseno))
+ cursor.close()
+
class TreatmentCourse(object):
@@ -158,14 +216,13 @@ class TreatmentCourse(object):
self.examd = ''
self.accd = None
self.cmpd = None
+ self.ftr = None
+ # this next line gives me a way to create a Mock Instance of the class
if self.courseno == 0:
return
- db = connect.connect()
- cursor = db.cursor()
self.getCurrtrt()
- cursor.close()
def __repr__(self):
message = "TreatmentCourse for patient %s courseno %s\n" % (
@@ -206,26 +263,21 @@ class TreatmentCourse(object):
def getCurrtrt(self):
db = connect.connect()
cursor = db.cursor()
-
cursor.execute(QUERY, (self.serialno, self.courseno))
-
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]))
cursor.close()
@property
def underTreatment(self):
- return (not self.accd in ("", None) and self.cmpd in ("", None))
+ return not self.accd in ("", None) and self.cmpd in ("", None)
@property
def max_tx_courseno(self):
db = connect.connect()
cursor = db.cursor()
- if cursor.execute(
- "select max(courseno) from currtrtmt2 where serialno=%s",
- (self.serialno,)):
+ if cursor.execute(MAX_COURSE_QUERY, (self.serialno,)):
cno = cursor.fetchone()[0]
else:
cno = 0
@@ -254,6 +306,12 @@ class TreatmentCourse(object):
'''
self.cmpd = cmpd
+ def set_ftr(self, ftr):
+ '''
+ ftr = "Failed to Return"
+ '''
+ self.ftr = ftr
+
@property
def has_treatment_outstanding(self):
for att in CURRTRT_ATTS:
@@ -356,26 +414,143 @@ class TreatmentCourse(object):
'''
return self.cmp_txs(att) + self.pl_txs(att)
+ @property
+ def course_duration(self):
+ if not self.cmpd:
+ return (_("still ongoing"))
+ else:
+ days = (self.cmpd - self.accd).days + 1
+ if days == 1:
+ return "1 %s" % _("day")
+ return "%s %s" % (days, _("days"))
+
+ def to_html(self, allow_edit=False, days_elapsed=None, completed_only=False):
+ def sorted_work(work):
+ items = work.split(" ")
+ return " ".join(sorted([item for item in items if item != ""]))
+
+ if allow_edit:
+ edit_str = '''<a href="edit_courseno?%s">%s</a><br />
+ <a href="edit_tx_courseno?%s">%s</a>
+ <!--merge-->''' % (
+ self.courseno, _("Edit Course Dates"),
+ self.courseno, _("Edit Treatments"))
+ else:
+ edit_str = ""
+
+ if days_elapsed is None:
+ days_str = ""
+ else:
+ days_str = " (%s %s)" % (days_elapsed, _("days earlier"))
+
+ html = '''
+ <h4>%s %s %s</h4>
+ <font color="red">%s</font>
+ <table width = "100%%" border = "1">
+ <tr>
+ <th width="20%%" colspan="1" bgcolor="#ffff99">%s</th>
+ <th width="20%%" colspan="1" bgcolor="#ffff99">
+ %s %s<br />%s %s
+ </th>
+ <th width="60%%" bgcolor="#ffff99">%s %s</th>
+ </tr>
+ ''' % (
+ _("Course Number"), self.courseno, days_str,
+ _("PATIENT FAILED TO RETURN") if self.ftr else "",
+ edit_str,
+ _("Opened"), localsettings.formatDate(self.accd),
+ _("Closed"), localsettings.formatDate(self.cmpd),
+ _("Duration"), self.course_duration,
+ )
+
+ attributes = ("cmp",) if completed_only else ("pl", "cmp")
+
+ #-plan row.
+ for planned in attributes:
+ rows = []
+
+ if planned == "pl":
+ bgcolor = ' bgcolor = "#eeeeee"'
+ header = "%s<br />%s" % (_("Planned"), _("or incomplete"))
+ else:
+ bgcolor = ' bgcolor = "#ddeeee"'
+ header = _("Completed")
+ if self.examt != "":
+ exam_details = self.examt
+ if self.examd:
+ exam_details += " %s - %s" % (
+ _("dated"),
+ localsettings.formatDate(self.examd))
+ cells = "<th%s>%s</th>\n<td>%s</td>\n" % (
+ bgcolor, _("Exam"), exam_details)
+ rows.append(cells)
+
+ for att, con_att in (
+ ("perio", _("perio")),
+ ("xray", _('xray')),
+ ("anaes", _('anaes')),
+ ("other", _('other')),
+ ("custom", _("custom")),
+ ('ndu', _("New Denture (upper)")),
+ ('ndl', _("New Denture (lower)")),
+ ('odu', _("Other Denture (upper)")),
+ ('odl', _("Other Denture (lower)")),
+ ):
+ work = self.__dict__[att + planned]
+ if work.strip(" ") != "":
+ cells = "<th%s>%s</th>\n<td>%s</td>\n" % (
+ bgcolor, con_att, sorted_work(work))
+ rows.append(cells)
+
+ show_chart = False
+ row1, row2, row3, row4 = "<tr>", "<tr>", "<tr>", "<tr>"
+
+ for att in UPPERS:
+ work = self.__dict__[att + planned]
+ row1 += '<td>%s</td>\n' % sorted_work(work)
+ row2 += '<td align="center"%s>%s</td>\n' % (
+ bgcolor, att.upper())
+ show_chart = show_chart or work.strip(" ") != ""
+
+ for att in LOWERS:
+ work = self.__dict__[att + planned]
+ row3 += '<td align="center"%s>%s</td>\n' % (
+ bgcolor, att.upper())
+ row4 += '<td>%s</td>\n' % sorted_work(work)
+ show_chart = show_chart or work.strip(" ") != ""
+
+ if show_chart:
+ chart_cells = '''<td colspan="2">
+ <table width = "100%%" border = "1">
+ %s</tr>\n%s</tr>\n%s</tr>\n%s</tr>\n</table></td>
+ ''' % (row1, row2, row3, row4)
+ rows.append(chart_cells)
+
+ row_span = len(rows)
+
+ if rows != []:
+ html += '<tr>\n<th rowspan = "%s"%s>%s</th>\n' % (
+ row_span, bgcolor, header)
+ for row in rows:
+ if row == rows[0]:
+ html += "%s</tr>\n" % row
+ else:
+ html += "<tr>%s</tr>\n" % row
+
+ html += '</table>\n'
+ return html
+
if __name__ == "__main__":
'''
testing stuff
'''
-
- TEST_SNO = 11956
- db = connect.connect()
- cursor = db.cursor()
- cursor.execute("select courseno0 from patients where serialno = %s",
- (TEST_SNO,))
- courseno = cursor.fetchone()[0]
- cursor.close()
-
- tc = TreatmentCourse(TEST_SNO, 0)
- print tc
- print tc.underTreatment
-
- tc = TreatmentCourse(TEST_SNO, courseno)
+ tc = TreatmentCourse(14469, 45869)
print tc
print tc.non_tooth_plan_items
print tc.non_tooth_cmp_items
print tc.all_txs("ur5")
+
+ f = open("/home/neil/out.html", "w")
+ f.write(tc.to_html())
+ f.close()
diff --git a/src/openmolar/dbtools/writeNewPatient.py b/src/openmolar/dbtools/writeNewPatient.py
index 2820b14..cc2d981 100644
--- a/src/openmolar/dbtools/writeNewPatient.py
+++ b/src/openmolar/dbtools/writeNewPatient.py
@@ -37,9 +37,9 @@ def commit(pt):
sqlcond += '%s = %%s,' % attr
values.append(value)
- sqlcommand = "insert into patients SET %s serialno=%%s" % sqlcond
+ sqlcommand = "insert into new_patients SET %s serialno=%%s" % sqlcond
- query = "select max(serialno) from patients"
+ query = "select max(serialno) from new_patients"
Attempts = 0
while True:
@@ -64,7 +64,7 @@ def commit(pt):
newSerialno = -1
Attempts += 1
- if Attemps > 20:
+ if Attempts > 20:
break
# db.close()
return newSerialno
diff --git a/src/openmolar/firstRun.py b/src/openmolar/firstRun.py
deleted file mode 100755
index 75dbe13..0000000
--- a/src/openmolar/firstRun.py
+++ /dev/null
@@ -1,465 +0,0 @@
-#! /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 is only called if a settings file isn't found
-'''
-
-import sys
-import os
-import hashlib
-import base64
-import MySQLdb
-from PyQt4 import QtGui, QtCore
-from xml.dom import minidom
-
-from openmolar.qt4gui.compiled_uis.Ui_newSetup import Ui_MainWindow
-from openmolar.settings import localsettings
-
-blankXML = '''<?xml version="1.1" ?>
-<settings>
-<system_password> </system_password>
-<connection name="existing_database">
- <version>1.1</version>
- <server>
- <location> </location>
- <port> </port>
- </server>
- <database>
- <dbname> </dbname>
- <user> </user>
- <password> </password>
- </database>
-</connection>
-</settings>'''
-
-
-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(NewSetupMainWindow, self).__init__(parent)
- self.setupUi(self)
- self.stackedWidget.setCurrentIndex(0)
- self.PASSWORD = ""
- self.HOST = ""
- self.PORT = 3306
- self.DB = ""
- self.MysqlPassword = ""
- self.MysqlUser = ""
- self.rootpass = ""
- self.signals()
- 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 += _("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' "
- advice += _("on the command line, or delete the file")
- advice += "<br />" + "~/.openmolar/openmolar.conf" + "<br />" * 2
- advice += _(
- "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.rootPassword_checkBox, QtCore.SIGNAL(
- "stateChanged(int)"), self.rootechomode)
-
- self.connect(self.mainpassword_checkBox, QtCore.SIGNAL(
- "stateChanged(int)"), self.echomode)
-
- self.connect(self.dbpassword_checkBox, QtCore.SIGNAL(
- "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)
-
- 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):
- '''
- throws up a message box
- '''
- if warning:
- QtGui.QMessageBox.warning(self, _("Error"), message)
- else:
- 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: # welcome screen
- self.stackedWidget.setCurrentIndex(1)
- self.main_password_lineEdit.setFocus()
- self.back_pushButton.show()
-
- elif i == 1: # system password
- p1 = self.main_password_lineEdit.text()
- p2 = self.repeat_password_lineEdit.text()
- 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: # server_location
- self.stackedWidget.setCurrentIndex(3)
-
- elif i == 3: # choose database
- if self.createDemo_radioButton.isChecked():
- self.stackedWidget.setCurrentIndex(4)
- self.rootPassword_lineEdit.setFocus()
- else:
- self.stackedWidget.setCurrentIndex(6)
- self.go_pushButton.setFocus()
-
- elif i == 6:
- self.completed = self.finish()
- QtGui.QApplication.instance().closeAllWindows()
-
- elif i == 4:
- 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>
- <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)
-
- if result == QtGui.QMessageBox.Yes:
- self.stackedWidget.setCurrentIndex(5)
- if self.createDemoDatabase():
- self.advise(_("Database Created Sucessfully"))
- self.stackedWidget.setCurrentIndex(6)
- self.testDB_pushButton.setEnabled(True)
- return
- else:
- self.stackedWidget.setCurrentIndex(3)
- return
-
- self.advise(_("Database NOT Created"))
- 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)
-
- 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]
-
- self.title_label.setText(message)
-
- def snapshot(self):
- '''
- grab the current settings
- '''
- if self.createDemo_radioButton.isChecked():
- self.DB = "openmolar_demo"
- else:
- self.DB = unicode(self.database_lineEdit.text())
- self.HOST = unicode(self.host_lineEdit.text())
- self.PORT = int(self.port_lineEdit.text())
- self.MysqlUser = unicode(self.user_lineEdit.text())
- self.MysqlPassword = unicode(self.password_lineEdit.text())
- self.rootpass = unicode(self.rootPassword_lineEdit.text())
-
- def demo_or_existing(self, checked):
- '''
- 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
- '''
- 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)
-
- result = db.open
- db.close()
-
- except Exception as e:
- print e
- self.advise(_("The connection attempt threw an exception")
- + "<hr>%s" % e, True)
- return
-
- if result:
- QtGui.QMessageBox.information(None,
- _("Success!"),
- _("The %s database accepted the connection.") % self.DB)
-
- else:
- self.advise(_('''The connection attempt failed,
-please recheck your settings'''), True)
- print "Connection failed!"
-
- def createDemoDatabase(self):
- 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.update()
-
- self.timer1 = QtCore.QTimer()
- self.timer1.start(10) # 1/100thsecond
- self.connect(self.timer1, QtCore.SIGNAL("timeout()"),
- 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):
- print 'New database created sucessfully.'
- else:
- print "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):
- print "successfully loaded tables"
- else:
- print "error loading tables"
- raise IOError("error loading tables")
- self.progressBar.setValue(100)
-
- return True
-
- 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
- '''
- if arg == 0:
- self.main_password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
- self.repeat_password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
- else:
- self.main_password_lineEdit.setEchoMode(QtGui.QLineEdit.Normal)
- self.repeat_password_lineEdit.setEchoMode(QtGui.QLineEdit.Normal)
-
- def rootechomode(self, arg):
- if arg == 0:
- self.rootPassword_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
- else:
- self.rootPassword_lineEdit.setEchoMode(QtGui.QLineEdit.Normal)
-
- def dbechomode(self, arg):
- if arg == 0:
- self.password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
- else:
- self.password_lineEdit.setEchoMode(QtGui.QLineEdit.Normal)
-
- def finish(self):
- self.snapshot()
- result = False
- try:
- dom = minidom.parseString(blankXML)
- #-- hash the password and save it
- PSWORD = hashlib.md5(hashlib.sha1(
- str("diqug_ADD_SALT_3i2some" + self.PASSWORD)).hexdigest()
- ).hexdigest()
-
- dom.getElementsByTagName(
- "system_password")[0].firstChild.replaceWholeText(PSWORD)
-
- #-- server settings
- xmlnode = dom.getElementsByTagName("server")[0]
- #--save the location
- xmlnode.getElementsByTagName(
- "location")[0].firstChild.replaceWholeText(self.HOST)
-
- #--port
- xmlnode.getElementsByTagName(
- "port")[0].firstChild.replaceWholeText(str(self.PORT))
-
- #-- database settings
- xmlnode = dom.getElementsByTagName("database")[0]
-
- #--user
- xmlnode.getElementsByTagName(
- "user")[0].firstChild.replaceWholeText(self.MysqlUser)
-
- xmlnode.getElementsByTagName(
- "password")[0].firstChild.replaceWholeText(
- base64.b64encode(self.MysqlPassword))
-
- xmlnode.getElementsByTagName(
- "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.write(dom.toxml())
- f.close()
- print '...ok'
- localsettings.cflocation = localsettings.global_cflocation
- sucessful_save = True
- except OSError:
- pass
- except IOError:
- pass
-
- if not sucessful_save:
- 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
-
- settingsDir = os.path.dirname(localsettings.cflocation)
-
- if not os.path.exists(settingsDir):
- os.mkdir(settingsDir)
-
- print 'putting a local settings file in', settingsDir,
-
- f = open(localsettings.cflocation, "w")
- f.write(dom.toxml())
- f.close()
- print '...ok'
- localsettings.cflocation = localsettings.cflocation
-
- 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))
-
- 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__":
- print run()
diff --git a/src/openmolar/html/images/thumbs/Screenshot-Patient Finder.png b/src/openmolar/html/images/thumbs/Screenshot-Patient Finder.png
deleted file mode 100644
index cccc568..0000000
Binary files a/src/openmolar/html/images/thumbs/Screenshot-Patient Finder.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/Screenshot.png b/src/openmolar/html/images/thumbs/Screenshot.png
deleted file mode 100644
index b2ab494..0000000
Binary files a/src/openmolar/html/images/thumbs/Screenshot.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/altered_db.png b/src/openmolar/html/images/thumbs/altered_db.png
deleted file mode 100644
index b984cfb..0000000
Binary files a/src/openmolar/html/images/thumbs/altered_db.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/appointment_diff_dent.png b/src/openmolar/html/images/thumbs/appointment_diff_dent.png
deleted file mode 100644
index acd5604..0000000
Binary files a/src/openmolar/html/images/thumbs/appointment_diff_dent.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/appt_ov.png b/src/openmolar/html/images/thumbs/appt_ov.png
deleted file mode 100644
index ec08794..0000000
Binary files a/src/openmolar/html/images/thumbs/appt_ov.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/appts.png b/src/openmolar/html/images/thumbs/appts.png
deleted file mode 100644
index fe55db6..0000000
Binary files a/src/openmolar/html/images/thumbs/appts.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/complete_tooth_treatment.png b/src/openmolar/html/images/thumbs/complete_tooth_treatment.png
deleted file mode 100644
index a26b63e..0000000
Binary files a/src/openmolar/html/images/thumbs/complete_tooth_treatment.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/complete_treatment.png b/src/openmolar/html/images/thumbs/complete_treatment.png
deleted file mode 100644
index 467fd37..0000000
Binary files a/src/openmolar/html/images/thumbs/complete_treatment.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/confirm_appt.png b/src/openmolar/html/images/thumbs/confirm_appt.png
deleted file mode 100644
index 5665e5b..0000000
Binary files a/src/openmolar/html/images/thumbs/confirm_appt.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/cpitn.png b/src/openmolar/html/images/thumbs/cpitn.png
deleted file mode 100644
index 84d9593..0000000
Binary files a/src/openmolar/html/images/thumbs/cpitn.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/crown_choice.png b/src/openmolar/html/images/thumbs/crown_choice.png
deleted file mode 100644
index cdcbc79..0000000
Binary files a/src/openmolar/html/images/thumbs/crown_choice.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/dayllis_printing_wiizard.png b/src/openmolar/html/images/thumbs/dayllis_printing_wiizard.png
deleted file mode 100644
index 2b547c2..0000000
Binary files a/src/openmolar/html/images/thumbs/dayllis_printing_wiizard.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/edit_patient_details.png b/src/openmolar/html/images/thumbs/edit_patient_details.png
deleted file mode 100644
index 539fd43..0000000
Binary files a/src/openmolar/html/images/thumbs/edit_patient_details.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/enter_appointment.png b/src/openmolar/html/images/thumbs/enter_appointment.png
deleted file mode 100644
index 6dfd95e..0000000
Binary files a/src/openmolar/html/images/thumbs/enter_appointment.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/estimates_plan.png b/src/openmolar/html/images/thumbs/estimates_plan.png
deleted file mode 100644
index 145ba06..0000000
Binary files a/src/openmolar/html/images/thumbs/estimates_plan.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/exam_wizard.png b/src/openmolar/html/images/thumbs/exam_wizard.png
deleted file mode 100644
index 4522752..0000000
Binary files a/src/openmolar/html/images/thumbs/exam_wizard.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/exit_record.png b/src/openmolar/html/images/thumbs/exit_record.png
deleted file mode 100644
index 00d92b3..0000000
Binary files a/src/openmolar/html/images/thumbs/exit_record.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/feescales.png b/src/openmolar/html/images/thumbs/feescales.png
deleted file mode 100644
index 1623890..0000000
Binary files a/src/openmolar/html/images/thumbs/feescales.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/find.png b/src/openmolar/html/images/thumbs/find.png
deleted file mode 100644
index 47807d6..0000000
Binary files a/src/openmolar/html/images/thumbs/find.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/hygenist_wizard.png b/src/openmolar/html/images/thumbs/hygenist_wizard.png
deleted file mode 100644
index cfeb1aa..0000000
Binary files a/src/openmolar/html/images/thumbs/hygenist_wizard.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/letter_review.png b/src/openmolar/html/images/thumbs/letter_review.png
deleted file mode 100644
index 1bee725..0000000
Binary files a/src/openmolar/html/images/thumbs/letter_review.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/letter_text_entry.png b/src/openmolar/html/images/thumbs/letter_text_entry.png
deleted file mode 100644
index 67feecd..0000000
Binary files a/src/openmolar/html/images/thumbs/letter_text_entry.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/make_appointment.png b/src/openmolar/html/images/thumbs/make_appointment.png
deleted file mode 100644
index 52424be..0000000
Binary files a/src/openmolar/html/images/thumbs/make_appointment.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/make_appointment_any.png b/src/openmolar/html/images/thumbs/make_appointment_any.png
deleted file mode 100644
index 8a8fb53..0000000
Binary files a/src/openmolar/html/images/thumbs/make_appointment_any.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/newPt.png b/src/openmolar/html/images/thumbs/newPt.png
deleted file mode 100644
index 973fc52..0000000
Binary files a/src/openmolar/html/images/thumbs/newPt.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/newlogo.png b/src/openmolar/html/images/thumbs/newlogo.png
deleted file mode 100644
index b5e599b..0000000
Binary files a/src/openmolar/html/images/thumbs/newlogo.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/notes.png b/src/openmolar/html/images/thumbs/notes.png
deleted file mode 100644
index 866ee4c..0000000
Binary files a/src/openmolar/html/images/thumbs/notes.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/perio_charts.png b/src/openmolar/html/images/thumbs/perio_charts.png
deleted file mode 100644
index 4d06324..0000000
Binary files a/src/openmolar/html/images/thumbs/perio_charts.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/place_appointment.png b/src/openmolar/html/images/thumbs/place_appointment.png
deleted file mode 100644
index e4b31ee..0000000
Binary files a/src/openmolar/html/images/thumbs/place_appointment.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/plan_treament.png b/src/openmolar/html/images/thumbs/plan_treament.png
deleted file mode 100644
index 2aad110..0000000
Binary files a/src/openmolar/html/images/thumbs/plan_treament.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/plan_treatment.png b/src/openmolar/html/images/thumbs/plan_treatment.png
deleted file mode 100644
index 5eae4b0..0000000
Binary files a/src/openmolar/html/images/thumbs/plan_treatment.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/reception.png b/src/openmolar/html/images/thumbs/reception.png
deleted file mode 100644
index 7f73c2a..0000000
Binary files a/src/openmolar/html/images/thumbs/reception.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/reception_welcome_screen.png b/src/openmolar/html/images/thumbs/reception_welcome_screen.png
deleted file mode 100644
index 481bf29..0000000
Binary files a/src/openmolar/html/images/thumbs/reception_welcome_screen.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/startscreen.png b/src/openmolar/html/images/thumbs/startscreen.png
deleted file mode 100644
index e5aaca8..0000000
Binary files a/src/openmolar/html/images/thumbs/startscreen.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/surgery_welcome.png b/src/openmolar/html/images/thumbs/surgery_welcome.png
deleted file mode 100644
index 9520abf..0000000
Binary files a/src/openmolar/html/images/thumbs/surgery_welcome.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/toothplan_screen.png b/src/openmolar/html/images/thumbs/toothplan_screen.png
deleted file mode 100644
index 617d4d5..0000000
Binary files a/src/openmolar/html/images/thumbs/toothplan_screen.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/treatment_plan_page.png b/src/openmolar/html/images/thumbs/treatment_plan_page.png
deleted file mode 100644
index 2eb97e8..0000000
Binary files a/src/openmolar/html/images/thumbs/treatment_plan_page.png and /dev/null differ
diff --git a/src/openmolar/html/images/thumbs/whats_changed.png b/src/openmolar/html/images/thumbs/whats_changed.png
deleted file mode 100644
index e763bfa..0000000
Binary files a/src/openmolar/html/images/thumbs/whats_changed.png and /dev/null differ
diff --git a/src/openmolar/locale/messages.pot b/src/openmolar/locale/messages.pot
index b132649..4546293 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: 2014-04-22 14:21+BST\n"
+"POT-Creation-Date: 2014-06-25 21:35+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,52 +15,155 @@ msgstr ""
"Generated-By: pygettext.py 1.5\n"
-#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/backports/advisor.py:264
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/select_language.py:115
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:227
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:335
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1319
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:199
+msgid "Advisory"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/backports/advisor.py:267
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:142
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:125
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:488
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/newCourse.py:72
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:231
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:338
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:202
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:207
+msgid "Error"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/appointments.py:1015
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:229
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:230
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:231
msgid "emergency"
msgstr ""
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:71
+msgid "Past Courses of Treatment"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:87
-msgid "perio"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:73
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/estimatesHistory.py:100
+msgid "found"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:88
-msgid "xray"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:101
+msgid "no estimate found for courseno"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:89
-msgid "anaes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:109
+msgid "Warning - No course acceptance date"
msgstr ""
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:115
+msgid "Warning - No course completion date, using today to gather daybook items."
msgstr ""
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:133
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:202
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybookHistory.py:72
+msgid "Edit Tx"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:155
+msgid "Course is Ongoing"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:159
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/course_checker.py:145
+msgid "Course closed"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:161
+msgid "days after last treatment"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:165
+msgid "Course dates not found in daybook"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:179
+msgid "Examine these Issues."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:187
+msgid "Merge with following course"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:208
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:196
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:235
+msgid "WARNING"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:209
+msgid "ORPHANED ESTIMATE DATA"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:218
+msgid "Errors Found"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:105
-msgid "Denture Work"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/courseHistory.py:226
+msgid "This shouldn't happen!"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:85
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:137
msgid "Error - unrecognised practioner- sorry"
msgstr ""
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:146
+msgid "Patients of"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:146
+msgid "between"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:146
+msgid "treated by"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:147
+msgid "and"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:210
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybookHistory.py:90
+msgid "Ests"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:324
+msgid "Daybook Items during this Period"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:353
+msgid "Filter your results"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:354
+msgid "If this text box is left blank, then results from the daybook are returned dependent on the dates and clinicians entered."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:356
+msgid "You can filter using the following fields."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/daybook.py:366
+msgid "Examples"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/db_settings.py:245
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:65
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:86
+msgid "Example Dental Practice"
+msgstr ""
+
#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/est_logger.py:107
msgid "No estimate history found for course"
msgstr ""
@@ -70,8 +173,8 @@ msgid "Current Estimate Version History"
msgstr ""
#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3336
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3347
msgid "Estimate"
msgstr ""
@@ -90,37 +193,52 @@ 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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:67
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/customwidgets/estimate_widget.py:69
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:128
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:109
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fee_table_model.py:177
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:914
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:988
msgid "Description"
msgstr ""
#: /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/paymentHistory.py:31
#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3410
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:63
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:70
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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:73
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:128
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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:75
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:128
msgid "Charge"
msgstr ""
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/estimatesHistory.py:46
+msgid "Edit this Estimate"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/estimatesHistory.py:98
+msgid "Past Estimates"
+msgstr ""
+
#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/forum.py:29
msgid "Subject"
msgstr ""
@@ -137,8 +255,8 @@ msgstr ""
#: /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/dbtools/paymentHistory.py:30
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:69
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:79
msgid "Date"
msgstr ""
@@ -169,89 +287,89 @@ 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/dialogs/alter_denture_dialog.py:286
#: /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:213
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:228
#: /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:263
#: /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:301
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:325
#: /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:403
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:427
+msgid "Yes"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/memos.py:169
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:171
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:287
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:197
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:207
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:215
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:235
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:258
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:270
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:289
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:296
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:308
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:332
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:355
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:366
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:377
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:384
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:391
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:398
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:410
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:428
msgid "No"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/patient_class.py:772
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/patient_class.py:749
msgid "Student Exemption removed"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:33
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:32
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
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:33
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:68
msgid "Code"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:35
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:34
#: /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/dbtools/paymentHistory.py:35
#: /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/dbtools/paymentHistory.py:36
#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/paymentHistory.py:37
msgid "Unknown"
msgstr ""
-#: /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/dbtools/paymentHistory.py:38
+#: /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:80
msgid "Amount"
msgstr ""
@@ -265,19 +383,21 @@ msgid "Serial No"
msgstr ""
#: /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/compiled_uis/Ui_main.py:3184
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:36
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:118
msgid "Title"
msgstr ""
#: /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/compiled_uis/Ui_main.py:3185
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:36
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:120
msgid "Surname"
msgstr ""
#: /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_main.py:3198
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:174
msgid "First Name"
msgstr ""
@@ -287,15 +407,16 @@ msgid "Age"
msgstr ""
#: /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/compiled_uis/Ui_main.py:3177
#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:124
msgid "Town"
msgstr ""
#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/recall.py:34
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:143
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:111
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:144
msgid "Address"
msgstr ""
@@ -312,255 +433,245 @@ msgid "Recall Date"
msgstr ""
#: /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/compiled_uis/Ui_main.py:3179
#: /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/openmolar1/src/openmolar/firstRun.py:88
-msgid "If you ever need to run this again, "
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:89
-msgid "delete the openmolar.conf file in "
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:92
-msgid "If you ever need to run this wizard again, "
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:93
-msgid "Eg. if your server location changes, "
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:94
-msgid "or you require a new password"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:95
-msgid "type"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:96
-msgid "on the command line, or delete the file"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/referral.py:161
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:187
+msgid "Telephone"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:98
-msgid "For a more secure setup, you should move this file to"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/referral.py:165
+msgid "home"
msgstr ""
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/referral.py:165
+msgid "mobile "
msgstr ""
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/referral.py:165
+msgid "work "
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:164
-msgid "Password must not be blank!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/referral.py:176
+msgid "D.O.B."
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:166
-msgid "Passwords don't match!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/referral.py:182
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:47
+msgid "Yours Sincerely"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:189
-msgid "Create Database"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:420
+msgid "still ongoing"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:190
-msgid "Create Demo Database now with the following settings?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:424
+msgid "day"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:201
-msgid "Database Created Sucessfully"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:425
+msgid "days"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:209
-msgid "Database NOT Created"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:436
+msgid "Edit Course Dates"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:230
-msgid "Welcome to the openMolar settings wizard."
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:437
+msgid "Edit Treatments"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:231
-msgid "Set the application Password"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:444
+msgid "days earlier"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:232
-msgid "Server Location"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:458
+msgid "Course Number"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:233
-msgid "Database Settings"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:459
+msgid "PATIENT FAILED TO RETURN"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:234
-msgid "Save settings and exit"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:461
+msgid "Opened"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:235
-msgid "Create a demo database"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:462
+msgid "Closed"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:236
-msgid "Creating Database"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:463
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:109
+msgid "Duration"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:284
-msgid "The connection attempt threw an exception"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:474
+msgid "or incomplete"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:290
-msgid "Success!"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:474
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:65
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:57
+msgid "Planned"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:291
-msgid "The %s database accepted the connection."
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:477
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3323
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:65
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:59
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:1171
+msgid "Completed"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:294
-msgid ""
-"The connection attempt failed,\n"
-"please recheck your settings"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:482
+msgid "dated"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:338
-msgid "Error Creating Database"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:485
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:135
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3295
+msgid "Exam"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/firstRun.py:450
-msgid "FAILURE"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:489
+msgid "perio"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:84
-msgid "Update Client"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:490
+msgid "xray"
msgstr ""
-#: /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"
-"<p>this client requires schema version %s, but your database is at %s</p>\n"
-"<p>Please Update openMolar now</p>"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:491
+msgid "anaes"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:92
-msgid "Proceed without upgrade?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:492
+#: /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/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"
-"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 this client ASAP</i></p>\n"
-"<hr /><p>Do you wish to continue?</p>"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:493
+#: /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/openmolar1/src/openmolar/main.py:140
-msgid "This is not the default database - are you sure?"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:494
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:60
+msgid "New Denture (upper)"
msgstr ""
-#: /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"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:495
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:61
+msgid "New Denture (lower)"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:157
-msgid "DEFAULT"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:496
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:62
+msgid "Other Denture (upper)"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:159
-msgid "Chosen server"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/dbtools/treatment_course.py:497
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:63
+msgid "Other Denture (lower)"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:176
-msgid "This appears to be your first running of OpenMolar."
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:75
+msgid "command line options are as follows"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:177
-msgid "We need to generate a settings file."
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:76
+msgid "quiet (minimal logging to console)"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:178
-msgid "Are you ready to proceed?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:77
+msgid "verbose logging to console (for debugging)"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:181
-msgid "First Run"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:78
+msgid "show this text"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:211
-msgid "Unable to Run OpenMolar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:79
+msgid "offer the firstrun config and demodatabase generation"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:212
-msgid "Good Bye!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:80
+msgid "proceed even if client and database versions clash (NOT ADVISABLE!)"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:301
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:315
-msgid "Login Error"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:81
+msgid "show the versioning and exit"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:303
-msgid "Incorrect"
+#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:82
+msgid "Ignore dev login (advanced)"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:304
-msgid "User/password combination!"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/course_checker.py:141
+msgid "Course is still active"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:305
-msgid "Please Try Again."
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/course_checker.py:147
+msgid "days after last day treatment"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:311
-msgid "UNEXPECTED ERROR"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/course_checker.py:149
+msgid "Course doesn't tally with daybook entries"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/main.py:312
-msgid "application cannot run"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/course_checker.py:152
+msgid "No warnings"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:160
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:164
msgid "no treatments"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:165
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:169
msgid "Partially"
msgstr ""
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/estimates.py:199
+msgid "Estimates for Course Number"
+msgstr ""
+
#:
#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/formatted_notes.py:165
msgid "Course Activity"
@@ -568,17 +679,17 @@ msgstr ""
#:
#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3221
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3227
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3234
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3242
msgid "Edit"
msgstr ""
#:
#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:596
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:610
msgid "Today"
msgstr ""
@@ -598,274 +709,282 @@ msgid "Todays notes for"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:144
-msgid "DO NOT RECALL"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:46
+msgid "TODAY!"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:133
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1360
-msgid "Previous Course"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:53
+msgid "year"
msgstr ""
-#: /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"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:53
+msgid "years"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:138
-msgid "End"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:56
+msgid "month"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:144
-msgid "PLAN"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:56
+msgid "months"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:150
-msgid "COMPLETED"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:76
+msgid "!UNKNOWN POSTCODE!"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:155
-msgid "No treatment"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:94
+msgid "exemption"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:41
-msgid "Available Clinicians"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:96
+msgid "NOT EXEMPT"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:42
-msgid "Available Dentists"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:107
+msgid "UNKNOWN COURSETYPE"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:43
-msgid "Available Hygenists"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:115
+msgid "Please Set a Dentist for this patient!"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:118
+#: /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:3178
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:64
+msgid "Memo"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:121
+#: /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_main.py:3356
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/payment_dialog.py:91
+msgid "Treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:224
-msgid "staff meeting"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:122
+msgid "IO xrays"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:123
+msgid "Panoral"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:36
-msgid "Unscheduled"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:124
+msgid "Scaling"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:36
-msgid "View Past Appointments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:137
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3376
+msgid "History"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
-msgid "Date & Time"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:148
+msgid "Recall"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
-msgid "Practitioner"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:152
+msgid "(exam booked)"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:157
+msgid "DO NOT RECALL"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:159
+msgid "NOT SAVED"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:163
+msgid "Account"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:166
+msgid "in credit"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/patientDetails.py:168
+msgid "UNDER TREATMENT"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/charts/charts_gui.py:266
-msgid "NO CHARTS"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:134
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1454
+msgid "Previous Course"
msgstr ""
-#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:137
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:122
+msgid "Start"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py:58
-msgid "CheckBox"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:141
+msgid "End"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py:71
-msgid "Plan Treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:144
+msgid "ONGOING"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:147
+msgid "Patient Failed to Return"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:154
+msgid "PLAN"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:160
+msgid "COMPLETED"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/ptModules/plan.py:165
+msgid "No treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py:73
-msgid "Add the following Treatment Items to the Current Treatment Plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:41
+msgid "Available Clinicians"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:78
-msgid "Select Appointment Length"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:42
+msgid "Available Dentists"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:79
-msgid "Hours"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/clinician_select_model.py:43
+msgid "Available Hygenists"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:80
-msgid "Minutes"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:193
-msgid "Open a Day"
+#: /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/compiled_uis/Ui_blockSlot.py:170
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:39
+msgid "Lunch"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:228
+msgid "staff meeting"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:195
-msgid "Date to Open"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/list_models.py:232
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:169
+msgid "Out of Office"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:196
-msgid "Day Memo - optional"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:36
+msgid "Unscheduled"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:197
-msgid "Day Start"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:36
+msgid "View Past Appointments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:198
-msgid "Morning Emergency Slot"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
+msgid "Date & Time"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py:37
+msgid "Practitioner"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:204
-msgid "Afternoon Emergency Slot "
+#: /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_specify_appointment.py:188
+msgid "Length"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py:207
-msgid "Day Finish"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/charts/charts_gui.py:145
+msgid "you need to be in the static chart to change tooth state"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/charts/charts_gui.py:238
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3290
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:116
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:745
+msgid "BPE"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:78
-msgid "Move the end date for making appointments."
+#: /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_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_toothProps.py:225
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_treatmentItemWidget.py:51
+msgid "Form"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_activeDentStartFinish.py:58
+msgid "CheckBox"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:80
-msgid "Remove old weeks"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_addTreatment.py:71
+msgid "Plan Treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:82
-msgid "Edit Standard Working Weeks for Clinicians"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:83
-msgid "Open A Day"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:78
+msgid "Select Appointment Length"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py:84
-msgid "Insert regular blocks"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:79
+msgid "Hours"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_appointment_length.py:80
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:99
+msgid "Minutes"
msgstr ""
#:
@@ -881,15 +1000,12 @@ msgstr ""
#:
#: /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_main.py:3436
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3450
#: /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 ""
@@ -905,6 +1021,16 @@ msgid "Clinicians - DATE"
msgstr ""
#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:121
+msgid "Clinician"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_aslotEdit.py:123
+msgid "Finish"
+msgstr ""
+
+#:
#: /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 ""
@@ -926,7 +1052,7 @@ msgstr ""
#:
#: /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/compiled_uis/Ui_main.py:3484
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:146
msgid "Options"
msgstr ""
@@ -958,6 +1084,7 @@ msgstr ""
#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:167
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:39
msgid "Emergency"
msgstr ""
@@ -978,7 +1105,7 @@ msgstr ""
#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_blockSlot.py:173
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:184
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:176
msgid "minutes"
msgstr ""
@@ -1014,7 +1141,6 @@ msgstr ""
#:
#: /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 ""
@@ -1024,126 +1150,6 @@ msgid "Insert a Known Patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:140
-msgid "Block Wizard"
-msgstr ""
-
-#:
-#: /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/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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:144
-msgid "End Date (inclusive)"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:145
-msgid "Time"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:147
-msgid "Text to Apply"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:148
-msgid "Days to Apply"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py:149
-msgid "Clinicians"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:131
-msgid "Bridge - Denture Entry"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:132
-msgid "Porcelain / Precious Metal"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:133
-msgid "Lava (or all ceramic)"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:134
-msgid "Resin Retained"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:137
-msgid "Bridge"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:138
-msgid "Upper"
-msgstr ""
-
-#:
-#: /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/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/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/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/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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:144
-msgid "Lower"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py:152
-msgid "Denture"
-msgstr ""
-
-#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_bulkmail_options.py:104
msgid "Bulk Mail Options"
msgstr ""
@@ -1252,34 +1258,6 @@ msgid "QUIT"
msgstr ""
#:
-#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:87
-msgid "UNNAMED PT - (000000)"
-msgstr ""
-
-#:
-#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py:90
-msgid "Suggested completion Date"
-msgstr ""
-
-#:
-#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_customTreatment.py:90
msgid "Custom Item"
msgstr ""
@@ -1305,9 +1283,19 @@ msgid "Specify Dates and Practitioners for a Daylist Print Run"
msgstr ""
#:
+#: /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:3392
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3404
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:91
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:106
+msgid "Start Date"
+msgstr ""
+
+#:
#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3393
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3407
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:107
msgid "End Date"
msgstr ""
@@ -1393,21 +1381,6 @@ msgid "Agenda"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:76
-msgid "Edit Memos"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:77
-msgid "Global Memo"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py:78
-msgid "Clinician Memos"
-msgstr ""
-
-#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_enter_letter_text.py:54
msgid "Letter Text Entry"
msgstr ""
@@ -1425,7 +1398,7 @@ msgstr ""
#:
#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:990
msgid "Type"
msgstr ""
@@ -1537,4539 +1510,5269 @@ msgid "Treating Dentist/Hygienist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:519
-msgid "OpenMolar - database wizard"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3148
+msgid "Open Molar"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:520
-msgid "What do you want to do?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3149
+msgid "Exit the Current Patient Record."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:522
-msgid "Modify an existing openmolar database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3150
+msgid "Esc"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:524
-msgid "Create a New database from scratch"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3152
+msgid "Add a New Patient to the database."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:526
-msgid "Create a New database (from a known template)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3154
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3445
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3479
+msgid "Click on this Button to search for in patient in your database."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:530
-msgid "Practice Name"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3155
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3480
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:531
-msgid "Used in receipts, appointment cards etc."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3156
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3446
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3481
+msgid "Ctrl+F"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:532
-msgid "Address Line 1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3158
+msgid "This cycles back through the history of records loaded today."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:533
-msgid "Address Line 2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3160
+msgid "Reload the patient from the database."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:534
-msgid "Address Line 3"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3161
+msgid "Ctrl+R"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:537
-msgid "Postcode / Zip"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3163
+msgid "This cycles forwards through the history of records loaded today."
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3165
+msgid "Show patients who live at the same address, or who have a similar name."
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3166
+msgid "&Relatives"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:540
-msgid "Website"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3167
+msgid "Ctrl+G"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3169
+msgid "A drop down box of all patients who have an appointment today."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:544
-msgid "Practice Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3170
+msgid "Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:546
-msgid "The Following users can login to the application"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3171
+#: /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:163
+msgid "Date of Birth"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:548
-msgid "Id"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3172
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+msgid "Address3"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3173
+msgid "send an sms"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3174
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
+msgid "sms"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3175
+msgid "email2"
msgstr ""
#:
-#: /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?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3176
+msgid "Fax"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3180
+msgid "email1"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:559
-msgid "Modify Selected User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3181
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3188
+msgid "send an email"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:560
-msgid "New User Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3182
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3189
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
+msgid "email"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:564
-msgid "Standard User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3183
+msgid "Occupation"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:566
-msgid "Hygienist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3186
+msgid "Tel (mob)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:567
-msgid "Receptionist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3187
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+msgid "Address2"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:568
-msgid "Active User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3190
+msgid "Sex"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:570
-msgid "Add a New User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3191
+msgid "M"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:573
-msgid "Users"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3192
+msgid "F"
msgstr ""
#:
-#: /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) "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3193
+#: /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/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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3194
+msgid "Tel (home)"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3195
+msgid "send a fax"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3196
+msgid "fax"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:591
-msgid "Dentists"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3197
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+msgid "Address1"
msgstr ""
#:
-#: /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) "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3199
+msgid "Tel (work)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:609
-msgid "Hygienists"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3200
+msgid "Abort New Patient Entry"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3202
+msgid "Higlighted Fields are Mandatory for New Patients"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3203
+msgid "Save New Patient"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3204
+msgid "Family Groups"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3206
+msgid "Raise a dialog to edit the patients family grouping"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3207
+msgid "Edit family group"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3208
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3102
+msgid "Not a member of a known family"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3210
+msgid "Use the Sname and Address details from the previous patient."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:619
-msgid "Practice Hours"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3211
+msgid "Apply Address of previous record"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:622
-msgid "View XML"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3214
+msgid "Patient Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:623
-msgid "File"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3215
+msgid "Pt is registered with Dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:624
-msgid "L&oad Template"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3216
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:88
+msgid "Course Type"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py:625
-msgid "&Save Template"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3217
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:117
+msgid "Status"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3171
-msgid "Open Molar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3218
+msgid "Write Off Bad Debt"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3172
-msgid "Exit the Current Patient Record."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3220
+msgid "This label is for displaying Private contractual stuff"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3173
-msgid "Esc"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3224
+msgid "Private"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3175
-msgid "Add a New Patient to the database."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3226
+msgid "This label is for displaying HDP contractual stuff"
msgstr ""
#:
-#: /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."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3230
+msgid "Highland Dental Plan"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3232
+msgid "This label is for displaying NHS contractual stuff"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3233
+msgid "View Claims History"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3181
-msgid "This cycles back through the history of records loaded today."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3235
+msgid "Exemption"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3183
-msgid "Reload the patient from the database."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3236
+msgid "Exemption Text"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3184
-msgid "Ctrl+R"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3239
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3278
+msgid "NHS"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3186
-msgid "This cycles forwards through the history of records loaded today."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3241
+msgid "No Details of Pt's Registered Dentist Found"
msgstr ""
#:
-#: /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."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3245
+msgid "Registered Elsewhere"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3189
-msgid "&Relatives"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3248
+msgid "Contract"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3190
-msgid "Ctrl+G"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3249
+msgid "Letters TO the patient"
msgstr ""
#:
-#: /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."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3251
+msgid " Custom Letter to the patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3193
-msgid "Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3253
+msgid "Print a recall saying the patient is due now."
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3254
+msgid "Recall for An Examination"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3256
+msgid "Print a receipt - useful for duplicates."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3196
-msgid "send an sms"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3257
+msgid "Duplicate Receipt"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3258
+msgid "Print An Account Letter"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3198
-msgid "email2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3259
+msgid "Referrals (Letters about the patient)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3203
-msgid "email1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3260
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3373
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3397
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3409
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:53
+msgid "Print"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3261
+msgid "Patient \"Notes\""
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3263
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3272
+msgid "Print a summary of the patient's notes (for them to take on). Includes No fee details."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3206
-msgid "Occupation"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3264
+msgid "Print the patient's notes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3209
-msgid "Tel (mob)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3265
+msgid "Previous Correspondence"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3266
+msgid "Generated By OpenMolar"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3213
-msgid "Sex"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3267
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3214
-msgid "M"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3268
+msgid "Imported into database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3215
-msgid "F"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3269
+msgid "Import A Document"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3270
+msgid "Medical History"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3217
-msgid "Tel (home)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3273
+msgid "Print a medical history form"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3218
-msgid "send a fax"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3276
+msgid "Correspondence"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3219
-msgid "fax"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3277
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3289
+msgid "Reception"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3279
+msgid "Print A GP17"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3222
-msgid "Tel (work)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3280
+msgid "Apply an Exemption"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3223
-msgid "Abort New Patient Entry"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3281
+msgid "Custom Estimate on File"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3225
-msgid "Higlighted Fields are Mandatory for New Patients"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3282
+msgid "Print &Account"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3226
-msgid "Save New Patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3283
+msgid "Take &Payment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3227
-msgid "Family Groups"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3284
+msgid "Print &Estimate"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3229
-msgid "Raise a dialog to edit the patients family grouping"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3285
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3320
+msgid "Notes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3230
-msgid "Edit family group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3286
+msgid "Patient's Diary"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3292
+msgid "Update the Basic Perio Exam (CPITN) score"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3233
-msgid "Use the Sname and Address details from the previous patient."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3293
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:234
+msgid "New"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3234
-msgid "Apply Address of previous record"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3294
+msgid "perform a clinical exam"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3237
-msgid "Patient Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3297
+msgid "add x-rays to the patient's current course."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3238
-msgid "Pt is registered with Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3298
+msgid "X-ray"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3300
+msgid "perform common perio treatments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3240
-msgid "Status"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3301
+msgid "Hyg"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3241
-msgid "Write Off Bad Debt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3302
+msgid "Close This Course"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3243
-msgid "This label is for displaying Private contractual stuff"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3303
+msgid "ChildSmile"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3247
-msgid "Private"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3305
+msgid "check / update the patients medical history"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3249
-msgid "This label is for displaying HDP contractual stuff"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3306
+msgid "Med Notes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3253
-msgid "Highland Dental Plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3309
+msgid "Clinical Summary"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3255
-msgid "This label is for displaying NHS contractual stuff"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3310
+msgid "Include"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3256
-msgid "View Claims History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3311
+msgid "Printing Notes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3258
-msgid "Exemption"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3312
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3353
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:203
+msgid "Payments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3259
-msgid "Exemption Text"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3313
+msgid "Timestamps"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3314
+msgid "Metadata"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3264
-msgid "No Details of Pt's Registered Dentist Found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3316
+msgid "<html><head/><body><p>Use these settings for the clinical summary notes also.</p></body></html>"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3268
-msgid "Registered Elsewhere"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3317
+msgid "clinical summary"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3271
-msgid "Contract"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3321
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/toothprop_fulledit.py:55
+msgid "Static"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3272
-msgid "Letters TO the patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3322
+msgid "Plan"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3274
-msgid " Custom Letter to the patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3324
+msgid "Treatment Planning"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3276
-msgid "Print a recall saying the patient is due now."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3325
+msgid "X-Rays"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3277
-msgid "Recall for An Examination"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3326
+#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:57
+msgid "Perio"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3279
-msgid "Print a receipt - useful for duplicates."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3327
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3280
-msgid "Duplicate Receipt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3328
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:210
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:135
+#: /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
+msgid "Other"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3281
-msgid "Print An Account Letter"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3329
+msgid "Custom"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3282
-msgid "Referrals (Letters about the patient)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3330
+msgid "Advanced Tx Planning"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3332
+msgid "Patient is not currently under treatment - click here to begin"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3284
-msgid "Patient \"Notes\""
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3335
+msgid "Charts / Planning"
msgstr ""
#:
-#: /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."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3337
+msgid "Custom Estimate Letter"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3287
-msgid "Print the patient's notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3338
+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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3288
-msgid "Previous Correspondence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3341
+msgid "ReCalculate Estimate"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3289
-msgid "Generated By OpenMolar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3342
+msgid "Apply Exemption"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3343
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:87
+msgid "Course Dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3291
-msgid "Imported into database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3344
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1434
+msgid "Close Course"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3292
-msgid "Import A Document"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3350
+msgid "Perio Charts"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3293
-msgid "Medical History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3352
+msgid "See all payments in the database made by this patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3296
-msgid "Print a medical history form"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3355
+msgid "View treatments completed, by date order"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3299
-msgid "Correspondence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3358
+msgid "View all Courses of treatment. This includes treatment that was planned but not completed."
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3359
+msgid "Courses"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3302
-msgid "Print A GP17"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3361
+msgid "Estimate history for this patient."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3303
-msgid "Apply an Exemption"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3362
+msgid "Estimates"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3304
-msgid "Custom Estimate on File"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3363
+msgid "Current Estimate"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3305
-msgid "Print &Account"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3364
+msgid "NHS Claims"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3306
-msgid "Take &Payment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3365
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3384
+msgid "Memos"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3307
-msgid "Print &Estimate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3366
+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/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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3369
+msgid "debug tools"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3309
-msgid "Patient's Diary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3370
+msgid "changes only"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3315
-msgid "Update the Basic Perio Exam (CPITN) score"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3372
+msgid "Print the text displayed on this page."
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3377
+msgid "Today's Notes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3317
-msgid "perform a clinical exam"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3378
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:106
+msgid "PhraseBook"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3320
-msgid "add x-rays to the patient's current course."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3379
+msgid "Ins"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3321
-msgid "X-ray"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3380
+msgid "Save the changes made to this record."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3323
-msgid "perform common perio treatments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3381
+msgid "Save Changes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3324
-msgid "Hyg"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3382
+msgid "Ctrl+S"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3325
-msgid "Close This Course"
-msgstr ""
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3383
+msgid "Enter Notes."
+msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3326
-msgid "ChildSmile"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3385
+msgid "Phrases"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3328
-msgid "check / update the patients medical history"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3388
+msgid "Patient Database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3329
-msgid "Med Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3391
+msgid "Appointments / Diary"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3332
-msgid "Clinical Summary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3394
+msgid "Registered Dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3333
-msgid "Include"
+#: /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:3405
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:241
+msgid "Go"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3334
-msgid "Printing Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3396
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3408
+msgid "Print the Data"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3398
+msgid "All payments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3336
-msgid "Timestamps"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3399
+msgid "Sundries_only"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3337
-msgid "Metadata"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3400
+msgid "Treatment_only"
msgstr ""
#:
-#: /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>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3403
+msgid "Cashbook"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3340
-msgid "clinical summary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3406
+msgid "Treating Clinician"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3411
+msgid "Extra Filters"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3345
-msgid "Plan"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3414
+msgid "Daybook"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3416
+msgid "Find Patient Records where the patient is in"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3347
-msgid "Treatment Planning"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3417
+msgid "Debt"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3348
-msgid "X-Rays"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3418
+msgid "Credit"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3419
+msgid "By More than"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3420
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3429
+msgid "Load Table"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3352
-msgid "Custom"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3421
+msgid "Print Table"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3353
-msgid "Advanced Tx Planning"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3423
+msgid "Print Selected Letters"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3355
-msgid "Patient is not currently under treatment - click here to begin"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3425
+msgid "TOTAL OUTSTANDING"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3358
-msgid "Charts / Planning"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3428
+msgid "Accounts"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3360
-msgid "Custom Estimate Letter"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3430
+msgid "Print Letters"
msgstr ""
#:
-#: /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. "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3431
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:78
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:388
+msgid "Expand All"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3364
-msgid "ReCalculate Estimate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3432
+msgid "Letter Options"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3365
-msgid "Apply Exemption"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3435
+msgid "Bulk Mailings"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3437
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:180
+msgid "Fee Scales Available"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3439
+msgid "Use this control to select a feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3371
-msgid "Choose Data"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3440
+msgid "Search For an Item"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3372
-msgid "Chart Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3442
+msgid "search for the given phrase in description columns"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3377
-msgid "Perio Charts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3443
+msgid "Search Descriptions"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3379
-msgid "See all payments in the database made by this patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3448
+msgid "only search for the given phrase in the usercode column"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3380
-msgid "Past Payments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3449
+msgid "Search Itemcodes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3382
-msgid "View treatments completed, by date order"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3452
+msgid "Hide Rarely Used Codes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3383
-msgid "Past Treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3453
+msgid "Quickly expand all items"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3385
-msgid "display a combination of courses and estimates."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3454
+msgid "Expand All Sections"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3386
-msgid "Courses / Estimates"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3456
+msgid "Quickly compress all items"
msgstr ""
#:
-#: /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."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3457
+msgid "Compress All Sections"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3389
-msgid "Courses"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3458
+msgid "Resources"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3391
-msgid "Estimate history for this patient."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3460
+msgid "Open A PDF of the latest NHS Regulations"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3392
-msgid "Estimates"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3461
+msgid "Documents"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3393
-msgid "Current Estimate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3462
+msgid "Advanced Options"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3394
-msgid "NHS Claims"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3463
+msgid "FeeScale Editor"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3464
+msgid "FeeScale Tester"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3397
-msgid "Print the text displayed on this page."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3465
+msgid "Reload Fee Scales"
msgstr ""
#:
-#: /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."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3468
+msgid "Feescales"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3402
-msgid "debug tools"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3470
+msgid "Reply"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3403
-msgid "changes only"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3471
+msgid "Alt+R"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3406
-msgid "History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3472
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:323
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:376
+msgid "Delete"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3407
-msgid "Today's Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3473
+msgid "Del, Backspace"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3474
+msgid "&set parent"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3409
-msgid "Ins"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3475
+msgid "Alt+S"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3410
-msgid "Save the changes made to this record."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3476
+msgid "New Topic"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3411
-msgid "Save Changes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3477
+msgid "Search by keyword"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3412
-msgid "Ctrl+S"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3482
+msgid "Show Topics for"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3413
-msgid "Enter Notes."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3483
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/forum_gui_module.py:59
+msgid "Everyone"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3415
-msgid "Phrases"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3485
+msgid "Include Deleted Posts"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3418
-msgid "Patient Database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3486
+msgid "Split Replies"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3421
-msgid "Appointments / Diary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3487
+msgid "Group replies"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3488
+msgid "&Collapse Replies"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3489
+msgid "&Expand Replies"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3492
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1566
+msgid "FORUM"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3428
-msgid "All payments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3495
+msgid "Wiki"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3429
-msgid "Sundries_only"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3496
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3430
-msgid "Treatment_only"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3497
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:95
+msgid "&Help"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3498
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3437
-msgid "Treating Dentist / Hygenist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3499
+msgid "&View"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3443
-msgid "Daybook"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3500
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3509
+msgid "&Appointments"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3501
+msgid "&Printing"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3502
+msgid "&Forum"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3503
+msgid "&Charts"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3504
+msgid "&Mode (reception or surgery)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3505
+msgid "&Cashbook"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3506
+msgid "&Daybook"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3507
+msgid "&History"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3508
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3510
+msgid "&Export Patient to disk"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3511
+msgid "&Import Patient from disk"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3512
+msgid "About &OpenMolar"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3513
+msgid "&About QT"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3514
+msgid "&Quit"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3515
+msgid "Select Interface Language"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3517
+msgid "Full Screen Mode (Ctrl-Alt-F)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3518
+msgid "Ctrl+Alt+F"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3519
+msgid "Font Size"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3521
+msgid "Show Advanced Options"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3523
+msgid "Table View For Charting"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3524
+msgid "NHS Form Settings"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3525
+msgid "Test Print a GP17"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3526
+msgid "Print Daylists"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3527
+msgid "Set Clinician"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3528
+msgid "Set Assistant"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3529
+msgid "Surgery Mode"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3531
+msgid "Advanced Record Management"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3533
+msgid "Fix Locked New Course of Treatment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3534
+msgid "Allow Full Edit"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3535
+msgid "Set Surgery Number"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3537
+msgid "Set Surgery Number (used so other applications can see which record is loaded)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3538
+msgid "Edit Phrasebooks"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3539
+msgid "Allow &Edit"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3540
+msgid "Enable &Filters"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3541
+msgid "Allow Edit &Courses"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3542
+msgid "Allow Edit &Estimates"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3543
+msgid "Allow Edit &Treatment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3544
+msgid "Allow &ALL Edits"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3545
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:71
+msgid "Edit Referral Centres"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3546
+msgid "Edit Feescales"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3547
+msgid "Open Document Dialog"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3549
+msgid "Reset Supervisor Password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3550
+msgid "Add User"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3551
+msgid "Add Clinician"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3552
+msgid "Edit Practice Details"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3554
+msgid "Clear Today's Emergency Slots"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3555
+msgid "Insert Regular Blocks"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:196
+msgid "Medical Notes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:197
+msgid "Doctor's details"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:198
+msgid "Doctor's Name"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:199
+msgid "Address / Tel No"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:200
+msgid "Known Conditions"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:201
+msgid "Current Medication"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:202
+msgid "Past Medication"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:203
+msgid "Allergies"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:204
+msgid "Heart"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:205
+msgid "Lungs"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:206
+msgid "Liver"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:207
+msgid "Bleeding"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:208
+msgid "Kidneys"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:209
+msgid "Anaesthetic / operations"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:211
+msgid "Mark as Checked Today"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:212
+msgid "Checked"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_medhist.py:213
+msgid "Mark Patient as Med Alert"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:124
+msgid "New CPITN score"
+msgstr ""
+
+#:
+#: /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/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/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/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/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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:83
+msgid "New Course"
+msgstr ""
+
+#:
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newCourse.py:86
+msgid "Contracted Dentist"
+msgstr ""
+
+#:
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:214
+msgid "Dental History"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:215
+msgid "Previous Referral Date"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:216
+msgid "1st referral"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:217
+msgid "re - referral"
+msgstr ""
+
+#:
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:220
+msgid "Teeth With Poor Prognosis"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:221
+msgid "Relevant Medical History"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:222
+msgid "Reason for Referral"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:223
+msgid "Crowding"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:224
+msgid "Severe"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:225
+msgid "Moderate"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:226
+msgid "Mild"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:227
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:593
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:610
+msgid "None"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:228
+msgid "Spaced"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:229
+msgid "Incisal Relationship"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:230
+msgid "Overjet:"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:231
+msgid "mm"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:232
+msgid "Overbite"
+msgstr ""
+
+#:
+#: /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:371
+msgid "Complete"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:234
+msgid "InComplete"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:235
+msgid "Traumatic"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:236
+msgid "%"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:237
+msgid "Patient Motivation"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:238
+msgid "Fixed Appliance"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:239
+msgid "Removable Applicance"
+msgstr ""
+
+#:
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:200
+msgid "Recall Settings"
+msgstr ""
+
+#:
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:203
+msgid "Appointment Shortcuts"
+msgstr ""
+
+#:
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:206
+msgid "&New"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:208
+msgid "delete or cancel the appointment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:209
+msgid "Clear/Cancel"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:211
+msgid "Make the selected appointment"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:212
+msgid "Schedule"
+msgstr ""
+
+#:
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:215
+msgid "Find in Book"
+msgstr ""
+
+#:
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:218
+msgid "Print Card"
+msgstr ""
+
+#:
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:221
+msgid "Modify"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:163
+msgid "Patient Finder"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3445
-msgid "Find Patient Records where the patient is in"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3446
-msgid "Debt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:166
+msgid "Repeat Last Search"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3447
-msgid "Credit"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:167
+msgid "SNO or Surname"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3448
-msgid "By More than"
+#: /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/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"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3450
-msgid "Print Table"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3452
-msgid "Print Selected Letters"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:184
+msgid "Address includes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3454
-msgid "TOTAL OUTSTANDING"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3457
-msgid "Accounts"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3459
-msgid "Print Letters"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:191
+msgid "search for a postcode"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:204
+msgid "Payments for treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3461
-msgid "Letter Options"
+#: /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
+msgid "-"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3464
-msgid "Bulk Mailings"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:209
+msgid "Debit Card"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:211
+msgid "Credit Card"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3468
-msgid "Use this control to select a feescale"
+#: /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/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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:215
+msgid "Annual HDP"
+msgstr ""
+
+#:
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:218
+msgid "Amount which will appear on receipt (read only)"
+msgstr ""
+
+#:
+#: /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:1409
+#: /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:61
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:71
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/gp17/gp17_printer.py:53
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:437
+msgid "Question"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:67
+msgid "Print Formatting"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:68
+msgid "Minimal"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:69
+msgid "Full Page"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:585
+msgid "Advanced Record Alteration"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:586
+msgid "NHS current fees (money0)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:587
+msgid "NHS payments (money2)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:588
+msgid "NHS estimated (money4)"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:589
+msgid "private estimate (money5)"
+msgstr ""
+
+#:
+#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:123
+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_main.py:3469
-msgid "Search For an Item"
+#: /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_main.py:3471
-msgid "search for the given phrase in description columns"
+#: /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_main.py:3472
-msgid "Search Descriptions"
+#: /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_main.py:3477
-msgid "only search for the given phrase in the usercode column"
+#: /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_main.py:3478
-msgid "Search Itemcodes"
+#: /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_main.py:3481
-msgid "Hide Rarely Used Codes"
+#: /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_main.py:3482
-msgid "Quickly expand all items"
+#: /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_main.py:3483
-msgid "Expand All Sections"
+#: /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_main.py:3485
-msgid "Quickly compress all items"
+#: /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_main.py:3486
-msgid "Compress All Sections"
+#: /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_main.py:3487
-msgid "Resources"
+#: /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_main.py:3489
-msgid "Open A PDF of the latest NHS Regulations"
+#: /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_main.py:3490
-msgid "Documents"
+#: /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_main.py:3491
-msgid "Advanced Options"
+#: /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_main.py:3492
-msgid "FeeScale Editor"
+#: /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_main.py:3493
-msgid "FeeScale Tester"
+#: /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_main.py:3494
-msgid "Reload Fee Scales"
+#: /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_main.py:3497
-msgid "Feescales"
+#: /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_main.py:3499
-msgid "Reply"
+#: /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_main.py:3500
-msgid "Alt+R"
+#: /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_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"
+#: /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_main.py:3502
-msgid "Del, Backspace"
+#: /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_main.py:3503
-msgid "&set parent"
+#: /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_main.py:3504
-msgid "Alt+S"
+#: /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_main.py:3505
-msgid "New Topic"
+#: /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_main.py:3506
-msgid "Search by keyword"
+#: /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_main.py:3511
-msgid "Show Topics for"
+#: /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_main.py:3512
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/forum_gui_module.py:59
-msgid "Everyone"
+#: /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_main.py:3514
-msgid "Include Deleted Posts"
+#: /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_main.py:3515
-msgid "Split Replies"
+#: /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_main.py:3516
-msgid "Group replies"
+#: /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_main.py:3517
-msgid "&Collapse Replies"
+#: /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_main.py:3518
-msgid "&Expand Replies"
+#: /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_main.py:3521
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1475
-msgid "FORUM"
+#: /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_main.py:3524
-msgid "Wiki"
+#: /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_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"
+#: /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_main.py:3526
-#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:95
-msgid "&Help"
+#: /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_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"
+#: /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_main.py:3528
-msgid "View"
+#: /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_main.py:3529
-msgid "Appointments"
+#: /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_main.py:3530
-msgid "Printing"
+#: /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_main.py:3531
-msgid "Forum"
+#: /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_main.py:3532
-msgid "Charts"
+#: /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_main.py:3533
-msgid "Mode (reception or surgery)"
+#: /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_main.py:3535
-msgid "Tools"
+#: /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_main.py:3536
-msgid "&Export Patient to disk"
+#: /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_main.py:3537
-msgid "&Import Patient from disk"
+#: /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_main.py:3538
-msgid "About &OpenMolar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:75
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:107
+msgid "Reception Machine"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3539
-msgid "&About QT"
+#: /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_main.py:3542
-msgid "Clear Today's Emergency Slots"
+#: /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_main.py:3544
-msgid "Select Interface Language"
+#: /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_main.py:3546
-msgid "Full Screen Mode (Ctrl-Alt-F)"
+#: /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_main.py:3547
-msgid "Ctrl+Alt+F"
+#: /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_main.py:3548
-msgid "Font Size"
+#: /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_main.py:3550
-msgid "Show Advanced Options"
+#: /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_main.py:3552
-msgid "Table View For Charting"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:227
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:380
+msgid "ADD COMMENTS"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_main.py:3553
-msgid "NHS Form Settings"
+#: /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_main.py:3554
-msgid "Test Print a GP17"
+#: /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_main.py:3555
-msgid "Print Daylists"
+#: /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_main.py:3556
-msgid "Set Clinician"
+#: /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_main.py:3557
-msgid "Set Assistant"
+#: /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_main.py:3558
-msgid "Surgery Mode"
+#: /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_main.py:3560
-msgid "Advanced Record Management"
+#: /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_main.py:3562
-msgid "Fix Locked New Course of Treatment"
+#: /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_main.py:3563
-msgid "Allow Full Edit"
+#: /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_main.py:3564
-msgid "Set Surgery Number"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:237
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:382
+msgid "DELETE COMMENTS"
msgstr ""
#:
-#: /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)"
+#: /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_main.py:3567
-msgid "Edit Phrasebooks"
+#: /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_main.py:3568
-msgid "Documents Dialog"
+#: /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_medhist.py:196
-msgid "Medical Notes"
+#: /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_medhist.py:197
-msgid "Doctor's details"
+#: /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_medhist.py:198
-msgid "Doctor's Name"
+#: /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_medhist.py:199
-msgid "Address / Tel No"
+#: /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_medhist.py:200
-msgid "Known Conditions"
+#: /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_medhist.py:201
-msgid "Current Medication"
+#: /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_medhist.py:202
-msgid "Past Medication"
+#: /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_medhist.py:203
-msgid "Allergies"
+#: /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_medhist.py:204
-msgid "Heart"
+#: /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_medhist.py:205
-msgid "Lungs"
+#: /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_medhist.py:206
-msgid "Liver"
+#: /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_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"
+#: /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_medhist.py:208
-msgid "Kidneys"
+#: /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_medhist.py:209
-msgid "Anaesthetic / operations"
+#: /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_medhist.py:211
-msgid "Mark as Checked Today"
+#: /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/compiled_uis/Ui_medhist.py:212
-msgid "Checked"
+#: /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/compiled_uis/Ui_medhist.py:213
-msgid "Mark Patient as Med Alert"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:121
+msgid "Out Of Office"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newBPE.py:124
-msgid "New CPITN score"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:679
+msgid "Made"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:679
+msgid "at"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:683
+msgid "Made on"
msgstr ""
#:
-#: /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"
+#: /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:374
+msgid "Load Patient"
msgstr ""
#:
-#: /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"
+#: /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/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 "*"
+#: /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/compiled_uis/Ui_newCourse.py:83
-msgid "New Course"
+#: /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/compiled_uis/Ui_newCourse.py:85
-msgid "Start a new Course of Treatment with the following Criteria?"
+#: /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/compiled_uis/Ui_newCourse.py:86
-msgid "Contracted Dentist"
+#: /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/compiled_uis/Ui_newCourse.py:89
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:118
-msgid "Acceptance Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:825
+msgid "Bad Time Sequence!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:359
-msgid "OpenMolar - New Setup"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:825
+msgid "Whoops!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:361
-msgid "Welcome to the OpenMolar settings wizard."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py:89
+msgid "Switch to day view of this date"
msgstr ""
#:
-#: /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."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py:93
+msgid "Edit Memos"
msgstr ""
#:
-#: /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."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py:95
+msgid "Edit Clinician Hours"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:369
-msgid "Password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:301
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:635
+msgid "Edit day memos"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:302
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:636
+msgid "Edit Public Holiday information"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:371
-msgid "Repeat Password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:349
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:514
+msgid "Wednesday"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:372
-msgid "Where is your mysql server located? **"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:389
+msgid "DATE"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:373
-msgid "Host"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:314
+msgid "Toggle Deciduous State"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:374
-msgid "Port"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:328
+msgid "Delete All Restorations"
msgstr ""
#:
-#: /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. "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:334
+msgid "Add Comments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:379
-msgid "Database Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:338
+msgid "Show History"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:380
-msgid "(mysql) User"
+#: /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/compiled_uis/Ui_newSetup.py:381
-msgid "(mysql) Password"
+#: /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/compiled_uis/Ui_newSetup.py:383
-msgid "Database Name"
+#: /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/compiled_uis/Ui_newSetup.py:384
-msgid "Test this Connection"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/confirming_check_box.py:58
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/base_dialogs.py:141
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/base_dialogs.py:170
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:83
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py:117
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:94
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:120
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:292
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:361
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:446
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:75
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1387
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1444
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:237
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:141
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:168
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:532
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:569
+#: /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:478
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:637
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3017
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3037
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:216
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:407
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:423
+#: /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/compiled_uis/Ui_newSetup.py:385
-msgid "Create A Demo Database"
+#: /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/compiled_uis/Ui_newSetup.py:386
-msgid "Use with an existing database"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:74
+msgid "Scheduling Mode"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:387
-msgid "Root mysql password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:76
+msgid "Blocking Mode"
msgstr ""
#:
-#: /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)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:78
+msgid "Notes Mode"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:393
-msgid "Creating Database.... please wait"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:400
+msgid "completed already"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:394
-msgid "OK.... you are all set to go!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:404
+msgid "There are multiple treatments associated with this estimate item"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:395
-msgid "Back"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:407
+msgid "All must be completed for the full charge to be applied"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py:396
-msgid "Proceed"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:409
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:120
+msgid "information"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:214
-msgid "Dental History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:428
+msgid "Not Allowed"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:215
-msgid "Previous Referral Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:429
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:1070
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:1118
+msgid "You have no clinician login. Treatments cannot be completed by you!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:216
-msgid "1st referral"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:436
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:80
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:645
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:704
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:721
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:733
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:366
+#: /home/neil/openmolar/openmolar1/src/standalone_chart/om_chart.py:178
+msgid "confirm"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:217
-msgid "re - referral"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:437
+msgid "Delete examination from this treatment plan and estimate?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:219
-msgid "I am Willing to carry out simple treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:72
+msgid "CSET"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:220
-msgid "Teeth With Poor Prognosis"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:115
+msgid "Planned Items Total"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:221
-msgid "Relevant Medical History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:116
+msgid "Interim Charges"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:222
-msgid "Reason for Referral"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:117
+msgid "Completed Items Total"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:223
-msgid "Crowding"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:118
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:142
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:180
+msgid "TOTAL"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:224
-msgid "Severe"
+#: /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/compiled_uis/Ui_ortho_ref_wizard.py:225
-msgid "Moderate"
+#: /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/compiled_uis/Ui_ortho_ref_wizard.py:226
-msgid "Mild"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:109
+msgid "Previous appointment"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:113
+msgid "Next available appointment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:228
-msgid "Spaced"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:202
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:319
+msgid "No patient Selected"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:229
-msgid "Incisal Relationship"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:427
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:72
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:125
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:624
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:108
+msgid "error"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:230
-msgid "Overjet:"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:428
+msgid "No patient selected"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:231
-msgid "mm"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:450
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:122
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:222
+msgid "Close"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_ortho_ref_wizard.py:232
-msgid "Overbite"
+#: /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/compiled_uis/Ui_ortho_ref_wizard.py:233
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:367
-msgid "Complete"
+#: /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/compiled_uis/Ui_ortho_ref_wizard.py:234
-msgid "InComplete"
+#: /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/compiled_uis/Ui_ortho_ref_wizard.py:235
-msgid "Traumatic"
+#: /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/compiled_uis/Ui_ortho_ref_wizard.py:236
-msgid "%"
+#: /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/compiled_uis/Ui_ortho_ref_wizard.py:237
-msgid "Patient Motivation"
+#: /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/compiled_uis/Ui_ortho_ref_wizard.py:238
-msgid "Fixed Appliance"
+#: /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/compiled_uis/Ui_ortho_ref_wizard.py:239
-msgid "Removable Applicance"
+#: /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/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>"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:281
+msgid "Toggle Pin Retention for current Filling"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:200
-msgid "Recall Settings"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:299
+msgid "Crowns"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:202
-msgid "A Wizard to select some common appointment combinations"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:300
+msgid "Posts"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:203
-msgid "Appointment Shortcuts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:301
+msgid "Bridges"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:205
-msgid "A New Appointment for this patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:302
+msgid "Implants"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:206
-msgid "&New"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:303
+msgid "Fissure Sealants"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:208
-msgid "delete or cancel the appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:304
+msgid "Endodontics"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:209
-msgid "Clear/Cancel"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:305
+msgid "Surgical Tx"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:211
-msgid "Make the selected appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:37
+msgid "Account Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:212
-msgid "Schedule"
+#: /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/compiled_uis/Ui_patient_diary.py:214
-msgid "Find the appointment in the the practice appointment list"
+#: /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/compiled_uis/Ui_patient_diary.py:215
-msgid "Find in Book"
+#: /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/compiled_uis/Ui_patient_diary.py:217
-msgid "Print out the next 5 appointments for this patient"
+#: /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/compiled_uis/Ui_patient_diary.py:218
-msgid "Print Card"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:51
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:44
+msgid "Add User Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:220
-msgid "Allows modifcation of certain criteria for this appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:53
+msgid "Add a new clinician to the system?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_diary.py:221
-msgid "Modify"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:56
+msgid "Add New Login"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:163
-msgid "Patient Finder"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:64
+msgid "Hygienist"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:65
+msgid "Therapist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:166
-msgid "Repeat Last Search"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:72
+msgid "Create a new diary for this clinician (uncheck to map to an existing diary)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:167
-msgid "SNO or Surname"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:84
+msgid "Initials/Nickname (must be an existing Login)"
msgstr ""
#:
-#: /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."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:86
+msgid "Name eg. Fred Smith"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:87
+msgid "Formal Name eg. Dr.F. Smith"
msgstr ""
#:
-#: /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\"!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:88
+msgid "Qualifications"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:184
-msgid "Address includes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:89
+msgid "Speciality"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:90
+msgid "Clinician Type"
msgstr ""
#:
-#: /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."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:92
+msgid "Additional Data"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py:191
-msgid "search for a postcode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py:104
+msgid "view existing dentists"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:204
-msgid "Payments for treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py:75
+msgid "Complete Treatments"
msgstr ""
#:
-#: /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 "-"
+#: /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/compiled_uis/Ui_payments.py:209
-msgid "Debit Card"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:47
+msgid "Add a new user to the system?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:211
-msgid "Credit Card"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:48
+msgid "This is done using initials or a short nickname."
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:49
+msgid "Must be unique and Maximum allowed in 5 characters"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:55
+msgid "User Initials or nickname"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:215
-msgid "Annual HDP"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:66
+msgid "view existing users"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_user_dialog.py:73
+msgid "Initials/nickname mut be unique"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_payments.py:218
-msgid "Amount which will appear on receipt (read only)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:36
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:119
+msgid "Forename"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py:56
-msgid "Raise Permissions"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
+msgid "dob"
msgstr ""
#:
-#: /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."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:38
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:125
+msgid "POSTCODE"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:48
+msgid "Address Matches"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_quick_daylist_print.py:67
-msgid "Print Formatting"
+#: /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/compiled_uis/Ui_quick_daylist_print.py:68
-msgid "Minimal"
+#: /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/compiled_uis/Ui_quick_daylist_print.py:69
-msgid "Full Page"
+#: /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/compiled_uis/Ui_record_tools.py:585
-msgid "Advanced Record Alteration"
+#: /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/compiled_uis/Ui_record_tools.py:586
-msgid "NHS current fees (money0)"
+#: /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/compiled_uis/Ui_record_tools.py:587
-msgid "NHS payments (money2)"
+#: /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/compiled_uis/Ui_record_tools.py:588
-msgid "NHS estimated (money4)"
+#: /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/compiled_uis/Ui_record_tools.py:589
-msgid "private estimate (money5)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alterAday.py:150
+msgid "Clinician Times"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:591
-msgid "Exempt - nhs gross - completed treatment (money6)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alterAday.py:170
+msgid "values from"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:593
-msgid "Exempt - NHS gross - estimated current (money7)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:46
+msgid "Alter Cashbook Entry"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:594
-msgid "credit (money8)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:67
+msgid "Patient Number"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:595
-msgid "debt (money9)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:68
+msgid "Patient Name"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:596
-msgid "debt2 (money10)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:71
+msgid "Payment Type"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:597
-msgid "money 11 (always 0!)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py:85
+msgid "Enable Full Edit"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:598
-msgid "private current fees (money1) "
+#: /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:55
+msgid "Choose from the following options"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:599
-msgid "private payments (money3)"
+#: /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:79
+msgid "You haven't completed this option"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:600
-msgid "ALL AMOUNTS ARE IN PENCE (cents)"
+#: /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/compiled_uis/Ui_record_tools.py:601
-msgid "Outstanding <br />amount"
+#: /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/compiled_uis/Ui_record_tools.py:602
-msgid "0.00"
+#: /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/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"
+#: /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/compiled_uis/Ui_record_tools.py:604
-msgid "Money"
+#: /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:190
+msgid "Acrylic Denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:606
-msgid "Last CE (pd5)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:177
+msgid "Metal Denture"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:206
+msgid "Please select teeth to be added to this denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:608
-msgid "Last ECE (pd6)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:254
+msgid "How Many Clasps?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:610
-msgid "Last FCA (pd7)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:284
+msgid "Does this work require the taking of an impression?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:612
-msgid "Last OPT (pd8)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:317
+#: /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:293
+msgid "You have completed your input."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:614
-msgid "Last intraoral Xrays (pd9)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:318
+#: /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:294
+msgid "Please click on Apply"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:616
-msgid "Last SP (pd10)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:328
+msgid "Alterations to an existing Denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:618
-msgid "Last Account sent (billdate)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:362
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:336
+msgid "Upper Denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:622
-msgid "Dates"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:363
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:337
+msgid "Lower Denture"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:368
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:577
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:608
+#: /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:342
+msgid "Next"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:388
+#: /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:362
+msgid "Whoops"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:443
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:454
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:244
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:421
+msgid "Warning"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:444
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:422
+msgid "Your upper denture input is invalid"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:455
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:434
+msgid "Your lower denture input is invalid"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_todays_notes.py:56
+msgid "Open Phrasebook"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:636
-msgid "Treatment Plan"
+#: /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/compiled_uis/Ui_record_tools.py:650
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:73
-msgid "Completed Treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:49
+msgid "Include Today's appointments?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py:651
-msgid "Hidden Notes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:106
+msgid "No appointments to print!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:97
-msgid "Post a memo about this Patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:39
+msgid "Staff Meeting"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:98
-msgid "Expiry Policy"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:50
+msgid "Insert a number of blocks to various books"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:99
-msgid "Do Not Expire"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:52
+msgid "Clinicians"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:100
-msgid "Expire on this date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:64
+msgid "Days to Apply"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:101
-msgid "Viewable by"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:108
+msgid "What time does this recurr?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:103
-msgid "Surgery Machines"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:110
+msgid "What is this block for?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_saveMemo.py:104
-msgid "Reception Machines"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:138
+msgid "reason"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_select_patient.py:54
-msgid "Make a Selection"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:139
+msgid "Please enter the text to use for this block"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_showMemo.py:66
-msgid "Delete this memo when I close this"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:181
+msgid "End Date is greater than Start Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:186
-msgid "Enter an appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:184
+msgid "Block has zero duration"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:187
-msgid "Appointment with"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:187
+msgid "You have no days selected"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:189
-msgid "5 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:190
+msgid "You have no clinicians (ie.books) selected"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:190
-msgid "10 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:214
+msgid "applying changes for"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:191
-msgid "15 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:228
+msgid "Appointment(s) inserted"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:192
-msgid "20 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:231
+msgid "Some were rejected by the database as they clashed with existing appointments or blocks"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:193
-msgid "30 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:234
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:332
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:339
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:60
+#: /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:454
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:264
+msgid "Information"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:194
-msgid "40 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py:243
+msgid "Bad Input"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:195
-msgid "45 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py:45
+msgid "Edit Memos for"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:196
-msgid "1 hour"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py:61
+msgid "Global Memo"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:197
-msgid "1 hour 15 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py:77
+msgid "Clinician Memos"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:198
-msgid "1 hour 20 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py:84
+msgid "Public Holiday Text"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:199
-msgid "1 hour 30 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py:86
+msgid "Edit Public Holiday Text"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:200
-msgid "1 hour 45 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:47
+msgid "User choice"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:201
-msgid "2 hours"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:49
+msgid "Set the Appointment Viewing Mode"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:202
-msgid "2 hours 30 minutes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:53
+msgid "Browsing"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:203
-msgid "3 hours"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:58
+msgid "Scheduling"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:206
-msgid "Combined Appointment With Hygenist?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:59
+msgid "make appointments for a patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:207
-msgid "Reason 1"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:63
+msgid "Blocking"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:208
-msgid "Reason 3"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:209
-msgid "Reason 2"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:68
+msgid "Note Checking"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:210
-msgid "Brief Note for Clinician (optional)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:69
+msgid "check notes for today's patients"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_specify_appointment.py:211
-msgid "Schedule Appointment Now"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:63
+msgid "Appointment Preferences for Patient"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:68
+msgid "Recall Patient Periodically"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:165
-msgid "Messages and Tasks"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:72
+msgid "Dentist Recall"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:168
-msgid "My Calendar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:87
+msgid "dentist recall period (months)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_staff_diary.py:171
-msgid "Holiday Planner"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:89
+msgid "Next Recall Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:166
-msgid "openMolar"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:90
+msgid "Shortcuts (months from today)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:167
-msgid "System Password"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:94
+msgid "Hygienist Recall"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:168
-msgid "User 1(required)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:107
+msgid "hygienist recall period (months)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:169
-msgid "User 2 (optional)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:109
+msgid "Next Recall"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:170
-msgid "Surgery Machine"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
+msgid "Post"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:125
+msgid "Recall method"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py:173
-msgid "change"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:34
+msgid "Select an Assitant"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:74
-msgid "Please set the Surgery Number"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:43
+msgid "No Assistant"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:76
-msgid "Surgery One"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:38
+msgid "Apply Saved Address"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:77
-msgid "Surgery Two"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:78
-msgid "Surgery Three"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:79
-msgid "Surgery Four"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:51
+msgid "Post Code"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:80
-msgid "Surgery Five"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:52
+msgid "Home Telephone"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_surgeryNumber.py:81
-msgid "Surgery Six"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:78
+msgid "Existing"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:152
-msgid "ToothId"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:151
+msgid "No previous address details found"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/base_dialogs.py:99
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:188
+msgid "Abandon Changes?"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:46
+msgid "Begin Make Appointment Dialog"
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"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:157
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:354
-msgid "Furcation"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:57
+msgid "When to Look"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:63
+msgid "Find First Available Appointment"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:67
+msgid "7 Days Hence"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:161
-msgid "Copy &All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:69
+msgid "After Patient's last appointment"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:77
+msgid "Day or Week Graphical View"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:163
-msgid "Cp"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:92
+msgid "Clinician selection policy"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:97
+msgid "Specified Clinician"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:99
+msgid "Any Dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:168
-msgid "I"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:100
+msgid "Any Hygienist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:169
-msgid "II"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:102
+msgid "Any Clinician"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py:170
-msgid "III"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:113
+msgid "Emergency time management"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:115
+msgid "Ignore Emergency Spaces"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:228
-msgid "!KUO"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:229
-msgid "!Mobile Tooth"
+#: /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/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:230
-msgid "!Early Caries"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:142
+msgid "Search Now"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:231
-msgid "!Filling Missing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:195
+msgid "begin making appointment for patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:232
-msgid "!Chipped"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:58
+msgid "No patient chosen!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:233
-msgid "!Cracked"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:101
+msgid "Start is outwith slot bounds (too early)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:234
-msgid "!Poor Prognosis"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:104
+msgid "Start is outwith slot bounds (too late)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:235
-msgid "!Extract Soon"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:107
+msgid "Finish is outwith slot bounds (too late"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:236
-msgid "!Implant required"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:110
+msgid "Finish is outwith slot bounds (too early"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:112
+msgid "length of appointment is too short"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:238
-msgid "AM"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:115
+msgid "no reason for the block given"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:239
-msgid "CO"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:118
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:113
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1779
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:96
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:119
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:190
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:211
+msgid "no patient selected"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:240
-msgid "GL"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:124
+msgid "Unable to commit because"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:242
-msgid "Po"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:142
+msgid "patient not found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:243
-msgid "extract (plan only!)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:152
+msgid "Chosen Patient is"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:244
-msgid "EX"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:154
+msgid "no patient chosen"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:245
-msgid "root treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:43
+msgid "Bridge Treatment Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:246
-msgid "RT"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:51
+msgid "Plan a New Bridge"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:248
-msgid "porcelain veneer"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:53
+msgid "Recement/Repairs"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:249
-msgid "DR"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:36
+msgid "Fissure Sealant"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:250
-msgid "Apply & Add Another Item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:37
+msgid "PRR restoration with composite"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothProps.py:251
-msgid "&&"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:41
+msgid "Pulp Extirpation - 1 canal"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:80
-msgid "Tooth Property Editor"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:42
+msgid "Pulp Extirpation - multiple canals"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:81
-msgid "UR8"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:43
+msgid "Root Canal"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:82
-msgid "Items"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:44
+msgid "Incomplete Endodontics"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/compiled_uis/Ui_toothprops_full_edit.py:83
-msgid "Database Line"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:48
+msgid "Extraction"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/contract_gui_module.py:120
-msgid "erroneous exemption category entered"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:49
+msgid "Surgical Extraction"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:121
-msgid "Out Of Office"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:50
+msgid "Apicectomy"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:679
-msgid "Made"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:61
+msgid "Chart Treatment Choice Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:679
-msgid "at"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:78
+msgid "Show Treatments from all feescales"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:683
-msgid "Made on"
+#: /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/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"
+#: /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/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:737
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:776
-msgid "Add/Edit Memo"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:85
+msgid "ToothBrushing Instruction Given"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:88
+msgid "Dietary Advice Given"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:91
+msgid "Fluoride Varnish Applied"
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"
+#: /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/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:751
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:779
-msgid "Print A Medical Form"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:126
+msgid "Please enter a valid postcode"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:825
-msgid "Bad Time Sequence!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:138
+msgid "KNOWN SIMD"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/appointmentwidget.py:825
-msgid "Whoops!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:145
+msgid "Polling website with Postcode"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:148
-msgid "Public Holidays"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:161
+msgid "Error polling website"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:149
-msgid "Enter the information for "
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:164
+msgid "Timeout polling website"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/calendars.py:455
-msgid "DATE"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:168
+msgid "RESULT"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:186
+msgid "Manual Input Required"
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"
+#: /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/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:314
-msgid "Toggle Deciduous State"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:34
+msgid "Select a Clinician"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:328
-msgid "Delete All Restorations"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:43
+msgid "NONE"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:334
-msgid "Add Comments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:84
+msgid "Set assistant as"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/chartwidget.py:338
-msgid "Show History"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/close_course_dialog.py:38
+msgid "Close Course Dialog"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/close_course_dialog.py:47
+msgid "You have no further treatment proposed for this patient, yet they are deemed to be \"under treatment\"."
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/close_course_dialog.py:58
+msgid "Suggested Completion Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/confirming_check_box.py:58
-msgid "Are you Sure"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/close_course_dialog.py:62
+msgid "Close this course now?"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/close_course_dialog.py:65
+msgid "Pt failed to return"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:45
+msgid "Complete Multiple Treatments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:74
-msgid "Scheduling Mode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:48
+msgid "You have selected multiple treatments."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:76
-msgid "Blocking Mode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:49
+msgid "Please complete, reverse or delete then apply changes."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/diary_view_controller.py:78
-msgid "Notes Mode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:110
+msgid "Complete All"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:393
-msgid "completed already"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:113
+msgid "Reverse All"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:397
-msgid "There are multiple treatments associated with this estimate item"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py:42
+msgid "Course Daybook Estimate Checker"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py:45
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:51
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:50
+msgid "Polling Database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:402
-msgid "information"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py:53
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:56
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:64
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:70
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py:78
+msgid "No advanced options available"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py:419
-msgid "Delete examination from this treatment plan and estimate?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py:59
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:62
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:70
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:77
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:115
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py:88
+msgid "message"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:69
-msgid "CSET"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:41
+msgid "Edit Treatment Course"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:113
-msgid "Planned Items Total"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:96
+msgid "acceptance date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:114
-msgid "Interim Charges"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:99
+msgid "completion date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:115
-msgid "Completed Items Total"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:102
+msgid "Set completion date to match Acceptance date"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:106
+msgid "Add Completion Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/estimate_widget.py:373
-msgid "from treatment plan and estimate"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:111
+msgid "exam date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:101
-msgid "Open the patient's diary"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:113
+msgid "No Exam Date on this course"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:105
-msgid "Launch the Appointment Wizard"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_edit_dialog.py:128
+msgid "Bad Date Sequence"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:109
-msgid "Previous appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py:40
+msgid "Options Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:113
-msgid "Next available appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py:41
+msgid "What do you wish to show?"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py:44
+msgid "Include Estimates"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py:48
+msgid "Include Daybook"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/schedule_control.py:428
-msgid "No patient selected"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py:52
+msgid "Leave both unchecked for courses only"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:46
+msgid "Merge Treatment Courses"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:42
-msgid "Mark the selected tooth as missing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:52
+msgid "Preview Merged Course"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:46
-msgid "Mark the selected tooth as artificial"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:84
+msgid "Courses can't be merged, both have examinations"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:50
-msgid "Mark the selected tooth as root present"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/course_merge_dialog.py:86
+msgid "Merged Course Preview"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:54
-msgid "Permanent Tooth Also Present"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:36
+msgid "Porcelain Jacket"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:58
-msgid "Supernumary Tooth Present"
+#: /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/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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:38
+msgid "Porcelain/Metal"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/static_control_panel.py:66
-msgid "Mark the selected tooth as over erupted"
+#: /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/customwidgets/static_control_panel.py:74
-msgid "Toggle selected tooth/teeth as deciduous"
+#: /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/customwidgets/toothProps.py:272
-msgid "Toggle Pin Retention for current Filling"
+#: /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/customwidgets/toothProps.py:290
-msgid "Crowns"
+#: /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/customwidgets/toothProps.py:291
-msgid "Posts"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:43
+msgid "Stainless"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:292
-msgid "Bridges"
+#: /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/customwidgets/toothProps.py:293
-msgid "Implants"
+#: /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/customwidgets/toothProps.py:294
-msgid "Fissure Sealants"
+#: /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/customwidgets/toothProps.py:295
-msgid "Endodontics"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:44
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:82
+msgid "Inspecting daybook row"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/customwidgets/toothProps.py:296
-msgid "Surgical Tx"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:56
+msgid "Diagnosis"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:37
-msgid "Account Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:58
+msgid "Anaesthetics"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:38
-msgid "Please Choose the tone of this letter"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:59
+msgid "Misc"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:41
-msgid "Normal Account - Very Polite"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:64
+msgid "Other Treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:42
-msgid "Mildly assertive request"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py:65
+msgid "Chart Treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/account_severity_dialog.py:44
-msgid "Threaten with Debt Collector"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:47
+msgid "Update the daybook row with these new Totals"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py:75
-msgid "Complete Treatments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:49
+msgid "Update the daybook row with Fee Total Only"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/add_treatment_dialog.py:76
-msgid "What treatment has been performed?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:51
+msgid "Update the daybook row with Charge Total Only"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:36
-msgid "Forename"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:53
+msgid "Delete this row from the daybook"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:37
-msgid "dob"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:90
+msgid "Ok"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:38
-msgid "POSTCODE"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:123
+msgid "No Information found in estimates for this daybook item"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:48
-msgid "Address Matches"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:148
+msgid "Fee Differs"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/address_match_dialog.py:81
-msgid "Top 12 address matches for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:150
+msgid "Charge Differs"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/advanced_tx_planning_dialog.py:100
-msgid "Advanced Treatment Planning"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:157
+msgid "Successfully applied changes"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:159
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:165
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:171
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:177
+msgid "No changes made"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:163
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:169
+msgid "Successfully applied change"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/daybook_item_dialog.py:175
+msgid "Successfully deleted row"
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"
+#: /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/advanced_tx_planning_dialog.py:193
-msgid "Hide Chart Items"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:51
+msgid "Plan New Denture(s)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alterAday.py:150
-msgid "Clinician Times"
+#: /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/alterAday.py:170
-msgid "values from"
+#: /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/alter_cashbook_dialog.py:49
-msgid "Alter Cashbook Entry"
+#: /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/alter_cashbook_dialog.py:70
-msgid "Patient Number"
+#: /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/alter_cashbook_dialog.py:71
-msgid "Patient Name"
+#: /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/alter_cashbook_dialog.py:74
-msgid "Payment Type"
+#: /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/alter_cashbook_dialog.py:88
-msgid "Enable Full Edit"
+#: /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/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"
+#: /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/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"
+#: /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/alter_denture_dialog.py:94
-msgid "What are you Modifying?"
+#: /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/alter_denture_dialog.py:97
-msgid "An existing Upper Denture"
+#: /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/alter_denture_dialog.py:99
-msgid "An existing Lower Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:126
+msgid "show"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:174
-msgid "What best describes the denture type?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:165
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:972
+msgid "error reviewing PDF file"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:178
+msgid "Professional Services"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:177
-msgid "Metal Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:184
+msgid "duplicate receipt for"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:205
-msgid "Please select teeth to be added to this denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py:42
+msgid "Edit Practice Address Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:251
-msgid "How Many Clasps?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py:45
+msgid "Edit the Practice Name and/or address."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:281
-msgid "Does this work require the taking of an impression?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py:46
+msgid "This information is used on receipts and appointment slips."
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."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py:54
+msgid "Practice Name"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py:60
+msgid "Address Line"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py:325
-msgid "Alterations to an existing Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:86
+msgid "Delete the currently selected Centre"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:91
+msgid "Add a New Centre"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:110
+msgid "Greeting"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:228
+msgid "Example Referral Centre"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:229
+msgid "Dear Sir/Madam"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:229
+msgid "My Local Hospital"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:230
+msgid "Main Street"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:230
+msgid "My Town"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/alter_todays_notes.py:56
-msgid "Open Phrasebook"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py:245
+msgid "You should have at least one referral centre in the database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:43
-msgid "Appointment Card for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:39
+msgid "Edit Treatment Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:49
-msgid "Include Today's appointments?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:44
+msgid "Option"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appointment_card_dialog.py:106
-msgid "No appointments to print!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:46
+msgid "Edit Completed items?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:47
-msgid "User choice"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:47
+msgid "Choosing 'NO' will offer edit of planned items"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:49
-msgid "Set the Appointment Viewing Mode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:54
+msgid "Planned Items"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:53
-msgid "Browsing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:57
+msgid "Completed Items"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:58
-msgid "Scheduling"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py:89
+msgid "No Advanced Options"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:59
-msgid "make appointments for a patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py:70
+msgid "Inspecting estimate for Course Number"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:63
-msgid "Blocking"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py:117
+msgid "Apply Changes?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_mode_dialog.py:64
-msgid "block time periods. eg. lunch times etc."
+#: /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/appt_mode_dialog.py:68
-msgid "Note Checking"
+#: /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/appt_mode_dialog.py:69
-msgid "check notes for today's patients"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:88
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:105
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:542
+msgid "Is this correct?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:63
-msgid "Appointment Preferences for Patient"
+#: /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/appt_prefs_dialog.py:68
-msgid "Recall Patient Periodically"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:104
+msgid "performed this exam"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:72
-msgid "Dentist Recall"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:109
+msgid "confirming this will change the course dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:87
-msgid "dentist recall period (months)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:110
+msgid "but not the registered dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:89
-msgid "Next Recall Date"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:114
+msgid "consider making"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:90
-msgid "Shortcuts (months from today)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:116
+msgid "the registered dentist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:94
-msgid "Hygienist Recall"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:142
+msgid "You already have a completed exam on this course of treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:107
-msgid "hygienist recall period (months)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:144
+msgid "Unable to perform exam"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:109
-msgid "Next Recall"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:152
+msgid "Examination not applied"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:113
-msgid "Post"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:188
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:145
+msgid "performed by"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/appt_prefs_dialog.py:125
-msgid "Recall method"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:197
+msgid "Not updating recall due to patient's recall settings"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/assistant_select_dialog.py:34
-msgid "Select an Assitant"
+#: /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/assistant_select_dialog.py:43
-msgid "No Assistant"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:43
+msgid "TOWN"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:38
-msgid "Apply Saved Address"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:104
+msgid "Add Record"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:105
+msgid "to this family group?"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:125
+msgid "Which address should be used?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:51
-msgid "Post Code"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:167
+msgid "Synchronise Addresses"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:52
-msgid "Home Telephone"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:171
+msgid "Standard Search"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:78
-msgid "Existing"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:174
+msgid "Address Search"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/auto_address_dialog.py:151
-msgid "No previous address details found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:178
+msgid "Delete this group"
msgstr ""
#:
-#: /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?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:183
+msgid "Add members"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:46
-msgid "Begin Make Appointment Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:188
+msgid "Manage Group"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:49
-msgid "Please set criteria for making this appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:204
+msgid "Manage Family Group"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:57
-msgid "When to Look"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:237
+msgid "from group"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:63
-msgid "Find First Available Appointment"
+#: /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:257
+msgid "Unlink"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:67
-msgid "7 Days Hence"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:272
+msgid "This patient does not belong to any family group."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:69
-msgid "After Patient's last appointment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:274
+msgid "Create a New Family Group"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:77
-msgid "Day or Week Graphical View"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:277
+msgid "Show similar addresses"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:92
-msgid "Clinician selection policy"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:293
+msgid "Remove"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:97
-msgid "Specified Clinician"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:294
+msgid "from this family group?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:99
-msgid "Any Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:333
+msgid "Addresses are all identical - nothing to do!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:100
-msgid "Any Hygienist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:340
+msgid "Address(es) updated"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:102
-msgid "Any Clinician"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:362
+msgid "Delete this family group?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:113
-msgid "Emergency time management"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:61
+msgid "warning"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:115
-msgid "Ignore Emergency Spaces"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:62
+msgid "You have no patients in your database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:124
-msgid "Look for appointments on these days"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:89
+msgid "no match found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:132
-msgid "Look for Joint Appointments with the hygienist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:116
+msgid "Serialno"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:142
-msgid "Search Now"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:121
+msgid "Birth Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/begin_make_appt_dialog.py:195
-msgid "begin making appointment for patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:122
+msgid "Address Line 1"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/block_wizard.py:111
-msgid "applying changes for"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:123
+msgid "Address Line 2"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:58
-msgid "No patient chosen!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:126
+msgid "Tel1"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:109
-msgid "Start is outwith slot bounds (too early)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:127
+msgid "Tel2"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:112
-msgid "Start is outwith slot bounds (too late)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:128
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:166
+msgid "Mobile"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:115
-msgid "Finish is outwith slot bounds (too late"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:154
+msgid "Load the Selected Patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:118
-msgid "Finish is outwith slot bounds (too early"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:103
+msgid "This Dialog will help you"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:120
-msgid "length of appointment is too short"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:104
+msgid "secure openmolar with a password"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:123
-msgid "no reason for the block given"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:105
+msgid "note the location of your mysql/mariadb server"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:106
+msgid "install a blank database schema if required."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:132
-msgid "Unable to commit because"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:107
+msgid "save a settings file so you do not have to endure this again!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:150
-msgid "patient not found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:111
+msgid "Click Next to continue, or Quit to leave OpenMolar now."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:160
-msgid "Chosen Patient is"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:119
+msgid "This appears to be your first running of OpenMolar."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/blockslot.py:162
-msgid "no patient chosen"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:120
+msgid "We need to save a few settings to continue."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:43
-msgid "Bridge Treatment Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:129
+msgid "You may wish to enter a password which will hereafter be required to login to the OpenMolar application"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:51
-msgid "Plan a New Bridge"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:131
+msgid "This password will help prevent an unauthorised person accessing any sensitive data."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/bridge_dialog.py:53
-msgid "Recement/Repairs"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:133
+msgid "If your data is simply demonstration data, this can be left blank"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:36
-msgid "Fissure Sealant"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:141
+msgid "Show Passwords"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:37
-msgid "PRR restoration with composite"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:142
+msgid "Password"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:41
-msgid "Pulp Extirpation - 1 canal"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:143
+msgid "Confirm Password"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:42
-msgid "Pulp Extirpation - multiple canals"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:152
+msgid "Step 1 - Set a password for OpenMolar"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:43
-msgid "Root Canal"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:171
+msgid "Passwords don't match!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:44
-msgid "Incomplete Endodontics"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:179
+msgid "OpenMolar is simply a database client."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:48
-msgid "Extraction"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:180
+msgid "It requires a database server such as MySQL or MariaDB."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:49
-msgid "Surgical Extraction"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:181
+msgid "Please enter the hostname and port number where your server can be reached."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:50
-msgid "Apicectomy"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:186
+msgid "If you do not have a mysql/mariadb server on your computer or local network, please quit this setup, and install one now!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:61
-msgid "Chart Treatment Choice Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:189
+msgid "Make a note of the root password you create during this set up."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/chart_tx_choice_dialog.py:78
-msgid "Show Treatments from all feescales"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:201
+msgid "Host"
msgstr ""
#:
-#: /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?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:202
+msgid "Port"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:212
+msgid "Step 2 - Where is your database server?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:85
-msgid "ToothBrushing Instruction Given"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:234
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:330
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:394
+msgid "The Following errors were found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:88
-msgid "Dietary Advice Given"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:236
+msgid "Host Field is Blank"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:91
-msgid "Fluoride Varnish Applied"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:238
+msgid "Port Field is Blank"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:93
-msgid "Fee claimable for patients betwen 2 and 5"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:240
+msgid "Port Field must be a number. Default is 3306"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:126
-msgid "Please enter a valid postcode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:252
+msgid "Do you already have an openmolar database on this server?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:138
-msgid "KNOWN SIMD"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:253
+msgid "If not, you should lay out one now."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:145
-msgid "Polling website with Postcode"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:259
+msgid "Create a database user and install a blank (demo) Database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:161
-msgid "Error polling website"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:261
+msgid "Use an existing database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:164
-msgid "Timeout polling website"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:269
+msgid "Step 3 - select a database option"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:168
-msgid "RESULT"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:284
+msgid "Please enter connection criteria for the database."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:186
-msgid "Manual Input Required"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:285
+msgid "If the user and/or database does not exist, you will be given an opportunity to create them "
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/child_smile_dialog.py:188
-msgid "Online lookup has failed, please enter the SIMD manually"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:298
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:364
+msgid "Show Password"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:34
-msgid "Select a Clinician"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:300
+msgid "Database Name"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:43
-msgid "NONE"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:301
+msgid "(mysql) user"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/clinician_select_dialog.py:84
-msgid "Set assistant as"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:302
+msgid "(mysql) password"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:47
-msgid "Complete Multiple Treatments"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:310
+msgid "Step 5(a) - Your Database Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:50
-msgid "You have selected multiple treatments."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:332
+msgid "Database Name Field is Blank"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:51
-msgid "Please complete, reverse or delete then apply changes."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:334
+msgid "User Field is Blank"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:336
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:398
+msgid "Password Field is Blank"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:112
-msgid "Complete All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:346
+msgid "To create a database, and set the privileges for user, OpenMolar must log into mysql as a privileged mysql user."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py:115
-msgid "Reverse All"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:348
+msgid "OpenMolar does NOT store this username or password."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:36
-msgid "Porcelain Jacket"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:352
+msgid "Please enter the username and password of a privileged mysql user."
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:354
+msgid "(note - on most mysql setups, login by 'root' is only allowed on localhost)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:38
-msgid "Porcelain/Metal"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:366
+msgid "Privileged user"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:367
+msgid "Password for this user"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:375
+msgid "Step 5b - Create an authenticated user and database"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:396
+msgid "Privileged User Field is Blank"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:408
+msgid "Creating Database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:43
-msgid "Stainless"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:417
+msgid "Step 6 - Create Database"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:447
+msgid "A database named"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:59
-msgid "Crown Choice Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:449
+msgid "exists already"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/crown_choice_dialog.py:77
-msgid "Show Crowns types from all feescales"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:450
+msgid "Overwrite this database?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:43
-msgid "Denture Treatment Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:480
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:524
+msgid "Success!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:51
-msgid "Plan a New Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:481
+msgid "Database created successfully!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/denture_dialog.py:53
-msgid "Alter an Existing Denture"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:487
+msgid "Error Creating Database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:91
-msgid "Openmolar Documents Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:496
+msgid "Testing connection"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:95
-msgid "Please choose a document to open"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:503
+msgid "Final Step - Test Connection & Write Config File"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:101
-msgid "For help configuring this feature, see"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:525
+msgid "The Database accepted the connection"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:112
-msgid "You have no documents stored in"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:534
+msgid "Warning!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:136
-msgid "docs.xml is not parseable"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:535
+msgid "The Database refused the connection"
msgstr ""
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/document_dialog.py:170
-msgid "Error opening PDF file"
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:546
+msgid "First Run Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:51
-msgid "Duplicate receipts for Patient"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:579
+msgid "Back"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:56
-msgid "No previous receipts found!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:584
+msgid "Quit OpenMolar"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:59
-msgid "Reprint an existing receipt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:604
+msgid "Create Database Now!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py:66
-msgid "Generate a Duplicate receipt"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/first_run_dialog.py:606
+msgid "Write Config File and Proceed"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:38
+msgid "Form options"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:48
+msgid "use test mode (print boxes)"
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"
+#: /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/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:68
-msgid "Please enter the examining Dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:74
+msgid "Prior Approval"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:87
-msgid "is now both the registered and course dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:96
+msgid "GP17 Dialog"
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?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:98
+msgid "Print a GP17 Form"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:89
-msgid "confirming this will remove reference to"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:110
+msgid "Use this dentists stamp?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:102
-msgid "performed this exam"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:115
+msgid "Chart"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:107
-msgid "confirming this will change the course dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:119
+msgid "Completion Date"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:108
-msgid "but not the registered dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:120
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:589
+msgid "Treatments"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:112
-msgid "consider making"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:122
+msgid "Include Chart Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:114
-msgid "the registered dentist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:129
+msgid "Include Course Details"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:51
+msgid "WARNING - THE FOLLOWING TREATMENTS ARE ALREADY PLANNED."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:137
-msgid "Unable to perform exam"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:102
+msgid "Please enter a dentist / hygienist"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:144
-msgid "Examination not applied"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:36
+msgid "Titanium Implant"
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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:37
+msgid "Implant Abutment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/exam_wizard.py:188
-msgid "WARNING - Not updating recall due to patients recall settings"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:38
+msgid "Implant Crown"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:42
-msgid "Address 3"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:39
+msgid "Implant Bridge Retainer"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:43
-msgid "TOWN"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:40
+msgid "Implant Bridge Pontic"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:104
-msgid "Add Record"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:54
+msgid "Implant Choice Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:105
-msgid "to this family group?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:42
+msgid "Initial Check Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:125
-msgid "Which address should be used?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:45
+msgid "OpenMolar has found the following issues with your database."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:167
-msgid "Synchronise Addresses"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:50
+msgid "No Advanced options"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:171
-msgid "Standard Search"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:56
+msgid "Proceed"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:174
-msgid "Address Search"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:76
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:82
+msgid "How do I Fix This?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:178
-msgid "Delete this group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:78
+msgid "Your database contains no dentists"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:183
-msgid "Add members"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:85
+msgid "Your practice name is"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:188
-msgid "Manage Group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:94
+msgid "Why is this?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:204
-msgid "Manage Family Group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:96
+msgid "You have no appointment space in your diary!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:237
-msgid "from group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:105
+msgid "The cbcodes table in your database is inadequate."
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:106
+msgid "This will create problems when accepting payments."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:270
-msgid "This patient does not belong to any family group."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:112
+msgid "patients"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:272
-msgid "Create a New Family Group"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:112
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:115
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:118
+msgid "you have"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:275
-msgid "Show similar addresses"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:115
+msgid "active dentists"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:291
-msgid "Remove"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:118
+msgid "active hygienists"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:292
-msgid "from this family group?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:121
+msgid "appointment search final date is"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:126
+msgid "Once the application is open, click on Tools - > Menu - > Add Clinician"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:331
-msgid "Addresses are all identical - nothing to do!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:130
+msgid "Once the application is open, click on Tools - > Menu - > Edit Practice Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:338
-msgid "Address(es) updated"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:134
+msgid "This could be for a variety of reasons"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/family_manage_dialog.py:361
-msgid "Delete this family group?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:135
+msgid "You need to have at least one clinician with an appointment book"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/find_patient_dialog.py:83
-msgid "no match found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:137
+msgid "No Clinicians have any days contracted to work in the practice?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:38
-msgid "Form options"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:139
+msgid "Perhaps all future clinical time is already booked?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:48
-msgid "use test mode (print boxes)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/initial_check_dialog.py:140
+msgid "The BOOKEND value (last day to search for appointments) may simply need adjusting"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:50
-msgid "use a background image for the form (if available)"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:52
+msgid "Default"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:74
-msgid "Prior Approval"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:67
+msgid "You have selected to connect to"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:96
-msgid "GP17 Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:69
+msgid "This is not the default database - are you sure you wish to use this database?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:98
-msgid "Print a GP17 Form"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:96
+msgid "Login Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:110
-msgid "Use this dentists stamp?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:98
+msgid "Login Required"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:115
-msgid "Chart"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:108
+msgid "Surgery Machine"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:114
+msgid "System Password"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:122
-msgid "Include Chart Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:116
+msgid "User 1 (Required)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/gp17_printdialog.py:129
-msgid "Include Course Details"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:117
+msgid "User 2 (Optional)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:51
-msgid "WARNING - THE FOLLOWING TREATMENTS ARE ALREADY PLANNED."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:141
+msgid "Database choice"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/hygTreatWizard.py:102
-msgid "Please enter a dentist / hygienist"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:162
+msgid "Are you sure you wish to cancel the login process?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:36
-msgid "Titanium Implant"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:181
+msgid "Unable to Run OpenMolar"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:37
-msgid "Implant Abutment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:182
+msgid "Good Bye!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:38
-msgid "Implant Crown"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:293
+msgid "Login Error"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:39
-msgid "Implant Bridge Retainer"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:295
+msgid "Incorrect"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:40
-msgid "Implant Bridge Pontic"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:296
+msgid "User/password combination!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/implant_choice_dialog.py:54
-msgid "Implant Choice Dialog"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/login_dialog.py:297
+msgid "Please Try Again."
msgstr ""
#:
@@ -6128,47 +6831,62 @@ msgid "Chart/Plan a Bridge"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:98
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:99
msgid "Complete Denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:100
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:101
msgid "Partial Denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:161
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:138
+msgid "New UPPER Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:140
+msgid "New LOWER Denture"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:143
+msgid "Complete Upper AND Lower Acrylic Dentures"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:191
msgid "Chrome Denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:162
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:192
msgid "Flexible Denture"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:184
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:221
msgid "Please select teeth which this denture is to replace"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:226
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:263
msgid "You may wish to add the following optional items"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:229
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:265
msgid "Special Tray"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:230
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:266
msgid "Soft Lining"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:268
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/new_denture_dialog.py:304
msgid "Add A New Denture To The Treatment Plan"
msgstr ""
@@ -6218,6 +6936,62 @@ msgid "unusual payments"
msgstr ""
#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:48
+msgid "Raise Permissions Dialog"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:50
+msgid "Supervisor privileges required to perform this action"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:51
+msgid "Please enter the supervisor password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:58
+msgid "Supervisor Password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:786
+msgid "whoops"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:80
+msgid "incorrect supervisor password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:96
+msgid "New Password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:97
+msgid "Confirm New Password"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:109
+msgid "new passwords didn't match"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:117
+msgid "password changed successfully"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/permissions.py:119
+msgid "Password unchanged"
+msgstr ""
+
+#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/post_choice_dialog.py:38
msgid "Cast Precious Metal"
msgstr ""
@@ -6258,22 +7032,53 @@ msgid "Dentist choice (leave unchecked for all)"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:42
-msgid "What's changed?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:42
+msgid "Recall Prompt Dialog"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:53
-msgid "Discard All Changes"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:48
+msgid "There is a problem with the recall date of this patient."
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:49
+msgid "Would you like to fix this now?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:53
+msgid "Fix"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:57
+msgid "Ignore Recall Date"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:58
+msgid "Ignore this for now."
msgstr ""
#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py:60
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:55
msgid "Cancel and Continue Editing"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:74
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:43
+msgid "What's changed?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:53
+msgid "Discard All Changes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/dialogs/save_discard_cancel.py:76
msgid "Are you sure you want to discard these changes?"
msgstr ""
@@ -6397,148 +7202,171 @@ msgstr ""
msgid "click to promote Item - "
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:205
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:219
#: /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/openmolar1/src/openmolar/qt4gui/diary_widget.py:387
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:401
msgid "Please select an appointment to schedule"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:391
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:405
msgid "appointment already scheduled for"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:461
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:475
msgid "Reached"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:463
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:477
msgid "which is specified as the book end point"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:512
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:526
msgid "Please select an appointment to place here"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:516
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:530
msgid "Please choose another appointment - this one is made already!"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:526
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:540
msgid "You have chosen an appointment with"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:555
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:569
msgid "Confirm Make appointment for"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:602
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:616
msgid "Error putting appointment back into patient diary"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:610
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:624
msgid "more appointments to schedule"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:617
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:631
msgid "Error making appointment - sorry!"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:618
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:632
msgid "It is most likely that another user utilised this space."
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:620
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:634
msgid "Please try again."
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:819
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:817
msgid "This date is beyond the diary limit."
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:820
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:818
msgid "If the appointment wizard has brought you here"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:822
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:820
msgid "you should search again with different criteria."
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:824
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:822
msgid "for instance..."
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:825
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:823
msgid "no excluded days"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:826
-msgid "ignore emergencies"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:824
+msgid "ignore emergencies"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:825
+msgid "add or view more clinicians."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:829
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:973
+msgid "You can't schedule an appointment in the past"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:835
+msgid "No matching appointments found"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1234
+msgid "No books to show!"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:827
-msgid "add or view more clinicians."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1351
+msgid "multiple appointments selected, unable to edit memo"
msgstr ""
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1358
+msgid "unable to locate appointment memo, sorry"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:837
-msgid "No matching appointments found"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1362
+msgid "New Memo"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1236
-msgid "No books to show!"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1363
+msgid "Please enter Memo for this appointment"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1382
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:414
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1383
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:417
msgid "Confirm Delete appointment at"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1384
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:418
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1385
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:421
msgid "with"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1407
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:435
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1410
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:438
msgid "Removed from appointment book - keep for rescheduling?"
msgstr ""
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1416
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:396
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:444
+msgid "Successfully removed appointment"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1416
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:443
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1419
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:446
msgid "Error removing from patient diary"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1421
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1424
msgid "Error Removing from Appointment Book"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1434
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1437
msgid "Do you want to unblock the selected slot?"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1463
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1469
msgid "unable to block - has the book been altered elsewhere?"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1481
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1488
msgid "unable to make appointment - has the book been altered elsewhere?"
msgstr ""
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1642
+msgid "Public Holidays"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/diary_widget.py:1643
+msgid "Enter the information for "
+msgstr ""
+
#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/cashbook_module.py:73
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/daybook_module.py:137
@@ -6546,72 +7374,88 @@ msgid "bad date sequence"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:53
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:56
msgid "Please save the old course changes before continuing"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:62
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:65
msgid "It looks as if another user is starting a course of treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:64
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:67
msgid "Please allow this other user to commit their changes then reload this record before continuing."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:66
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:69
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/openmolar1/src/openmolar/qt4gui/fees/course_module.py:75
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:79
msgid "unable to plan or perform treatment if the patient does not have an active course"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:139
-msgid "Sucessfully started new course of treatment"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:144
+msgid "Successfully started new course of treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:140
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:145
msgid "Using Feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:188
-msgid "are you sure you wish to close this course of treatment?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:176
+msgid "Appointment Preferences Applied"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:219
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:238
msgid "Resume the previous course of treatment?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:240
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:258
msgid "no zombied course found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:243
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:261
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/openmolar1/src/openmolar/qt4gui/fees/course_module.py:246
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:265
msgid "Do you wish to recover this row now?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:247
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:278
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/course_module.py:269
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:282
msgid "question"
msgstr ""
#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/daybook_module.py:143
+msgid "polling database..."
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/daybook_module.py:148
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/daybook_module.py:151
+msgid "Bad Query"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/daybook_module.py:154
+msgid "Unknown Error"
+msgstr ""
+
+#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fee_table_model.py:175
msgid "Usercode"
msgstr ""
@@ -6632,57 +7476,57 @@ msgid "Charge to Patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:145
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:151
msgid "error applying payment.... sorry!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:146
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:152
msgid "This shouldn't happen - please report as an urgent bug"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:232
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:238
msgid "Add to tx plan"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:240
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:246
msgid "Add to tx plan of patient"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:279
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:285
msgid "Items containing"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:285
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:291
msgid "phrase not found in feetable"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:287
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:293
msgid "itemcodes"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:289
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:295
msgid "usercodes or descriptions"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:303
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:309
msgid "IN CURRENT USE"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:316
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:322
msgid "fee table error"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:352
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/fees_module.py:358
msgid "changed patients status to BAD DEBT"
msgstr ""
@@ -6702,185 +7546,180 @@ msgid "as a complex code for the following attributes."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:142
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:167
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:144
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:171
msgid "was not found in the patient's default feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:144
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:169
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:146
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:173
msgid "It is matched in another feescale -"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:147
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:172
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:149
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:176
msgid "Shall we add this item from this feescale?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:231
-msgid "WARNING"
-msgstr ""
-
-#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:232
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:236
msgid "treatment"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:234
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:238
msgid "has not been succesfully priced"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:235
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:239
msgid "Please edit the estimate manually"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:279
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:283
msgid "Were these xrays taken today?"
msgstr ""
#:
-#: /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/fees/manipulate_plan.py:381
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:428
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:93
msgid "Cancel"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:415
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:419
msgid "Reverse and Delete"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:420
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:424
msgid "Reverse"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:505
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:509
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:358
msgid "Choose"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:506
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:510
msgid "OK to add"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:506
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:510
msgid "to patient attribute"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:507
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:511
msgid "Recommended"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:508
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:512
msgid "to overide this behaviour"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:508
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:568
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:512
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:572
msgid "Use Feescale Method"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:509
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:513
msgid "Cancel to abandon this addition entirely"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:511
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:515
#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:149
msgid "Help"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:523
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:527
msgid "Confirm you wish to use feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:525
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:529
msgid "for this item"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:526
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:530
msgid "The patient's default table is"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:559
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:563
msgid "You appear to be adding a relatively straightforward code to the patient's treatment plan using their default feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:561
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:565
msgid "It is normally advisable to add this code conventionally."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:562
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:566
msgid "Would you like to do this now?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:586
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:590
msgid "were added conventionally"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:594
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:598
msgid "Exam items can never be added this way"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:597
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:602
msgid "This item can not be added to the treatment plan using the feescale method, sorry"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:640
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:645
msgid "added to estimate"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:640
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:645
msgid "from feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:868
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:883
msgid "Couldn't find"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:870
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:885
msgid "in the patient's estimate"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:871
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:886
msgid "This Shouldn't Happen!"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:933
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:951
msgid "couldn't pass on delete message for"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:999
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/fees/manipulate_plan.py:1019
msgid "Estimate recalculated"
msgstr ""
@@ -6925,6 +7764,7 @@ msgstr ""
#:
#: /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/openmolar/qt4gui/schema_updater.py:199
#: /home/neil/openmolar/openmolar1/src/standalone_chart/lib_om_chart/main_window.py:103
msgid "Quit"
msgstr ""
@@ -6973,12 +7813,6 @@ msgid "&Database"
msgstr ""
#:
-#: /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/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:158
msgid "Diffs"
msgstr ""
@@ -7159,7 +7993,7 @@ msgstr ""
#:
#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:697
msgid "File Saved"
msgstr ""
@@ -7179,153 +8013,162 @@ msgid "Do you want to reload now?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:417
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:425
msgid "unable to parse file"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:447
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:455
msgid "You appear to have no feescales installed in your database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:465
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:473
msgid "Local Feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:466
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:474
msgid "differs from the database version"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:467
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:475
msgid "Do you wish to overwrite it with the stored data?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:473
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:481
msgid "Show Diff"
msgstr ""
#:
-#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:483
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:495
msgid "Keep Local File Unchanged"
msgstr ""
#:
-#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:485
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:494
msgid "Overwrite Local File"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:528
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:536
msgid "feescale is well formed"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:532
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:540
msgid "feescale is not well formed"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:539
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:547
msgid "feescale is valid"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:587
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:595
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:338
msgid "Find Text"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:588
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:596
#: /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/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:596
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:604
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:347
msgid "not found"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:630
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:638
msgid "Zero all patient charges in the current feescale?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:638
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:646
msgid "Save all files?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:654
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:662
msgid "Files saved"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:669
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:678
msgid "save as"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:670
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:679
msgid "xml_files"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:679
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:689
msgid "Copy saved to"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:681
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:691
msgid "Reload files to edit the new feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:690
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:700
msgid "File not saved"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:696
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:706
msgid "Warning - you have unsaved changes, if you refresh now, these will be lost"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:698
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:708
msgid "Refresh anyway?"
msgstr ""
#:
-#: /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?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:719
+msgid "Please save local files before pushing to database"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:745
-msgid "whoops"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:722
+msgid "update all existing feescales with data from the local files?"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:734
+msgid "Insert new Feescale"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:744
+msgid "your local files will now be moved to comply with the database indexes they have been given"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:746
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:787
msgid "you have no other files available for comparison"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:750
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:791
msgid "Which feescale would you like to compare with the current feescale"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:754
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/feescale_editor/feescale_editor.py:795
msgid "Please make a choice"
msgstr ""
@@ -7455,303 +8298,411 @@ msgstr ""
msgid "Click on the Parent Item"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:188
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:187
+msgid "OFFLINE"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:205
msgid "connected to"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:407
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:209
+msgid "CRITICAL MESSAGE"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:248
+msgid "Login Cancelled- Closing Application"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:252
+msgid "Login by"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:262
+msgid "Warning - ignoring schema check!"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:266
+msgid "database schema is up to date"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:270
+msgid "database schema is incompatible"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:283
+msgid "Sorry, you cannot run this version of the openMolar client because your database schema is more advanced."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:285
+msgid "this client requires schema version "
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:287
+msgid "but your database is at"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:289
+msgid "Please Update openMolar now"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:294
+msgid "This openMolar client has fallen behind your database schema version"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:296
+msgid "This client was written for schema version"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:298
+msgid "and your database is now at"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:300
+msgid "However, the differences are not critical, and you can continue if you wish"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:302
+msgid "It would still be wise to update this client ASAP"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:303
+msgid "Do you wish to continue?"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:307
+msgid "Proceed without upgrade?"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:480
msgid "changed clinician to"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:414
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:487
msgid "changed assistant to"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:541
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:607
msgid "You have unsaved changes to the record of"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:797
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:814
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:857
+msgid "You have no dentists in your database."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:867
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:887
msgid "is no longer an active dentist in this practice"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:801
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:870
msgid "unknown contract dentist - please correct this"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:819
-msgid "unknown course dentist - please correct this"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:885
+msgid "Course dentist"
msgstr ""
-#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:945
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:958
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1026
msgid "Re-open"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:873
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:885
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:946
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:959
msgid "Do you want to review and/or reprint this item?"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:904
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:977
msgid "No information available about this document, sorry"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:913
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:987
msgid "Date imported"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:914
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:989
msgid "Size"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:931
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:991
+msgid "Index"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1009
msgid "opening"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:935
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1013
msgid "error importing file"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:937
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1519
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1015
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1610
msgid "no file chosen"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:947
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1027
msgid "Do you want to open a copy of this document?"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:963
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1042
msgid "error opening document"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:974
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1053
msgid "Today's Patients"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:977
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1056
msgid "Today's Patients (ALL)"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1032
-msgid "Reached end of the List"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1112
+msgid "Reached End of Record History"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1046
-msgid "Reached Start of the List"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1126
+msgid "Reached Start Record History"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1119
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1186
msgid "Patient already loaded"
msgstr ""
-#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1190
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1468
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1595
msgid "Not loading patient"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1131
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1200
msgid "Error populating interface"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1137
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1206
msgid "error getting serialno"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1138
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1207
msgid "please check this number is correct?"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1150
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1235
msgid "Reloading record"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1224
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1286
+msgid "Setting"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1288
+msgid "as patient's dentist"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1318
msgid "Please set a Valid Course Type for this patient"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1258
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1352
msgid "Message from"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1260
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1354
msgid "Dated"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1352
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1446
msgid "Active Course"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1353
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1361
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1447
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1455
msgid "started"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1363
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1457
msgid "completed"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1367
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1461
msgid "Resume Existing Course"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1391
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1485
msgid "NO CLINICIAN SET"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1393
-msgid "you are in surgery mode without a clinician"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1487
+msgid "You are in surgery mode without a clinician"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1398
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1491
msgid "CLINICIAN"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1402
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1495
msgid "team"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1403
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1496
msgid "using"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1404
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1497
msgid "mode"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1415
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1508
msgid "Miss"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1415
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1508
msgid "Mr"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1415
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1508
msgid "Mrs"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1415
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1508
msgid "Ms"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1416
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1509
msgid "Dr"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1416
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1509
msgid "Master"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1416
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1509
msgid "Professor"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1469
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1560
msgid "NEW FORUM POSTS"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1508
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1599
msgid "opening patient file"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1661
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1751
msgid "POTENTIALLY SERIOUS CONFUSION PROBLEM WITH PT RECORDS"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1814
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1753
+msgid "AND"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1920
msgid "no record selected"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1824
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1932
msgid "FontSize"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1825
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:1933
msgid "Enter your preferred font size for appointment book"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:2416
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:2121
+msgid "Moving existing treatment from plan to completed."
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:2519
msgid "use the checkboxes on the notes tab to control what is printed."
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3078
-msgid "Recalculate Estimate is for active courses only"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3012
+msgid "Recalculate Estimate is not normally used on closed courses"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3082
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3019
msgid "Scrap the estimate and re-price everything?"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3084
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3020
msgid "Custom items and items added using feescale method will be unaffected"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3101
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3038
msgid "apply an exemption to the NHS items on this estimate?"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3107
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3044
msgid "input needed"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3108
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3045
msgid "maximum charge for the patient"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3108
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3046
msgid "please enter the amount in pence, or leave as 0 for full exemption"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3150
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3089
msgid "Relatives"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3153
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3092
msgid "Family ID"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3156
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3095
msgid "Member(s)"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3161
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3100
msgid "No Patient Loaded"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3185
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3124
msgid "error loading feetable"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3198
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3137
msgid "Reloading feescales from database"
msgstr ""
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3342
+msgid "New user added to login table"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3347
+msgid "Please exit any record before taking this action"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/maingui.py:3356
+msgid "Practice Name and/or Address modified."
+msgstr ""
+
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:41
msgid "Use details from the previous record?"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:61
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:62
msgid "Start a new family group?"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:69
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:72
msgid "Add the new patient to this family group?"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:138
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:141
msgid "Error saving new patient, sorry!"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:145
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:148
msgid "insufficient data to create a new record.please fill in all highlighted fields"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:184
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/new_patient_gui.py:187
msgid "New Patient not saved."
msgstr ""
@@ -7822,6 +8773,11 @@ msgid "A phrasebook for which clinician?"
msgstr ""
#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:367
+msgid "commit all local files to database?"
+msgstr ""
+
+#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/phrasebook/phrasebook_editor.py:378
msgid "Phrasebook"
msgstr ""
@@ -7899,7 +8855,6 @@ msgstr ""
#:
#: /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 ""
@@ -7921,13 +8876,13 @@ msgstr ""
#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:45
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:93
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:39
msgid "We are writing to inform you that your dental examination is now due."
msgstr ""
#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/bulk_mail.py:46
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:98
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:42
msgid "Please contact the surgery to arrange an appointment. *"
msgstr ""
@@ -7975,13 +8930,13 @@ msgstr ""
#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/estimatePrint.py:103
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:247
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:231
msgid "NHS items"
msgstr ""
#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/estimatePrint.py:104
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:248
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:232
msgid "Private items"
msgstr ""
@@ -7991,179 +8946,184 @@ msgid "Print an NHS form now?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:139
-msgid "PLEASE CHECK/COMPLETE THESE DETAILS"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:122
+msgid "Confidential Medical History Questionaire"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:163
-msgid "Home tel"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:140
+msgid "PLEASE CHECK/COMPLETE THESE DETAILS"
msgstr ""
#:
#: /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"
+msgid "Home tel"
msgstr ""
#:
#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:165
-msgid "Mobile"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:171
+msgid "Work tel"
msgstr ""
#:
#: /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 "Email"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:168
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:171
msgid "Alternate Email"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:186
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:187
msgid "Please Circle"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:188
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:189
msgid "Give Details"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:190
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:191
msgid "ARE YOU CURRENTLY?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:194
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:195
msgid "Taking any prescribed medicines?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:203
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:204
msgid "Carrying a Medical Warning Card?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:210
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:211
msgid "Pregnant or Breast Feeding?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:222
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:223
msgid "DO YOU SUFFER FROM?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:241
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:242
msgid "Allergies to Any Medicines or Substances?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:246
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:247
msgid "eg. Penicillin, aspirin or latex."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:251
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:252
msgid "Bronchitis, Asthma, other Chest Conditions?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:276
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:277
msgid "Heart Problems, Angina, Blood pressure"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:281
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:282
msgid "problems, or a stroke?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:285
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:286
msgid "Diabetes?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:292
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:293
msgid "Arthritis?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:314
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:315
msgid "Bruising or persistant bleeding after"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:319
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:320
msgid "surgery or tooth extraction?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:337
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:338
msgid "Any Infectious Diseases"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:339
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:340
msgid "(including HIV and Hepatitis)?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:344
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:345
msgid "DID YOU, AS A CHILD OR SINCE HAVE"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:351
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:352
msgid "Bacterial Endocarditis?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:359
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:360
msgid "Liver Disease (eg. Jaundice or Hepatitis)?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:370
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:371
msgid "A bad reaction to a Local or General Anaesthetic?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:380
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:381
msgid "A joint replacement or other implant?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:387
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:388
msgid "Heart Surgery?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:394
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:395
msgid "Brain Surgery?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:415
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:416
msgid "Treatment that required you to be"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:417
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:418
msgid "in Hospital?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:421
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:422
msgid "A close relative with Creutzfeldt Jacob Disease?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:434
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:435
msgid "PLEASE GIVE ANY OTHER DETAILS WHICH YOU THINK MAY BE RELEVANT TO YOUR DENTIST"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:438
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/mh_print.py:439
msgid "Patient's Signature"
msgstr ""
@@ -8178,12 +9138,12 @@ msgid "Error saving PDF copy %s"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:167
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:151
msgid "Nothing to print - have you loaded the table?"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:171
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:155
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"
@@ -8192,32 +9152,37 @@ msgid ""
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:232
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:216
msgid "Estimate for your current course of treatment."
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:269
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:253
msgid ""
"<tr><td></td><td><b>TOTAL</b></td>\n"
"<td align=\"right\"><b>%s</b></td></tr>"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:273
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/om_printing.py:257
msgid ""
"<p><i>Please note, this estimate may be subject\n"
"to change if clinical circumstances dictate.</i></p>"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:89
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:45
+msgid "We look forward to seeing you in the near future."
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:107
msgid "Dear %s %s,"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:103
-msgid "We look forward to seeing you in the near future."
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/printing/recallprint.py:134
+msgid "* If you already have a future appointment with us - please accept our apologies and ignore this letter."
msgstr ""
#:
@@ -8225,150 +9190,101 @@ msgstr ""
msgid "Thankyou for your custom."
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:301
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:304
msgid "Please specify a clinician"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:395
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:398
msgid "Error removing proposed appointment"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:400
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:493
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:403
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:496
msgid "No appointment selected"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:405
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:408
msgid "Delete Unscheduled Appointment?"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:577
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/pt_diary_widget.py:580
msgid "Error putting into dentist's book"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:40
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:43
msgid "Update required"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:41
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:44
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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:48
msgid "Would you like to Upgrade Now?"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:46
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:49
msgid "WARNING - PLEASE ENSURE ALL OTHER STATIONS ARE LOGGED OFF"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:49
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:52
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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:56
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
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:59
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/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/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:74
-msgid "extend the books now?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:75
+msgid "Updating Database"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/apptTools.py:84
-msgid "How many months?"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:86
+msgid "Continue"
msgstr ""
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:103
+msgid "Schema Update Required"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:91
-msgid "Please enter initials for this user"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:112
+msgid "Operation Cancelled."
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:93
-msgid "Please set a name for this user"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:150
+msgid "Converting Database Schema from version"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:178
-msgid "this action will overwrite any current data stored"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:152
+msgid "to"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:180
-msgid "proceed?"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:191
-msgid "save template file"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:193
-msgid "openmolar template files "
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:200
-msgid "Template Saved"
-msgstr ""
-
-#: /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/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:204
-msgid "Template not saved"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:213
-msgid "load an existing template file"
-msgstr ""
-
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:215
-msgid "openmolar template files"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:158
+msgid "upgrading to schema version"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:220
-msgid "template loaded sucessfully"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:171
+msgid "Conversion to %s failed"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:223
-msgid "error parsing template file"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:174
+msgid "Schema Upgrade Halted"
msgstr ""
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:180
+msgid "Unexpected Error updating the schema please file a bug at http:www.openmolar.com"
msgstr ""
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:194
+msgid "All updates successully applied!"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/tools/new_setup.py:341
-msgid "Add New User"
+#: /home/neil/openmolar/openmolar1/src/openmolar/qt4gui/schema_updater.py:197
+msgid "continuing to openmolar"
msgstr ""
#:
@@ -8397,182 +9313,181 @@ msgid "updated hidden notes list"
msgstr ""
#:
-#: /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/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/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:105
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:352
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_0to1_1.py:165
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:62
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:321
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:81
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:129
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:113
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_4to2_5.py:104
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_5to2_6.py:63
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_6to2_7.py:138
msgid "creating new tables"
msgstr ""
#:
-#: /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"
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_0to1_1.py:177
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_1to1_2.py:113
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:73
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:340
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:95
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:144
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:314
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:122
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:150
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:100
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:252
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:241
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:136
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:81
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_4to2_5.py:120
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_5to2_6.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_6to2_7.py:154
+msgid "Successfully moved db to"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_1to1_2.py:111
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:71
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:338
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:93
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:142
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:312
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:120
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:148
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:98
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:250
+#: /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:134
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:79
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_4to2_5.py:118
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_5to2_6.py:77
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_6to2_7.py:152
+msgid "updating stored schema version"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:120
-msgid "couldn't create tables, rolled back to"
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_2to1_3.py:64
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:334
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:89
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:139
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:310
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:118
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:145
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:95
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:245
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:236
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:129
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:74
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_4to2_5.py:113
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_5to2_6.py:72
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_6to2_7.py:147
+msgid "updating settings"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:357
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_3to1_4.py:326
msgid "copying data across from old feetable"
msgstr ""
#:
-#: /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/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/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
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_4to1_5.py:85
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:133
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:229
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:182
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:211
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:113
msgid "transfering data"
msgstr ""
#:
-#: /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
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_5to1_6.py:136
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:308
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_7to1_8.py:115
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:142
msgid "inserting values"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:402
-msgid "you may now remove old feetables"
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_6to1_7.py:305
+msgid "executing statements"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:125
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:134
msgid "converting note"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:147
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_8to1_9.py:140
+msgid "creating new tables and indexes"
+msgstr ""
+
+#:
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:89
msgid "creating new appt_prefs table"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:149
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:91
msgid "copying data"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:151
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema1_9to2_0.py:93
msgid "statements executed"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:281
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:236
msgid "creating currtrtmt2 table"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:283
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:238
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_4to2_5.py:107
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_5to2_6.py:66
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_6to2_7.py:141
msgid "transferring data"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:287
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_0to2_1.py:242
msgid "deleting void courses"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:218
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:230
msgid "creating tables"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:221
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:232
msgid "populating est_link table"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:224
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_1to2_2.py:234
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
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:120
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:68
msgid "creating est_link2 table"
msgstr ""
#:
-#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:151
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:123
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
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_2to2_3.py:126
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_3to2_4.py:71
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_4to2_5.py:110
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_5to2_6.py:69
+#: /home/neil/openmolar/openmolar1/src/openmolar/schema_upgrades/schema2_6to2_7.py:144
msgid "executing cleanup statements"
msgstr ""
@@ -8592,164 +9507,184 @@ msgstr ""
msgid "No reason given by feescale author."
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:57
-msgid "translation tools are installed sucessfully"
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:67
+msgid "translation tools are installed successfully"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:82
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:87
msgid "Please try and give at least 24 hours notice"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:83
-msgid "if you need to change an appointment."
-msgstr ""
-
#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:88
-msgid "Confidential Medical History Questionaire"
+msgid "if you need to change an appointment."
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:300
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:325
msgid "EXAM"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:301
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:326
msgid "BITE"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:302
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:327
msgid "BT"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:303
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:328
msgid "FAMILY"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:304
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:329
msgid "FILL"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:305
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:330
msgid "FIT"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:306
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:331
msgid "HYG"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:307
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:332
msgid "IMPS"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:308
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:333
msgid "LF"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:309
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:334
msgid "ORTHO"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:310
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:335
msgid "PAIN"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:311
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:336
msgid "PREP"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:312
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:337
msgid "RCT"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:313
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:338
msgid "RECEMENT"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:314
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:339
msgid "REVIEW"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:315
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:340
msgid "SP"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:316
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:341
msgid "TRY"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:317
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:342
msgid "XLA"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:510
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:514
+msgid "Monday"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:514
+msgid "Thursday"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:514
+msgid "Tuesday"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:515
+msgid "Friday"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:515
+msgid "Saturday"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:515
+msgid "Sunday"
+msgstr ""
+
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:550
msgid "January"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:511
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:551
msgid "February"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:512
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:552
msgid "March"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:513
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:553
msgid "April"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:514
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:554
msgid "May"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:515
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:555
msgid "June"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:516
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:556
msgid "July"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:517
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:557
msgid "August"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:518
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:558
msgid "September"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:519
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:559
msgid "October"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:520
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:560
msgid "November"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:521
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:561
msgid "December"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:558
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:598
msgid "Tomorrow"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:560
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:570
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:600
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:610
msgid "Yesterday"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:925
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:901
msgid "Welcome to OpenMolar!"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:926
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:902
msgid "Version"
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:929
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:904
msgid "Your Data is Accessible, and the server reports no issues."
msgstr ""
-#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:930
+#: /home/neil/openmolar/openmolar1/src/openmolar/settings/localsettings.py:906
msgid "Have a great day!"
msgstr ""
diff --git a/src/openmolar/main.py b/src/openmolar/main.py
index 9b0bbaa..77f9cc4 100755
--- a/src/openmolar/main.py
+++ b/src/openmolar/main.py
@@ -29,303 +29,41 @@ and starts the gui
import getopt
import logging
-import sys
import os
-import hashlib
-from PyQt4 import QtGui, QtCore
-from xml.dom import minidom
+import subprocess
+import sys
-# a variable to force the first run and database update tools
-FIRST_RUN_TESTING = False
-IGNORE_SCHEMA_CHECK = False
+from openmolar.settings import localsettings
-SHORTARGS = "v"
-LONGARGS = ["help", "version", "setup", "firstrun", "user=", "db=", "port=",
- "ignore-schema-check"]
+SHORTARGS = "vq"
+LONGARGS = [
+ "help",
+ "version",
+ "firstrun",
+ "ignore-schema-check",
+ "no-dev-login"
+]
LOGGER = logging.getLogger("openmolar")
+USAGE = '''%s
+-q \t : %s
+-v \t : %s
-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
- '''
- # this import will set up gettext and logging
- from openmolar.dbtools import schema_version
-
- LOGGER.debug("checking schema version...")
-
- sv = schema_version.getVersion()
-
- run_main = False
-
- if IGNORE_SCHEMA_CHECK or localsettings.CLIENT_SCHEMA_VERSION == sv:
- run_main = True
-
- elif localsettings.CLIENT_SCHEMA_VERSION > sv:
- print "schema is out of date"
- from openmolar.qt4gui import schema_updater
- sys.exit(schema_updater.main())
-
- elif localsettings.CLIENT_SCHEMA_VERSION < sv:
- print "client is out of date....."
- 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
-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))
- else:
- result = QtGui.QMessageBox.question(None,
- _("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)
-
- if result == QtGui.QMessageBox.Yes:
- run_main = True
-
- if run_main:
- from openmolar.qt4gui import maingui
- maingui.main(my_app)
- else:
- sys.exit()
+--help \t : %s
+--firstrun \t : %s
+--ignore-schema-check\t : %s
+--version \t : %s
+--no-dev-login \t : %s
+'''
def main():
'''
main function
'''
- global localsettings, my_app
- my_app = QtGui.QApplication(sys.argv)
-
- from openmolar.settings import localsettings
- from openmolar.qt4gui.compiled_uis import Ui_startscreen
- localsettings.showVersion()
-
- uninitiated = True
-
- def autoreception(arg): # arg is a QString
- '''
- check to see if the user is special user "rec"
- which implies a reception machine
- '''
- if arg.toLower() == "rec":
- dl.reception_radioButton.setChecked(True)
-
- def chosenServer(chosenAction):
- '''
- the advanced qmenu has been triggered
- '''
- i = actions.index(chosenAction)
-
- message = localsettings.server_names[i] + "<br />" + _(
- "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:
- i = 0
-
- dl.chosenServer = i
- for action in actions:
- action.setChecked(False)
- chosenAction.setChecked(True)
- labelServer(i)
-
- def labelServer(i):
- def_string = ""
- if i == 0:
- def_string = " (" + _("DEFAULT") + ")"
-
- dl.chosenServer_label.setText(_("Chosen server") + " - " +
- localsettings.server_names[i] + def_string)
-
- if not FIRST_RUN_TESTING:
- cf_Found = True
- if os.path.exists(localsettings.global_cflocation):
- localsettings.cflocation = localsettings.global_cflocation
- pass
- elif os.path.exists(localsettings.cflocation):
- pass
- else:
- cf_Found = False
- else:
- cf_Found = False
-
- if not cf_Found:
- 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)
-
- if result == QtGui.QMessageBox.Yes:
- import firstRun
- if not firstRun.run():
- my_app.closeAllWindows()
- sys.exit()
- else:
- my_app.closeAllWindows()
- sys.exit()
-
- try:
- dom = minidom.parse(localsettings.cflocation)
- sys_password = dom.getElementsByTagName(
- "system_password")[0].firstChild.data
-
- servernames = dom.getElementsByTagName("connection")
-
- for i, server in enumerate(servernames):
- nameDict = server.attributes
- try:
- localsettings.server_names.append(nameDict["name"].value)
- except KeyError:
- localsettings.server_names.append("%d" % i + 1)
-
- except IOError as e:
- LOGGER.warning("still no settings file. quitting politely")
- QtGui.QMessageBox.information(None, _("Unable to Run OpenMolar"),
- _("Good Bye!"))
-
- 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)
-
- 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
- labelServer(0)
- actions = []
- if len(localsettings.server_names) > 1:
- for name in localsettings.server_names:
- action = QtGui.QAction(name, servermenu)
- servermenu.addAction(action)
- dl.advanced_toolButton.setMenu(servermenu)
- actions.append(action)
- else:
- dl.advanced_frame.hide()
-
- servermenu.connect(servermenu,
- QtCore.SIGNAL("triggered (QAction *)"), chosenServer)
-
- QtCore.QObject.connect(dl.user1_lineEdit,
- QtCore.SIGNAL("textEdited (const QString&)"), autoreception)
-
- while True:
- if (PASSWORD != "" and USER1 != "") or my_dialog.exec_():
- PASSWORD = ""
-
- changedServer = localsettings.chosenserver != dl.chosenServer
-
- localsettings.setChosenServer(dl.chosenServer)
-
- try:
- #--"salt" the password
- pword = "diqug_ADD_SALT_3i2some" + str(
- 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()
-
- if stored_password != sys_password:
- #-- end password check
- raise LoginError
-
- if uninitiated or changedServer:
- #- user has entered the correct password
- #- so now we connect to the mysql database
- #- for the 1st time
- #- I do it this way so that anyone sniffing the network
- #- won't see the mysql password until this point
- #- this could and should possibly still be improved upon
- #- maybe by using an ssl connection to the server.
- localsettings.initiateUsers(changedServer)
- uninitiated = False
-
- u1_qstring = dl.user1_lineEdit.text().toAscii().toUpper()
- u2_qstring = dl.user2_lineEdit.text().toAscii().toUpper()
-
- #-- localsettings module now has user variables.
- #-- 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):
- raise LoginError
-
- #-- set a variable to allow the main program to run
- localsettings.successful_login = True
- if dl.reception_radioButton.isChecked():
- localsettings.station = "reception"
-
- localsettings.setOperator(str(u1_qstring), str(u2_qstring))
-
- proceed()
-
- except LoginError:
- QtGui.QMessageBox.warning(my_dialog,
- _("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>' % (
- _("UNEXPECTED ERROR"),
- _("application cannot run"),
- exc)
-
- QtGui.QMessageBox.warning(my_dialog, _("Login Error"), message)
- break
- else:
- break
- QtGui.QApplication.instance().closeAllWindows()
-
-
-def setup(argv):
- '''
- run the setup gui, which allows customisation of the app
- '''
- print "running setup"
- from openmolar.qt4gui.tools import new_setup
- new_setup.main(argv)
+ from openmolar.qt4gui import maingui
+ maingui.main()
def usage():
@@ -333,21 +71,22 @@ def usage():
called by --help, bad arguments, or no arguments
simply importing the localsettings will display some system info
'''
- 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
-'''
+ print USAGE % (
+ _("command line options are as follows"),
+ _("quiet (minimal logging to console)"),
+ _("verbose logging to console (for debugging)"),
+ _("show this text"),
+ _("offer the firstrun config and demodatabase generation"),
+ _("proceed even if client and database versions clash (NOT ADVISABLE!)"),
+ _("show the versioning and exit"),
+ _("Ignore dev login (advanced)")
+ )
def version():
'''
show the version on the command line
'''
- from openmolar.settings import localsettings
localsettings.showVersion()
@@ -355,50 +94,41 @@ def run():
'''
the real entry point for the app
'''
- global FIRST_RUN_TESTING, IGNORE_SCHEMA_CHECK
try:
opts, args = getopt.gnu_getopt(sys.argv[1:], SHORTARGS, LONGARGS)
except getopt.GetoptError as exc:
- print
- print exc
- print
+ # LOGGER.exception ("Unable to parse command line arguments")
+ print "\n%s\n" % exc.msg
opts = (("--help", ""),)
# some backward compatibility stuff here...
- if "setup" in sys.argv:
- opts.append(("--setup", ""))
if "firstrun" in sys.argv:
opts.append(("--firstrun", ""))
+ chosen_func = main
for option, arg in opts:
if option == "--help":
- usage()
- sys.exit()
+ chosen_func = usage
+ break
if option == "--version":
- version()
- sys.exit()
- if option == "--setup":
- print "setup found"
- setup(sys.argv)
- sys.exit()
-
+ chosen_func = version
+ break
if option == "--firstrun":
- FIRST_RUN_TESTING = True
-
+ localsettings.FORCE_FIRST_RUN = True
if option == "--ignore-schema-check":
- IGNORE_SCHEMA_CHECK = True
- print "ignoring schema check"
-
- main()
+ localsettings.IGNORE_SCHEMA_CHECK = True
+ LOGGER.warning("command line args demand no schema check")
+ chosen_func()
if __name__ == "__main__":
#-- put "openmolar" on the pyth path and go....
- LOGGER.info("starting openMolar.... using main.py as __main__")
+ LOGGER.debug("starting openMolar.... using main.py as __main__")
def determine_path():
"""Borrowed from wxglade.py"""
try:
+ # could use localsettings.__file__ for non-standard install?
root = __file__
if os.path.islink(root):
root = os.path.realpath(root)
diff --git a/src/openmolar/ptModules/course_checker.py b/src/openmolar/ptModules/course_checker.py
new file mode 100644
index 0000000..de97920
--- /dev/null
+++ b/src/openmolar/ptModules/course_checker.py
@@ -0,0 +1,194 @@
+#! /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 re
+
+from openmolar.dbtools.treatment_course import TreatmentCourse
+from openmolar.dbtools import estimatesHistory
+from openmolar.dbtools import daybook
+
+LOGGER = logging.getLogger("openmolar")
+
+class CourseChecker(object):
+ '''
+ look to see if there is consistency accross three tables
+ currtrtmt2, daybook and newestimates
+ '''
+ def __init__(self, course, estimates, daybook_entries):
+ self.course = course
+ self.estimates = estimates
+ self.daybook_entries = daybook_entries
+ self._daybook_course = None
+ self._courses_match = None
+
+ @property
+ def serialno(self):
+ return self.course.serialno
+
+ @property
+ def courseno(self):
+ return self.course.courseno
+
+ @property
+ def is_ongoing(self):
+ return self.course.cmpd is None
+
+ @property
+ def days_at_course_end(self):
+ if self.is_ongoing:
+ return 0
+ dead_space = 0
+ for daybook_entry in self.daybook_entries:
+ days = (self.course.cmpd - daybook_entry.date).days
+ if dead_space > days:
+ dead_space = days
+ return dead_space
+
+ @property
+ def daybook_course(self):
+ '''
+ This is the daybook entries converted to a Treatment Course
+ '''
+ if self._daybook_course is None:
+ self._daybook_course = TreatmentCourse(self.serialno, 0)
+ self._daybook_course.courseno = self.courseno
+ accd, cmpd = None, None
+ for daybook_entry in self.daybook_entries:
+ #LOGGER.debug(daybook_entry)
+ if not accd or daybook_entry.date < accd:
+ accd = daybook_entry.date
+ if not cmpd or daybook_entry.date > cmpd:
+ cmpd = daybook_entry.date
+ #diagn
+ m = re.search("(E?CE) ", daybook_entry.diagn)
+ if m:
+ self._daybook_course.examt += m.groups()[0]
+ self._daybook_course.examd = daybook_entry.date
+ #xray
+ for xray in re.findall("\d?[S|M|P] ", daybook_entry.diagn):
+ self._daybook_course.xraycmp += xray
+ #perio
+ if daybook_entry.perio.strip(" "):
+ self._daybook_course.periocmp += daybook_entry.perio.strip(" ") + " "
+ #anaes
+ if daybook_entry.anaes.strip(" "):
+ self._daybook_course.anaescmp += daybook_entry.anaes.strip(" ") + " "
+ #misc
+ if daybook_entry.misc.strip(" "):
+ self._daybook_course.customcmp += daybook_entry.misc.strip(" ") + " "
+ #ndu
+ if daybook_entry.ndu.strip(" "):
+ self._daybook_course.nducmp += daybook_entry.ndu.strip(" ") + " "
+ #ndl
+ if daybook_entry.ndl.strip(" "):
+ self._daybook_course.ndlcmp += daybook_entry.ndl.strip(" ") + " "
+ #odu
+ if daybook_entry.odu.strip(" "):
+ self._daybook_course.oducmp += daybook_entry.odu.strip(" ") + " "
+ #odl
+ if daybook_entry.odl.strip(" "):
+ self._daybook_course.odlcmp += daybook_entry.odl.strip(" ") + " "
+ #other
+ if daybook_entry.other.strip(" "):
+ self._daybook_course.othercmp += daybook_entry.other.strip(" ") + " "
+ #chart
+ for chart_entry in daybook_entry.chart.split(" "):
+ m = re.match("([UL][LR][1-8]) (.*)", chart_entry)
+ if m:
+ att = "%scmp" % m.groups()[0].lower()
+ tx = m.groups()[1] + " "
+ self._daybook_course.__dict__[att]+=tx
+
+ if accd is None or (self.course.accd and self.course.accd < accd):
+ self._daybook_course.accd = self.course.accd
+ else:
+ self._daybook_course.accd = accd
+ self._daybook_course.cmpd = cmpd
+
+ return self._daybook_course
+
+ def completed_txs_match_daybook(self):
+ for hash_, att, tx in self.course.completed_tx_hash_tups:
+ print "checking '%s' '%s'" % (att, tx)
+
+ @property
+ def results(self):
+ message = "<ul>"
+ if self.is_ongoing:
+ message += "<li>%s</li>" % _("Course is still active")
+ dead_days = self.days_at_course_end
+ if dead_days:
+ message += "<li>%s %d %s.</li>" % (
+ _("Course closed"),
+ dead_days,
+ _("days after last day treatment"))
+ if not self.courses_match:
+ message += "<li>%s</li>" % _(
+ "Course doesn't tally with daybook entries")
+ message += "</ul>"
+ return message if message != "<ul></ul>" else _("No warnings")
+
+ @property
+ def courses_match(self):
+ if self._courses_match is None:
+ html = self.daybook_course.to_html()
+ html1c = self.course.to_html(completed_only = True)
+ self._courses_match = html == html1c
+ return self._courses_match
+
+ @property
+ def has_errors(self):
+ '''
+ currently this looks for consistency betwwen the daybook
+ and treatment plan only
+ '''
+ return (self.days_at_course_end > 0
+ or self.is_ongoing
+ or not self.courses_match)
+
+def get_course_checker(serialno, courseno):
+ course = TreatmentCourse(serialno, courseno)
+ ests = estimatesHistory.getEsts(serialno, courseno)
+ daybook_list = []
+ accd = datetime.date.today() if course.accd is None else course.accd
+ cmpd = datetime.date.today() if course.cmpd is None else course.cmpd
+ for daybook_entry in daybook.all_data(serialno):
+ if accd <= daybook_entry.date <= cmpd:
+ daybook_list.append(daybook_entry)
+
+ return CourseChecker(course, ests, daybook_list)
+
+
+if __name__ == "__main__":
+ serialno = 11956
+ courseno = 29749
+
+ course_check = get_course_checker(serialno, courseno)
+ print course_check.results()
+
+ course_check.completed_txs_match_daybook()
+
+ print course_check.daybook_course.to_html()
\ No newline at end of file
diff --git a/src/openmolar/ptModules/debug_html.py b/src/openmolar/ptModules/debug_html.py
index b6fac66..15d941d 100644
--- a/src/openmolar/ptModules/debug_html.py
+++ b/src/openmolar/ptModules/debug_html.py
@@ -49,8 +49,6 @@ def toHtml(pt, tableCalled=None, changesOnly=False):
attributesDict["HDP"] = ("plandata",)
elif tableCalled == "Estimates":
attributesDict["Estimates"] = ("estimates", )
- elif tableCalled == "Perio":
- attributesDict["Perio Data"] = ("perioData",)
else:
attributesDict["all attributes"] = pt.dbstate.__dict__.keys()
diff --git a/src/openmolar/ptModules/estimates.py b/src/openmolar/ptModules/estimates.py
index 7af3684..3a13273 100644
--- a/src/openmolar/ptModules/estimates.py
+++ b/src/openmolar/ptModules/estimates.py
@@ -131,11 +131,12 @@ class Estimate(object):
self.fee,
self.ptfee,
self.dent,
- self.tx_hashes,
self.itemcode,
self.description,
self.csetype,
- self.feescale)
+ self.feescale,
+ self.tx_hashes
+ )
@property
def log_text(self):
@@ -150,6 +151,9 @@ class Estimate(object):
def __eq__(self, other):
return str(self) == str(other)
+ def __ne__(self, other):
+ return not self.__eq__(other)
+
def toHtmlRow(self):
hash_string = ""
for tx_hash in self.tx_hashes:
@@ -191,10 +195,25 @@ class Estimate(object):
hash_string)
def htmlHeader(self):
- return '''<tr><th>Dentist</th><th>number</th><th>code</th>
- <th>Description</th><th>fee</th>
- <th>pt fee</th><th>feescale</th><th>cset</th><th>completed</th>
- <th>Hashes</th></tr>'''
+ color_string = ' bgcolor="#ffff99"'
+ sub_values = (color_string, _("Estimates for Course Number"),
+ self.courseno) + (color_string,) * 10
+ return '''
+ <tr>
+ <th%s colspan="10">%s %s <!--editlink--></th>
+ </tr>
+ <tr>
+ <th%s>Dentist</th>
+ <th%s>number</th>
+ <th%s>code</th>
+ <th%s>Description</th>
+ <th%s>fee</th>
+ <th%s>pt fee</th>
+ <th%s>feescale</th>
+ <th%s>cset</th>
+ <th%s>completed</th>
+ <th%s>Hashes</th>
+ </tr>''' % sub_values
def filteredDescription(self):
'''
diff --git a/src/openmolar/ptModules/hidden_notes.py b/src/openmolar/ptModules/hidden_notes.py
index edf7874..fbd2164 100644
--- a/src/openmolar/ptModules/hidden_notes.py
+++ b/src/openmolar/ptModules/hidden_notes.py
@@ -45,7 +45,8 @@ if __name__ == "__main__":
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 pt.HIDDENNOTES
print toHtml(pt)
diff --git a/src/openmolar/ptModules/patientDetails.py b/src/openmolar/ptModules/patientDetails.py
index 2502e1c..8de51e5 100644
--- a/src/openmolar/ptModules/patientDetails.py
+++ b/src/openmolar/ptModules/patientDetails.py
@@ -43,123 +43,131 @@ def getAge(pt):
'''
ageYears, months, isToday = pt.getAge()
if isToday:
- return "<h5> %s TODAY!</h5>" % ageYears
+ return "<h5> %s %s</h5>" % (ageYears, _("TODAY!"))
if ageYears > 18:
- return "(%syo)<hr />" % ageYears
+ return "(%syo)" % ageYears
else:
- retarg = "<br />%s years" % ageYears
- if ageYears == 1:
- retarg = retarg.strip("s")
- retarg += " %s months" % months
- if months == 1:
- retarg = retarg.strip("s")
- return retarg + "<hr />"
+
+ html = "<br />%s %s" % (
+ ageYears,
+ _("years") if ageYears == 1 else _("year"))
+ html += " %s %s" % (
+ months,
+ _("months") if months == 1 else _("month"))
+ return html
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>
+ html = '''
+ <html>
+ <head><link rel="stylesheet" href="%s" type="text/css"></head>
+ <body><div align = "center">
+ <h4>Patient %d</h4>
+ <h3>%s %s %s</h3>
+ %s %s<hr />
''' % (
localsettings.stylesheet, pt.serialno, pt.title.title(),
- pt.fname.title(), pt.sname.title())
+ pt.fname.title(), pt.sname.title(),
+ 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
+ address = (pt.addr1, pt.addr2, pt.addr3, pt.town, pt.county, pt.pcde)
+ html += "<br />".join([l for l in address if l != ""])
if pt.pcde == "":
- retarg += "<b>!UNKNOWN POSTCODE!</b>"
- else:
- retarg += "%s" % pt.pcde
+ html += "<b>%s</b>" % _("!UNKNOWN POSTCODE!")
if not pt.status in ("Active", "", None):
- retarg += "<hr /><h1>%s</h1>" % pt.status
+ html += "<hr /><h1>%s</h1>" % pt.status
- return retarg
+ return html
def details(pt, Saved=True):
'''returns an html set showing pt name etc...'''
try:
- retarg = header(pt) + '<hr />'
+ html = header(pt) + '<hr />'
if "N" in pt.cset:
- retarg += '''<img src="%s/nhs_scot.png" alt="NHS" />
+ html += '''<img src="%s/nhs_scot.png" alt="NHS" />
<br />''' % localsettings.resources_path
if pt.exemption != "":
- retarg += " exemption=%s" % str(pt.exemption)
+ html += "%s=%s" % (_("exemption"), pt.exemption)
else:
- retarg += "NOT EXEMPT"
- retarg += "<br />"
+ html += _("NOT EXEMPT")
+ html += "<br />"
elif "I" in pt.cset:
- retarg += '''<img src="%s/hdp_small.png" alt="HDP" />
+ html += '''<img src="%s/hdp_small.png" alt="HDP" />
<br />''' % localsettings.resources_path
elif "P" in pt.cset:
- retarg += '''<img src="%s/private.png" alt="PRIVATE" />
+ html += '''<img src="%s/private.png" alt="PRIVATE" />
<br />''' % localsettings.resources_path
else:
- retarg += 'UNKNOWN COURSETYPE = %s <br />' % str(pt.cset)
+ html += '%s = %s <br />' % (_("UNKNOWN COURSETYPE"), pt.cset)
- retarg += "%s<br />" % pt.fee_table.briefName
+ html += "%s<br />" % pt.fee_table.briefName
try:
- retarg += 'dentist = %s' % localsettings.ops[pt.dnt1]
+ html += 'dentist = %s' % localsettings.ops[pt.dnt1]
if pt.dnt2 != 0 and pt.dnt1 != pt.dnt2:
- retarg += '/%s' % localsettings.ops[pt.dnt2]
+ html += '/%s' % localsettings.ops[pt.dnt2]
except KeyError as e:
- retarg += '<h4>Please Set a Dentist for this patient!</h4><hr />'
+ html += '<h4>%s</h4><hr />' % _(
+ "Please Set a Dentist for this patient!")
if 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))
-
- letype = ""
- lastexam = datetime.date(1, 1, 1)
- i = 0
- for date in (pt.pd5, pt.pd6, pt.pd7):
- if date and date > lastexam:
- lastexam = date
+ html += '<h4>%s</h4>%s<hr />' % (_("Memo"), pt.memo)
+
+ tx_dates = [
+ (_("Treatment"), pt.last_treatment_date),
+ (_("IO xrays"), pt.pd9),
+ (_("Panoral"), pt.pd8),
+ (_("Scaling"), pt.pd10)
+ ]
+
+ letype, le_date = "", datetime.date(1, 1, 1)
+ for i, date_ in enumerate((pt.pd5, pt.pd6, pt.pd7)):
+ if date_ and date_ > le_date:
+ le_date = date_
letype = ("(CE)", "(ECE)", "(FCA)")[i]
- i += 1
- if lastexam == datetime.date(1, 1, 1):
- lastexam = None
+ if le_date == datetime.date(1, 1, 1):
+ le_date = None
if letype != "":
- retarg += '<tr><td>Last Exam %s</td><td>%s</td></tr>' % (
- letype, localsettings.formatDate(lastexam))
+ tx_dates.append(('%s %s' % (_("Exam"), letype), le_date))
+
+ html += '<h4>%s</h4><table width="100%%" border="1">' % _("History")
+ for i, (att, val) in enumerate(tx_dates):
+ html += '''<tr><td align="center">%s</td>
+ <td align="center">%s%s%s</td></tr>''' % (
+ att,
+ "<b>" if i in (0, 4) else "",
+ localsettings.formatDate(val),
+ "</b>" if i in (0, 4) else "")
+
+ html += "</table>"
+ html += "<h4>%s</h4>" % _("Recall")
if pt.recall_active:
- retarg += '''<tr><td>Recall Date</td><td>%s</td></tr>
- </table>''' % localsettings.formatDate(pt.recd)
+ if pt.recd > localsettings.currentDay() or pt.has_exam_booked:
+ html += "%s " % localsettings.formatDate(pt.recd)
+ html += _("(exam booked)") if pt.has_exam_booked else ""
+ else:
+ html += '<div style="color:red;">%s</div>' % (
+ localsettings.formatDate(pt.recd))
else:
- retarg += '<tr><td colspan="2">%s</td></tr></table>' % _(
- "DO NOT RECALL")
+ html += '<div style="color:red;">%s</div>' % _("DO NOT RECALL")
- if not Saved:
- alert = "<br />NOT SAVED"
- else:
- alert = ""
+ alert = _("NOT SAVED") if not Saved else ""
if pt.fees > 0:
amount = localsettings.formatMoney(pt.fees)
- retarg += '<hr /><h3 class="debt">Account = %s %s</h3>' % (
- amount, alert)
+ html += '<hr /><h3 class="debt">%s = %s %s</h3>' % (
+ _("Account"), amount, alert)
if pt.fees < 0:
amount = localsettings.formatMoney(-pt.fees)
- retarg += '<hr /><h3>%s in credit %s</h3>' % (amount, alert)
-
+ html += '<hr /><h3>%s %s %s</h3>' % (amount, _("in credit"), alert)
if pt.underTreatment:
- retarg += '<hr /><h2 class="ut_label">UNDER TREATMENT</h2><hr />'
-
- return '''%s\n</div></body></html>''' % retarg
+ html += '<hr /><h2 class="ut_label">%s</h2><hr />' % _(
+ "UNDER TREATMENT")
+ return '''%s\n</div></body></html>''' % html
except Exception as exc:
LOGGER.exception("error in patientDetails.details")
return "error displaying details, sorry <br />%s" % exc
@@ -171,8 +179,4 @@ if __name__ == '__main__':
serialno = int(sys.argv[len(sys.argv) - 1])
except:
serialno = 4792
- if '-v' in sys.argv:
- verbose = True
- else:
- verbose = False
print details(patient_class.patient(serialno))
diff --git a/src/openmolar/ptModules/perio.py b/src/openmolar/ptModules/perio.py
deleted file mode 100755
index 24c0366..0000000
--- a/src/openmolar/ptModules/perio.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#! /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/>. # #
-# # # #
-# ############################################################################ #
-
-'''gets and decodes the perio charts'''
-
-import sys
-from openmolar.settings import localsettings
-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
-
- return perioData
-
-if __name__ == "__main__":
- try:
- 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()
- cursor.close()
- # 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
diff --git a/src/openmolar/ptModules/plan.py b/src/openmolar/ptModules/plan.py
index 5f8e5d6..9f9f8b6 100644
--- a/src/openmolar/ptModules/plan.py
+++ b/src/openmolar/ptModules/plan.py
@@ -123,20 +123,30 @@ def summary(pt):
returns html set showing a summary of planned or completed treatment
'''
- if pt.treatment_course is None:
+ if pt.treatment_course is None or pt.treatment_course.accd is None:
return ""
- retarg = '''<html><body><head>
+ retarg = '''<html><head>
<link rel="stylesheet" href="%s" type="text/css">
- </head>\n''' % localsettings.stylesheet
+ </head>\n<body>''' % localsettings.stylesheet
+
if not pt.underTreatment:
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))
+ 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))
+ else:
+ retarg += '<b>%s</b><br />' % _("ONGOING")
+
+ if pt.treatment_course.ftr:
+ retarg += '<font color="red">%s</font><br />' % _(
+ "Patient Failed to Return")
+
plan = ""
for item in plannedItems(pt):
plan += '%s - %s<br />' % (item)
@@ -163,25 +173,46 @@ def completedFillsToStatic(pt):
'''
take completed items, and update the static chart
'''
- try:
- items = completedItems(pt, teethOnly=True)
- for tooth, prop in items:
- tooth = tooth.lower()
- if re.match("EX", prop):
- 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.
- while len(new) > 34:
- new = new[new.index(" ") + 1:]
- pt.__dict__["%sst" % tooth] = new
-
- except Exception as e:
- # shouldn't happen, but safety first.
- LOGGER.exception("FAILED TO TRANSFER FILLS TO STATIC")
+ items = completedItems(pt, teethOnly=True)
+ for tooth, prop in items:
+ tooth = tooth.lower()
+ if re.match("EX", prop):
+ pt.__dict__["%sst" % tooth] = "TM "
+ elif len(prop) > 33:
+ pass
+ else:
+ existing = pt.__dict__.get("%sst" % tooth).split(" ")
+ existing.append(prop.strip(" "))
+ i = 0
+ correct = False
+ while not correct:
+ new = " ".join([s for s in existing[i:] if s != ""]) + " "
+ correct = len(new) < 34
+ i += 1
+ pt.__dict__["%sst" % tooth] = new
+
+
+def reverse_completedFillsToStatic(pt):
+ '''
+ undo above procedure if a course is "resumed"
+ take completed items, and update the static chart
+ '''
+ items = completedItems(pt, teethOnly=True)
+ for tooth, prop in items:
+ tooth = tooth.lower()
+ existing = pt.__dict__["%sst" % tooth].split(" ")
+ if re.match("EX", prop):
+ removal = "TM"
+ else:
+ removal = prop.strip(" ")
+ existing.reverse()
+ try:
+ existing.remove(removal)
+ except ValueError:
+ pass # property not found
+ existing.reverse()
+ new = " ".join([s for s in existing if s != ""]) + " "
+ pt.__dict__["%sst" % tooth] = new
if __name__ == "__main__":
diff --git a/src/openmolar/ptModules/reception_summary.py b/src/openmolar/ptModules/reception_summary.py
index f126155..cc7e3ce 100644
--- a/src/openmolar/ptModules/reception_summary.py
+++ b/src/openmolar/ptModules/reception_summary.py
@@ -59,7 +59,7 @@ def header_html(pt):
def treatment_html(pt):
return u"<h4>Treatments (courseno %s)</h4>%s" % (
- pt.courseno0, estimate_synopsis.html(pt.courseno0))
+ pt.courseno0, estimate_synopsis.html(pt.serialno, pt.courseno0))
def payments_html(pt):
diff --git a/src/openmolar/ptModules/referral.py b/src/openmolar/ptModules/referral.py
deleted file mode 100644
index c3a869a..0000000
--- a/src/openmolar/ptModules/referral.py
+++ /dev/null
@@ -1,129 +0,0 @@
-#! /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 xml.dom import minidom
-import time
-import datetime
-from openmolar.settings import localsettings
-
-
-def getDescriptions():
- try:
- 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):
- try:
- d = minidom.parse(localsettings.referralfile)
- descriptions = d.getElementsByTagName("description")
- desclist = []
- found = False
- for description in descriptions:
- 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 = []
- 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
- 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>"
- return retarg
- else:
- return ("<html><body>SORRY - we couldn't find letter data for % </body></html>" % desc)
-
- 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()
- print d
- print getHtml(d[0], pt)
diff --git a/src/openmolar/qt-designer/activeDentStartFinish.ui b/src/openmolar/qt-designer/activeDentStartFinish.ui
deleted file mode 100644
index ad0b9d2..0000000
--- a/src/openmolar/qt-designer/activeDentStartFinish.ui
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>562</width>
- <height>25</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Form</string>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <property name="topMargin">
- <number>1</number>
- </property>
- <property name="bottomMargin">
- <number>1</number>
- </property>
- <item>
- <widget class="QCheckBox" name="checkBox">
- <property name="minimumSize">
- <size>
- <width>92</width>
- <height>23</height>
- </size>
- </property>
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>CheckBox</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QWidget" name="widget" native="true">
- <property name="minimumSize">
- <size>
- <width>80</width>
- <height>0</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QWidget" name="widget_2" native="true">
- <property name="minimumSize">
- <size>
- <width>80</width>
- <height>0</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLineEdit" name="lineEdit">
- <property name="minimumSize">
- <size>
- <width>160</width>
- <height>0</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/addTreatment.ui b/src/openmolar/qt-designer/addTreatment.ui
deleted file mode 100644
index ed54cfd..0000000
--- a/src/openmolar/qt-designer/addTreatment.ui
+++ /dev/null
@@ -1,115 +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>459</width>
- <height>245</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Plan Treatment</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Add the following Treatment Items to the Current Treatment Plan</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QScrollArea" name="scrollArea">
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>439</width>
- <height>173</height>
- </rect>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QFrame" name="frame">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/appointment_length.ui b/src/openmolar/qt-designer/appointment_length.ui
deleted file mode 100644
index 8728ae8..0000000
--- a/src/openmolar/qt-designer/appointment_length.ui
+++ /dev/null
@@ -1,137 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
- <property name="windowModality" >
- <enum>Qt::NonModal</enum>
- </property>
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>256</width>
- <height>134</height>
- </rect>
- </property>
- <property name="windowTitle" >
- <string>Select Appointment Length</string>
- </property>
- <property name="windowIcon" >
- <iconset resource="../resources/resources.qrc" >
- <normaloff>:/logo.png</normaloff>:/logo.png</iconset>
- </property>
- <layout class="QGridLayout" name="gridLayout" >
- <item row="0" column="0" >
- <widget class="QLabel" name="label" >
- <property name="text" >
- <string>Hours</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QLabel" name="label_2" >
- <property name="text" >
- <string>Minutes</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="0" >
- <widget class="QSpinBox" name="hours_spinBox" >
- <property name="maximumSize" >
- <size>
- <width>70</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maximum" >
- <number>8</number>
- </property>
- </widget>
- </item>
- <item row="1" column="1" >
- <widget class="QSpinBox" name="mins_spinBox" >
- <property name="maximumSize" >
- <size>
- <width>70</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maximum" >
- <number>55</number>
- </property>
- <property name="singleStep" >
- <number>5</number>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2" >
- <spacer name="verticalSpacer" >
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>20</width>
- <height>29</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="3" column="0" colspan="2" >
- <widget class="QDialogButtonBox" name="buttonBox" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons" >
- <set>QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources>
- <include location="../resources/resources.qrc" />
- </resources>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel" >
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>Dialog</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>127</x>
- <y>66</y>
- </hint>
- <hint type="destinationlabel" >
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/apptOpenDay.ui b/src/openmolar/qt-designer/apptOpenDay.ui
deleted file mode 100644
index cd01a57..0000000
--- a/src/openmolar/qt-designer/apptOpenDay.ui
+++ /dev/null
@@ -1,307 +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>540</width>
- <height>377</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Open a Day</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="1">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Clinician</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QComboBox" name="comboBox"/>
- </item>
- <item row="0" column="3">
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>141</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Date to Open</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QDateEdit" name="dateEdit">
- <property name="minimumSize">
- <size>
- <width>140</width>
- <height>0</height>
- </size>
- </property>
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2">
- <widget class="QLabel" name="label">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>Day Memo - optional</string>
- </property>
- </widget>
- </item>
- <item row="2" column="2" colspan="2">
- <widget class="QLineEdit" name="memo_lineEdit">
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="3" column="0" colspan="4">
- <widget class="QFrame" name="frame">
- <property name="minimumSize">
- <size>
- <width>522</width>
- <height>0</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="1">
- <widget class="QLabel" name="label_10">
- <property name="text">
- <string>Day Start</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QTimeEdit" name="dayStart_timeEdit"/>
- </item>
- <item row="1" column="0">
- <widget class="QCheckBox" name="es1_checkBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Morning Emergency Slot</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Start</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QTimeEdit" name="es1Start_timeEdit"/>
- </item>
- <item row="1" column="3">
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string>Finish</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="4">
- <widget class="QTimeEdit" name="es1Finish_timeEdit"/>
- </item>
- <item row="2" column="0">
- <widget class="QCheckBox" name="lunch_checkBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Lunch</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>Start</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QTimeEdit" name="lunchStart_timeEdit"/>
- </item>
- <item row="2" column="3">
- <widget class="QLabel" name="label_8">
- <property name="text">
- <string>Finish</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="4">
- <widget class="QTimeEdit" name="lunchFinish_timeEdit"/>
- </item>
- <item row="3" column="0">
- <widget class="QCheckBox" name="es2_checkBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Afternoon Emergency Slot </string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>Start</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="2">
- <widget class="QTimeEdit" name="es2Start_timeEdit"/>
- </item>
- <item row="3" column="3">
- <widget class="QLabel" name="label_9">
- <property name="text">
- <string>Finish</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="4">
- <widget class="QTimeEdit" name="es2Finish_timeEdit"/>
- </item>
- <item row="4" column="3">
- <widget class="QLabel" name="label_11">
- <property name="text">
- <string>Day Finish</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="4" column="4">
- <widget class="QTimeEdit" name="dayFinish_timeEdit"/>
- </item>
- </layout>
- </widget>
- </item>
- <item row="4" column="0">
- <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>
- <item row="5" column="0" colspan="4">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <tabstops>
- <tabstop>buttonBox</tabstop>
- </tabstops>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/apptTools.ui b/src/openmolar/qt-designer/apptTools.ui
deleted file mode 100644
index 1389a8a..0000000
--- a/src/openmolar/qt-designer/apptTools.ui
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>599</width>
- <height>255</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Appointment Tools</string>
- </property>
- <property name="windowIcon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/logo.png</normaloff>:/logo.png</iconset>
- </property>
- <widget class="QWidget" name="centralwidget">
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0" rowspan="5">
- <widget class="QLabel" name="label">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../resources/resources.qrc">:/appt_ov.png</pixmap>
- </property>
- <property name="scaledContents">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QPushButton" name="extendBook_pushButton">
- <property name="toolTip">
- <string>Move the end date for making appointments.</string>
- </property>
- <property name="text">
- <string>Extend Books</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QPushButton" name="removeOld_pushButton">
- <property name="text">
- <string>Remove old weeks</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QPushButton" name="editWeeks_pushButton">
- <property name="text">
- <string>Edit Standard Working Weeks for Clinicians</string>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QPushButton" name="openDay_pushButton">
- <property name="text">
- <string>Open A Day</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QPushButton" name="blocks_pushButton">
- <property name="text">
- <string>Insert regular blocks</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QMenuBar" name="menubar">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>599</width>
- <height>22</height>
- </rect>
- </property>
- <widget class="QMenu" name="menu_Quit">
- <property name="title">
- <string>&Quit</string>
- </property>
- </widget>
- <addaction name="menu_Quit"/>
- </widget>
- <widget class="QStatusBar" name="statusbar"/>
- </widget>
- <resources>
- <include location="../resources/resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/apptWizard.ui b/src/openmolar/qt-designer/apptWizard.ui
deleted file mode 100644
index 3a99a3e..0000000
--- a/src/openmolar/qt-designer/apptWizard.ui
+++ /dev/null
@@ -1,103 +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>721</width>
- <height>442</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Appointment Wizard</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Add a combination of proposed appointments to the patients diary.</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QScrollArea" name="scrollArea">
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>699</width>
- <height>360</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QFrame" name="frame">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/apptWizardItem.ui b/src/openmolar/qt-designer/apptWizardItem.ui
deleted file mode 100644
index 550b6f1..0000000
--- a/src/openmolar/qt-designer/apptWizardItem.ui
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>697</width>
- <height>34</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Form</string>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>3</number>
- </property>
- <property name="bottomMargin">
- <number>3</number>
- </property>
- <item>
- <widget class="QLabel" name="label">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>TextLabel</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="comboBox">
- <property name="minimumSize">
- <size>
- <width>300</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>300</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pushButton">
- <property name="text">
- <string>Add</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/aslotEdit.ui b/src/openmolar/qt-designer/aslotEdit.ui
deleted file mode 100644
index 10f814d..0000000
--- a/src/openmolar/qt-designer/aslotEdit.ui
+++ /dev/null
@@ -1,245 +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>602</width>
- <height>457</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Clinicians - DATE</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0" colspan="4">
- <widget class="QFrame" name="frame">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <property name="leftMargin">
- <number>40</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>40</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item>
- <widget class="QLabel" name="label">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>92</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>Clinician</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="label_3">
- <property name="minimumSize">
- <size>
- <width>80</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>Start</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_4">
- <property name="minimumSize">
- <size>
- <width>80</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>Finish</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_2">
- <property name="minimumSize">
- <size>
- <width>160</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>Memo</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="1" column="0" colspan="4">
- <widget class="QScrollArea" name="scrollArea">
- <property name="minimumSize">
- <size>
- <width>346</width>
- <height>0</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>584</width>
- <height>380</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QFrame" name="frame_2">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QPushButton" name="copy_pushButton">
- <property name="toolTip">
- <string>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.</string>
- </property>
- <property name="text">
- <string>Copy To Clipboard</string>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>188</width>
- <height>24</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="3">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QPushButton" name="paste_pushButton">
- <property name="toolTip">
- <string>Paste the saved values.</string>
- </property>
- <property name="text">
- <string>Paste</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/blockSlot.ui b/src/openmolar/qt-designer/blockSlot.ui
deleted file mode 100644
index 69cf78c..0000000
--- a/src/openmolar/qt-designer/blockSlot.ui
+++ /dev/null
@@ -1,342 +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>345</width>
- <height>361</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Options</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QTabWidget" name="tabWidget">
- <property name="currentIndex">
- <number>0</number>
- </property>
- <widget class="QWidget" name="tab">
- <attribute name="title">
- <string>Insert a Block</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0" colspan="3">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Would you like to Block (or partially Block) this Slot?</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Block Start</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Bock End</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="0" rowspan="2">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Text to apply</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="1" colspan="2">
- <widget class="QComboBox" name="comboBox">
- <property name="editable">
- <bool>true</bool>
- </property>
- <item>
- <property name="text">
- <string>//Blocked//</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Emergency</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Reserved Clinical Time</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Out of Office</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Lunch</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Catch up time</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Phone Call</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="5" column="0" colspan="2">
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>34</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="1">
- <widget class="QFrame" name="blockStart_frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QFrame" name="blockEnd_frame">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="2" rowspan="2">
- <widget class="QLabel" name="length_label">
- <property name="text">
- <string>minutes</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_2">
- <attribute name="title">
- <string>Insert a Known Patient</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="0" colspan="4">
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string>Insert A Patient into this slot?</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="3">
- <widget class="QLabel" name="label_5">
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>Start Time</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="3">
- <widget class="QLabel" name="label_6">
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>Length</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="0" colspan="3">
- <widget class="QLabel" name="pt_label">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>50</height>
- </size>
- </property>
- <property name="text">
- <string>Chosen Patient is<br /></string>
- </property>
- <property name="textFormat">
- <enum>Qt::AutoText</enum>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="3">
- <widget class="QPushButton" name="changePt_pushButton">
- <property name="text">
- <string>Change</string>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="3">
- <widget class="QLabel" name="label_9">
- <property name="text">
- <string>Reason for appointment is</string>
- </property>
- <property name="textFormat">
- <enum>Qt::AutoText</enum>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="4" column="3">
- <widget class="QComboBox" name="reason_comboBox"/>
- </item>
- <item row="5" column="2">
- <spacer name="verticalSpacer_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>99</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="3">
- <widget class="QSpinBox" name="length_spinBox">
- <property name="suffix">
- <string> minutes</string>
- </property>
- <property name="minimum">
- <number>-600</number>
- </property>
- <property name="maximum">
- <number>600</number>
- </property>
- <property name="singleStep">
- <number>5</number>
- </property>
- </widget>
- </item>
- <item row="1" column="3">
- <widget class="QFrame" name="startTime_frame">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/block_wizard.ui b/src/openmolar/qt-designer/block_wizard.ui
deleted file mode 100644
index 6993c2d..0000000
--- a/src/openmolar/qt-designer/block_wizard.ui
+++ /dev/null
@@ -1,270 +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>403</width>
- <height>437</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Block Wizard</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="0" colspan="4">
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string>Insert a block into a book for a range of dates.</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Start Date</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QDateEdit" name="start_dateEdit">
- <property name="minimumSize">
- <size>
- <width>120</width>
- <height>0</height>
- </size>
- </property>
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="3">
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>202</width>
- <height>21</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>End Date (inclusive)</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QDateEdit" name="end_dateEdit">
- <property name="minimumSize">
- <size>
- <width>120</width>
- <height>0</height>
- </size>
- </property>
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="3">
- <spacer name="horizontalSpacer_3">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>202</width>
- <height>21</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Time</string>
- </property>
- </widget>
- </item>
- <item row="4" column="3">
- <spacer name="horizontalSpacer_4">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>202</width>
- <height>21</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="5" column="0">
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>Length</string>
- </property>
- </widget>
- </item>
- <item row="5" column="3">
- <spacer name="horizontalSpacer_5">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>202</width>
- <height>22</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>Text to Apply</string>
- </property>
- </widget>
- </item>
- <item row="6" column="1" colspan="3">
- <widget class="QLineEdit" name="lineEdit"/>
- </item>
- <item row="7" column="0" colspan="4">
- <widget class="QGroupBox" name="day_groupBox">
- <property name="title">
- <string>Days to Apply</string>
- </property>
- </widget>
- </item>
- <item row="12" column="0" colspan="4">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="8" column="0">
- <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>
- <item row="4" column="1">
- <widget class="QFrame" name="time_frame">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="4">
- <widget class="QGroupBox" name="clinicians_groupBox">
- <property name="title">
- <string>Clinicians</string>
- </property>
- </widget>
- </item>
- <item row="5" column="1">
- <widget class="QSpinBox" name="spinBox">
- <property name="suffix">
- <string> minutes</string>
- </property>
- <property name="maximum">
- <number>300</number>
- </property>
- <property name="singleStep">
- <number>5</number>
- </property>
- </widget>
- </item>
- <item row="11" column="0">
- <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>
- <item row="9" column="0" colspan="4">
- <widget class="QLabel" name="progress_label">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="10" column="0" colspan="4">
- <widget class="QProgressBar" name="progressBar">
- <property name="value">
- <number>0</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/bridge_denture.ui b/src/openmolar/qt-designer/bridge_denture.ui
deleted file mode 100644
index f69cb80..0000000
--- a/src/openmolar/qt-designer/bridge_denture.ui
+++ /dev/null
@@ -1,242 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>632</width>
- <height>480</height>
- </rect>
- </property>
- <property name="windowTitle" >
- <string>Bridge - Denture Entry</string>
- </property>
- <layout class="QGridLayout" name="gridLayout" >
- <item rowspan="2" row="0" column="0" >
- <widget class="QFrame" name="frame" >
- <property name="minimumSize" >
- <size>
- <width>331</width>
- <height>451</height>
- </size>
- </property>
- <property name="frameShape" >
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow" >
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QTabWidget" name="tabWidget" >
- <property name="currentIndex" >
- <number>0</number>
- </property>
- <widget class="QWidget" name="tab" >
- <attribute name="title" >
- <string>Bridge</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_4" >
- <item>
- <widget class="QRadioButton" name="radioButton" >
- <property name="text" >
- <string>Porcelain / Precious Metal</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_2" >
- <property name="text" >
- <string>Lava (or all ceramic)</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_3" >
- <property name="text" >
- <string>Resin Retained</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer" >
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>20</width>
- <height>295</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_2" >
- <attribute name="title" >
- <string>Denture</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_3" >
- <item>
- <widget class="QFrame" name="frame_2" >
- <property name="frameShape" >
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow" >
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout" >
- <item>
- <widget class="QLabel" name="label_2" >
- <property name="text" >
- <string>Upper</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_4" >
- <property name="text" >
- <string>Full (acrylic)</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_8" >
- <property name="text" >
- <string>Full (co-chrome)</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_5" >
- <property name="text" >
- <string>Partial (acrylic)</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_6" >
- <property name="text" >
- <string>Partial (co-chrome)</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_7" >
- <property name="text" >
- <string>Other</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="frame_3" >
- <property name="frameShape" >
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow" >
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2" >
- <item>
- <widget class="QLabel" name="label" >
- <property name="text" >
- <string>Lower</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_9" >
- <property name="text" >
- <string>Full (acrylic)</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_13" >
- <property name="text" >
- <string>Full (co-chrome)</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_10" >
- <property name="text" >
- <string>Partial (acrylic)</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_11" >
- <property name="text" >
- <string>Partial (co-chrome)</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_12" >
- <property name="text" >
- <string>Other</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item row="1" column="1" >
- <widget class="QDialogButtonBox" name="buttonBox" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons" >
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel" >
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel" >
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/bulkmail_options.ui b/src/openmolar/qt-designer/bulkmail_options.ui
deleted file mode 100644
index b0b0c45..0000000
--- a/src/openmolar/qt-designer/bulkmail_options.ui
+++ /dev/null
@@ -1,179 +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>410</width>
- <height>367</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Bulk Mail Options</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QFrame" name="frame">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="0" rowspan="2">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Date Format for the letters</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QRadioButton" name="fullDate_radioButton">
- <property name="text">
- <string>Full, Day, month and Year</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QRadioButton" name="abbrvDate_radioButton">
- <property name="text">
- <string>Month and Year Only</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="Line" name="line">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="frame_2">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Date to use</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QRadioButton" name="today_radioButton">
- <property name="text">
- <string>Today's Date</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QRadioButton" name="recd_radioButton">
- <property name="text">
- <string>The actual recall date for the patient</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QRadioButton" name="custDate_radioButton">
- <property name="text">
- <string>This Date</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QDateEdit" name="dateEdit">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <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>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/choose_clinicians.ui b/src/openmolar/qt-designer/choose_clinicians.ui
deleted file mode 100644
index b459f38..0000000
--- a/src/openmolar/qt-designer/choose_clinicians.ui
+++ /dev/null
@@ -1,77 +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>342</width>
- <height>385</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Choose Clinicians</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QFrame" name="frame">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/choose_language.ui b/src/openmolar/qt-designer/choose_language.ui
deleted file mode 100644
index 8b2925f..0000000
--- a/src/openmolar/qt-designer/choose_language.ui
+++ /dev/null
@@ -1,165 +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>426</width>
- <height>602</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Language Selector</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="label">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>60</height>
- </size>
- </property>
- <property name="text">
- <string>Choose from the following available languages.
-Please Note that some of these translations are not complete.</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="QScrollArea" name="scrollArea">
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>406</width>
- <height>351</height>
- </rect>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QFrame" name="frame">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_2">
- <property name="minimumSize">
- <size>
- <width>408</width>
- <height>40</height>
- </size>
- </property>
- <property name="text">
- <string>Note - if your preferred language is not available (or incomplete), please visit https://launchpad.net/openmolar and add a translation of your own!</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="label_3">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>80</height>
- </size>
- </property>
- <property name="font">
- <font>
- <italic>true</italic>
- </font>
- </property>
- <property name="text">
- <string>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.</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="QDialogButtonBox" name="buttonBox">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>27</height>
- </size>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/choose_tooth.ui b/src/openmolar/qt-designer/choose_tooth.ui
deleted file mode 100644
index c601a0e..0000000
--- a/src/openmolar/qt-designer/choose_tooth.ui
+++ /dev/null
@@ -1,93 +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>736</width>
- <height>300</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Choose A Tooth</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Please Select the tooth to which this treatment is planned</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>200</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/codeChecker.ui b/src/openmolar/qt-designer/codeChecker.ui
deleted file mode 100644
index db43822..0000000
--- a/src/openmolar/qt-designer/codeChecker.ui
+++ /dev/null
@@ -1,141 +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>907</width>
- <height>686</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Dialog</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <item>
- <widget class="QSplitter" name="splitter">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <widget class="QFrame" name="frame_3">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QFrame" name="frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>200</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Deciduous Teeth</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTableView" name="dec_tableView">
- <attribute name="verticalHeaderVisible">
- <bool>false</bool>
- </attribute>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QFrame" name="frame_2">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="label_2">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Adult Teeth</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTableView" name="adult_tableView">
- <attribute name="horizontalHeaderVisible">
- <bool>false</bool>
- </attribute>
- <attribute name="verticalHeaderVisible">
- <bool>false</bool>
- </attribute>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="comboBox"/>
- </item>
- <item>
- <layout class="QHBoxLayout" name="bottom_layout">
- <item>
- <widget class="QLabel" name="instruction_label">
- <property name="text">
- <string>Enter a Restoration Code (eg. MOD) to see how a feescale interprets the shortcut</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pushButton">
- <property name="maximumSize">
- <size>
- <width>40</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>GO</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="quit_pushButton">
- <property name="text">
- <string>QUIT</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/completionDate.ui b/src/openmolar/qt-designer/completionDate.ui
deleted file mode 100644
index 7f2c6e2..0000000
--- a/src/openmolar/qt-designer/completionDate.ui
+++ /dev/null
@@ -1,157 +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>340</width>
- <height>227</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Completion Date</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="pt_label">
- <property name="text">
- <string>UNNAMED PT - (000000)</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="autoComplete_label">
- <property name="text">
- <string>You have no further treatment proposed for this patient, yet they are deemed to be "under treatment".</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <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>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QLabel" name="label_4">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>Suggested completion Date</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QDateEdit" name="dateEdit">
- <property name="focusPolicy">
- <enum>Qt::TabFocus</enum>
- </property>
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Apply this Date Now?
-(course can be re-opened later if necessary)</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>14</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::No|QDialogButtonBox::Yes</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/customTreatment.ui b/src/openmolar/qt-designer/customTreatment.ui
deleted file mode 100644
index d40fb95..0000000
--- a/src/openmolar/qt-designer/customTreatment.ui
+++ /dev/null
@@ -1,151 +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>346</width>
- <height>192</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Custom Item</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="2" column="0" colspan="3">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Number of Items</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>number_spinBox</cstring>
- </property>
- </widget>
- </item>
- <item row="2" column="3">
- <widget class="QSpinBox" name="number_spinBox">
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="minimum">
- <number>1</number>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="3">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Fee</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>fee_doubleSpinBox</cstring>
- </property>
- </widget>
- </item>
- <item row="4" column="3">
- <widget class="QDoubleSpinBox" name="fee_doubleSpinBox">
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="maximum">
- <double>3000.000000000000000</double>
- </property>
- <property name="singleStep">
- <double>1.000000000000000</double>
- </property>
- </widget>
- </item>
- <item row="5" column="2">
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>50</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="6" column="1" colspan="3">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="4">
- <widget class="QLineEdit" name="description_lineEdit">
- <property name="maxLength">
- <number>50</number>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Treatment Description</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>description_lineEdit</cstring>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <tabstops>
- <tabstop>number_spinBox</tabstop>
- <tabstop>fee_doubleSpinBox</tabstop>
- <tabstop>buttonBox</tabstop>
- </tabstops>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/daylist_print.ui b/src/openmolar/qt-designer/daylist_print.ui
deleted file mode 100644
index 856f19b..0000000
--- a/src/openmolar/qt-designer/daylist_print.ui
+++ /dev/null
@@ -1,203 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>376</width>
- <height>486</height>
- </rect>
- </property>
- <property name="font" >
- <font>
- <weight>50</weight>
- <bold>false</bold>
- </font>
- </property>
- <property name="windowTitle" >
- <string>Daylist Printing Wizard</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout" >
- <item>
- <widget class="QLabel" name="label_2" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Minimum" hsizetype="Preferred" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize" >
- <size>
- <width>16777215</width>
- <height>100</height>
- </size>
- </property>
- <property name="font" >
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text" >
- <string>Specify Dates and Practitioners for a Daylist Print Run</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QGridLayout" name="gridLayout" >
- <item row="0" column="0" >
- <widget class="QLabel" name="label_3" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Minimum" hsizetype="Preferred" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text" >
- <string>Start Date</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QLabel" name="label_4" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Minimum" hsizetype="Preferred" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text" >
- <string>End Date</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="0" >
- <widget class="QDateEdit" name="start_dateEdit" >
- <property name="calendarPopup" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1" >
- <widget class="QDateEdit" name="end_dateEdit" >
- <property name="calendarPopup" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QScrollArea" name="scrollArea" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize" >
- <size>
- <width>0</width>
- <height>200</height>
- </size>
- </property>
- <property name="widgetResizable" >
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>354</width>
- <height>196</height>
- </rect>
- </property>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="allOnePage_radioButton" >
- <property name="text" >
- <string>All Practioners on One Page</string>
- </property>
- <property name="checked" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="onePageMin_radioButton" >
- <property name="text" >
- <string>One Practitioner Per Page - Minimal</string>
- </property>
- <property name="checked" >
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="onePageFull_radioButton" >
- <property name="text" >
- <string>One Practioner Per Page - Fill Page</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons" >
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel" >
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel" >
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/diary_widget.ui b/src/openmolar/qt-designer/diary_widget.ui
deleted file mode 100644
index f7de684..0000000
--- a/src/openmolar/qt-designer/diary_widget.ui
+++ /dev/null
@@ -1,953 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>732</width>
- <height>551</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Form</string>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QTabWidget" name="diary_tabWidget">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="currentIndex">
- <number>0</number>
- </property>
- <widget class="QWidget" name="tab_dayview">
- <attribute name="title">
- <string>Day View</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_4">
- <property name="spacing">
- <number>6</number>
- </property>
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <property name="spacing">
- <number>6</number>
- </property>
- <item>
- <widget class="QFrame" name="frame_18">
- <property name="minimumSize">
- <size>
- <width>220</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>220</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_19">
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <widget class="QWidget" name="dayCalendar_frame" native="true">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>200</width>
- <height>180</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>200</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="goTodayPushButton">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>24</height>
- </size>
- </property>
- <property name="text">
- <string>Go To Today</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/agt_reload.png</normaloff>:/agt_reload.png</iconset>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="day_view_control_frame">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Plain</enum>
- </property>
- <property name="lineWidth">
- <number>0</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="1" column="0">
- <widget class="QSplitter" name="dayView_splitter">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>300</height>
- </size>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QScrollBar" name="emergency_dayview_scroll_bar">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2">
- <widget class="QWebView" name="appt_notes_webView">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>150</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>200</height>
- </size>
- </property>
- <property name="url">
- <url>
- <string>about:blank</string>
- </url>
- </property>
- </widget>
- </item>
- <item row="0" column="0" colspan="2">
- <widget class="QLabel" name="daymemo_label">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <pointsize>12</pointsize>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>TextLabel</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_weekview">
- <attribute name="title">
- <string>Week View</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_11">
- <property name="margin">
- <number>3</number>
- </property>
- <property name="spacing">
- <number>3</number>
- </property>
- <item row="0" column="0" rowspan="2">
- <widget class="QFrame" name="frame_8">
- <property name="minimumSize">
- <size>
- <width>220</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>220</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <widget class="QWidget" name="weekCalendar_frame" native="true">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>30</width>
- <height>180</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>200</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="goto_current_week_PushButton">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>24</height>
- </size>
- </property>
- <property name="text">
- <string>View Current Week</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/agt_reload.png</normaloff>:/agt_reload.png</iconset>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="week_view_control_frame">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Plain</enum>
- </property>
- <property name="lineWidth">
- <number>0</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QSplitter" name="weekView_splitter">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <widget class="QWidget" name="layoutWidget">
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QFrame" name="day1_frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>60</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QFrame" name="day2_frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>40</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QFrame" name="day3_frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>40</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="0" column="3">
- <widget class="QFrame" name="day4_frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>40</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="0" column="4">
- <widget class="QFrame" name="day5_frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>40</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QFrame" name="appt_OV_Frame1">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QFrame" name="appt_OV_Frame2">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QFrame" name="appt_OV_Frame3">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="3">
- <widget class="QFrame" name="appt_OV_Frame4">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="4">
- <widget class="QFrame" name="appt_OV_Frame5">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="layoutWidget_2">
- <layout class="QVBoxLayout" name="verticalLayout_23">
- <item>
- <widget class="QFrame" name="day6_frame">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>40</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="appt_OV_Frame6">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="day7_frame">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>40</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="appt_OV_Frame7">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_monthview">
- <attribute name="title">
- <string>Month View</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_5">
- <property name="margin">
- <number>3</number>
- </property>
- <item row="0" column="0" colspan="4">
- <widget class="QScrollArea" name="monthView_scrollArea">
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_14">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>702</width>
- <height>456</height>
- </rect>
- </property>
- </widget>
- </widget>
- </item>
- <item row="1" column="2">
- <layout class="QHBoxLayout" name="horizontalLayout_22">
- <item>
- <spacer name="horizontalSpacer_13">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QPushButton" name="aptOVprevmonth">
- <property name="maximumSize">
- <size>
- <width>28</width>
- <height>20</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/back.png</normaloff>:/back.png</iconset>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_65">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>20</height>
- </size>
- </property>
- <property name="text">
- <string>Month</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="aptOVnextmonth">
- <property name="maximumSize">
- <size>
- <width>28</width>
- <height>20</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/forward.png</normaloff>:/forward.png</iconset>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_14">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- <item row="1" column="3">
- <widget class="QPushButton" name="printMonth_pushButton">
- <property name="text">
- <string>Print Month View</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QCheckBox" name="monthClinicians_checkBox">
- <property name="text">
- <string>All Clinicians</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QPushButton" name="monthView_clinicians_pushButton">
- <property name="text">
- <string>Select Clinicians</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_yearview">
- <attribute name="title">
- <string>Year View</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_22">
- <property name="margin">
- <number>3</number>
- </property>
- <item row="0" column="0" colspan="3">
- <widget class="QTextBrowser" name="year_textBrowser">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>200</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="3">
- <widget class="QFrame" name="yearView_frame">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QCheckBox" name="yearClinicians_checkBox">
- <property name="text">
- <string>All Clinicians</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QPushButton" name="yearView_clinicians_pushButton">
- <property name="text">
- <string>Select Clinicians</string>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <spacer name="horizontalSpacer_10">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QPushButton" name="aptOVprevyear">
- <property name="maximumSize">
- <size>
- <width>28</width>
- <height>20</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/back.png</normaloff>:/back.png</iconset>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_64">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>20</height>
- </size>
- </property>
- <property name="text">
- <string>Year</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="aptOVnextyear">
- <property name="maximumSize">
- <size>
- <width>28</width>
- <height>20</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/forward.png</normaloff>:/forward.png</iconset>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_6">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_agenda">
- <attribute name="title">
- <string>Agenda</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_agenda">
- <property name="margin">
- <number>3</number>
- </property>
- <property name="spacing">
- <number>3</number>
- </property>
- <item row="0" column="0">
- <widget class="QWidget" name="agenda_calendar_frame" native="true">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>220</width>
- <height>180</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>220</width>
- <height>200</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="0" column="1" rowspan="3">
- <widget class="QFrame" name="agenda_frame">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QPushButton" name="agenda_goTodayPushButton">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="minimumSize">
- <size>
- <width>220</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>220</width>
- <height>24</height>
- </size>
- </property>
- <property name="text">
- <string>Go To Today</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/agt_reload.png</normaloff>:/agt_reload.png</iconset>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QFrame" name="agenda_control_frame">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>220</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>220</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Plain</enum>
- </property>
- <property name="lineWidth">
- <number>0</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <customwidgets>
- <customwidget>
- <class>QWebView</class>
- <extends>QWidget</extends>
- <header>QtWebKit/QWebView</header>
- </customwidget>
- </customwidgets>
- <resources>
- <include location="../resources/resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/editmemos.ui b/src/openmolar/qt-designer/editmemos.ui
deleted file mode 100644
index 06acbcb..0000000
--- a/src/openmolar/qt-designer/editmemos.ui
+++ /dev/null
@@ -1,123 +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>417</width>
- <height>395</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Edit Memos</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0" colspan="3">
- <widget class="QLabel" name="label">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <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_2">
- <property name="text">
- <string>Global Memo</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1" colspan="2">
- <widget class="QLineEdit" name="lineEdit"/>
- </item>
- <item row="2" column="0" colspan="2">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Clinician Memos</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0" colspan="3">
- <widget class="QScrollArea" name="scrollArea">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>399</width>
- <height>238</height>
- </rect>
- </property>
- </widget>
- </widget>
- </item>
- <item row="4" column="2">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/enter_letter_text.ui b/src/openmolar/qt-designer/enter_letter_text.ui
deleted file mode 100644
index 4897b37..0000000
--- a/src/openmolar/qt-designer/enter_letter_text.ui
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
- <property name="windowModality">
- <enum>Qt::NonModal</enum>
- </property>
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>644</width>
- <height>641</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Letter Text Entry</string>
- </property>
- <property name="sizeGripEnabled">
- <bool>true</bool>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string><b>Please enter the body text for your letter here.</b></string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QTextEdit" name="textEdit"/>
- </item>
- <item row="2" column="0">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/exam_wizard.ui b/src/openmolar/qt-designer/exam_wizard.ui
deleted file mode 100644
index 81df24c..0000000
--- a/src/openmolar/qt-designer/exam_wizard.ui
+++ /dev/null
@@ -1,171 +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>333</width>
- <height>272</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Exam Wizard</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Type</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QRadioButton" name="examA_radioButton">
- <property name="text">
- <string>Standard</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QRadioButton" name="examB_radioButton">
- <property name="text">
- <string>Extensive</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QRadioButton" name="examC_radioButton">
- <property name="text">
- <string>Full Case Assessment</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="label_3">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Exam Date</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QDateEdit" name="dateEdit">
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_2">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Dentist</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QComboBox" name="dents_comboBox"/>
- </item>
- <item row="5" 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>
- <item row="6" column="0" colspan="2">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/finalise_appt_time.ui b/src/openmolar/qt-designer/finalise_appt_time.ui
deleted file mode 100644
index c50d0fa..0000000
--- a/src/openmolar/qt-designer/finalise_appt_time.ui
+++ /dev/null
@@ -1,148 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>321</width>
- <height>159</height>
- </rect>
- </property>
- <property name="windowTitle" >
- <string>Appointment Time</string>
- </property>
- <layout class="QGridLayout" name="gridLayout" >
- <item row="0" column="0" >
- <widget class="QLabel" name="label" >
- <property name="text" >
- <string>Space Before Appointment</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QLabel" name="minutesB4label" >
- <property name="text" >
- <string>0 mins</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item rowspan="3" row="0" column="2" >
- <widget class="QSlider" name="verticalSlider" >
- <property name="mouseTracking" >
- <bool>true</bool>
- </property>
- <property name="value" >
- <number>0</number>
- </property>
- <property name="tracking" >
- <bool>true</bool>
- </property>
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
- </property>
- <property name="invertedAppearance" >
- <bool>true</bool>
- </property>
- <property name="invertedControls" >
- <bool>false</bool>
- </property>
- <property name="tickPosition" >
- <enum>QSlider::NoTicks</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="0" >
- <widget class="QLabel" name="label_3" >
- <property name="text" >
- <string>Appointment Time</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="1" >
- <widget class="QLabel" name="apptTimelabel" >
- <property name="text" >
- <string>00:00 - 00:00</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="0" >
- <widget class="QLabel" name="label_2" >
- <property name="text" >
- <string>Space After Appointment</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="1" >
- <widget class="QLabel" name="minutesL8Rlabel" >
- <property name="text" >
- <string>0 mins</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="0" colspan="3" >
- <widget class="QDialogButtonBox" name="buttonBox" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons" >
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel" >
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel" >
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/forumPost.ui b/src/openmolar/qt-designer/forumPost.ui
deleted file mode 100644
index ffa7f22..0000000
--- a/src/openmolar/qt-designer/forumPost.ui
+++ /dev/null
@@ -1,162 +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>502</width>
- <height>253</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Forum Input</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QLabel" name="label_3">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Topic</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1" colspan="3">
- <widget class="QLineEdit" name="topic_lineEdit"/>
- </item>
- <item row="1" column="2">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>To</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="3">
- <widget class="QComboBox" name="to_comboBox">
- <property name="maxVisibleItems">
- <number>20</number>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Comment</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="1" rowspan="2" colspan="3">
- <widget class="QTextEdit" name="comment_textEdit">
- <property name="acceptRichText">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="4">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="count_label">
- <property name="text">
- <string>(0 Characters)</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_2">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>From</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QComboBox" name="from_comboBox">
- <property name="maxVisibleItems">
- <number>20</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/hygenist_wizard.ui b/src/openmolar/qt-designer/hygenist_wizard.ui
deleted file mode 100644
index 407595b..0000000
--- a/src/openmolar/qt-designer/hygenist_wizard.ui
+++ /dev/null
@@ -1,233 +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>339</width>
- <height>350</height>
- </rect>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="windowTitle">
- <string>Hygienist Wizard</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <item>
- <widget class="QGroupBox" name="planned_groupbox">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>200</height>
- </size>
- </property>
- <property name="title">
- <string>Planned Treatments</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QLabel" name="label">
- <property name="styleSheet">
- <string notr="true">color:red;</string>
- </property>
- <property name="text">
- <string>label</string>
- </property>
- <property name="wordWrap">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pushButton">
- <property name="text">
- <string>Ok - I'll be careful!</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QGroupBox" name="groupBox">
- <property name="title">
- <string>Type</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QRadioButton" name="db_radioButton">
- <property name="text">
- <string>Debridement</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="sp_radioButton">
- <property name="text">
- <string>Scale and Polish</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="extsp_radioButton">
- <property name="text">
- <string>Extensive Scaling</string>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <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>
- </item>
- <item>
- <widget class="QGroupBox" name="clinicianGroupBox">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="title">
- <string>Treating Dentist/Hygienist</string>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>89</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QComboBox" name="dents_comboBox">
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>88</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>29</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/initialise.ui b/src/openmolar/qt-designer/initialise.ui
deleted file mode 100644
index ce1f087..0000000
--- a/src/openmolar/qt-designer/initialise.ui
+++ /dev/null
@@ -1,890 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>800</width>
- <height>507</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>OpenMolar - database wizard</string>
- </property>
- <widget class="QWidget" name="centralwidget">
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QTabWidget" name="tabWidget">
- <property name="currentIndex">
- <number>0</number>
- </property>
- <widget class="QWidget" name="tab_8">
- <attribute name="title">
- <string>Start</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="0" column="0" colspan="2">
- <widget class="QLabel" name="label_17">
- <property name="text">
- <string>What do you want to do?</string>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QRadioButton" name="modifydb_radioButton">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string>Modify an existing openmolar database</string>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QComboBox" name="comboBox">
- <property name="enabled">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="5" column="0" colspan="3">
- <widget class="Line" name="line">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="6" column="1">
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>407</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="0">
- <widget class="QRadioButton" name="blankdb_radioButton">
- <property name="text">
- <string>Create a New database from scratch</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QRadioButton" name="newdb_template_radioButton">
- <property name="text">
- <string>Create a New database (from a known template)</string>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab">
- <attribute name="title">
- <string>Practice Details</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <item>
- <widget class="QFrame" name="practice_frame">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Practice Name</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLineEdit" name="lineEdit"/>
- </item>
- <item row="0" column="2">
- <widget class="QLabel" name="label_18">
- <property name="text">
- <string>Used in receipts, appointment cards etc.</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Address Line 1</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLineEdit" name="lineEdit_2"/>
- </item>
- <item row="1" column="2">
- <widget class="QLabel" name="label_22">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Address Line 2</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLineEdit" name="lineEdit_3"/>
- </item>
- <item row="2" column="2">
- <widget class="QLabel" name="label_23">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Address Line 3</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QLineEdit" name="lineEdit_4"/>
- </item>
- <item row="3" column="2">
- <widget class="QLabel" name="label_27">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>Town</string>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QLineEdit" name="lineEdit_5"/>
- </item>
- <item row="4" column="2">
- <widget class="QLabel" name="label_19">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="5" column="0">
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>County</string>
- </property>
- </widget>
- </item>
- <item row="5" column="1">
- <widget class="QLineEdit" name="lineEdit_6"/>
- </item>
- <item row="5" column="2">
- <widget class="QLabel" name="label_28">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string>Postcode / Zip</string>
- </property>
- </widget>
- </item>
- <item row="6" column="1">
- <widget class="QLineEdit" name="lineEdit_7"/>
- </item>
- <item row="6" column="2">
- <widget class="QLabel" name="label_25">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="7" column="0">
- <widget class="QLabel" name="label_8">
- <property name="text">
- <string>Telephone</string>
- </property>
- </widget>
- </item>
- <item row="7" column="1">
- <widget class="QLineEdit" name="lineEdit_8"/>
- </item>
- <item row="7" column="2">
- <widget class="QLabel" name="label_26">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="8" column="0">
- <widget class="QLabel" name="label_9">
- <property name="text">
- <string>Fax</string>
- </property>
- </widget>
- </item>
- <item row="8" column="1">
- <widget class="QLineEdit" name="lineEdit_9"/>
- </item>
- <item row="8" column="2">
- <widget class="QLabel" name="label_24">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="9" column="0">
- <widget class="QLabel" name="label_10">
- <property name="text">
- <string>Website</string>
- </property>
- </widget>
- </item>
- <item row="9" column="1">
- <widget class="QLineEdit" name="lineEdit_10"/>
- </item>
- <item row="9" column="2">
- <widget class="QLabel" name="label_21">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="10" column="0">
- <widget class="QLabel" name="label_11">
- <property name="text">
- <string>Email</string>
- </property>
- </widget>
- </item>
- <item row="10" column="1">
- <widget class="QLineEdit" name="lineEdit_11"/>
- </item>
- <item row="10" column="2">
- <widget class="QLabel" name="label_20">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <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="tab_2">
- <attribute name="title">
- <string>Users</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QLabel" name="label_12">
- <property name="text">
- <string>The Following users can login to the application</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTableWidget" name="users_tableWidget">
- <property name="alternatingRowColors">
- <bool>true</bool>
- </property>
- <property name="selectionMode">
- <enum>QAbstractItemView::SingleSelection</enum>
- </property>
- <property name="selectionBehavior">
- <enum>QAbstractItemView::SelectRows</enum>
- </property>
- <column>
- <property name="text">
- <string>Id</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>Initials</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>Name</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>User Group</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>Active?</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>DeActivation Date</string>
- </property>
- </column>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="frame_2">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <layout class="QVBoxLayout" name="verticalLayout_11">
- <item>
- <widget class="QPushButton" name="modifyUser_pushButton">
- <property name="text">
- <string>Modify Selected User</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QGroupBox" name="user_groupBox">
- <property name="title">
- <string>New User Details</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_8">
- <item row="0" column="0">
- <widget class="QLabel" name="label_14">
- <property name="text">
- <string>Name</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLineEdit" name="userName_lineEdit"/>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_13">
- <property name="text">
- <string>Initials</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLineEdit" name="userInits_lineEdit"/>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_15">
- <property name="text">
- <string>User Group</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QComboBox" name="userGroup_comboBox">
- <item>
- <property name="text">
- <string>Standard User</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Dentist</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Hygienist</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Receptionist</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QCheckBox" name="userActive_checkBox">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>Active User</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="user_date_label">
- <property name="text">
- <string>DeActivation Date</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QDateEdit" name="user_dateEdit">
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="newUser_pushButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Add a New User</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_3">
- <attribute name="title">
- <string>Dentists</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_5">
- <item>
- <widget class="QLabel" name="label_33">
- <property name="text">
- <string>The Following dentists have notes in this database
-(note - dentists should not be removed from the database, as this could create lookup issues for cashbooks and notes) </string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTableWidget" name="tableWidget_2">
- <column>
- <property name="text">
- <string>Initials</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>Name</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>User Group</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>Active?</string>
- </property>
- </column>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="frame_3">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>200</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_7">
- <item>
- <widget class="QLabel" name="label_29">
- <property name="text">
- <string>Add a Dentist</string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QGridLayout" name="gridLayout_4">
- <item row="0" column="0">
- <widget class="QLabel" name="label_30">
- <property name="text">
- <string>Initials</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLineEdit" name="lineEdit_14"/>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_31">
- <property name="text">
- <string>Name</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLineEdit" name="lineEdit_15"/>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_45">
- <property name="text">
- <string>Registration</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLineEdit" name="lineEdit_21">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QCheckBox" name="checkBox_2">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>Active Appointment Book</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_4">
- <attribute name="title">
- <string>Hygienists</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_4">
- <item>
- <widget class="QLabel" name="label_38">
- <property name="text">
- <string>The Following hygienists have notes in this database
-(note - hygienists should not be removed from the database, as this could create lookup issues for cashbooks and notes) </string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTableWidget" name="tableWidget_3">
- <column>
- <property name="text">
- <string>Initials</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>Name</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>User Group</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>Active?</string>
- </property>
- </column>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="frame_4">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>200</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_8">
- <item>
- <widget class="QLabel" name="label_32">
- <property name="text">
- <string>Add a Dentist</string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QGridLayout" name="gridLayout_5">
- <item row="0" column="0">
- <widget class="QLabel" name="label_34">
- <property name="text">
- <string>Initials</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLineEdit" name="lineEdit_16"/>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_35">
- <property name="text">
- <string>Name</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLineEdit" name="lineEdit_17"/>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_46">
- <property name="text">
- <string>Registration</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLineEdit" name="lineEdit_22">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QCheckBox" name="checkBox_3">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>Active Appointment Book</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_5">
- <attribute name="title">
- <string>Practice Hours</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <widget class="QFrame" name="frame_6">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout_7">
- <item row="0" column="0">
- <widget class="QCheckBox" name="checkBox_7">
- <property name="text">
- <string>Monday</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QTimeEdit" name="timeEdit"/>
- </item>
- <item row="0" column="2">
- <widget class="QTimeEdit" name="timeEdit_2"/>
- </item>
- <item row="1" column="0">
- <widget class="QCheckBox" name="checkBox_8">
- <property name="text">
- <string>Tuesday</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QTimeEdit" name="timeEdit_3"/>
- </item>
- <item row="1" column="2">
- <widget class="QTimeEdit" name="timeEdit_4"/>
- </item>
- <item row="2" column="0">
- <widget class="QCheckBox" name="checkBox_9">
- <property name="text">
- <string>Wednesday</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QTimeEdit" name="timeEdit_5"/>
- </item>
- <item row="2" column="2">
- <widget class="QTimeEdit" name="timeEdit_6"/>
- </item>
- <item row="3" column="0">
- <widget class="QCheckBox" name="checkBox_10">
- <property name="text">
- <string>Thursday</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QTimeEdit" name="timeEdit_7"/>
- </item>
- <item row="3" column="2">
- <widget class="QTimeEdit" name="timeEdit_8"/>
- </item>
- <item row="4" column="0">
- <widget class="QCheckBox" name="checkBox_11">
- <property name="text">
- <string>Friday</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QTimeEdit" name="timeEdit_10"/>
- </item>
- <item row="4" column="2">
- <widget class="QTimeEdit" name="timeEdit_11"/>
- </item>
- <item row="5" column="0">
- <widget class="QCheckBox" name="checkBox_12">
- <property name="text">
- <string>Saturday</string>
- </property>
- </widget>
- </item>
- <item row="5" column="1">
- <widget class="QTimeEdit" name="timeEdit_12"/>
- </item>
- <item row="5" column="2">
- <widget class="QTimeEdit" name="timeEdit_9"/>
- </item>
- <item row="6" column="0">
- <widget class="QCheckBox" name="checkBox_13">
- <property name="text">
- <string>Sunday</string>
- </property>
- </widget>
- </item>
- <item row="6" column="1">
- <widget class="QTimeEdit" name="timeEdit_13"/>
- </item>
- <item row="6" column="2">
- <widget class="QTimeEdit" name="timeEdit_14"/>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_7">
- <attribute name="title">
- <string>View XML</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_10"/>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QMenuBar" name="menubar">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>800</width>
- <height>22</height>
- </rect>
- </property>
- <widget class="QMenu" name="menuFile">
- <property name="title">
- <string>File</string>
- </property>
- <addaction name="actionLoad_Template"/>
- <addaction name="action_Save_Template"/>
- </widget>
- <addaction name="menuFile"/>
- </widget>
- <widget class="QStatusBar" name="statusbar"/>
- <action name="actionLoad_Template">
- <property name="text">
- <string>L&oad Template</string>
- </property>
- </action>
- <action name="action_Save_Template">
- <property name="text">
- <string>&Save Template</string>
- </property>
- </action>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/main.ui b/src/openmolar/qt-designer/main.ui
deleted file mode 100644
index c2ec465..0000000
--- a/src/openmolar/qt-designer/main.ui
+++ /dev/null
@@ -1,5491 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>964</width>
- <height>631</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="font">
- <font/>
- </property>
- <property name="windowTitle">
- <string>Open Molar</string>
- </property>
- <property name="windowIcon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/openmolar.svg</normaloff>:/openmolar.svg</iconset>
- </property>
- <property name="styleSheet">
- <string notr="true"/>
- </property>
- <property name="dockNestingEnabled">
- <bool>false</bool>
- </property>
- <property name="unifiedTitleAndToolBarOnMac">
- <bool>false</bool>
- </property>
- <widget class="QWidget" name="centralwidget">
- <layout class="QVBoxLayout" name="verticalLayout_18">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QScrollArea" name="scrollArea_main">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_12">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>964</width>
- <height>592</height>
- </rect>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_7">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QTabWidget" name="main_tabWidget">
- <property name="tabPosition">
- <enum>QTabWidget::North</enum>
- </property>
- <property name="tabShape">
- <enum>QTabWidget::Rounded</enum>
- </property>
- <property name="currentIndex">
- <number>0</number>
- </property>
- <property name="documentMode">
- <bool>false</bool>
- </property>
- <widget class="QWidget" name="tab_patient">
- <attribute name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/kfm.png</normaloff>:/kfm.png</iconset>
- </attribute>
- <attribute name="title">
- <string>Patient Database</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_24">
- <property name="margin">
- <number>6</number>
- </property>
- <item>
- <widget class="QFrame" name="details_frame">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>180</width>
- <height>16</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>200</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Plain</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QFrame" name="frame_15">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <property name="spacing">
- <number>3</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QPushButton" name="home_pushButton">
- <property name="minimumSize">
- <size>
- <width>32</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>32</width>
- <height>28</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Exit the Current Patient Record.</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/kfm_home.png</normaloff>:/kfm_home.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>32</width>
- <height>24</height>
- </size>
- </property>
- <property name="shortcut">
- <string>Esc</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="newPatientPushButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>32</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>32</width>
- <height>28</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Add a New Patient to the database.</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/add_user.png</normaloff>:/add_user.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>32</width>
- <height>16</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="findButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>80</width>
- <height>28</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>28</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Click on this Button to search for in patient in your database.</string>
- </property>
- <property name="text">
- <string>Find</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/search.png</normaloff>:/search.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- <property name="shortcut">
- <string>Ctrl+F</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="frame_16">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <property name="spacing">
- <number>2</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QPushButton" name="backButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>24</width>
- <height>28</height>
- </size>
- </property>
- <property name="toolTip">
- <string>This cycles back through the history of records loaded today.</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/back.png</normaloff>:/back.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>32</width>
- <height>16</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="reloadButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>24</width>
- <height>28</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Reload the patient from the database.</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/agt_reload.png</normaloff>:/agt_reload.png</iconset>
- </property>
- <property name="shortcut">
- <string>Ctrl+R</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="nextButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>24</width>
- <height>28</height>
- </size>
- </property>
- <property name="toolTip">
- <string>This cycles forwards through the history of records loaded today.</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/forward.png</normaloff>:/forward.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>32</width>
- <height>16</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="relatedpts_pushButton">
- <property name="minimumSize">
- <size>
- <width>60</width>
- <height>28</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Show patients who live at the same address, or who have a similar name.</string>
- </property>
- <property name="text">
- <string>&Relatives</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/agt_family.png</normaloff>:/agt_family.png</iconset>
- </property>
- <property name="shortcut">
- <string>Ctrl+G</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="dayList_comboBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="toolTip">
- <string>A drop down box of all patients who have an appointment today.</string>
- </property>
- <property name="maxVisibleItems">
- <number>40</number>
- </property>
- <property name="sizeAdjustPolicy">
- <enum>QComboBox::AdjustToContentsOnFirstShow</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTextBrowser" name="detailsBrowser">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QSplitter" name="splitter_patient">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="childrenCollapsible">
- <bool>false</bool>
- </property>
- <widget class="QTabWidget" name="tabWidget">
- <property name="currentIndex">
- <number>4</number>
- </property>
- <widget class="QWidget" name="tab_patient_details">
- <attribute name="title">
- <string>Patient Details</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QScrollArea" name="scrollArea_4">
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_7">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>469</width>
- <height>644</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_6">
- <item>
- <widget class="QGroupBox" name="patientEdit_groupBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="title">
- <string>Details</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <property name="verticalSpacing">
- <number>3</number>
- </property>
- <property name="margin">
- <number>6</number>
- </property>
- <item row="3" column="0">
- <widget class="QLabel" name="label_18">
- <property name="text">
- <string>Date of Birth</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="label_9">
- <property name="text">
- <string>Address3</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>addr3Edit</cstring>
- </property>
- </widget>
- </item>
- <item row="2" column="7">
- <widget class="QPushButton" name="pushButton_6">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="maximumSize">
- <size>
- <width>60</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>send an sms</string>
- </property>
- <property name="text">
- <string>sms</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>8</width>
- <height>8</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="5" column="4">
- <widget class="QLabel" name="label_23">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>email2</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>email2Edit</cstring>
- </property>
- </widget>
- </item>
- <item row="3" column="1" colspan="3">
- <widget class="QDateEdit" name="dobEdit">
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="4">
- <widget class="QLabel" name="label_15">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Fax</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>faxEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="7" column="0">
- <widget class="QLabel" name="label_10">
- <property name="text">
- <string>Town</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>townEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="7" column="1" colspan="3">
- <widget class="QLineEdit" name="townEdit">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="7" column="4" rowspan="3">
- <widget class="QLabel" name="label_55">
- <property name="text">
- <string>Memo</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>memoEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="7" column="5" rowspan="3" colspan="3">
- <widget class="QTextEdit" name="memoEdit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>100</height>
- </size>
- </property>
- <property name="acceptRichText">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="8" column="0">
- <widget class="QLabel" name="label_19">
- <property name="text">
- <string>County</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>countyEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="4" column="4">
- <widget class="QLabel" name="label_16">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>email1</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>email1Edit</cstring>
- </property>
- </widget>
- </item>
- <item row="4" column="5" colspan="2">
- <widget class="QLineEdit" name="email1Edit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>150</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>100</height>
- </size>
- </property>
- <property name="maxLength">
- <number>50</number>
- </property>
- </widget>
- </item>
- <item row="4" column="7">
- <widget class="QPushButton" name="email1_button">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="maximumSize">
- <size>
- <width>60</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>send an email</string>
- </property>
- <property name="text">
- <string>email</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>8</width>
- <height>8</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="6" column="1" colspan="3">
- <widget class="QLineEdit" name="addr3Edit">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="6" column="4">
- <widget class="QLabel" name="label_25">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Occupation</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>occupationEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="6" column="5" colspan="3">
- <widget class="QLineEdit" name="occupationEdit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>100</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Title</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>titleEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Surname</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>snameEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="2" column="1" colspan="3">
- <widget class="QLineEdit" name="snameEdit">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="autoFillBackground">
- <bool>false</bool>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="2" column="4">
- <widget class="QLabel" name="label_14">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Tel (mob)</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>mobileEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="5" column="0">
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>Address2</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>addr2Edit</cstring>
- </property>
- </widget>
- </item>
- <item row="5" column="1" colspan="3">
- <widget class="QLineEdit" name="addr2Edit">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="5" column="5" colspan="2">
- <widget class="QLineEdit" name="email2Edit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>150</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>100</height>
- </size>
- </property>
- <property name="maxLength">
- <number>50</number>
- </property>
- </widget>
- </item>
- <item row="5" column="7">
- <widget class="QPushButton" name="email2_button">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="maximumSize">
- <size>
- <width>60</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>send an email</string>
- </property>
- <property name="text">
- <string>email</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>8</width>
- <height>8</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLineEdit" name="titleEdit">
- <property name="maximumSize">
- <size>
- <width>101</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QLabel" name="label_17">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Sex</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>sexEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="0" column="3">
- <widget class="QComboBox" name="sexEdit">
- <property name="minimumSize">
- <size>
- <width>50</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <item>
- <property name="text">
- <string>M</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>F</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="8" column="1" colspan="3">
- <widget class="QLineEdit" name="countyEdit">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="9" column="0">
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>Postcode</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>pcdeEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="0" column="4">
- <widget class="QLabel" name="label_12">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>25</height>
- </size>
- </property>
- <property name="text">
- <string>Tel (home)</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>tel1Edit</cstring>
- </property>
- </widget>
- </item>
- <item row="3" column="7">
- <widget class="QPushButton" name="pushButton">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="maximumSize">
- <size>
- <width>60</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>send a fax</string>
- </property>
- <property name="text">
- <string>fax</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>8</width>
- <height>8</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Address1</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>addr1Edit</cstring>
- </property>
- </widget>
- </item>
- <item row="4" column="1" colspan="3">
- <widget class="QLineEdit" name="addr1Edit">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="9" column="1" colspan="3">
- <widget class="QLineEdit" name="pcdeEdit">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>First Name</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>fnameEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="1" column="1" colspan="3">
- <widget class="QLineEdit" name="fnameEdit">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="autoFillBackground">
- <bool>false</bool>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="1" column="4">
- <widget class="QLabel" name="label_13">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Tel (work)</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>tel2Edit</cstring>
- </property>
- </widget>
- </item>
- <item row="0" column="5" colspan="2">
- <widget class="QLineEdit" name="tel1Edit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>100</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="3" column="5" colspan="2">
- <widget class="QLineEdit" name="faxEdit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>100</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="2" column="5" colspan="2">
- <widget class="QLineEdit" name="mobileEdit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>100</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- <item row="1" column="5" colspan="2">
- <widget class="QLineEdit" name="tel2Edit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>100</height>
- </size>
- </property>
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- </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="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Higlighted Fields are Mandatory for New Patients</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </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>
- <item>
- <widget class="QGroupBox" name="family_groupBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="title">
- <string>Family Groups</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_11">
- <property name="margin">
- <number>6</number>
- </property>
- <property name="spacing">
- <number>3</number>
- </property>
- <item row="1" column="1">
- <widget class="QPushButton" name="family_button">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="toolTip">
- <string>Raise a dialog to edit the patients family grouping</string>
- </property>
- <property name="text">
- <string>Edit family group</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="family_group_label">
- <property name="text">
- <string>Not a member of a known family</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2">
- <widget class="QPushButton" name="auto_address_button">
- <property name="toolTip">
- <string>Use the Sname and Address details from the previous patient.</string>
- </property>
- <property name="text">
- <string>Apply Address of previous record</string>
- </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>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_patient_contract">
- <attribute name="title">
- <string>Contract</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_13">
- <item row="0" column="0" colspan="2">
- <widget class="QLabel" name="label_21">
- <property name="text">
- <string>Pt is registered with Dentist</string>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QComboBox" name="dnt1comboBox">
- <property name="maximumSize">
- <size>
- <width>50</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="0" column="3">
- <widget class="QLabel" name="contractType_label">
- <property name="text">
- <string>Course Type</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="4">
- <widget class="QComboBox" name="cseType_comboBox">
- <property name="maximumSize">
- <size>
- <width>50</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="0" column="5">
- <spacer name="horizontalSpacer_5">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>368</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="0">
- <widget class="QFrame" name="frame_19">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_17">
- <item>
- <widget class="QLabel" name="label_40">
- <property name="text">
- <string>Status</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="status_comboBox"/>
- </item>
- <item>
- <spacer name="verticalSpacer_12">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>242</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QPushButton" name="badDebt_pushButton">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string>Write Off Bad Debt</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="1" column="1" colspan="5">
- <widget class="QTabWidget" name="contract_tabWidget">
- <property name="currentIndex">
- <number>2</number>
- </property>
- <widget class="QWidget" name="tab_18">
- <attribute name="title">
- <string>Private</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_26">
- <item row="0" column="0" rowspan="2">
- <widget class="QLabel" name="contractHDP_label_2">
- <property name="text">
- <string>This label is for displaying Private contractual stuff</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="label_38">
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../resources/resources.qrc">:/private.png</pixmap>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <spacer name="verticalSpacer_6">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>147</width>
- <height>281</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="1">
- <widget class="QPushButton" name="editPriv_pushButton">
- <property name="maximumSize">
- <size>
- <width>150</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Edit</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_19">
- <attribute name="title">
- <string>Highland Dental Plan</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_25">
- <item row="0" column="0" rowspan="2">
- <widget class="QLabel" name="contractHDP_label">
- <property name="text">
- <string>This label is for displaying HDP contractual stuff</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <spacer name="verticalSpacer_5">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>108</width>
- <height>162</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="1">
- <widget class="QPushButton" name="editHDP_pushButton">
- <property name="maximumSize">
- <size>
- <width>150</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Edit</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="label_20">
- <property name="maximumSize">
- <size>
- <width>150</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../resources/resources.qrc">:/hdp.png</pixmap>
- </property>
- </widget>
- </item>
- </layout>
- <zorder>contractHDP_label</zorder>
- <zorder>verticalSpacer_5</zorder>
- <zorder>editHDP_pushButton</zorder>
- <zorder>label_20</zorder>
- </widget>
- <widget class="QWidget" name="tab_20">
- <attribute name="title">
- <string>NHS</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_24">
- <item row="0" column="0">
- <widget class="QLabel" name="contractNHS_label">
- <property name="text">
- <string>This label is for displaying NHS contractual stuff</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="1" rowspan="2">
- <layout class="QVBoxLayout" name="verticalLayout_26">
- <item>
- <widget class="QLabel" name="label_8">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../resources/resources.qrc">:/nhs_scot.png</pixmap>
- </property>
- <property name="scaledContents">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="nhsclaims_pushButton">
- <property name="text">
- <string>View Claims History</string>
- </property>
- </widget>
- </item>
- <item>
- <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>
- <widget class="QPushButton" name="editNHS_pushButton">
- <property name="maximumSize">
- <size>
- <width>150</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Edit</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="1" column="0">
- <layout class="QGridLayout" name="gridLayout_23">
- <item row="0" column="0">
- <widget class="QLabel" name="label_46">
- <property name="text">
- <string>Exemption</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLineEdit" name="exemption_lineEdit">
- <property name="maxLength">
- <number>10</number>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_48">
- <property name="text">
- <string>Exemption Text</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLineEdit" name="exempttext_lineEdit">
- <property name="maxLength">
- <number>50</number>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_21">
- <attribute name="title">
- <string>Registered Elsewhere</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_27">
- <item row="0" column="0" rowspan="2">
- <widget class="QLabel" name="contractHDP_label_3">
- <property name="text">
- <string>No Details of Pt's Registered Dentist Found</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <spacer name="verticalSpacer_7">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>147</width>
- <height>281</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="1">
- <widget class="QPushButton" name="editRegDent_pushButton">
- <property name="maximumSize">
- <size>
- <width>150</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Edit</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_patient_correspondence">
- <attribute name="title">
- <string>Correspondence</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_11">
- <item>
- <widget class="QScrollArea" name="scrollArea_5">
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_8">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>423</width>
- <height>421</height>
- </rect>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0" colspan="2">
- <widget class="QGroupBox" name="groupBox_6">
- <property name="title">
- <string>Letters TO the patient</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <item>
- <widget class="QPushButton" name="standardLetterPushButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string> Custom Letter to the patient</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="printRecall_pushButton">
- <property name="toolTip">
- <string>Print a recall saying the patient is due now.</string>
- </property>
- <property name="text">
- <string>Recall for An Examination</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="receiptPrintButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>32</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Print a receipt - useful for duplicates.</string>
- </property>
- <property name="text">
- <string>Duplicate Receipt</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="account2_pushButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Print An Account Letter</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="QGroupBox" name="groupBox_7">
- <property name="title">
- <string>Referrals (Letters about the patient)</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_4">
- <item>
- <widget class="QComboBox" name="referralLettersComboBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>240</width>
- <height>0</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="referralLettersPrintButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Print</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="5" column="0" colspan="2">
- <widget class="QGroupBox" name="groupBox_8">
- <property name="title">
- <string>Patient "Notes"</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_7">
- <item>
- <widget class="QPushButton" name="notesPrintButton">
- <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 a summary of the patient's notes (for them to take on). Includes No fee details.</string>
- </property>
- <property name="text">
- <string>Print the patient's notes</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="0" column="2" rowspan="6">
- <widget class="QGroupBox" name="groupBox_3">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="title">
- <string>Previous Correspondence</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_21">
- <item>
- <widget class="QLabel" name="label_44">
- <property name="text">
- <string>Generated By OpenMolar</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTreeWidget" name="prevCorres_treeWidget">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="alternatingRowColors">
- <bool>true</bool>
- </property>
- <property name="animated">
- <bool>true</bool>
- </property>
- <column>
- <property name="text">
- <string>1</string>
- </property>
- </column>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_45">
- <property name="text">
- <string>Imported into database</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTreeWidget" name="importDoc_treeWidget">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <column>
- <property name="text">
- <string notr="true">1</string>
- </property>
- </column>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="importDoc_pushButton">
- <property name="text">
- <string>Import A Document</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="3" column="0" rowspan="2" colspan="2">
- <spacer name="verticalSpacer_11">
- <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="2" column="0" colspan="2">
- <widget class="QGroupBox" name="groupBox_9">
- <property name="title">
- <string>Medical History</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_19">
- <item>
- <widget class="QPushButton" name="medicalPrintButton">
- <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 a summary of the patient's notes (for them to take on). Includes No fee details.</string>
- </property>
- <property name="text">
- <string>Print a medical history form</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_patient_reception">
- <attribute name="title">
- <string>Reception</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_24">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QScrollArea" name="scrollArea_2">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_5">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>283</width>
- <height>470</height>
- </rect>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_26">
- <property name="spacing">
- <number>3</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <layout class="QVBoxLayout" name="verticalLayout_32">
- <property name="spacing">
- <number>3</number>
- </property>
- <item>
- <widget class="QSplitter" name="splitter_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <widget class="QGroupBox" name="reception_groupBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="title">
- <string>Reception</string>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_32">
- <property name="spacing">
- <number>3</number>
- </property>
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="1" column="1">
- <widget class="QGroupBox" name="NHSadmin_groupBox">
- <property name="title">
- <string>NHS</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_27">
- <property name="spacing">
- <number>3</number>
- </property>
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <widget class="QPushButton" name="printGP17_pushButton">
- <property name="text">
- <string>Print A GP17</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="rec_apply_exemption_pushButton">
- <property name="text">
- <string>Apply an Exemption</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QCheckBox" name="customEst_checkBox">
- <property name="text">
- <string>Custom Estimate on File</string>
- </property>
- </widget>
- </item>
- <item row="5" column="1">
- <widget class="QPushButton" name="printAccount_pushButton">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Print &Account</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
- </property>
- </widget>
- </item>
- <item row="6" column="1">
- <widget class="QPushButton" name="takePayment_pushButton">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Take &Payment</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/vcard.png</normaloff>:/vcard.png</iconset>
- </property>
- </widget>
- </item>
- <item row="0" column="0" rowspan="7">
- <widget class="QTextBrowser" name="reception_textBrowser">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QPushButton" name="printEst_pushButton">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Print &Estimate</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
- </property>
- </widget>
- </item>
- <item row="2" 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>
- </item>
- </layout>
- </widget>
- <widget class="QGroupBox" name="groupBox_recnotes">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>300</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="title">
- <string>Notes</string>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_30">
- <property name="spacing">
- <number>3</number>
- </property>
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <widget class="QWebView" name="recNotes_webView">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="url">
- <url>
- <string>about:blank</string>
- </url>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QGroupBox" name="pt_diary_groupBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>200</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>200</height>
- </size>
- </property>
- <property name="title">
- <string>Patient's Diary</string>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_34">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- </layout>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_patient_summary">
- <attribute name="title">
- <string>Clinical Summary</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_12">
- <property name="spacing">
- <number>3</number>
- </property>
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <widget class="QScrollArea" name="scrollArea_6">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_9">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>739</width>
- <height>456</height>
- </rect>
- </property>
- <layout class="QGridLayout" name="gridLayout_4">
- <property name="margin">
- <number>0</number>
- </property>
- <property name="spacing">
- <number>6</number>
- </property>
- <item row="0" column="0" colspan="2">
- <widget class="QFrame" name="staticSummaryPanel">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>180</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>180</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- </font>
- </property>
- <property name="autoFillBackground">
- <bool>false</bool>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="QLineEdit" name="synopsis_lineEdit">
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- <weight>75</weight>
- <italic>true</italic>
- <bold>true</bold>
- </font>
- </property>
- <property name="whatsThis">
- <string/>
- </property>
- <property name="styleSheet">
- <string notr="true">color:red</string>
- </property>
- <property name="maxLength">
- <number>140</number>
- </property>
- </widget>
- </item>
- <item row="2" column="0" rowspan="2">
- <widget class="QWebView" name="notesSummary_webView">
- <property name="url">
- <url>
- <string>about:blank</string>
- </url>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QGroupBox" name="bpe_groupBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>145</width>
- <height>135</height>
- </size>
- </property>
- <property name="title">
- <string>BPE</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_8">
- <property name="leftMargin">
- <number>3</number>
- </property>
- <property name="topMargin">
- <number>3</number>
- </property>
- <property name="rightMargin">
- <number>9</number>
- </property>
- <property name="bottomMargin">
- <number>3</number>
- </property>
- <item>
- <widget class="QTextBrowser" name="bpe_textBrowser">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>65</height>
- </size>
- </property>
- <property name="verticalScrollBarPolicy">
- <enum>Qt::ScrollBarAlwaysOff</enum>
- </property>
- <property name="horizontalScrollBarPolicy">
- <enum>Qt::ScrollBarAlwaysOff</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="newBPE_pushButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="toolTip">
- <string>Update the Basic Perio Exam (CPITN) score</string>
- </property>
- <property name="text">
- <string>New</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QTextBrowser" name="planSummary_textBrowser">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>150</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="2">
- <layout class="QHBoxLayout" name="horizontalLayout_13">
- <item>
- <widget class="QPushButton" name="exampushButton">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>28</height>
- </size>
- </property>
- <property name="toolTip">
- <string>perform a clinical exam</string>
- </property>
- <property name="text">
- <string>Exam</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="xray_pushButton">
- <property name="toolTip">
- <string>add x-rays to the patient's current course.</string>
- </property>
- <property name="text">
- <string>X-ray</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="hygWizard_pushButton">
- <property name="toolTip">
- <string>perform common perio treatments</string>
- </property>
- <property name="text">
- <string>Hyg</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="Line" name="line_4">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="closeCourse_pushButton">
- <property name="text">
- <string>Close This Course</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_3">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>28</width>
- <height>17</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QPushButton" name="childsmile_button">
- <property name="text">
- <string>ChildSmile</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QPushButton" name="medNotes_pushButton">
- <property name="minimumSize">
- <size>
- <width>200</width>
- <height>0</height>
- </size>
- </property>
- <property name="toolTip">
- <string>check / update the patients medical history</string>
- </property>
- <property name="text">
- <string>Med Notes</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_patient_notes">
- <attribute name="title">
- <string>Notes</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_6">
- <item row="0" column="0" colspan="3">
- <widget class="QWebView" name="notes_webView">
- <property name="url">
- <url>
- <string>about:blank</string>
- </url>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <layout class="QHBoxLayout" name="horizontalLayout_35">
- <item>
- <widget class="QLabel" name="label_35">
- <property name="text">
- <string>Include</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QCheckBox" name="notes_includePrinting_checkBox">
- <property name="text">
- <string>Printing Notes</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QCheckBox" name="notes_includePayments_checkBox">
- <property name="text">
- <string>Payments</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QCheckBox" name="notes_includeTimestamps_checkBox">
- <property name="text">
- <string>Timestamps</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QCheckBox" name="notes_includeMetadata_checkBox">
- <property name="text">
- <string>Metadata</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="3" column="1">
- <spacer name="horizontalSpacer_9">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="3" column="2">
- <widget class="QCheckBox" name="summary_notes_checkBox">
- <property name="toolTip">
- <string><html><head/><body><p>Use these settings for the clinical summary notes also.</p></body></html></string>
- </property>
- <property name="text">
- <string>clinical summary</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_patient_charts">
- <attribute name="title">
- <string>Charts / Planning</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_8">
- <item row="0" column="0">
- <widget class="QStackedWidget" name="stackedWidget">
- <property name="currentIndex">
- <number>1</number>
- </property>
- <widget class="QWidget" name="table">
- <layout class="QHBoxLayout" name="horizontalLayout_4">
- <item>
- <widget class="QTableWidget" name="chartsTableWidget">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>500</height>
- </size>
- </property>
- <property name="alternatingRowColors">
- <bool>true</bool>
- </property>
- <property name="selectionBehavior">
- <enum>QAbstractItemView::SelectItems</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="charts">
- <layout class="QGridLayout" name="gridLayout_14">
- <property name="margin">
- <number>3</number>
- </property>
- <item row="3" column="1">
- <widget class="QListView" name="completed_listView">
- <property name="maximumSize">
- <size>
- <width>120</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QListView" name="plan_listView">
- <property name="maximumSize">
- <size>
- <width>120</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QGroupBox" name="static_groupBox">
- <property name="font">
- <font>
- <kerning>true</kerning>
- </font>
- </property>
- <property name="focusPolicy">
- <enum>Qt::ClickFocus</enum>
- </property>
- <property name="title">
- <string>Static</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QGroupBox" name="plan_groupBox">
- <property name="autoFillBackground">
- <bool>false</bool>
- </property>
- <property name="title">
- <string>Plan</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QFrame" name="static_frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>120</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>120</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QGroupBox" name="completed_groupBox">
- <property name="title">
- <string>Completed</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item row="0" column="1" rowspan="2">
- <widget class="QFrame" name="toothProps_frame">
- <property name="minimumSize">
- <size>
- <width>160</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>200</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QGroupBox" name="groupBox_4">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>50</height>
- </size>
- </property>
- <property name="title">
- <string>Treatment Planning</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QStackedWidget" name="plan_buttons_stacked_widget">
- <property name="currentIndex">
- <number>0</number>
- </property>
- <widget class="QWidget" name="plan_buttons_page1">
- <layout class="QHBoxLayout" name="horizontalLayout_9">
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QPushButton" name="xrayTxpushButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>X-Rays</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="perioTxpushButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Perio</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="dentureTxpushButton">
- <property name="text">
- <string>Dentures</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="otherTxpushButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Other</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="customTx_pushButton">
- <property name="text">
- <string>Custom</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="advanced_tx_planning_button">
- <property name="text">
- <string>Advanced Tx Planning</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="plan_buttons_page2">
- <layout class="QHBoxLayout" name="horizontalLayout_10">
- <property name="spacing">
- <number>12</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QPushButton" name="plan_course_manage_button">
- <property name="text">
- <string>Patient is not currently under treatment - click here to begin</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_patient_estimate">
- <attribute name="title">
- <string>Estimate</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_5">
- <item>
- <widget class="QScrollArea" name="estimate_scrollArea">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>202</height>
- </size>
- </property>
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_11">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>98</width>
- <height>200</height>
- </rect>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_19"/>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QScrollArea" name="scrollArea">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>200</width>
- <height>0</height>
- </size>
- </property>
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_4">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>139</width>
- <height>212</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_9">
- <item>
- <widget class="QLabel" name="estimate_label">
- <property name="text">
- <string>Estimate</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="estLetter_pushButton">
- <property name="text">
- <string>Custom Estimate Letter</string>
- </property>
- <property name="checkable">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="recalcEst_pushButton">
- <property name="toolTip">
- <string>Use this feature to re-price all items in the "tooth" category of treatments. i.e all those which appear on the charts.
-
-Note - this will not remove items which are currently there. </string>
- </property>
- <property name="text">
- <string>ReCalculate Estimate</string>
- </property>
- <property name="checkable">
- <bool>false</bool>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="apply_exemption_pushButton">
- <property name="text">
- <string>Apply Exemption</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_10">
- <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_22">
- <property name="layoutDirection">
- <enum>Qt::LeftToRight</enum>
- </property>
- <property name="text">
- <string>Course Dentist</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="dnt2comboBox">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="closeTx_pushButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Close Course</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_patient_perio">
- <attribute name="title">
- <string>Perio Charts</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_8">
- <item>
- <widget class="QScrollArea" name="perioCharts_scrollArea">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_6">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>252</width>
- <height>374</height>
- </rect>
- </property>
- <layout class="QGridLayout" name="gridLayout_15">
- <item row="0" column="0" colspan="3">
- <widget class="QFrame" name="perioChart_frame">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>140</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>140</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="3">
- <widget class="QScrollArea" name="perioChartData_scrollArea">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_10">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>918</width>
- <height>1218</height>
- </rect>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_15">
- <item>
- <widget class="QFrame" name="perioChartData_frame">
- <property name="minimumSize">
- <size>
- <width>900</width>
- <height>1200</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QGroupBox" name="groupBox_11">
- <property name="title">
- <string>Choose Data</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_16">
- <item>
- <widget class="QLabel" name="label_41">
- <property name="font">
- <font>
- <pointsize>12</pointsize>
- </font>
- </property>
- <property name="text">
- <string>Chart Date</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="perioChartDateComboBox"/>
- </item>
- <item>
- <widget class="QPushButton" name="newPerioChartPushButton">
- <property name="text">
- <string>New</string>
- </property>
- <property name="autoDefault">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QFrame" name="perioToothProps_frame">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QGroupBox" name="groupBox_12">
- <property name="maximumSize">
- <size>
- <width>120</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="title">
- <string>BPE</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_15">
- <item>
- <widget class="QTextBrowser" name="bpe_textBrowser_2">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>65</height>
- </size>
- </property>
- <property name="verticalScrollBarPolicy">
- <enum>Qt::ScrollBarAlwaysOff</enum>
- </property>
- <property name="horizontalScrollBarPolicy">
- <enum>Qt::ScrollBarAlwaysOff</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="bpeDateComboBox">
- <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="sizeAdjustPolicy">
- <enum>QComboBox::AdjustToContentsOnFirstShow</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_patient_history">
- <attribute name="title">
- <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>
- <item>
- <widget class="QFrame" name="frame_3">
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <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">
- <string>See all payments in the database made by this patient</string>
- </property>
- <property name="text">
- <string>Past Payments</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pastTreatment_pushButton">
- <property name="toolTip">
- <string>View treatments completed, by date order</string>
- </property>
- <property name="text">
- <string>Past Treatment</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="past_course_estimates_pushButton">
- <property name="toolTip">
- <string>display a combination of courses and estimates.</string>
- </property>
- <property name="text">
- <string>Courses / Estimates</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pastCourses_pushButton">
- <property name="toolTip">
- <string>View all Courses of treatment. This includes treatment that was planned but not completed.</string>
- </property>
- <property name="text">
- <string>Courses</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pastEstimates_pushButton">
- <property name="toolTip">
- <string>Estimate history for this patient.</string>
- </property>
- <property name="text">
- <string>Estimates</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="current_est_versioning_pushButton">
- <property name="text">
- <string>Current Estimate</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="NHSClaims_pushButton">
- <property name="text">
- <string>NHS Claims</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="memo_history_pushButton">
- <property name="text">
- <string>Memos</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="historyPrint_pushButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="toolTip">
- <string>Print the text displayed on this page.</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>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_14">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>123</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="Line" name="line_3">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="debug_toolButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="toolTip">
- <string>Advanced options for developer use. Don't expect this to make much sense!
-
-If the "changes only" checkbox is checked, only data which has been changed will be displayed.</string>
- </property>
- <property name="text">
- <string>debug tools</string>
- </property>
- <property name="checkable">
- <bool>false</bool>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- <property name="popupMode">
- <enum>QToolButton::InstantPopup</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QCheckBox" name="ptAtts_checkBox">
- <property name="text">
- <string>changes only</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- <widget class="QFrame" name="new_notes_frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>80</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout_7">
- <property name="margin">
- <number>0</number>
- </property>
- <property name="spacing">
- <number>3</number>
- </property>
- <item row="0" column="1" rowspan="3">
- <widget class="Line" name="line">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- </widget>
- </item>
- <item row="0" column="2" rowspan="3">
- <widget class="QScrollArea" name="scrollArea_8">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>120</width>
- <height>1200</height>
- </size>
- </property>
- <property name="horizontalScrollBarPolicy">
- <enum>Qt::ScrollBarAlwaysOff</enum>
- </property>
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_13">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>118</width>
- <height>118</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_20">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QLabel" name="hiddenNotes_label">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>70</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item row="0" column="4">
- <widget class="QLabel" name="label_39">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Today's Notes</string>
- </property>
- </widget>
- </item>
- <item row="0" column="5" rowspan="3">
- <widget class="Line" name="line_2">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="4">
- <widget class="QPushButton" name="phraseBook_pushButton">
- <property name="text">
- <string>PhraseBook</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/txt.png</normaloff>:/txt.png</iconset>
- </property>
- <property name="shortcut">
- <string>Ins</string>
- </property>
- </widget>
- </item>
- <item row="0" column="6" rowspan="3">
- <widget class="QPushButton" name="saveButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" 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>Save the changes made to this record.</string>
- </property>
- <property name="text">
- <string>Save Changes</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/save_all.png</normaloff>:/save_all.png</iconset>
- </property>
- <property name="shortcut">
- <string>Ctrl+S</string>
- </property>
- </widget>
- </item>
- <item row="0" column="3" rowspan="3">
- <widget class="QTextEdit" name="notesEnter_textEdit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" 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>Enter Notes.</string>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- </widget>
- </item>
- <item row="0" column="0" rowspan="3">
- <widget class="QPushButton" name="memos_pushButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Memos</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/icons/memos.png</normaloff>:/icons/memos.png</iconset>
- </property>
- </widget>
- </item>
- <item row="1" column="4">
- <widget class="QPushButton" name="clinician_phrasebook_pushButton">
- <property name="text">
- <string>Phrases</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/txt.png</normaloff>:/txt.png</iconset>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_appointments">
- <attribute name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/vcalendar.png</normaloff>:/vcalendar.png</iconset>
- </attribute>
- <attribute name="title">
- <string>Appointments / Diary</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_21">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_cashbook">
- <attribute name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/vcard.png</normaloff>:/vcard.png</iconset>
- </attribute>
- <attribute name="title">
- <string>Cashbook</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_5">
- <item row="0" column="0">
- <widget class="QLabel" name="label_34">
- <property name="text">
- <string>Start Date</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="label_33">
- <property name="text">
- <string>End Date</string>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QLabel" name="label_32">
- <property name="text">
- <string>Registered Dentist</string>
- </property>
- </widget>
- </item>
- <item row="0" column="3" rowspan="2">
- <widget class="QPushButton" name="cashbookGoPushButton">
- <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="4" rowspan="2">
- <widget class="QPushButton" name="cashbookPrintButton">
- <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>24</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QDateEdit" name="cashbookStartDateEdit">
- <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="cashbookEndDateEdit">
- <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="2">
- <widget class="QComboBox" name="cashbookDentComboBox"/>
- </item>
- <item row="1" column="5">
- <spacer>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>389</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="6">
- <widget class="QRadioButton" name="all_payments_radioButton">
- <property name="text">
- <string>All payments</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="7">
- <widget class="QRadioButton" name="sundries_only_radioButton">
- <property name="text">
- <string>Sundries_only</string>
- </property>
- </widget>
- </item>
- <item row="1" column="8">
- <widget class="QRadioButton" name="treatment_only_radioButton">
- <property name="text">
- <string>Treatment_only</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="9">
- <widget class="QWidget" name="cashbook_placeholder_widget" native="true">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_daybook">
- <attribute name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/txt.png</normaloff>:/txt.png</iconset>
- </attribute>
- <attribute name="title">
- <string>Daybook</string>
- </attribute>
- <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>
- <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>
- <widget class="QTextBrowser" name="daybookTextBrowser"/>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_accounts">
- <attribute name="title">
- <string>Accounts</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_9">
- <item row="0" column="0">
- <layout class="QHBoxLayout" name="horizontalLayout_28">
- <item>
- <widget class="QLabel" name="label_54">
- <property name="text">
- <string>Find Patient Records where the patient is in</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="accounts_debt_comboBox">
- <property name="minimumSize">
- <size>
- <width>100</width>
- <height>0</height>
- </size>
- </property>
- <item>
- <property name="text">
- <string>Debt</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Credit</string>
- </property>
- </item>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_24">
- <property name="text">
- <string>By More than</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QDoubleSpinBox" name="accounts_min_doubleSpinBox">
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="prefix">
- <string/>
- </property>
- <property name="maximum">
- <double>1000.000000000000000</double>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="loadAccountsTable_pushButton">
- <property name="text">
- <string>Load Table</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="0" column="1">
- <spacer name="horizontalSpacer_12">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>206</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="0" column="2" colspan="2">
- <widget class="QPushButton" name="printAccountsTable_pushButton">
- <property name="text">
- <string>Print Table</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
- </property>
- </widget>
- </item>
- <item row="0" column="4">
- <widget class="QPushButton" name="printSelectedAccounts_pushButton">
- <property name="text">
- <string>Print Selected Letters</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="5">
- <widget class="QTableWidget" name="accounts_tableWidget">
- <property name="font">
- <font>
- <pointsize>9</pointsize>
- </font>
- </property>
- <property name="alternatingRowColors">
- <bool>true</bool>
- </property>
- <property name="selectionBehavior">
- <enum>QAbstractItemView::SelectRows</enum>
- </property>
- <property name="sortingEnabled">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2">
- <spacer name="horizontalSpacer_4">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>746</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="2">
- <widget class="QLabel" name="label_43">
- <property name="text">
- <string>TOTAL OUTSTANDING</string>
- </property>
- </widget>
- </item>
- <item row="2" column="3" colspan="2">
- <widget class="QDoubleSpinBox" name="accountsTotal_doubleSpinBox">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="minimumSize">
- <size>
- <width>150</width>
- <height>0</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>12</pointsize>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="readOnly">
- <bool>true</bool>
- </property>
- <property name="prefix">
- <string/>
- </property>
- <property name="maximum">
- <double>1000000.000000000000000</double>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_bulk_mail">
- <attribute name="title">
- <string>Bulk Mailings</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_10">
- <item row="1" column="0">
- <layout class="QHBoxLayout" name="horizontalLayout_18">
- <item>
- <widget class="QPushButton" name="recallLoad_pushButton">
- <property name="text">
- <string>Load Table</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="1" column="5">
- <widget class="QPushButton" name="bulkMailPrint_pushButton">
- <property name="text">
- <string>Print Letters</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="6">
- <widget class="QTreeView" name="bulk_mailings_treeView"/>
- </item>
- <item row="1" column="2">
- <widget class="QPushButton" name="bulk_mail_expand_pushButton">
- <property name="text">
- <string>Expand All</string>
- </property>
- </widget>
- </item>
- <item row="1" column="4">
- <widget class="QPushButton" name="bulkMail_options_pushButton">
- <property name="text">
- <string>Letter Options</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_feescales">
- <attribute name="title">
- <string>Feescales</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_16">
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <layout class="QVBoxLayout" name="verticalLayout_29">
- <item>
- <widget class="QLabel" name="feeScale_label">
- <property name="text">
- <string>TextLabel</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTreeView" name="feeScales_treeView">
- <property name="alternatingRowColors">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QFrame" name="frame_5">
- <property name="minimumSize">
- <size>
- <width>180</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>200</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_10">
- <property name="spacing">
- <number>3</number>
- </property>
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <widget class="QLabel" name="feescales_available_label">
- <property name="text">
- <string>Fee Scales Available</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="chooseFeescale_comboBox">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="toolTip">
- <string>Use this control to select a feescale</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_9">
- <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="QFrame" name="frame_6">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout_16">
- <item row="0" column="0">
- <widget class="QLabel" name="label_26">
- <property name="text">
- <string>Search For an Item</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2">
- <widget class="QRadioButton" name="search_descriptions_radioButton">
- <property name="toolTip">
- <string>search for the given phrase in description columns</string>
- </property>
- <property name="text">
- <string>Search Descriptions</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QPushButton" name="feeSearch_pushButton">
- <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="maximumSize">
- <size>
- <width>70</width>
- <height>28</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Click on this Button to search for in patient in your database.</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/search.png</normaloff>:/search.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- <property name="shortcut">
- <string>Ctrl+F</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="QLineEdit" name="feeSearch_lineEdit"/>
- </item>
- <item row="3" column="0" colspan="2">
- <widget class="QRadioButton" name="search_itemcodes_radioButton">
- <property name="toolTip">
- <string>only search for the given phrase in the usercode column</string>
- </property>
- <property name="text">
- <string>Search Itemcodes</string>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="2">
- <widget class="QLabel" name="feesearch_results_label">
- <property name="text">
- <string>TextLabel</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- </layout>
- </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>
- <item>
- <widget class="QCheckBox" name="hide_rare_feescale_codes_checkBox">
- <property name="text">
- <string>Hide Rarely Used Codes</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="feeExpand_radioButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="toolTip">
- <string>Quickly expand all items</string>
- </property>
- <property name="text">
- <string>Expand All Sections</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="feeCompress_radioButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="toolTip">
- <string>Quickly compress all items</string>
- </property>
- <property name="text">
- <string>Compress All Sections</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <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>
- <item>
- <widget class="QGroupBox" name="groupBox">
- <property name="title">
- <string>Resources</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_13">
- <property name="spacing">
- <number>3</number>
- </property>
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <widget class="QPushButton" name="documents_pushButton">
- <property name="toolTip">
- <string>Open A PDF of the latest NHS Regulations</string>
- </property>
- <property name="text">
- <string>Documents</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/txt.png</normaloff>:/txt.png</iconset>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <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>
- <item>
- <widget class="QGroupBox" name="feeadjuster_groupBox">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="toolTip">
- <string/>
- </property>
- <property name="title">
- <string>Advanced Options</string>
- </property>
- <property name="checkable">
- <bool>false</bool>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_35">
- <property name="leftMargin">
- <number>2</number>
- </property>
- <property name="topMargin">
- <number>6</number>
- </property>
- <property name="rightMargin">
- <number>2</number>
- </property>
- <property name="bottomMargin">
- <number>6</number>
- </property>
- <item>
- <widget class="QPushButton" name="feetable_xml_pushButton">
- <property name="text">
- <string>FeeScale Editor</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="feescale_tester_pushButton">
- <property name="text">
- <string>FeeScale Tester</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="reload_feescales_pushButton">
- <property name="text">
- <string>Reload Fee Scales</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_forum">
- <attribute name="title">
- <string>FORUM</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_20">
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <widget class="QSplitter" name="splitter_3">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <widget class="QSplitter" name="splitter">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <widget class="QTreeWidget" name="forum_treeWidget">
- <property name="alternatingRowColors">
- <bool>true</bool>
- </property>
- <property name="selectionMode">
- <enum>QAbstractItemView::ExtendedSelection</enum>
- </property>
- <property name="sortingEnabled">
- <bool>true</bool>
- </property>
- <property name="animated">
- <bool>true</bool>
- </property>
- <attribute name="headerShowSortIndicator" stdset="0">
- <bool>true</bool>
- </attribute>
- <column>
- <property name="text">
- <string notr="true">1</string>
- </property>
- </column>
- </widget>
- </widget>
- <widget class="QFrame" name="frame_20">
- <property name="maximumSize">
- <size>
- <width>301</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_11">
- <item>
- <widget class="QLabel" name="forum_label">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>50</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTextBrowser" name="forum_textBrowser">
- <property name="font">
- <font>
- <pointsize>12</pointsize>
- </font>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_6">
- <item>
- <widget class="QPushButton" name="forumReply_pushButton">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string>Reply</string>
- </property>
- <property name="shortcut">
- <string>Alt+R</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="forumDelete_pushButton">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string>Delete</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/eraser.png</normaloff>:/eraser.png</iconset>
- </property>
- <property name="shortcut">
- <string>Del, Backspace</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="forumParent_pushButton">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string>&set parent</string>
- </property>
- <property name="shortcut">
- <string>Alt+S</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QPushButton" name="forumNewTopic_pushButton">
- <property name="text">
- <string>New Topic</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/icons/mail_new.png</normaloff>:/icons/mail_new.png</iconset>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="frame_9">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout_30">
- <item row="0" column="0" colspan="2">
- <widget class="QLabel" name="label_36">
- <property name="text">
- <string>Search by keyword</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="QLineEdit" name="feeSearch_lineEdit_2"/>
- </item>
- <item row="2" column="0">
- <spacer name="horizontalSpacer_11">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>67</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="1">
- <widget class="QPushButton" name="feeSearch_pushButton_2">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>80</width>
- <height>28</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>70</width>
- <height>28</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Click on this Button to search for in patient in your database.</string>
- </property>
- <property name="text">
- <string>Find</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/search.png</normaloff>:/search.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- <property name="shortcut">
- <string>Ctrl+F</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="frame_10">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_25">
- <item>
- <widget class="QLabel" name="label_37">
- <property name="text">
- <string>Show Topics for</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="forumViewFilter_comboBox">
- <item>
- <property name="text">
- <string>Everyone</string>
- </property>
- </item>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QGroupBox" name="groupBox_10">
- <property name="title">
- <string>Options</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_32">
- <item row="0" column="0" colspan="2">
- <widget class="QCheckBox" name="forum_deletedposts_checkBox">
- <property name="text">
- <string>Include Deleted Posts</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QRadioButton" name="split_replies_radioButton">
- <property name="text">
- <string>Split Replies</string>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QRadioButton" name="group_replies_radioButton">
- <property name="text">
- <string>Group replies</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QPushButton" name="forumCollapse_pushButton">
- <property name="text">
- <string>&Collapse Replies</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QPushButton" name="forumExpand_pushButton">
- <property name="text">
- <string>&Expand Replies</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_wiki">
- <attribute name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/icons/wikipedia.png</normaloff>:/icons/wikipedia.png</iconset>
- </attribute>
- <attribute name="title">
- <string>Wiki</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout_33">
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <widget class="QWebView" name="wiki_webView">
- <property name="url">
- <url>
- <string>about:blank</string>
- </url>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QMenuBar" name="menubar">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>964</width>
- <height>17</height>
- </rect>
- </property>
- <widget class="QMenu" name="menuMenu">
- <property name="title">
- <string>&File</string>
- </property>
- <addaction name="action_Open_Patient"/>
- <addaction name="separator"/>
- <addaction name="action_save_patient"/>
- <addaction name="actionPrint_Daylists"/>
- <addaction name="separator"/>
- <addaction name="action_Quit"/>
- </widget>
- <widget class="QMenu" name="menu_Help">
- <property name="title">
- <string>&Help</string>
- </property>
- <addaction name="action_About"/>
- <addaction name="action_About_QT"/>
- </widget>
- <widget class="QMenu" name="menu_Prefences">
- <property name="title">
- <string>&Preferences</string>
- </property>
- <widget class="QMenu" name="menuView">
- <property name="title">
- <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>
- </property>
- <addaction name="actionSet_Font_Size"/>
- </widget>
- <widget class="QMenu" name="menuPrinting">
- <property name="title">
- <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>
- </property>
- <addaction name="action_forum_show_advanced_options"/>
- </widget>
- <widget class="QMenu" name="menuCharts">
- <property name="title">
- <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>
- </property>
- <addaction name="actionSurgery_Mode"/>
- </widget>
- <widget class="QMenu" name="menuCashbook">
- <property name="title">
- <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"/>
- <addaction name="menuCharts"/>
- <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>
- </property>
- <addaction name="actionClear_Today_s_Emergency_Slots"/>
- <addaction name="actionAppointment_Tools"/>
- <addaction name="actionAdvanced_Record_Management"/>
- <addaction name="actionFix_Locked_New_Course_of_Treatment"/>
- <addaction name="separator"/>
- <addaction name="actionSet_Clinician"/>
- <addaction name="actionSet_Assistant"/>
- <addaction name="actionSet_Surgery_Number"/>
- <addaction name="separator"/>
- <addaction name="actionDocuments_Dialog"/>
- <addaction name="separator"/>
- <addaction name="actionEdit_Phrasebooks"/>
- </widget>
- <addaction name="menuMenu"/>
- <addaction name="menu_Prefences"/>
- <addaction name="menuTools"/>
- <addaction name="menu_Help"/>
- </widget>
- <widget class="QStatusBar" name="statusbar"/>
- <action name="action_save_patient">
- <property name="text">
- <string>&Export Patient to disk</string>
- </property>
- </action>
- <action name="action_Open_Patient">
- <property name="text">
- <string>&Import Patient from disk</string>
- </property>
- </action>
- <action name="action_About">
- <property name="text">
- <string>About &OpenMolar</string>
- </property>
- </action>
- <action name="action_About_QT">
- <property name="text">
- <string>&About QT</string>
- </property>
- </action>
- <action name="action_Quit">
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/exit.png</normaloff>:/exit.png</iconset>
- </property>
- <property name="text">
- <string>&Quit</string>
- </property>
- </action>
- <action name="actionClear_Today_s_Emergency_Slots">
- <property name="text">
- <string>Clear Today's Emergency Slots</string>
- </property>
- </action>
- <action name="actionAppointment_Tools">
- <property name="text">
- <string>Appointment Tools</string>
- </property>
- </action>
- <action name="actionChange_Language">
- <property name="text">
- <string>Select Interface Language</string>
- </property>
- </action>
- <action name="actionFull_Screen_Mode_Ctrl_Alt_F">
- <property name="checkable">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Full Screen Mode (Ctrl-Alt-F)</string>
- </property>
- <property name="shortcut">
- <string>Ctrl+Alt+F</string>
- </property>
- </action>
- <action name="actionSet_Font_Size">
- <property name="text">
- <string>Font Size</string>
- </property>
- </action>
- <action name="action_forum_show_advanced_options">
- <property name="checkable">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Show Advanced Options</string>
- </property>
- </action>
- <action name="actionTable_View_For_Charting">
- <property name="checkable">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Table View For Charting</string>
- </property>
- </action>
- <action name="actionNHS_Form_Settings">
- <property name="text">
- <string>NHS Form Settings</string>
- </property>
- </action>
- <action name="actionTest_Print_a_GP17">
- <property name="text">
- <string>Test Print a GP17</string>
- </property>
- </action>
- <action name="actionPrint_Daylists">
- <property name="text">
- <string>Print Daylists</string>
- </property>
- </action>
- <action name="actionSet_Clinician">
- <property name="text">
- <string>Set Clinician</string>
- </property>
- </action>
- <action name="actionSet_Assistant">
- <property name="text">
- <string>Set Assistant</string>
- </property>
- </action>
- <action name="actionSurgery_Mode">
- <property name="checkable">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Surgery Mode</string>
- </property>
- </action>
- <action name="actionAdvanced_Record_Management">
- <property name="text">
- <string>Advanced Record Management</string>
- </property>
- </action>
- <action name="actionFix_Locked_New_Course_of_Treatment">
- <property name="text">
- <string>Fix Locked New Course of Treatment</string>
- </property>
- </action>
- <action name="actionAllow_Full_Edit">
- <property name="checkable">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Allow Full Edit</string>
- </property>
- </action>
- <action name="actionSet_Surgery_Number">
- <property name="text">
- <string>Set Surgery Number</string>
- </property>
- <property name="toolTip">
- <string>Set Surgery Number (used so other applications can see which record is loaded)</string>
- </property>
- </action>
- <action name="actionEdit_Phrasebooks">
- <property name="text">
- <string>Edit Phrasebooks</string>
- </property>
- </action>
- <action name="actionDocuments_Dialog">
- <property name="text">
- <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>
- <class>QWebView</class>
- <extends>QWidget</extends>
- <header>QtWebKit/QWebView</header>
- </customwidget>
- </customwidgets>
- <tabstops>
- <tabstop>debugBrowser</tabstop>
- <tabstop>dayList_comboBox</tabstop>
- <tabstop>detailsBrowser</tabstop>
- <tabstop>cashbookGoPushButton</tabstop>
- <tabstop>cashbookPrintButton</tabstop>
- <tabstop>cashbookStartDateEdit</tabstop>
- <tabstop>cashbookEndDateEdit</tabstop>
- <tabstop>cashbookDentComboBox</tabstop>
- <tabstop>daybookPrintButton</tabstop>
- <tabstop>daybookStartDateEdit</tabstop>
- <tabstop>daybookEndDateEdit</tabstop>
- <tabstop>daybookDent1ComboBox</tabstop>
- <tabstop>daybookDent2ComboBox</tabstop>
- <tabstop>daybookTextBrowser</tabstop>
- <tabstop>reception_textBrowser</tabstop>
- <tabstop>printAccount_pushButton</tabstop>
- <tabstop>takePayment_pushButton</tabstop>
- <tabstop>perioChartDateComboBox</tabstop>
- <tabstop>dnt1comboBox</tabstop>
- <tabstop>scrollArea</tabstop>
- <tabstop>accounts_tableWidget</tabstop>
- <tabstop>printSelectedAccounts_pushButton</tabstop>
- <tabstop>titleEdit</tabstop>
- <tabstop>fnameEdit</tabstop>
- <tabstop>snameEdit</tabstop>
- <tabstop>dobEdit</tabstop>
- <tabstop>addr1Edit</tabstop>
- <tabstop>addr2Edit</tabstop>
- <tabstop>addr3Edit</tabstop>
- <tabstop>townEdit</tabstop>
- <tabstop>countyEdit</tabstop>
- <tabstop>pcdeEdit</tabstop>
- <tabstop>sexEdit</tabstop>
- <tabstop>tel1Edit</tabstop>
- <tabstop>tel2Edit</tabstop>
- <tabstop>mobileEdit</tabstop>
- <tabstop>faxEdit</tabstop>
- <tabstop>email1Edit</tabstop>
- <tabstop>email2Edit</tabstop>
- <tabstop>occupationEdit</tabstop>
- <tabstop>memoEdit</tabstop>
- <tabstop>email2_button</tabstop>
- <tabstop>pushButton</tabstop>
- <tabstop>email1_button</tabstop>
- <tabstop>pushButton_6</tabstop>
- <tabstop>printEst_pushButton</tabstop>
- <tabstop>bpe_textBrowser</tabstop>
- <tabstop>newBPE_pushButton</tabstop>
- <tabstop>planSummary_textBrowser</tabstop>
- <tabstop>exampushButton</tabstop>
- <tabstop>medNotes_pushButton</tabstop>
- <tabstop>perioCharts_scrollArea</tabstop>
- <tabstop>newPerioChartPushButton</tabstop>
- <tabstop>bpeDateComboBox</tabstop>
- <tabstop>perioChartData_scrollArea</tabstop>
- <tabstop>contract_tabWidget</tabstop>
- <tabstop>notesPrintButton</tabstop>
- <tabstop>loadAccountsTable_pushButton</tabstop>
- </tabstops>
- <resources>
- <include location="../resources/resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/medhist.ui b/src/openmolar/qt-designer/medhist.ui
deleted file mode 100644
index b169802..0000000
--- a/src/openmolar/qt-designer/medhist.ui
+++ /dev/null
@@ -1,362 +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>790</width>
- <height>559</height>
- </rect>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="windowTitle">
- <string>Medical Notes</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="0" colspan="7">
- <widget class="QGroupBox" name="groupBox_2">
- <property name="title">
- <string>Doctor's details</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Doctor's Name</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLineEdit" name="doctor_lineEdit">
- <property name="maxLength">
- <number>60</number>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Address / Tel No</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLineEdit" name="doctorAddy_lineEdit">
- <property name="maxLength">
- <number>60</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="1" column="0" colspan="7">
- <widget class="QGroupBox" name="groupBox">
- <property name="title">
- <string>Known Conditions</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="1">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Current Medication</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QLineEdit" name="curMeds_lineEdit">
- <property name="maxLength">
- <number>60</number>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Past Medication</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="pastMeds_lineEdit">
- <property name="maxLength">
- <number>60</number>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>Allergies</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="allergies_lineEdit">
- <property name="maxLength">
- <number>60</number>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>Heart</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="heart_lineEdit">
- <property name="maxLength">
- <number>60</number>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="2">
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string>Lungs</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="4" column="2">
- <widget class="QLineEdit" name="lungs_lineEdit">
- <property name="maxLength">
- <number>60</number>
- </property>
- </widget>
- </item>
- <item row="5" column="1">
- <widget class="QLabel" name="label_8">
- <property name="text">
- <string>Liver</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="5" column="2">
- <widget class="QLineEdit" name="liver_lineEdit">
- <property name="maxLength">
- <number>60</number>
- </property>
- </widget>
- </item>
- <item row="6" column="0" colspan="2">
- <widget class="QLabel" name="label_11">
- <property name="text">
- <string>Bleeding</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="6" column="2">
- <widget class="QLineEdit" name="bleeding_lineEdit">
- <property name="maxLength">
- <number>60</number>
- </property>
- </widget>
- </item>
- <item row="7" column="0" colspan="2">
- <widget class="QLabel" name="label_9">
- <property name="text">
- <string>Kidneys</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="7" column="2">
- <widget class="QLineEdit" name="kidneys_lineEdit">
- <property name="maxLength">
- <number>60</number>
- </property>
- </widget>
- </item>
- <item row="8" column="0" colspan="2">
- <widget class="QLabel" name="label_10">
- <property name="text">
- <string>Anaesthetic / operations</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="8" column="2">
- <widget class="QLineEdit" name="anaesthetic_lineEdit">
- <property name="maxLength">
- <number>60</number>
- </property>
- </widget>
- </item>
- <item row="9" column="0" colspan="2">
- <widget class="QLabel" name="label_12">
- <property name="text">
- <string>Other</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="9" column="2">
- <widget class="QLineEdit" name="other_lineEdit">
- <property name="maxLength">
- <number>60</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QPushButton" name="checked_pushButton">
- <property name="text">
- <string>Mark as Checked Today</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="2">
- <widget class="QLabel" name="date_label">
- <property name="text">
- <string>Checked</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="3">
- <widget class="QDateEdit" name="dateEdit">
- <property name="readOnly">
- <bool>true</bool>
- </property>
- <property name="buttonSymbols">
- <enum>QAbstractSpinBox::NoButtons</enum>
- </property>
- <property name="dateTime">
- <datetime>
- <hour>0</hour>
- <minute>0</minute>
- <second>0</second>
- <year>1900</year>
- <month>1</month>
- <day>1</day>
- </datetime>
- </property>
- </widget>
- </item>
- <item row="2" column="4">
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="5">
- <widget class="QCheckBox" name="checkBox">
- <property name="text">
- <string>Mark Patient as Med Alert</string>
- </property>
- </widget>
- </item>
- <item row="2" column="6">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/memo_item.ui b/src/openmolar/qt-designer/memo_item.ui
deleted file mode 100644
index c80e1a5..0000000
--- a/src/openmolar/qt-designer/memo_item.ui
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>400</width>
- <height>28</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Form</string>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <property name="topMargin">
- <number>2</number>
- </property>
- <property name="bottomMargin">
- <number>2</number>
- </property>
- <item>
- <widget class="QLabel" name="label">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>60</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>60</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>TextLabel</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLineEdit" name="lineEdit">
- <property name="maxLength">
- <number>30</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/newBPE.ui b/src/openmolar/qt-designer/newBPE.ui
deleted file mode 100644
index 4d20b57..0000000
--- a/src/openmolar/qt-designer/newBPE.ui
+++ /dev/null
@@ -1,309 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>261</width>
- <height>161</height>
- </rect>
- </property>
- <property name="windowTitle" >
- <string>New CPITN score</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout" >
- <item>
- <widget class="QFrame" name="frame" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
- <horstretch>120</horstretch>
- <verstretch>90</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize" >
- <size>
- <width>200</width>
- <height>90</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>300</width>
- <height>90</height>
- </size>
- </property>
- <property name="frameShape" >
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow" >
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout" >
- <item row="0" column="0" >
- <widget class="QComboBox" name="bpe_comboBox" >
- <item>
- <property name="text" >
- <string>0</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>1</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>2</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>3</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>4</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>*</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QComboBox" name="bpe2_comboBox" >
- <item>
- <property name="text" >
- <string>0</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>1</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>2</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>3</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>4</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>*</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="0" column="2" >
- <widget class="QComboBox" name="bpe3_comboBox" >
- <item>
- <property name="text" >
- <string>0</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>1</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>2</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>3</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>4</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>*</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="1" column="0" >
- <widget class="QComboBox" name="bpe4_comboBox" >
- <item>
- <property name="text" >
- <string>0</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>1</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>2</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>3</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>4</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>*</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="1" column="1" >
- <widget class="QComboBox" name="bpe5_comboBox" >
- <item>
- <property name="text" >
- <string>0</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>1</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>2</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>3</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>4</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>*</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="1" column="2" >
- <widget class="QComboBox" name="bpe6_comboBox" >
- <item>
- <property name="text" >
- <string>0</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>1</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>2</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>3</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>4</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>*</string>
- </property>
- </item>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons" >
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
- </property>
- <property name="centerButtons" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <tabstops>
- <tabstop>buttonBox</tabstop>
- <tabstop>bpe_comboBox</tabstop>
- <tabstop>bpe2_comboBox</tabstop>
- <tabstop>bpe3_comboBox</tabstop>
- <tabstop>bpe6_comboBox</tabstop>
- <tabstop>bpe5_comboBox</tabstop>
- <tabstop>bpe4_comboBox</tabstop>
- </tabstops>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>251</x>
- <y>145</y>
- </hint>
- <hint type="destinationlabel" >
- <x>157</x>
- <y>160</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>251</x>
- <y>145</y>
- </hint>
- <hint type="destinationlabel" >
- <x>260</x>
- <y>160</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/newCourse.ui b/src/openmolar/qt-designer/newCourse.ui
deleted file mode 100644
index 00c25ee..0000000
--- a/src/openmolar/qt-designer/newCourse.ui
+++ /dev/null
@@ -1,146 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>272</width>
- <height>310</height>
- </rect>
- </property>
- <property name="windowTitle" >
- <string>New Course</string>
- </property>
- <layout class="QGridLayout" name="gridLayout" >
- <item row="0" column="0" colspan="3" >
- <widget class="QLabel" name="label" >
- <property name="text" >
- <string>Start a new Course of Treatment with the following Criteria?</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_2" >
- <property name="text" >
- <string>Contracted Dentist</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0" >
- <widget class="QLabel" name="label_3" >
- <property name="text" >
- <string>Course Dentist</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0" >
- <widget class="QLabel" name="label_5" >
- <property name="text" >
- <string>Course Type</string>
- </property>
- </widget>
- </item>
- <item row="4" column="0" >
- <widget class="QLabel" name="label_4" >
- <property name="text" >
- <string>Acceptance Date</string>
- </property>
- </widget>
- </item>
- <item row="5" column="0" colspan="3" >
- <spacer name="verticalSpacer" >
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>188</width>
- <height>89</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="6" column="0" colspan="3" >
- <widget class="QDialogButtonBox" name="buttonBox" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons" >
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="1" >
- <widget class="QComboBox" name="dnt2_comboBox" />
- </item>
- <item row="1" column="1" >
- <widget class="QComboBox" name="dnt1_comboBox" />
- </item>
- <item row="3" column="1" >
- <widget class="QComboBox" name="cseType_comboBox" />
- </item>
- <item row="4" column="1" colspan="2" >
- <widget class="QDateEdit" name="dateEdit" >
- <property name="calendarPopup" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- <zorder>label</zorder>
- <zorder>label_2</zorder>
- <zorder>label_3</zorder>
- <zorder>label_5</zorder>
- <zorder>label_4</zorder>
- <zorder>buttonBox</zorder>
- <zorder>dateEdit</zorder>
- <zorder>cseType_comboBox</zorder>
- <zorder>dnt1_comboBox</zorder>
- <zorder>dnt2_comboBox</zorder>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel" >
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel" >
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/newSetup.ui b/src/openmolar/qt-designer/newSetup.ui
deleted file mode 100644
index 07bdd26..0000000
--- a/src/openmolar/qt-designer/newSetup.ui
+++ /dev/null
@@ -1,686 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>589</width>
- <height>413</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>OpenMolar - New Setup</string>
- </property>
- <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 (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="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="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>
- </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>
- </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/>
-</ui>
diff --git a/src/openmolar/qt-designer/ortho_ref_wizard.ui b/src/openmolar/qt-designer/ortho_ref_wizard.ui
deleted file mode 100644
index 2b66659..0000000
--- a/src/openmolar/qt-designer/ortho_ref_wizard.ui
+++ /dev/null
@@ -1,406 +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>910</width>
- <height>594</height>
- </rect>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="windowTitle">
- <string>Dialog</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_5">
- <item row="2" column="1">
- <widget class="QGroupBox" name="groupBox_5">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="title">
- <string>Dental History</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_4">
- <property name="margin">
- <number>2</number>
- </property>
- <item row="0" column="0" colspan="2">
- <widget class="QPlainTextEdit" name="dh_plainTextEdit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QFrame" name="frame">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="1" column="1">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Previous Referral Date</string>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QRadioButton" name="ref1_radioButton">
- <property name="text">
- <string>1st referral</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="1" colspan="2">
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>68</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="0">
- <widget class="QRadioButton" name="ref2_radioButton">
- <property name="text">
- <string>re - referral</string>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QDateEdit" name="dateEdit">
- <property name="enabled">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="3">
- <widget class="QCheckBox" name="tx_checkBox">
- <property name="text">
- <string>I am Willing to carry out simple treatment</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QGroupBox" name="chart_groupBox">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>80</height>
- </size>
- </property>
- <property name="title">
- <string>Teeth With Poor Prognosis</string>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="3">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QGroupBox" name="groupBox_4">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="title">
- <string>Relevant Medical History</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_3">
- <property name="margin">
- <number>2</number>
- </property>
- <item row="0" column="0">
- <widget class="QPlainTextEdit" name="mh__plainTextEdit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="2" column="0" rowspan="2">
- <widget class="QGroupBox" name="groupBox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="title">
- <string>Reason for Referral</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <property name="spacing">
- <number>2</number>
- </property>
- <property name="margin">
- <number>2</number>
- </property>
- <item>
- <widget class="QGroupBox" name="groupBox_2">
- <property name="title">
- <string>Crowding</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <property name="margin">
- <number>2</number>
- </property>
- <item>
- <widget class="QRadioButton" name="crowding5_radioButton">
- <property name="text">
- <string>Severe</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="crowding4_radioButton">
- <property name="text">
- <string>Moderate</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="crowding3_radioButton">
- <property name="text">
- <string>Mild</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="crowding2_radioButton">
- <property name="text">
- <string>None</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="crowding1_radioButton">
- <property name="text">
- <string>Spaced</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QGroupBox" name="groupBox_3">
- <property name="title">
- <string>Incisal Relationship</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <property name="margin">
- <number>2</number>
- </property>
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Overjet:</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QSpinBox" name="oj_spinBox">
- <property name="suffix">
- <string>mm</string>
- </property>
- <property name="minimum">
- <number>-20</number>
- </property>
- <property name="maximum">
- <number>20</number>
- </property>
- </widget>
- </item>
- <item row="0" column="2" colspan="3">
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>248</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Overbite</string>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QRadioButton" name="ob1_radioButton">
- <property name="text">
- <string>Complete</string>
- </property>
- </widget>
- </item>
- <item row="1" column="3">
- <widget class="QRadioButton" name="ob2_radioButton">
- <property name="text">
- <string>InComplete</string>
- </property>
- </widget>
- </item>
- <item row="1" column="4">
- <widget class="QRadioButton" name="ob3_radioButton">
- <property name="text">
- <string>Traumatic</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QSpinBox" name="ob_spinBox">
- <property name="suffix">
- <string>%</string>
- </property>
- <property name="maximum">
- <number>100</number>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QGroupBox" name="groupBox_6">
- <property name="title">
- <string>Patient Motivation</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <property name="spacing">
- <number>2</number>
- </property>
- <property name="margin">
- <number>2</number>
- </property>
- <item>
- <widget class="QCheckBox" name="fixed_checkBox">
- <property name="text">
- <string>Fixed Appliance</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QCheckBox" name="removable_checkBox">
- <property name="text">
- <string>Removable Applicance</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/patient_diary.ui b/src/openmolar/qt-designer/patient_diary.ui
deleted file mode 100644
index 23c14d9..0000000
--- a/src/openmolar/qt-designer/patient_diary.ui
+++ /dev/null
@@ -1,270 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>829</width>
- <height>205</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Form</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <property name="margin">
- <number>0</number>
- </property>
- <property name="spacing">
- <number>6</number>
- </property>
- <item row="0" column="0" colspan="2">
- <widget class="QLineEdit" name="appt_memo_lineEdit">
- <property name="toolTip">
- <string><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></string>
- </property>
- <property name="styleSheet">
- <string notr="true">color:rgb(255, 0, 0)</string>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QPushButton" name="recall_settings_pushButton">
- <property name="text">
- <string>Recall Settings</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QTreeView" name="pt_diary_treeView"/>
- </item>
- <item row="1" column="1" colspan="2">
- <widget class="QFrame" name="appt_buttons_frame">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="minimumSize">
- <size>
- <width>330</width>
- <height>0</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_33">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QPushButton" name="apptWizard_pushButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="toolTip">
- <string>A Wizard to select some common appointment combinations</string>
- </property>
- <property name="text">
- <string>Appointment Shortcuts</string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QGridLayout" name="gridLayout_16">
- <item row="0" column="0">
- <widget class="QPushButton" name="newAppt_pushButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>A New Appointment for this patient</string>
- </property>
- <property name="text">
- <string>&New</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/add_user.png</normaloff>:/add_user.png</iconset>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QPushButton" name="clearAppt_pushButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>delete or cancel the appointment</string>
- </property>
- <property name="text">
- <string>Clear/Cancel</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/eraser.png</normaloff>:/eraser.png</iconset>
- </property>
- </widget>
- </item>
- <item row="0" column="2" rowspan="2">
- <layout class="QVBoxLayout" name="verticalLayout_31">
- <item>
- <widget class="QPushButton" name="scheduleAppt_pushButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Make the selected appointment</string>
- </property>
- <property name="text">
- <string>Schedule</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/month.png</normaloff>:/month.png</iconset>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="findAppt_pushButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Find the appointment in the the practice appointment list</string>
- </property>
- <property name="text">
- <string>Find in Book</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/schedule.png</normaloff>:/schedule.png</iconset>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="1" column="0">
- <widget class="QPushButton" name="printAppt_pushButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
- <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 out the next 5 appointments for this patient</string>
- </property>
- <property name="text">
- <string>Print Card</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/ps.png</normaloff>:/ps.png</iconset>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QPushButton" name="modifyAppt_pushButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Allows modifcation of certain criteria for this appointment</string>
- </property>
- <property name="text">
- <string>Modify</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <resources>
- <include location="../resources/resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/patient_finder.ui b/src/openmolar/qt-designer/patient_finder.ui
deleted file mode 100644
index 19e422d..0000000
--- a/src/openmolar/qt-designer/patient_finder.ui
+++ /dev/null
@@ -1,319 +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>306</width>
- <height>367</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Patient Finder</string>
- </property>
- <property name="windowIcon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/logo.png</normaloff>:/logo.png</iconset>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0" colspan="3">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Fill in a few of the following fields to get a list of possible patients</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="3">
- <widget class="QPushButton" name="repeat_pushButton">
- <property name="text">
- <string>Repeat Last Search</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/agt_reload.png</normaloff>:/agt_reload.png</iconset>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="3">
- <widget class="Line" name="line">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="label_5">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>SNO or Surname</string>
- </property>
- <property name="buddy">
- <cstring>sname</cstring>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QLineEdit" name="sname">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="toolTip">
- <string>Enter either the full name or the first few letters of the name.
-
-If you are unsure of the spelling, type in the COMPLETE name,
-and check the adjacent "sounds like" box.</string>
- </property>
- </widget>
- </item>
- <item row="3" column="2">
- <widget class="QCheckBox" name="snameSoundex_checkBox">
- <property name="maximumSize">
- <size>
- <width>60</width>
- <height>24</height>
- </size>
- </property>
- <property name="toolTip">
- <string>check to search for a similar sounding name</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/speaker.svg</normaloff>:/speaker.svg</iconset>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_6">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>First Name</string>
- </property>
- <property name="buddy">
- <cstring>fname</cstring>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QLineEdit" name="fname">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="toolTip">
- <string>Enter either the full name or the first few letters of the name.
-
-If you are unsure of the spelling, type in the COMPLETE name,
-and check the adjacent "sounds like" box.
-Be wary of middle names.
-eg. "Neil" does NOT sound like "Neil Alexander"!</string>
- </property>
- </widget>
- </item>
- <item row="4" column="2">
- <widget class="QCheckBox" name="fnameSoundex_checkBox">
- <property name="maximumSize">
- <size>
- <width>60</width>
- <height>24</height>
- </size>
- </property>
- <property name="toolTip">
- <string>check to search for a similar sounding name</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/speaker.svg</normaloff>:/speaker.svg</iconset>
- </property>
- </widget>
- </item>
- <item row="5" column="0">
- <widget class="QLabel" name="label_2">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>Date of Birth</string>
- </property>
- </widget>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="label_7">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>Address includes</string>
- </property>
- <property name="buddy">
- <cstring>addr1</cstring>
- </property>
- </widget>
- </item>
- <item row="6" column="1" colspan="2">
- <widget class="QLineEdit" name="addr1">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="toolTip">
- <string>openMolar will search line1 and line2 of the address for this text</string>
- </property>
- </widget>
- </item>
- <item row="7" column="0">
- <widget class="QLabel" name="label_8">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>Telephone</string>
- </property>
- <property name="buddy">
- <cstring>tel</cstring>
- </property>
- </widget>
- </item>
- <item row="7" column="1">
- <widget class="QLineEdit" name="tel">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="toolTip">
- <string>open molar will search tel1, tel2 and mobile for numbers present here.</string>
- </property>
- </widget>
- </item>
- <item row="8" column="0">
- <widget class="QLabel" name="label_9">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>Postcode</string>
- </property>
- <property name="buddy">
- <cstring>pcde</cstring>
- </property>
- </widget>
- </item>
- <item row="8" column="1">
- <widget class="QLineEdit" name="pcde">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="toolTip">
- <string>search for a postcode</string>
- </property>
- </widget>
- </item>
- <item row="9" column="1">
- <spacer>
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>21</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="10" column="0" colspan="3">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="5" column="1">
- <widget class="QDateEdit" name="dateEdit">
- <property name="dateTime">
- <datetime>
- <hour>0</hour>
- <minute>0</minute>
- <second>0</second>
- <year>1900</year>
- <month>1</month>
- <day>1</day>
- </datetime>
- </property>
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <tabstops>
- <tabstop>sname</tabstop>
- <tabstop>fname</tabstop>
- <tabstop>dateEdit</tabstop>
- <tabstop>addr1</tabstop>
- <tabstop>tel</tabstop>
- <tabstop>pcde</tabstop>
- <tabstop>buttonBox</tabstop>
- <tabstop>repeat_pushButton</tabstop>
- <tabstop>snameSoundex_checkBox</tabstop>
- <tabstop>fnameSoundex_checkBox</tabstop>
- </tabstops>
- <resources>
- <include location="../resources/resources.qrc"/>
- </resources>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/payments.ui b/src/openmolar/qt-designer/payments.ui
deleted file mode 100644
index 2595287..0000000
--- a/src/openmolar/qt-designer/payments.ui
+++ /dev/null
@@ -1,419 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
- <property name="windowModality" >
- <enum>Qt::ApplicationModal</enum>
- </property>
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>226</width>
- <height>404</height>
- </rect>
- </property>
- <property name="windowTitle" >
- <string>Payments</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout" >
- <item>
- <widget class="QGroupBox" name="groupBox_2" >
- <property name="title" >
- <string>Payments for treatment</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2" >
- <item row="0" column="0" >
- <widget class="QLabel" name="label" >
- <property name="text" >
- <string>Cash</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy" >
- <cstring>cash_lineEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="0" column="2" >
- <widget class="QPushButton" name="cash_pushButton" >
- <property name="maximumSize" >
- <size>
- <width>28</width>
- <height>28</height>
- </size>
- </property>
- <property name="text" >
- <string>-</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0" >
- <widget class="QLabel" name="label_2" >
- <property name="text" >
- <string>Cheque</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy" >
- <cstring>cheque_lineEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="1" column="2" >
- <widget class="QPushButton" name="cheque_pushButton" >
- <property name="maximumSize" >
- <size>
- <width>28</width>
- <height>28</height>
- </size>
- </property>
- <property name="text" >
- <string>-</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0" >
- <widget class="QLabel" name="label_3" >
- <property name="text" >
- <string>Debit Card</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy" >
- <cstring>debitCard_lineEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="2" column="2" >
- <widget class="QPushButton" name="debit_pushButton" >
- <property name="maximumSize" >
- <size>
- <width>28</width>
- <height>28</height>
- </size>
- </property>
- <property name="text" >
- <string>-</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0" >
- <widget class="QLabel" name="label_4" >
- <property name="text" >
- <string>Credit Card</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy" >
- <cstring>creditCard_lineEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="3" column="2" >
- <widget class="QPushButton" name="credit_pushButton" >
- <property name="maximumSize" >
- <size>
- <width>28</width>
- <height>28</height>
- </size>
- </property>
- <property name="text" >
- <string>-</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QLineEdit" name="cash_lineEdit" >
- <property name="minimumSize" >
- <size>
- <width>70</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>70</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength" >
- <number>10</number>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="1" >
- <widget class="QLineEdit" name="cheque_lineEdit" >
- <property name="minimumSize" >
- <size>
- <width>70</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>70</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength" >
- <number>10</number>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="1" >
- <widget class="QLineEdit" name="debitCard_lineEdit" >
- <property name="minimumSize" >
- <size>
- <width>70</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>70</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength" >
- <number>10</number>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="1" >
- <widget class="QLineEdit" name="creditCard_lineEdit" >
- <property name="minimumSize" >
- <size>
- <width>70</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>70</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength" >
- <number>10</number>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QGroupBox" name="groupBox" >
- <property name="title" >
- <string>Other Payments</string>
- </property>
- <property name="checkable" >
- <bool>false</bool>
- </property>
- <layout class="QGridLayout" name="gridLayout" >
- <item row="0" column="0" >
- <widget class="QLabel" name="label_8" >
- <property name="text" >
- <string>Sundries</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy" >
- <cstring>sundries_lineEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QLineEdit" name="sundries_lineEdit" >
- <property name="minimumSize" >
- <size>
- <width>70</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>70</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength" >
- <number>10</number>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="0" >
- <widget class="QLabel" name="label_7" >
- <property name="text" >
- <string>Annual HDP</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy" >
- <cstring>annualHDP_lineEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="1" column="1" >
- <widget class="QLineEdit" name="annualHDP_lineEdit" >
- <property name="minimumSize" >
- <size>
- <width>70</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>70</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength" >
- <number>10</number>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="0" >
- <widget class="QLabel" name="label_9" >
- <property name="text" >
- <string>Miscellaneous</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy" >
- <cstring>misc_lineEdit</cstring>
- </property>
- </widget>
- </item>
- <item row="2" column="1" >
- <widget class="QLineEdit" name="misc_lineEdit" >
- <property name="minimumSize" >
- <size>
- <width>70</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>70</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength" >
- <number>10</number>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout" >
- <item>
- <widget class="QLabel" name="label_6" >
- <property name="text" >
- <string>Amount which will appear on receipt (read only)</string>
- </property>
- <property name="wordWrap" >
- <bool>true</bool>
- </property>
- <property name="buddy" >
- <cstring>total_doubleSpinBox</cstring>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QDoubleSpinBox" name="total_doubleSpinBox" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize" >
- <size>
- <width>80</width>
- <height>0</height>
- </size>
- </property>
- <property name="readOnly" >
- <bool>true</bool>
- </property>
- <property name="maximum" >
- <double>20000.000000000000000</double>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox" >
- <property name="standardButtons" >
- <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <tabstops>
- <tabstop>cash_lineEdit</tabstop>
- <tabstop>cheque_lineEdit</tabstop>
- <tabstop>debitCard_lineEdit</tabstop>
- <tabstop>creditCard_lineEdit</tabstop>
- <tabstop>sundries_lineEdit</tabstop>
- <tabstop>annualHDP_lineEdit</tabstop>
- <tabstop>misc_lineEdit</tabstop>
- <tabstop>total_doubleSpinBox</tabstop>
- <tabstop>buttonBox</tabstop>
- <tabstop>cheque_pushButton</tabstop>
- <tabstop>credit_pushButton</tabstop>
- <tabstop>debit_pushButton</tabstop>
- <tabstop>cash_pushButton</tabstop>
- </tabstops>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>112</x>
- <y>378</y>
- </hint>
- <hint type="destinationlabel" >
- <x>112</x>
- <y>201</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/permissions.ui b/src/openmolar/qt-designer/permissions.ui
deleted file mode 100644
index 11ecce6..0000000
--- a/src/openmolar/qt-designer/permissions.ui
+++ /dev/null
@@ -1,88 +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>308</width>
- <height>177</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Raise Permissions</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Supervisor Rights required to Perform This Action.
-Please enter password.</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLineEdit" name="lineEdit">
- <property name="echoMode">
- <enum>QLineEdit::Password</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/quick_daylist_print.ui b/src/openmolar/qt-designer/quick_daylist_print.ui
deleted file mode 100644
index beb20af..0000000
--- a/src/openmolar/qt-designer/quick_daylist_print.ui
+++ /dev/null
@@ -1,105 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>178</width>
- <height>140</height>
- </rect>
- </property>
- <property name="font" >
- <font>
- <weight>50</weight>
- <bold>false</bold>
- </font>
- </property>
- <property name="windowTitle" >
- <string>Question</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout" >
- <item>
- <widget class="QLabel" name="label" >
- <property name="font" >
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text" >
- <string>Print Formatting</string>
- </property>
- <property name="scaledContents" >
- <bool>false</bool>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton" >
- <property name="text" >
- <string>Minimal</string>
- </property>
- <property name="checked" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="radioButton_2" >
- <property name="text" >
- <string>Full Page</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons" >
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel" >
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel" >
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/record_tools.ui b/src/openmolar/qt-designer/record_tools.ui
deleted file mode 100644
index 2449be0..0000000
--- a/src/openmolar/qt-designer/record_tools.ui
+++ /dev/null
@@ -1,1053 +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>628</width>
- <height>521</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Advanced Record Alteration</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QTabWidget" name="tabWidget">
- <property name="currentIndex">
- <number>0</number>
- </property>
- <widget class="QWidget" name="tab">
- <attribute name="title">
- <string>Money</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="0" rowspan="4">
- <widget class="QScrollArea" name="money_scrollArea">
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="money_scrollAreaWidgetContents">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>443</width>
- <height>424</height>
- </rect>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="1" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>NHS current fees (money0)</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QSpinBox" name="money0_spinBox">
- <property name="maximum">
- <number>1000000</number>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>NHS payments (money2)</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QSpinBox" name="money2_spinBox">
- <property name="maximum">
- <number>1000000</number>
- </property>
- </widget>
- </item>
- <item row="7" column="0">
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>NHS estimated (money4)</string>
- </property>
- </widget>
- </item>
- <item row="7" column="1">
- <widget class="QSpinBox" name="money4_spinBox">
- <property name="maximum">
- <number>1000000</number>
- </property>
- </widget>
- </item>
- <item row="8" column="0">
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>private estimate (money5)</string>
- </property>
- </widget>
- </item>
- <item row="8" column="1">
- <widget class="QSpinBox" name="money5_spinBox">
- <property name="maximum">
- <number>1000000</number>
- </property>
- </widget>
- </item>
- <item row="9" column="0">
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string>Exempt - nhs gross - completed treatment (money6)</string>
- </property>
- </widget>
- </item>
- <item row="9" column="1">
- <widget class="QSpinBox" name="money6_spinBox">
- <property name="maximum">
- <number>1000000</number>
- </property>
- </widget>
- </item>
- <item row="10" column="0">
- <widget class="QLabel" name="label_8">
- <property name="text">
- <string>Exempt - NHS gross - estimated current (money7)</string>
- </property>
- </widget>
- </item>
- <item row="10" column="1">
- <widget class="QSpinBox" name="money7_spinBox">
- <property name="maximum">
- <number>1000000</number>
- </property>
- </widget>
- </item>
- <item row="11" column="0">
- <widget class="QLabel" name="label_9">
- <property name="text">
- <string>credit (money8)</string>
- </property>
- </widget>
- </item>
- <item row="11" column="1">
- <widget class="QSpinBox" name="money8_spinBox">
- <property name="maximum">
- <number>1000000</number>
- </property>
- </widget>
- </item>
- <item row="12" column="0">
- <widget class="QLabel" name="label_10">
- <property name="text">
- <string>debt (money9)</string>
- </property>
- </widget>
- </item>
- <item row="12" column="1">
- <widget class="QSpinBox" name="money9_spinBox">
- <property name="maximum">
- <number>1000000</number>
- </property>
- </widget>
- </item>
- <item row="13" column="0">
- <widget class="QLabel" name="label_11">
- <property name="text">
- <string>debt2 (money10)</string>
- </property>
- </widget>
- </item>
- <item row="13" column="1">
- <widget class="QSpinBox" name="money10_spinBox">
- <property name="maximum">
- <number>1000000</number>
- </property>
- </widget>
- </item>
- <item row="14" column="0">
- <widget class="QLabel" name="label_12">
- <property name="text">
- <string>money 11 (always 0!)</string>
- </property>
- </widget>
- </item>
- <item row="14" column="1">
- <widget class="QSpinBox" name="money11_spinBox">
- <property name="maximum">
- <number>1000000</number>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>private current fees (money1) </string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QSpinBox" name="money1_spinBox">
- <property name="maximum">
- <number>1000000</number>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QSpinBox" name="money3_spinBox">
- <property name="maximum">
- <number>1000000</number>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>private payments (money3)</string>
- </property>
- </widget>
- </item>
- <item row="15" column="0" colspan="2">
- <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>
- <item row="0" column="0" colspan="2">
- <widget class="QLabel" name="label_14">
- <property name="text">
- <string>ALL AMOUNTS ARE IN PENCE (cents)</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="label_13">
- <property name="text">
- <string>Outstanding <br />amount</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="total_label">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>0.00</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QPushButton" name="money_pushButton">
- <property name="text">
- <string>Apply Changes</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <spacer name="verticalSpacer_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>337</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_2">
- <attribute name="title">
- <string>Dates</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_4">
- <item row="0" column="1">
- <widget class="QPushButton" name="dates_pushButton">
- <property name="text">
- <string>Apply Changes</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <spacer name="verticalSpacer_3">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>82</width>
- <height>388</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="0" column="0" rowspan="2">
- <widget class="QScrollArea" name="scrollArea">
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>345</width>
- <height>263</height>
- </rect>
- </property>
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="0" column="0">
- <widget class="QLabel" name="label_15">
- <property name="text">
- <string>Last CE (pd5)</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QDateEdit" name="pd5_dateEdit">
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pd5_pushButton">
- <property name="text">
- <string>Add Date</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_16">
- <property name="text">
- <string>Last ECE (pd6)</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <widget class="QDateEdit" name="pd6_dateEdit">
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pd6_pushButton">
- <property name="text">
- <string>Add Date</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_17">
- <property name="text">
- <string>Last FCA (pd7)</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <item>
- <widget class="QDateEdit" name="pd7_dateEdit">
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pd7_pushButton">
- <property name="text">
- <string>Add Date</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="label_18">
- <property name="text">
- <string>Last OPT (pd8)</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <layout class="QHBoxLayout" name="horizontalLayout_4">
- <item>
- <widget class="QDateEdit" name="pd8_dateEdit">
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pd8_pushButton">
- <property name="text">
- <string>Add Date</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_19">
- <property name="text">
- <string>Last intraoral Xrays (pd9)</string>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <layout class="QHBoxLayout" name="horizontalLayout_5">
- <item>
- <widget class="QDateEdit" name="pd9_dateEdit">
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pd9_pushButton">
- <property name="text">
- <string>Add Date</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="5" column="0">
- <widget class="QLabel" name="label_20">
- <property name="text">
- <string>Last SP (pd10)</string>
- </property>
- </widget>
- </item>
- <item row="5" column="1">
- <layout class="QHBoxLayout" name="horizontalLayout_6">
- <item>
- <widget class="QDateEdit" name="pd10_dateEdit">
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="pd10_pushButton">
- <property name="text">
- <string>Add Date</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="label_21">
- <property name="text">
- <string>Last Account sent (billdate)</string>
- </property>
- </widget>
- </item>
- <item row="6" column="1">
- <layout class="QHBoxLayout" name="horizontalLayout_7">
- <item>
- <widget class="QDateEdit" name="billdate_dateEdit">
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="billdate_pushButton">
- <property name="text">
- <string>Add Date</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="7" column="0">
- <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>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_3">
- <attribute name="title">
- <string>Treatment Plan</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_11">
- <item row="0" column="0" rowspan="2" colspan="3">
- <widget class="QScrollArea" name="scrollArea_2">
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_2">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>36</width>
- <height>28</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QFrame" name="chartplan_frame">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item row="0" column="3">
- <widget class="QPushButton" name="plan_pushButton">
- <property name="text">
- <string>Apply Changes</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
- </property>
- </widget>
- </item>
- <item row="1" column="3" rowspan="2">
- <spacer name="verticalSpacer_5">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>82</width>
- <height>388</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="0">
- <layout class="QGridLayout" name="gridLayout_9">
- <item row="0" column="0" colspan="2">
- <widget class="QLabel" name="label_22">
- <property name="text">
- <string>Xray</string>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QLineEdit" name="xraypl_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="QLabel" name="label_23">
- <property name="text">
- <string>Perio</string>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QLineEdit" name="periopl_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2">
- <widget class="QLabel" name="label_47">
- <property name="text">
- <string>anaesthetics</string>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QLineEdit" name="anaespl_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="3" column="0" colspan="2">
- <widget class="QLabel" name="label_48">
- <property name="text">
- <string>other</string>
- </property>
- </widget>
- </item>
- <item row="3" column="2">
- <widget class="QLineEdit" name="otherpl_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="2">
- <widget class="QLabel" name="label_49">
- <property name="text">
- <string>custom</string>
- </property>
- </widget>
- </item>
- <item row="4" column="2">
- <widget class="QLineEdit" name="custompl_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="2" column="1">
- <widget class="Line" name="line_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <layout class="QGridLayout" name="gridLayout_10">
- <item row="0" column="0" colspan="3">
- <widget class="QLabel" name="label_51">
- <property name="text">
- <string>Dentures</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="QLabel" name="label_52">
- <property name="text">
- <string>new upper</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2">
- <widget class="QLabel" name="label_53">
- <property name="text">
- <string>new lower</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0" colspan="3">
- <widget class="Line" name="line">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="2">
- <widget class="QLabel" name="label_54">
- <property name="text">
- <string>repair upper</string>
- </property>
- </widget>
- </item>
- <item row="4" column="2">
- <widget class="QLineEdit" name="odupl_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="5" column="0" colspan="2">
- <widget class="QLabel" name="label_55">
- <property name="text">
- <string>repair lower</string>
- </property>
- </widget>
- </item>
- <item row="5" column="2">
- <widget class="QLineEdit" name="odlpl_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QLineEdit" name="ndupl_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QLineEdit" name="ndlpl_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_4">
- <attribute name="title">
- <string>Completed Treatment</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_5">
- <item row="0" column="0" rowspan="2" colspan="3">
- <widget class="QScrollArea" name="scrollArea_3">
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents_3">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>461</width>
- <height>225</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <item>
- <widget class="QFrame" name="chartcompleted_frame">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item row="0" column="3">
- <widget class="QPushButton" name="completed_pushButton">
- <property name="text">
- <string>Apply Changes</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
- </property>
- </widget>
- </item>
- <item row="1" column="3" rowspan="2">
- <spacer name="verticalSpacer_6">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>82</width>
- <height>388</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="0">
- <layout class="QGridLayout" name="gridLayout_12">
- <item row="0" column="0" colspan="2">
- <widget class="QLabel" name="label_24">
- <property name="text">
- <string>Xray</string>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QLineEdit" name="xraycmp_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="QLabel" name="label_25">
- <property name="text">
- <string>Perio</string>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QLineEdit" name="periocmp_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2">
- <widget class="QLabel" name="label_50">
- <property name="text">
- <string>anaesthetics</string>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QLineEdit" name="anaescmp_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="3" column="0" colspan="2">
- <widget class="QLabel" name="label_56">
- <property name="text">
- <string>other</string>
- </property>
- </widget>
- </item>
- <item row="3" column="2">
- <widget class="QLineEdit" name="othercmp_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="2">
- <widget class="QLabel" name="label_57">
- <property name="text">
- <string>custom</string>
- </property>
- </widget>
- </item>
- <item row="4" column="2">
- <widget class="QLineEdit" name="customcmp_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="2" column="1">
- <widget class="Line" name="line_3">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <layout class="QGridLayout" name="gridLayout_13">
- <item row="0" column="0" colspan="3">
- <widget class="QLabel" name="label_58">
- <property name="text">
- <string>Dentures</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="QLabel" name="label_59">
- <property name="text">
- <string>new upper</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2">
- <widget class="QLabel" name="label_60">
- <property name="text">
- <string>new lower</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0" colspan="3">
- <widget class="Line" name="line_4">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="2">
- <widget class="QLabel" name="label_61">
- <property name="text">
- <string>repair upper</string>
- </property>
- </widget>
- </item>
- <item row="4" column="2">
- <widget class="QLineEdit" name="oducmp_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="5" column="0" colspan="2">
- <widget class="QLabel" name="label_62">
- <property name="text">
- <string>repair lower</string>
- </property>
- </widget>
- </item>
- <item row="5" column="2">
- <widget class="QLineEdit" name="odlcmp_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QLineEdit" name="nducmp_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QLineEdit" name="ndlcmp_lineEdit">
- <property name="maxLength">
- <number>56</number>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_5">
- <attribute name="title">
- <string>Miscellaneous</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_6">
- <item row="0" column="0" rowspan="2">
- <layout class="QVBoxLayout" name="verticalLayout_4">
- <item>
- <widget class="QLabel" name="label_26">
- <property name="text">
- <string>Hidden Notes</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTableWidget" name="hidden_notes_tableWidget"/>
- </item>
- </layout>
- </item>
- <item row="0" column="1">
- <widget class="QPushButton" name="hidden_notes_pushButton">
- <property name="text">
- <string>Apply Changes</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/button_ok.png</normaloff>:/button_ok.png</iconset>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <spacer name="verticalSpacer_7">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>377</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Close</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources>
- <include location="../resources/resources.qrc"/>
- </resources>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/saveMemo.ui b/src/openmolar/qt-designer/saveMemo.ui
deleted file mode 100644
index c5f56ff..0000000
--- a/src/openmolar/qt-designer/saveMemo.ui
+++ /dev/null
@@ -1,152 +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>584</width>
- <height>236</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Post a memo about this Patient</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="0" colspan="4">
- <widget class="QTextEdit" name="textEdit">
- <property name="acceptRichText">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="0" rowspan="2">
- <widget class="QGroupBox" name="groupBox_2">
- <property name="title">
- <string>Expiry Policy</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QRadioButton" name="noExpire_radioButton">
- <property name="text">
- <string>Do Not Expire</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QRadioButton" name="dateExpire_radioButton">
- <property name="text">
- <string>Expire on this date</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QDateEdit" name="dateEdit"/>
- </item>
- </layout>
- </widget>
- </item>
- <item row="1" column="1" rowspan="2">
- <widget class="QGroupBox" name="groupBox_3">
- <property name="title">
- <string>Viewable by</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QRadioButton" name="viewAll_radioButton">
- <property name="text">
- <string>All</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="viewSurgery_radioButton">
- <property name="text">
- <string>Surgery Machines</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="viewReception_radioButton">
- <property name="text">
- <string>Reception Machines</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QGroupBox" name="groupBox">
- <property name="title">
- <string>Author</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QComboBox" name="author_comboBox"/>
- </item>
- </layout>
- </widget>
- </item>
- <item row="1" column="3">
- <widget class="QPushButton" name="phraseBook_pushButton">
- <property name="text">
- <string>PhraseBook</string>
- </property>
- </widget>
- </item>
- <item row="2" column="2" colspan="2">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/select_patient.ui b/src/openmolar/qt-designer/select_patient.ui
deleted file mode 100644
index a7b1508..0000000
--- a/src/openmolar/qt-designer/select_patient.ui
+++ /dev/null
@@ -1,73 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>1014</width>
- <height>398</height>
- </rect>
- </property>
- <property name="windowTitle" >
- <string>Make a Selection</string>
- </property>
- <layout class="QVBoxLayout" >
- <item>
- <widget class="QTableWidget" name="tableWidget" >
- <property name="alternatingRowColors" >
- <bool>true</bool>
- </property>
- <property name="selectionBehavior" >
- <enum>QAbstractItemView::SelectRows</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons" >
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel" >
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel" >
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/showMemo.ui b/src/openmolar/qt-designer/showMemo.ui
deleted file mode 100644
index 4d31f73..0000000
--- a/src/openmolar/qt-designer/showMemo.ui
+++ /dev/null
@@ -1,107 +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>611</width>
- <height>262</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Memo</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0" rowspan="2">
- <widget class="QLabel" name="label">
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../resources/resources.qrc">:/newlogo_launchpadSize.png</pixmap>
- </property>
- <property name="scaledContents">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="1" colspan="2">
- <widget class="QLabel" name="message_label">
- <property name="font">
- <font>
- <pointsize>12</pointsize>
- </font>
- </property>
- <property name="text">
- <string>TextLabel</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QCheckBox" name="checkBox">
- <property name="text">
- <string>Delete this memo when I close this</string>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources>
- <include location="../resources/resources.qrc"/>
- </resources>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/specify_appointment.ui b/src/openmolar/qt-designer/specify_appointment.ui
deleted file mode 100644
index b9b4336..0000000
--- a/src/openmolar/qt-designer/specify_appointment.ui
+++ /dev/null
@@ -1,420 +0,0 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>593</width>
- <height>404</height>
- </rect>
- </property>
- <property name="windowTitle" >
- <string>Enter an appointment</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2" >
- <item row="0" column="0" >
- <spacer name="horizontalSpacer_3" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>81</width>
- <height>56</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="0" column="1" >
- <layout class="QGridLayout" name="gridLayout_3" >
- <item row="0" column="0" >
- <widget class="QLabel" name="label" >
- <property name="text" >
- <string>Appointment with</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QComboBox" name="practix_comboBox" />
- </item>
- <item row="1" column="0" >
- <widget class="QLabel" name="label_2" >
- <property name="text" >
- <string>Length</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="1" >
- <widget class="QComboBox" name="apptlength_comboBox" >
- <property name="maxVisibleItems" >
- <number>20</number>
- </property>
- <item>
- <property name="text" >
- <string>5 minutes</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>10 minutes</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>15 minutes</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>20 minutes</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>30 minutes</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>40 minutes</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>45 minutes</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>1 hour</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>1 hour 15 minutes</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>1 hour 20 minutes</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>1 hour 30 minutes</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>1 hour 45 minutes</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>2 hours</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>2 hours 30 minutes</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>3 hours</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>other</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="2" column="0" colspan="2" >
- <widget class="QCheckBox" name="combinedApptcheckBox" >
- <property name="enabled" >
- <bool>false</bool>
- </property>
- <property name="layoutDirection" >
- <enum>Qt::LeftToRight</enum>
- </property>
- <property name="text" >
- <string>Combined Appointment With Hygenist?</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="0" column="2" >
- <spacer name="horizontalSpacer_2" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>152</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="0" colspan="3" >
- <widget class="Line" name="line" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="3" >
- <layout class="QGridLayout" name="gridLayout" >
- <item row="0" column="0" >
- <widget class="QLabel" name="label_3" >
- <property name="maximumSize" >
- <size>
- <width>16777215</width>
- <height>24</height>
- </size>
- </property>
- <property name="text" >
- <string>Reason 1</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="2" >
- <widget class="QLabel" name="label_5" >
- <property name="maximumSize" >
- <size>
- <width>16777215</width>
- <height>24</height>
- </size>
- </property>
- <property name="text" >
- <string>Reason 3</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="0" >
- <widget class="QComboBox" name="trt1_comboBox" >
- <property name="minimumSize" >
- <size>
- <width>176</width>
- <height>0</height>
- </size>
- </property>
- <property name="maxVisibleItems" >
- <number>20</number>
- </property>
- </widget>
- </item>
- <item row="1" column="1" >
- <widget class="QComboBox" name="trt2_comboBox" >
- <property name="minimumSize" >
- <size>
- <width>176</width>
- <height>0</height>
- </size>
- </property>
- <property name="maxVisibleItems" >
- <number>20</number>
- </property>
- <item>
- <property name="text" >
- <string/>
- </property>
- </item>
- </widget>
- </item>
- <item row="1" column="2" >
- <widget class="QComboBox" name="trt3_comboBox" >
- <property name="minimumSize" >
- <size>
- <width>176</width>
- <height>0</height>
- </size>
- </property>
- <property name="maxVisibleItems" >
- <number>20</number>
- </property>
- <item>
- <property name="text" >
- <string/>
- </property>
- </item>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QLabel" name="label_4" >
- <property name="maximumSize" >
- <size>
- <width>16777215</width>
- <height>24</height>
- </size>
- </property>
- <property name="text" >
- <string>Reason 2</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="3" column="0" colspan="3" >
- <widget class="Line" name="line_2" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="3" >
- <layout class="QHBoxLayout" name="horizontalLayout" >
- <item>
- <widget class="QLabel" name="label_6" >
- <property name="maximumSize" >
- <size>
- <width>16777215</width>
- <height>30</height>
- </size>
- </property>
- <property name="text" >
- <string>Brief Note for Clinician (optional)</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLineEdit" name="lineEdit" >
- <property name="minimumSize" >
- <size>
- <width>180</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>300</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength" >
- <number>20</number>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="5" column="0" colspan="3" >
- <widget class="Line" name="line_3" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="6" column="0" colspan="3" >
- <layout class="QHBoxLayout" name="horizontalLayout_2" >
- <item>
- <widget class="QPushButton" name="scheduleNow_pushButton" >
- <property name="text" >
- <string>Schedule Appointment Now</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>128</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons" >
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
- </property>
- <property name="centerButtons" >
- <bool>false</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>553</x>
- <y>258</y>
- </hint>
- <hint type="destinationlabel" >
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>553</x>
- <y>258</y>
- </hint>
- <hint type="destinationlabel" >
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>scheduleNow_pushButton</sender>
- <signal>clicked()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>90</x>
- <y>305</y>
- </hint>
- <hint type="destinationlabel" >
- <x>296</x>
- <y>175</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/staff_diary.ui b/src/openmolar/qt-designer/staff_diary.ui
deleted file mode 100644
index ea631ce..0000000
--- a/src/openmolar/qt-designer/staff_diary.ui
+++ /dev/null
@@ -1,212 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>786</width>
- <height>546</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Form</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="header_label">
- <property name="font">
- <font>
- <weight>75</weight>
- <italic>true</italic>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>TextLabel</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTabWidget" name="tabWidget">
- <property name="currentIndex">
- <number>0</number>
- </property>
- <widget class="QWidget" name="tab_4">
- <attribute name="title">
- <string>Summary</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_5">
- <item>
- <widget class="QSplitter" name="splitter">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <widget class="QWidget" name="">
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <item>
- <widget class="QLabel" name="label_3">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <weight>75</weight>
- <italic>true</italic>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Summary</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="summary_label">
- <property name="minimumSize">
- <size>
- <width>300</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>TextLabel</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="">
- <layout class="QVBoxLayout" name="verticalLayout_4">
- <item>
- <widget class="QLabel" name="label_2">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <weight>75</weight>
- <italic>true</italic>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Agenda</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="agenda_label">
- <property name="minimumSize">
- <size>
- <width>300</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>TextLabel</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab">
- <attribute name="title">
- <string>Messages and Tasks</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QListWidget" name="messages_listWidget">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="task_frame">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_2">
- <attribute name="title">
- <string>My Calendar</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_6">
- <item>
- <widget class="QFrame" name="calendar_frame">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tab_3">
- <attribute name="title">
- <string>Holiday Planner</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_7">
- <item>
- <widget class="QFrame" name="planner_frame">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/startscreen.ui b/src/openmolar/qt-designer/startscreen.ui
deleted file mode 100644
index 886a52b..0000000
--- a/src/openmolar/qt-designer/startscreen.ui
+++ /dev/null
@@ -1,301 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
- <property name="windowModality">
- <enum>Qt::WindowModal</enum>
- </property>
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>276</width>
- <height>343</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>200</width>
- <height>200</height>
- </size>
- </property>
- <property name="windowTitle">
- <string>openMolar</string>
- </property>
- <property name="windowIcon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/openmolar.svg</normaloff>:/openmolar.svg</iconset>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="0" colspan="2">
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QLabel" name="label_3">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>System Password</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLineEdit" name="password_lineEdit">
- <property name="minimumSize">
- <size>
- <width>80</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>71</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength">
- <number>10</number>
- </property>
- <property name="echoMode">
- <enum>QLineEdit::Password</enum>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="Line" name="line">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>16</height>
- </size>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2">
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="layoutDirection">
- <enum>Qt::LeftToRight</enum>
- </property>
- <property name="text">
- <string>User 1(required)</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLineEdit" name="user1_lineEdit">
- <property name="maximumSize">
- <size>
- <width>40</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="maxLength">
- <number>6</number>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_2">
- <property name="layoutDirection">
- <enum>Qt::LeftToRight</enum>
- </property>
- <property name="text">
- <string>User 2 (optional)</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLineEdit" name="user2_lineEdit">
- <property name="maximumSize">
- <size>
- <width>40</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="maxLength">
- <number>6</number>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="2">
- <widget class="QRadioButton" name="surgery_radioButton">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>Surgery Machine</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="0" colspan="2">
- <widget class="QRadioButton" name="reception_radioButton">
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>Reception Machine</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="4" column="0" colspan="2">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="6" column="0" colspan="2">
- <widget class="QFrame" name="advanced_frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>40</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="0" column="0" colspan="2">
- <widget class="Line" name="line_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="0" rowspan="2">
- <widget class="QLabel" name="chosenServer_label">
- <property name="text">
- <string>TextLabel</string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QToolButton" name="advanced_toolButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>change</string>
- </property>
- <property name="popupMode">
- <enum>QToolButton::InstantPopup</enum>
- </property>
- <property name="toolButtonStyle">
- <enum>Qt::ToolButtonTextOnly</enum>
- </property>
- <property name="arrowType">
- <enum>Qt::DownArrow</enum>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="3" column="0" colspan="2">
- <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>
- <resources>
- <include location="../resources/resources.qrc"/>
- </resources>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/surgeryNumber.ui b/src/openmolar/qt-designer/surgeryNumber.ui
deleted file mode 100644
index a01249f..0000000
--- a/src/openmolar/qt-designer/surgeryNumber.ui
+++ /dev/null
@@ -1,135 +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>301</width>
- <height>167</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Question</string>
- </property>
- <property name="windowIcon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/logo.png</normaloff>:/logo.png</iconset>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="3" column="0" colspan="3">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="0" colspan="3">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Please set the Surgery Number</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" 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>
- <item row="1" column="0" colspan="3">
- <widget class="QComboBox" name="comboBox">
- <item>
- <property name="text">
- <string>Reception Machine</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Surgery One</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Surgery Two</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Surgery Three</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Surgery Four</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Surgery Five</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Surgery Six</string>
- </property>
- </item>
- </widget>
- </item>
- </layout>
- </widget>
- <resources>
- <include location="../resources/resources.qrc"/>
- </resources>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/toothPerioProps.ui b/src/openmolar/qt-designer/toothPerioProps.ui
deleted file mode 100644
index e618378..0000000
--- a/src/openmolar/qt-designer/toothPerioProps.ui
+++ /dev/null
@@ -1,330 +0,0 @@
-<ui version="4.0" >
- <class>Form</class>
- <widget class="QWidget" name="Form" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>499</width>
- <height>148</height>
- </rect>
- </property>
- <property name="minimumSize" >
- <size>
- <width>0</width>
- <height>120</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>16777215</width>
- <height>517</height>
- </size>
- </property>
- <property name="windowTitle" >
- <string>Form</string>
- </property>
- <layout class="QGridLayout" name="gridLayout" >
- <item row="0" column="0" >
- <widget class="QLabel" name="tooth_label" >
- <property name="maximumSize" >
- <size>
- <width>16777215</width>
- <height>28</height>
- </size>
- </property>
- <property name="font" >
- <font>
- <pointsize>14</pointsize>
- </font>
- </property>
- <property name="text" >
- <string>ToothId</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="3" colspan="2" >
- <widget class="QComboBox" name="comboBox" >
- <item>
- <property name="text" >
- <string>Pocketing</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>Bleeding</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>Plaque</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>Recession</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>Furcation</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>Suppuration</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>Mobility</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>Other</string>
- </property>
- </item>
- </widget>
- </item>
- <item rowspan="2" row="1" column="0" >
- <widget class="QFrame" name="orig_frame" >
- <property name="minimumSize" >
- <size>
- <width>100</width>
- <height>100</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>16777215</width>
- <height>100</height>
- </size>
- </property>
- <property name="frameShape" >
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow" >
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item rowspan="2" row="1" column="1" >
- <widget class="QFrame" name="new_frame" >
- <property name="minimumSize" >
- <size>
- <width>100</width>
- <height>100</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>16777215</width>
- <height>100</height>
- </size>
- </property>
- <property name="frameShape" >
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow" >
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="2" >
- <widget class="QPushButton" name="copy_pushButton" >
- <property name="maximumSize" >
- <size>
- <width>16777215</width>
- <height>28</height>
- </size>
- </property>
- <property name="text" >
- <string>Copy &All</string>
- </property>
- </widget>
- </item>
- <item row="1" column="3" >
- <widget class="QPushButton" name="cp_pushButton" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize" >
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>40</width>
- <height>28</height>
- </size>
- </property>
- <property name="toolTip" >
- <string>delete tooth data</string>
- </property>
- <property name="text" >
- <string>Cp</string>
- </property>
- </widget>
- </item>
- <item row="1" column="4" >
- <widget class="QPushButton" name="clear_pushButton" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize" >
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>40</width>
- <height>28</height>
- </size>
- </property>
- <property name="toolTip" >
- <string>delete tooth data</string>
- </property>
- <property name="text" >
- <string/>
- </property>
- <property name="icon" >
- <iconset resource="../resources/resources.qrc" >
- <normaloff>:/eraser.png</normaloff>:/eraser.png</iconset>
- </property>
- </widget>
- </item>
- <item row="2" column="2" colspan="2" >
- <layout class="QHBoxLayout" name="horizontalLayout" >
- <item>
- <widget class="QPushButton" name="leftTooth_pushButton" >
- <property name="minimumSize" >
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- <property name="toolTip" >
- <string>Apply and move Back a tooth</string>
- </property>
- <property name="text" >
- <string/>
- </property>
- <property name="icon" >
- <iconset resource="../resources/resources.qrc" >
- <normaloff>:/back.png</normaloff>:/back.png</iconset>
- </property>
- <property name="iconSize" >
- <size>
- <width>24</width>
- <height>18</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="le_frame" >
- <property name="maximumSize" >
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="frameShape" >
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow" >
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="rightTooth_pushButton" >
- <property name="minimumSize" >
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- <property name="toolTip" >
- <string>Apply & Move to Next Tooth</string>
- </property>
- <property name="text" >
- <string/>
- </property>
- <property name="icon" >
- <iconset resource="../resources/resources.qrc" >
- <normaloff>:/forward.png</normaloff>:/forward.png</iconset>
- </property>
- <property name="iconSize" >
- <size>
- <width>24</width>
- <height>18</height>
- </size>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="2" column="4" >
- <widget class="QComboBox" name="mobilitycomboBox" >
- <property name="maximumSize" >
- <size>
- <width>16777215</width>
- <height>28</height>
- </size>
- </property>
- <item>
- <property name="text" >
- <string>-</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>I</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>II</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>III</string>
- </property>
- </item>
- </widget>
- </item>
- </layout>
- </widget>
- <resources>
- <include location="../resources/resources.qrc" />
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/toothProps.ui b/src/openmolar/qt-designer/toothProps.ui
deleted file mode 100644
index ffb6f77..0000000
--- a/src/openmolar/qt-designer/toothProps.ui
+++ /dev/null
@@ -1,548 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>150</width>
- <height>479</height>
- </rect>
- </property>
- <property name="minimumSize">
- <size>
- <width>150</width>
- <height>459</height>
- </size>
- </property>
- <property name="windowTitle">
- <string>Form</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="margin">
- <number>2</number>
- </property>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QPushButton" name="edit_pushButton">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/icons/pencil.png</normaloff>:/icons/pencil.png</iconset>
- </property>
- <property name="flat">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="tooth_label">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>14</pointsize>
- </font>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="clear_pushButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>delete tooth data</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/eraser.png</normaloff>:/eraser.png</iconset>
- </property>
- <property name="flat">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QFrame" name="editframe">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>131</width>
- <height>24</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>24</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Plain</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="comments_comboBox">
- <item>
- <property name="text">
- <string>ADD COMMENTS</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>!KUO</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>!Mobile Tooth</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>!Early Caries</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>!Filling Missing</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>!Chipped</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>!Cracked</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>!Poor Prognosis</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>!Extract Soon</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>!Implant required</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>DELETE COMMENTS</string>
- </property>
- </item>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>120</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <property name="spacing">
- <number>2</number>
- </property>
- <property name="margin">
- <number>2</number>
- </property>
- <item>
- <widget class="QPushButton" name="am_pushButton">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>48</width>
- <height>24</height>
- </size>
- </property>
- <property name="autoFillBackground">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>AM</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="co_pushButton">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>48</width>
- <height>24</height>
- </size>
- </property>
- <property name="autoFillBackground">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>CO</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="gl_pushButton">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>48</width>
- <height>24</height>
- </size>
- </property>
- <property name="autoFillBackground">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>GL</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="gold_pushButton">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>48</width>
- <height>24</height>
- </size>
- </property>
- <property name="autoFillBackground">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Go</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="porc_pushButton">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>48</width>
- <height>24</height>
- </size>
- </property>
- <property name="autoFillBackground">
- <bool>true</bool>
- </property>
- <property name="text">
- <string>Po</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="1" column="0">
- <widget class="QPushButton" name="ex_pushButton">
- <property name="minimumSize">
- <size>
- <width>32</width>
- <height>24</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>80</width>
- <height>40</height>
- </size>
- </property>
- <property name="toolTip">
- <string>extract (plan only!)</string>
- </property>
- <property name="text">
- <string>EX</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QPushButton" name="rt_pushButton">
- <property name="minimumSize">
- <size>
- <width>32</width>
- <height>24</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>80</width>
- <height>40</height>
- </size>
- </property>
- <property name="toolTip">
- <string>root treatment</string>
- </property>
- <property name="text">
- <string>RT</string>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QPushButton" name="leftTooth_pushButton">
- <property name="minimumSize">
- <size>
- <width>32</width>
- <height>24</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>80</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Apply and move Back a tooth</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/back.png</normaloff>:/back.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>18</height>
- </size>
- </property>
- <property name="flat">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QPushButton" name="dressing_pushButton">
- <property name="minimumSize">
- <size>
- <width>32</width>
- <height>24</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>80</width>
- <height>40</height>
- </size>
- </property>
- <property name="toolTip">
- <string>porcelain veneer</string>
- </property>
- <property name="text">
- <string>DR</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QPushButton" name="pushButton">
- <property name="minimumSize">
- <size>
- <width>32</width>
- <height>24</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>80</width>
- <height>40</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Apply & Add Another Item</string>
- </property>
- <property name="text">
- <string>&&</string>
- </property>
- <property name="iconSize">
- <size>
- <width>18</width>
- <height>24</height>
- </size>
- </property>
- <property name="flat">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QPushButton" name="rightTooth_pushButton">
- <property name="minimumSize">
- <size>
- <width>32</width>
- <height>24</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>80</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Apply & Move to Next Tooth</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../resources/resources.qrc">
- <normaloff>:/forward.png</normaloff>:/forward.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>18</height>
- </size>
- </property>
- <property name="flat">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="Line" name="line">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QScrollArea" name="cb_scrollArea">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>140</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="widgetResizable">
- <bool>true</bool>
- </property>
- <widget class="QWidget" name="scrollAreaWidgetContents">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>144</width>
- <height>147</height>
- </rect>
- </property>
- </widget>
- </widget>
- </item>
- </layout>
- </widget>
- <resources>
- <include location="../resources/resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt-designer/toothprops_full_edit.ui b/src/openmolar/qt-designer/toothprops_full_edit.ui
deleted file mode 100644
index 40aeb79..0000000
--- a/src/openmolar/qt-designer/toothprops_full_edit.ui
+++ /dev/null
@@ -1,143 +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>360</width>
- <height>420</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Tooth Property Editor</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="tooth_label">
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- </font>
- </property>
- <property name="text">
- <string>UR8</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Items</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTableWidget" name="tableWidget">
- <attribute name="horizontalHeaderDefaultSectionSize">
- <number>50</number>
- </attribute>
- <attribute name="horizontalHeaderMinimumSectionSize">
- <number>50</number>
- </attribute>
- <attribute name="horizontalHeaderStretchLastSection">
- <bool>true</bool>
- </attribute>
- <attribute name="verticalHeaderVisible">
- <bool>false</bool>
- </attribute>
- <attribute name="verticalHeaderDefaultSectionSize">
- <number>50</number>
- </attribute>
- <attribute name="verticalHeaderMinimumSectionSize">
- <number>50</number>
- </attribute>
- <attribute name="verticalHeaderStretchLastSection">
- <bool>false</bool>
- </attribute>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Database Line</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QFrame" name="frame">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>32</height>
- </size>
- </property>
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- <property name="centerButtons">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>Dialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>Dialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
diff --git a/src/openmolar/qt-designer/treatmentItemWidget.ui b/src/openmolar/qt-designer/treatmentItemWidget.ui
deleted file mode 100644
index 8b83e68..0000000
--- a/src/openmolar/qt-designer/treatmentItemWidget.ui
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Form</class>
- <widget class="QWidget" name="Form">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>415</width>
- <height>31</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Form</string>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="topMargin">
- <number>3</number>
- </property>
- <property name="bottomMargin">
- <number>3</number>
- </property>
- <item>
- <widget class="QSpinBox" name="spinBox">
- <property name="maximumSize">
- <size>
- <width>60</width>
- <height>16777215</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>TextLabel</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/openmolar/qt4gui/appointment_gui_modules/list_models.py b/src/openmolar/qt4gui/appointment_gui_modules/list_models.py
index 0cd6dc4..aa08edf 100644
--- a/src/openmolar/qt4gui/appointment_gui_modules/list_models.py
+++ b/src/openmolar/qt4gui/appointment_gui_modules/list_models.py
@@ -137,8 +137,12 @@ class SimpleListModel(QtCore.QAbstractListModel):
if app.flag == -128:
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,
+ " ".join(
+ [tx for tx in (
+ app.trt1, app.trt2, app.trt3) if tx != ""]),
+ app.dent_inits)
else:
info = "%s %s with %s" % (app.readableDate,
app.readableTime, app.dent_inits)
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 8b67a24..5db21c2 100644
--- a/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py
+++ b/src/openmolar/qt4gui/appointment_gui_modules/pt_diary_treemodel.py
@@ -103,6 +103,7 @@ class treeModel(QtCore.QAbstractItemModel):
'''
a model to display a feetables data
'''
+ appointments_changed_signal = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(treeModel, self).__init__(parent)
@@ -123,6 +124,7 @@ class treeModel(QtCore.QAbstractItemModel):
self.clear()
self.appointments = appointments
self.setupModelData()
+ self.appointments_changed_signal.emit()
def setSelectedAppt(self, appt):
if appt and self.om_gui:
diff --git a/src/openmolar/qt4gui/charts/charts_gui.py b/src/openmolar/qt4gui/charts/charts_gui.py
index 02c861c..c86c692 100644
--- a/src/openmolar/qt4gui/charts/charts_gui.py
+++ b/src/openmolar/qt4gui/charts/charts_gui.py
@@ -132,9 +132,11 @@ def flipDeciduous(om_gui):
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):
+ for chart in (om_gui.ui.staticChartWidget,
+ om_gui.ui.planChartWidget,
+ om_gui.ui.completedChartWidget,
+ om_gui.ui.summaryChartWidget
+ ):
chart.chartgrid = om_gui.pt.chartgrid
#--necessary to restore the chart to full dentition
chart.update()
@@ -210,23 +212,6 @@ def selectChartedTooth(om_gui, x, y):
om_gui.selectedChartWidget == "st")
-def bpe_dates(om_gui):
- '''
- updates the date in the bpe date groupbox
- '''
- #--bpe = "basic periodontal exam"
- om_gui.ui.bpeDateComboBox.clear()
- om_gui.ui.bpe_textBrowser.setPlainText("")
- if om_gui.pt.bpe == []:
- om_gui.ui.bpeDateComboBox.addItem(QtCore.QString("NO BPE"))
- else:
- l = copy.deepcopy(om_gui.pt.bpe)
- 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
@@ -254,39 +239,6 @@ def bpe_table(om_gui, arg):
om_gui.ui.bpe_textBrowser.setHtml("")
-def periochart_dates(om_gui):
- '''
- multiple perio charts on multiple dates....
- display those dates in a combo box
- '''
- om_gui.ui.perioChartDateComboBox.clear()
- for date in om_gui.pt.perioData.keys():
- om_gui.ui.perioChartDateComboBox.addItem(QtCore.QString(date))
- 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 selected_date in om_gui.pt.perioData:
- perioD = om_gui.pt.perioData[selected_date]
- #--headers=("Recession", "Pocketing", "Plaque", "Bleeding", "Other",
- #--"Suppuration", "Furcation", "Mobility")
- for key in perioD.keys():
- for i in range(8):
- om_gui.ui.perioChartWidgets[i].setProps(key, perioD[key][i])
- else:
- om_gui.advise("no perio data found for", selected_date)
- for i in range(8):
- om_gui.ui.perioChartWidgets[i].props = {}
- for chart in om_gui.ui.perioChartWidgets:
- chart.update()
-
-
def chartsTable(om_gui):
'''
update the charts table
@@ -303,7 +255,7 @@ def chartsTable(om_gui):
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
@@ -332,7 +284,5 @@ def chartsTable(om_gui):
om_gui.ui.planChartWidget.setToothProps(tooth, pItem.lower())
om_gui.ui.completedChartWidget.setToothProps(tooth, cItem.lower())
- if static_text[:2] in ("AT", "TM", "UE"):
- om_gui.ui.perioChartWidget.setToothProps(tooth, static_text)
om_gui.ui.chartsTableWidget.resizeColumnsToContents()
om_gui.ui.chartsTableWidget.setCurrentCell(0, 0)
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py b/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py
deleted file mode 100644
index 09382d9..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_apptOpenDay.py
+++ /dev/null
@@ -1,219 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/apptOpenDay.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(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.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)
- 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.setObjectName(_fromUtf8("label_3"))
- self.gridLayout_2.addWidget(self.label_3, 1, 1, 1, 1)
- self.dateEdit = QtGui.QDateEdit(Dialog)
- self.dateEdit.setMinimumSize(QtCore.QSize(140, 0))
- self.dateEdit.setCalendarPopup(True)
- self.dateEdit.setObjectName(_fromUtf8("dateEdit"))
- self.gridLayout_2.addWidget(self.dateEdit, 1, 2, 1, 1)
- self.label = QtGui.QLabel(Dialog)
- self.label.setLayoutDirection(QtCore.Qt.RightToLeft)
- self.label.setObjectName(_fromUtf8("label"))
- self.gridLayout_2.addWidget(self.label, 2, 0, 1, 2)
- self.memo_lineEdit = QtGui.QLineEdit(Dialog)
- self.memo_lineEdit.setMaxLength(30)
- self.memo_lineEdit.setObjectName(_fromUtf8("memo_lineEdit"))
- self.gridLayout_2.addWidget(self.memo_lineEdit, 2, 2, 1, 2)
- self.frame = QtGui.QFrame(Dialog)
- self.frame.setMinimumSize(QtCore.QSize(522, 0))
- self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
- self.frame.setFrameShadow(QtGui.QFrame.Raised)
- self.frame.setObjectName(_fromUtf8("frame"))
- 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.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.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- 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.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.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.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- 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.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.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.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.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.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- 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.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.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.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)
- 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.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.QMetaObject.connectSlotsByName(Dialog)
-
- def retranslateUi(self, Dialog):
- Dialog.setWindowTitle(_("Open a Day"))
- self.label_2.setText(_("Clinician"))
- self.label_3.setText(_("Date to Open"))
- self.label.setText(_("Day Memo - optional"))
- self.label_10.setText(_("Day Start"))
- self.es1_checkBox.setText(_("Morning Emergency Slot"))
- self.label_4.setText(_("Start"))
- self.label_7.setText(_("Finish"))
- self.lunch_checkBox.setText(_("Lunch"))
- self.label_5.setText(_("Start"))
- self.label_8.setText(_("Finish"))
- self.es2_checkBox.setText(_("Afternoon Emergency Slot "))
- self.label_6.setText(_("Start"))
- self.label_9.setText(_("Finish"))
- self.label_11.setText(_("Day Finish"))
-
-
-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_apptTools.py b/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py
deleted file mode 100644
index 35de4f1..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_apptTools.py
+++ /dev/null
@@ -1,98 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/apptTools.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_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)
- MainWindow.setWindowIcon(icon)
- self.centralwidget = QtGui.QWidget(MainWindow)
- self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
- self.gridLayout = QtGui.QGridLayout(self.centralwidget)
- self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
- self.label = QtGui.QLabel(self.centralwidget)
- self.label.setFrameShape(QtGui.QFrame.NoFrame)
- self.label.setText(_fromUtf8(""))
- self.label.setPixmap(QtGui.QPixmap(_fromUtf8(":/appt_ov.png")))
- self.label.setScaledContents(True)
- 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.gridLayout.addWidget(self.extendBook_pushButton, 0, 1, 1, 1)
- self.removeOld_pushButton = QtGui.QPushButton(self.centralwidget)
- 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.gridLayout.addWidget(self.editWeeks_pushButton, 3, 1, 1, 1)
- self.openDay_pushButton = QtGui.QPushButton(self.centralwidget)
- self.openDay_pushButton.setObjectName(_fromUtf8("openDay_pushButton"))
- self.gridLayout.addWidget(self.openDay_pushButton, 4, 1, 1, 1)
- self.blocks_pushButton = QtGui.QPushButton(self.centralwidget)
- self.blocks_pushButton.setObjectName(_fromUtf8("blocks_pushButton"))
- self.gridLayout.addWidget(self.blocks_pushButton, 1, 1, 1, 1)
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtGui.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 599, 22))
- self.menubar.setObjectName(_fromUtf8("menubar"))
- self.menu_Quit = QtGui.QMenu(self.menubar)
- self.menu_Quit.setObjectName(_fromUtf8("menu_Quit"))
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtGui.QStatusBar(MainWindow)
- self.statusbar.setObjectName(_fromUtf8("statusbar"))
- MainWindow.setStatusBar(self.statusbar)
- self.menubar.addAction(self.menu_Quit.menuAction())
-
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- def retranslateUi(self, MainWindow):
- MainWindow.setWindowTitle(_("Appointment Tools"))
- 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.openDay_pushButton.setText(_("Open A Day"))
- self.blocks_pushButton.setText(_("Insert regular blocks"))
- self.menu_Quit.setTitle(_("&Quit"))
-
-from openmolar.qt4gui import resources_rc
-
-if __name__ == "__main__":
- import gettext
- gettext.install("openmolar")
- import sys
- app = QtGui.QApplication(sys.argv)
- MainWindow = QtGui.QMainWindow()
- ui = Ui_MainWindow()
- ui.setupUi(MainWindow)
- MainWindow.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
deleted file mode 100644
index 8392740..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_block_wizard.py
+++ /dev/null
@@ -1,162 +0,0 @@
-#! /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'
-#
-# 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(403, 437)
- self.gridLayout_2 = QtGui.QGridLayout(Dialog)
- self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
- self.label_7 = QtGui.QLabel(Dialog)
- self.label_7.setAlignment(QtCore.Qt.AlignCenter)
- self.label_7.setObjectName(_fromUtf8("label_7"))
- self.gridLayout_2.addWidget(self.label_7, 0, 0, 1, 4)
- self.label_2 = QtGui.QLabel(Dialog)
- self.label_2.setObjectName(_fromUtf8("label_2"))
- self.gridLayout_2.addWidget(self.label_2, 2, 0, 1, 1)
- self.start_dateEdit = QtGui.QDateEdit(Dialog)
- self.start_dateEdit.setMinimumSize(QtCore.QSize(120, 0))
- 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)
- self.gridLayout_2.addItem(spacerItem, 2, 3, 1, 1)
- self.label_3 = QtGui.QLabel(Dialog)
- self.label_3.setObjectName(_fromUtf8("label_3"))
- self.gridLayout_2.addWidget(self.label_3, 3, 0, 1, 1)
- self.end_dateEdit = QtGui.QDateEdit(Dialog)
- self.end_dateEdit.setMinimumSize(QtCore.QSize(120, 0))
- 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)
- 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)
- 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)
- self.gridLayout_2.addItem(spacerItem3, 5, 3, 1, 1)
- self.label_6 = QtGui.QLabel(Dialog)
- self.label_6.setObjectName(_fromUtf8("label_6"))
- self.gridLayout_2.addWidget(self.label_6, 6, 0, 1, 1)
- self.lineEdit = QtGui.QLineEdit(Dialog)
- self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
- self.gridLayout_2.addWidget(self.lineEdit, 6, 1, 1, 3)
- self.day_groupBox = QtGui.QGroupBox(Dialog)
- self.day_groupBox.setObjectName(_fromUtf8("day_groupBox"))
- 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.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)
- self.gridLayout_2.addItem(spacerItem4, 8, 0, 1, 1)
- self.time_frame = QtGui.QFrame(Dialog)
- self.time_frame.setFrameShape(QtGui.QFrame.NoFrame)
- self.time_frame.setFrameShadow(QtGui.QFrame.Raised)
- 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.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)
- self.gridLayout_2.addItem(spacerItem5, 11, 0, 1, 1)
- self.progress_label = QtGui.QLabel(Dialog)
- self.progress_label.setText(_fromUtf8(""))
- self.progress_label.setObjectName(_fromUtf8("progress_label"))
- self.gridLayout_2.addWidget(self.progress_label, 9, 0, 1, 4)
- self.progressBar = QtGui.QProgressBar(Dialog)
- self.progressBar.setProperty("value", 0)
- self.progressBar.setObjectName(_fromUtf8("progressBar"))
- 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.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_2.setText(_("Start Date"))
- self.label_3.setText(_("End Date (inclusive)"))
- self.label_4.setText(_("Time"))
- self.label_5.setText(_("Length"))
- self.label_6.setText(_("Text to Apply"))
- self.day_groupBox.setTitle(_("Days to Apply"))
- self.clinicians_groupBox.setTitle(_("Clinicians"))
- self.spinBox.setSuffix(_(" minutes"))
-
-
-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_bridge_denture.py b/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py
deleted file mode 100644
index be62174..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_bridge_denture.py
+++ /dev/null
@@ -1,164 +0,0 @@
-#! /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'
-#
-# 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(632, 480)
- self.gridLayout = QtGui.QGridLayout(Dialog)
- self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
- self.frame = QtGui.QFrame(Dialog)
- self.frame.setMinimumSize(QtCore.QSize(331, 451))
- self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
- self.frame.setFrameShadow(QtGui.QFrame.Raised)
- self.frame.setObjectName(_fromUtf8("frame"))
- self.gridLayout.addWidget(self.frame, 0, 0, 2, 1)
- self.tabWidget = QtGui.QTabWidget(Dialog)
- self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
- self.tab = QtGui.QWidget()
- self.tab.setObjectName(_fromUtf8("tab"))
- self.verticalLayout_4 = QtGui.QVBoxLayout(self.tab)
- self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
- self.radioButton = QtGui.QRadioButton(self.tab)
- self.radioButton.setObjectName(_fromUtf8("radioButton"))
- self.verticalLayout_4.addWidget(self.radioButton)
- self.radioButton_2 = QtGui.QRadioButton(self.tab)
- self.radioButton_2.setObjectName(_fromUtf8("radioButton_2"))
- self.verticalLayout_4.addWidget(self.radioButton_2)
- 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)
- self.verticalLayout_4.addItem(spacerItem)
- self.tabWidget.addTab(self.tab, _fromUtf8(""))
- self.tab_2 = QtGui.QWidget()
- self.tab_2.setObjectName(_fromUtf8("tab_2"))
- self.verticalLayout_3 = QtGui.QVBoxLayout(self.tab_2)
- self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
- self.frame_2 = QtGui.QFrame(self.tab_2)
- self.frame_2.setFrameShape(QtGui.QFrame.StyledPanel)
- self.frame_2.setFrameShadow(QtGui.QFrame.Raised)
- self.frame_2.setObjectName(_fromUtf8("frame_2"))
- self.verticalLayout = QtGui.QVBoxLayout(self.frame_2)
- self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
- self.label_2 = QtGui.QLabel(self.frame_2)
- self.label_2.setObjectName(_fromUtf8("label_2"))
- self.verticalLayout.addWidget(self.label_2)
- self.radioButton_4 = QtGui.QRadioButton(self.frame_2)
- self.radioButton_4.setObjectName(_fromUtf8("radioButton_4"))
- self.verticalLayout.addWidget(self.radioButton_4)
- self.radioButton_8 = QtGui.QRadioButton(self.frame_2)
- self.radioButton_8.setObjectName(_fromUtf8("radioButton_8"))
- self.verticalLayout.addWidget(self.radioButton_8)
- self.radioButton_5 = QtGui.QRadioButton(self.frame_2)
- self.radioButton_5.setObjectName(_fromUtf8("radioButton_5"))
- self.verticalLayout.addWidget(self.radioButton_5)
- self.radioButton_6 = QtGui.QRadioButton(self.frame_2)
- self.radioButton_6.setObjectName(_fromUtf8("radioButton_6"))
- self.verticalLayout.addWidget(self.radioButton_6)
- self.radioButton_7 = QtGui.QRadioButton(self.frame_2)
- self.radioButton_7.setObjectName(_fromUtf8("radioButton_7"))
- self.verticalLayout.addWidget(self.radioButton_7)
- self.verticalLayout_3.addWidget(self.frame_2)
- self.frame_3 = QtGui.QFrame(self.tab_2)
- self.frame_3.setFrameShape(QtGui.QFrame.StyledPanel)
- self.frame_3.setFrameShadow(QtGui.QFrame.Raised)
- self.frame_3.setObjectName(_fromUtf8("frame_3"))
- self.verticalLayout_2 = QtGui.QVBoxLayout(self.frame_3)
- self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
- self.label = QtGui.QLabel(self.frame_3)
- self.label.setObjectName(_fromUtf8("label"))
- self.verticalLayout_2.addWidget(self.label)
- self.radioButton_9 = QtGui.QRadioButton(self.frame_3)
- self.radioButton_9.setObjectName(_fromUtf8("radioButton_9"))
- self.verticalLayout_2.addWidget(self.radioButton_9)
- self.radioButton_13 = QtGui.QRadioButton(self.frame_3)
- self.radioButton_13.setObjectName(_fromUtf8("radioButton_13"))
- self.verticalLayout_2.addWidget(self.radioButton_13)
- self.radioButton_10 = QtGui.QRadioButton(self.frame_3)
- self.radioButton_10.setObjectName(_fromUtf8("radioButton_10"))
- self.verticalLayout_2.addWidget(self.radioButton_10)
- self.radioButton_11 = QtGui.QRadioButton(self.frame_3)
- self.radioButton_11.setObjectName(_fromUtf8("radioButton_11"))
- self.verticalLayout_2.addWidget(self.radioButton_11)
- self.radioButton_12 = QtGui.QRadioButton(self.frame_3)
- self.radioButton_12.setObjectName(_fromUtf8("radioButton_12"))
- self.verticalLayout_2.addWidget(self.radioButton_12)
- self.verticalLayout_3.addWidget(self.frame_3)
- self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
- 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.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.QMetaObject.connectSlotsByName(Dialog)
-
- def retranslateUi(self, Dialog):
- Dialog.setWindowTitle(_("Bridge - Denture Entry"))
- 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.label_2.setText(_("Upper"))
- self.radioButton_4.setText(_("Full (acrylic)"))
- self.radioButton_8.setText(_("Full (co-chrome)"))
- self.radioButton_5.setText(_("Partial (acrylic)"))
- self.radioButton_6.setText(_("Partial (co-chrome)"))
- self.radioButton_7.setText(_("Other"))
- self.label.setText(_("Lower"))
- self.radioButton_9.setText(_("Full (acrylic)"))
- self.radioButton_13.setText(_("Full (co-chrome)"))
- 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"))
-
-
-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_completionDate.py b/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py
deleted file mode 100644
index 72cffc6..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_completionDate.py
+++ /dev/null
@@ -1,104 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/completionDate.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(340, 227)
- self.verticalLayout = QtGui.QVBoxLayout(Dialog)
- self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
- self.pt_label = QtGui.QLabel(Dialog)
- self.pt_label.setAlignment(QtCore.Qt.AlignCenter)
- self.pt_label.setObjectName(_fromUtf8("pt_label"))
- self.verticalLayout.addWidget(self.pt_label)
- self.autoComplete_label = QtGui.QLabel(Dialog)
- self.autoComplete_label.setAlignment(QtCore.Qt.AlignCenter)
- 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)
- self.verticalLayout.addItem(spacerItem)
- self.horizontalLayout = QtGui.QHBoxLayout()
- self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
- self.label_4 = QtGui.QLabel(Dialog)
- self.label_4.setLayoutDirection(QtCore.Qt.RightToLeft)
- self.label_4.setObjectName(_fromUtf8("label_4"))
- self.horizontalLayout.addWidget(self.label_4)
- self.dateEdit = QtGui.QDateEdit(Dialog)
- self.dateEdit.setFocusPolicy(QtCore.Qt.TabFocus)
- self.dateEdit.setCalendarPopup(True)
- self.dateEdit.setObjectName(_fromUtf8("dateEdit"))
- self.horizontalLayout.addWidget(self.dateEdit)
- self.verticalLayout.addLayout(self.horizontalLayout)
- self.label = QtGui.QLabel(Dialog)
- self.label.setAlignment(QtCore.Qt.AlignCenter)
- 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)
- 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.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.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.label_4.setText(_("Suggested completion Date"))
- self.label.setText(_("Apply this Date Now?\n"
- "(course can be re-opened later if necessary)"))
-
-
-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_editmemos.py b/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py
deleted file mode 100644
index 9cf34ca..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_editmemos.py
+++ /dev/null
@@ -1,90 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/editmemos.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(417, 395)
- self.gridLayout = QtGui.QGridLayout(Dialog)
- self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
- self.label = QtGui.QLabel(Dialog)
- font = QtGui.QFont()
- font.setBold(True)
- font.setWeight(75)
- self.label.setFont(font)
- self.label.setText(_fromUtf8(""))
- self.label.setAlignment(QtCore.Qt.AlignCenter)
- self.label.setWordWrap(True)
- self.label.setObjectName(_fromUtf8("label"))
- self.gridLayout.addWidget(self.label, 0, 0, 1, 3)
- self.label_2 = QtGui.QLabel(Dialog)
- self.label_2.setObjectName(_fromUtf8("label_2"))
- self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
- self.lineEdit = QtGui.QLineEdit(Dialog)
- self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
- self.gridLayout.addWidget(self.lineEdit, 1, 1, 1, 2)
- self.label_3 = QtGui.QLabel(Dialog)
- self.label_3.setObjectName(_fromUtf8("label_3"))
- self.gridLayout.addWidget(self.label_3, 2, 0, 1, 2)
- self.scrollArea = QtGui.QScrollArea(Dialog)
- self.scrollArea.setFrameShape(QtGui.QFrame.NoFrame)
- self.scrollArea.setWidgetResizable(True)
- self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
- self.scrollAreaWidgetContents = QtGui.QWidget()
- self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 399, 238))
- 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.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.QMetaObject.connectSlotsByName(Dialog)
-
- def retranslateUi(self, Dialog):
- Dialog.setWindowTitle(_("Edit Memos"))
- self.label_2.setText(_("Global Memo"))
- self.label_3.setText(_("Clinician Memos"))
-
-
-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_initialise.py b/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py
deleted file mode 100644
index 1f60996..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_initialise.py
+++ /dev/null
@@ -1,637 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/initialise.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_MainWindow(object):
-
- def setupUi(self, MainWindow):
- MainWindow.setObjectName(_fromUtf8("MainWindow"))
- MainWindow.resize(800, 507)
- self.centralwidget = QtGui.QWidget(MainWindow)
- self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
- self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
- self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
- self.tabWidget = QtGui.QTabWidget(self.centralwidget)
- self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
- self.tab_8 = QtGui.QWidget()
- self.tab_8.setObjectName(_fromUtf8("tab_8"))
- self.gridLayout_3 = QtGui.QGridLayout(self.tab_8)
- self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
- self.label_17 = QtGui.QLabel(self.tab_8)
- self.label_17.setObjectName(_fromUtf8("label_17"))
- 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.gridLayout_3.addWidget(self.modifydb_radioButton, 4, 0, 1, 1)
- self.comboBox = QtGui.QComboBox(self.tab_8)
- self.comboBox.setEnabled(False)
- self.comboBox.setObjectName(_fromUtf8("comboBox"))
- self.gridLayout_3.addWidget(self.comboBox, 4, 1, 1, 1)
- self.line = QtGui.QFrame(self.tab_8)
- self.line.setFrameShape(QtGui.QFrame.HLine)
- 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)
- 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.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.tabWidget.addTab(self.tab_8, _fromUtf8(""))
- self.tab = QtGui.QWidget()
- self.tab.setObjectName(_fromUtf8("tab"))
- self.verticalLayout_3 = QtGui.QVBoxLayout(self.tab)
- self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
- self.practice_frame = QtGui.QFrame(self.tab)
- self.practice_frame.setFrameShape(QtGui.QFrame.StyledPanel)
- self.practice_frame.setFrameShadow(QtGui.QFrame.Raised)
- self.practice_frame.setObjectName(_fromUtf8("practice_frame"))
- self.gridLayout = QtGui.QGridLayout(self.practice_frame)
- self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
- self.label = QtGui.QLabel(self.practice_frame)
- self.label.setObjectName(_fromUtf8("label"))
- self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
- self.lineEdit = QtGui.QLineEdit(self.practice_frame)
- self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
- self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
- self.label_18 = QtGui.QLabel(self.practice_frame)
- self.label_18.setObjectName(_fromUtf8("label_18"))
- self.gridLayout.addWidget(self.label_18, 0, 2, 1, 1)
- self.label_2 = QtGui.QLabel(self.practice_frame)
- self.label_2.setObjectName(_fromUtf8("label_2"))
- self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
- self.lineEdit_2 = QtGui.QLineEdit(self.practice_frame)
- self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
- self.gridLayout.addWidget(self.lineEdit_2, 1, 1, 1, 1)
- self.label_22 = QtGui.QLabel(self.practice_frame)
- self.label_22.setText(_fromUtf8(""))
- self.label_22.setObjectName(_fromUtf8("label_22"))
- self.gridLayout.addWidget(self.label_22, 1, 2, 1, 1)
- self.label_3 = QtGui.QLabel(self.practice_frame)
- self.label_3.setObjectName(_fromUtf8("label_3"))
- self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
- self.lineEdit_3 = QtGui.QLineEdit(self.practice_frame)
- self.lineEdit_3.setObjectName(_fromUtf8("lineEdit_3"))
- self.gridLayout.addWidget(self.lineEdit_3, 2, 1, 1, 1)
- self.label_23 = QtGui.QLabel(self.practice_frame)
- self.label_23.setText(_fromUtf8(""))
- self.label_23.setObjectName(_fromUtf8("label_23"))
- self.gridLayout.addWidget(self.label_23, 2, 2, 1, 1)
- self.label_4 = QtGui.QLabel(self.practice_frame)
- self.label_4.setObjectName(_fromUtf8("label_4"))
- self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1)
- self.lineEdit_4 = QtGui.QLineEdit(self.practice_frame)
- self.lineEdit_4.setObjectName(_fromUtf8("lineEdit_4"))
- self.gridLayout.addWidget(self.lineEdit_4, 3, 1, 1, 1)
- self.label_27 = QtGui.QLabel(self.practice_frame)
- self.label_27.setText(_fromUtf8(""))
- self.label_27.setObjectName(_fromUtf8("label_27"))
- self.gridLayout.addWidget(self.label_27, 3, 2, 1, 1)
- self.label_5 = QtGui.QLabel(self.practice_frame)
- self.label_5.setObjectName(_fromUtf8("label_5"))
- self.gridLayout.addWidget(self.label_5, 4, 0, 1, 1)
- self.lineEdit_5 = QtGui.QLineEdit(self.practice_frame)
- self.lineEdit_5.setObjectName(_fromUtf8("lineEdit_5"))
- self.gridLayout.addWidget(self.lineEdit_5, 4, 1, 1, 1)
- self.label_19 = QtGui.QLabel(self.practice_frame)
- self.label_19.setText(_fromUtf8(""))
- self.label_19.setObjectName(_fromUtf8("label_19"))
- self.gridLayout.addWidget(self.label_19, 4, 2, 1, 1)
- self.label_6 = QtGui.QLabel(self.practice_frame)
- self.label_6.setObjectName(_fromUtf8("label_6"))
- self.gridLayout.addWidget(self.label_6, 5, 0, 1, 1)
- self.lineEdit_6 = QtGui.QLineEdit(self.practice_frame)
- self.lineEdit_6.setObjectName(_fromUtf8("lineEdit_6"))
- self.gridLayout.addWidget(self.lineEdit_6, 5, 1, 1, 1)
- self.label_28 = QtGui.QLabel(self.practice_frame)
- self.label_28.setText(_fromUtf8(""))
- self.label_28.setObjectName(_fromUtf8("label_28"))
- self.gridLayout.addWidget(self.label_28, 5, 2, 1, 1)
- self.label_7 = QtGui.QLabel(self.practice_frame)
- self.label_7.setObjectName(_fromUtf8("label_7"))
- self.gridLayout.addWidget(self.label_7, 6, 0, 1, 1)
- self.lineEdit_7 = QtGui.QLineEdit(self.practice_frame)
- self.lineEdit_7.setObjectName(_fromUtf8("lineEdit_7"))
- self.gridLayout.addWidget(self.lineEdit_7, 6, 1, 1, 1)
- self.label_25 = QtGui.QLabel(self.practice_frame)
- self.label_25.setText(_fromUtf8(""))
- self.label_25.setObjectName(_fromUtf8("label_25"))
- self.gridLayout.addWidget(self.label_25, 6, 2, 1, 1)
- self.label_8 = QtGui.QLabel(self.practice_frame)
- self.label_8.setObjectName(_fromUtf8("label_8"))
- self.gridLayout.addWidget(self.label_8, 7, 0, 1, 1)
- self.lineEdit_8 = QtGui.QLineEdit(self.practice_frame)
- self.lineEdit_8.setObjectName(_fromUtf8("lineEdit_8"))
- self.gridLayout.addWidget(self.lineEdit_8, 7, 1, 1, 1)
- self.label_26 = QtGui.QLabel(self.practice_frame)
- self.label_26.setText(_fromUtf8(""))
- self.label_26.setObjectName(_fromUtf8("label_26"))
- self.gridLayout.addWidget(self.label_26, 7, 2, 1, 1)
- self.label_9 = QtGui.QLabel(self.practice_frame)
- self.label_9.setObjectName(_fromUtf8("label_9"))
- self.gridLayout.addWidget(self.label_9, 8, 0, 1, 1)
- self.lineEdit_9 = QtGui.QLineEdit(self.practice_frame)
- self.lineEdit_9.setObjectName(_fromUtf8("lineEdit_9"))
- self.gridLayout.addWidget(self.lineEdit_9, 8, 1, 1, 1)
- self.label_24 = QtGui.QLabel(self.practice_frame)
- self.label_24.setText(_fromUtf8(""))
- self.label_24.setObjectName(_fromUtf8("label_24"))
- self.gridLayout.addWidget(self.label_24, 8, 2, 1, 1)
- self.label_10 = QtGui.QLabel(self.practice_frame)
- self.label_10.setObjectName(_fromUtf8("label_10"))
- self.gridLayout.addWidget(self.label_10, 9, 0, 1, 1)
- self.lineEdit_10 = QtGui.QLineEdit(self.practice_frame)
- self.lineEdit_10.setObjectName(_fromUtf8("lineEdit_10"))
- self.gridLayout.addWidget(self.lineEdit_10, 9, 1, 1, 1)
- self.label_21 = QtGui.QLabel(self.practice_frame)
- self.label_21.setText(_fromUtf8(""))
- self.label_21.setObjectName(_fromUtf8("label_21"))
- self.gridLayout.addWidget(self.label_21, 9, 2, 1, 1)
- self.label_11 = QtGui.QLabel(self.practice_frame)
- self.label_11.setObjectName(_fromUtf8("label_11"))
- self.gridLayout.addWidget(self.label_11, 10, 0, 1, 1)
- self.lineEdit_11 = QtGui.QLineEdit(self.practice_frame)
- self.lineEdit_11.setObjectName(_fromUtf8("lineEdit_11"))
- self.gridLayout.addWidget(self.lineEdit_11, 10, 1, 1, 1)
- self.label_20 = QtGui.QLabel(self.practice_frame)
- self.label_20.setText(_fromUtf8(""))
- 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)
- self.verticalLayout_3.addItem(spacerItem1)
- self.tabWidget.addTab(self.tab, _fromUtf8(""))
- self.tab_2 = QtGui.QWidget()
- self.tab_2.setObjectName(_fromUtf8("tab_2"))
- self.verticalLayout_2 = QtGui.QVBoxLayout(self.tab_2)
- self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
- self.label_12 = QtGui.QLabel(self.tab_2)
- self.label_12.setObjectName(_fromUtf8("label_12"))
- 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.setObjectName(_fromUtf8("users_tableWidget"))
- self.users_tableWidget.setColumnCount(6)
- self.users_tableWidget.setRowCount(0)
- item = QtGui.QTableWidgetItem()
- self.users_tableWidget.setHorizontalHeaderItem(0, item)
- item = QtGui.QTableWidgetItem()
- self.users_tableWidget.setHorizontalHeaderItem(1, item)
- item = QtGui.QTableWidgetItem()
- self.users_tableWidget.setHorizontalHeaderItem(2, item)
- item = QtGui.QTableWidgetItem()
- self.users_tableWidget.setHorizontalHeaderItem(3, item)
- item = QtGui.QTableWidgetItem()
- self.users_tableWidget.setHorizontalHeaderItem(4, item)
- item = QtGui.QTableWidgetItem()
- self.users_tableWidget.setHorizontalHeaderItem(5, item)
- self.verticalLayout_2.addWidget(self.users_tableWidget)
- self.frame_2 = QtGui.QFrame(self.tab_2)
- self.frame_2.setFrameShape(QtGui.QFrame.StyledPanel)
- self.frame_2.setFrameShadow(QtGui.QFrame.Raised)
- self.frame_2.setObjectName(_fromUtf8("frame_2"))
- self.horizontalLayout = QtGui.QHBoxLayout(self.frame_2)
- self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
- 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.verticalLayout_11.addWidget(self.modifyUser_pushButton)
- self.horizontalLayout.addLayout(self.verticalLayout_11)
- self.user_groupBox = QtGui.QGroupBox(self.frame_2)
- self.user_groupBox.setObjectName(_fromUtf8("user_groupBox"))
- self.gridLayout_8 = QtGui.QGridLayout(self.user_groupBox)
- self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8"))
- self.label_14 = QtGui.QLabel(self.user_groupBox)
- self.label_14.setObjectName(_fromUtf8("label_14"))
- self.gridLayout_8.addWidget(self.label_14, 0, 0, 1, 1)
- self.userName_lineEdit = QtGui.QLineEdit(self.user_groupBox)
- self.userName_lineEdit.setObjectName(_fromUtf8("userName_lineEdit"))
- self.gridLayout_8.addWidget(self.userName_lineEdit, 0, 1, 1, 1)
- self.label_13 = QtGui.QLabel(self.user_groupBox)
- self.label_13.setObjectName(_fromUtf8("label_13"))
- self.gridLayout_8.addWidget(self.label_13, 1, 0, 1, 1)
- self.userInits_lineEdit = QtGui.QLineEdit(self.user_groupBox)
- self.userInits_lineEdit.setObjectName(_fromUtf8("userInits_lineEdit"))
- self.gridLayout_8.addWidget(self.userInits_lineEdit, 1, 1, 1, 1)
- self.label_15 = QtGui.QLabel(self.user_groupBox)
- self.label_15.setObjectName(_fromUtf8("label_15"))
- self.gridLayout_8.addWidget(self.label_15, 2, 0, 1, 1)
- self.userGroup_comboBox = QtGui.QComboBox(self.user_groupBox)
- self.userGroup_comboBox.setObjectName(_fromUtf8("userGroup_comboBox"))
- self.userGroup_comboBox.addItem(_fromUtf8(""))
- self.userGroup_comboBox.addItem(_fromUtf8(""))
- self.userGroup_comboBox.addItem(_fromUtf8(""))
- self.userGroup_comboBox.addItem(_fromUtf8(""))
- self.gridLayout_8.addWidget(self.userGroup_comboBox, 2, 1, 1, 1)
- 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.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"))
- self.gridLayout_8.addWidget(self.user_date_label, 3, 0, 1, 1)
- self.user_dateEdit = QtGui.QDateEdit(self.user_groupBox)
- self.user_dateEdit.setCalendarPopup(True)
- self.user_dateEdit.setObjectName(_fromUtf8("user_dateEdit"))
- self.gridLayout_8.addWidget(self.user_dateEdit, 3, 1, 1, 1)
- self.horizontalLayout.addWidget(self.user_groupBox)
- self.newUser_pushButton = QtGui.QPushButton(self.frame_2)
- self.newUser_pushButton.setEnabled(True)
- self.newUser_pushButton.setObjectName(_fromUtf8("newUser_pushButton"))
- self.horizontalLayout.addWidget(self.newUser_pushButton)
- self.verticalLayout_2.addWidget(self.frame_2)
- self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
- self.tab_3 = QtGui.QWidget()
- self.tab_3.setObjectName(_fromUtf8("tab_3"))
- self.verticalLayout_5 = QtGui.QVBoxLayout(self.tab_3)
- self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5"))
- self.label_33 = QtGui.QLabel(self.tab_3)
- self.label_33.setWordWrap(True)
- self.label_33.setObjectName(_fromUtf8("label_33"))
- self.verticalLayout_5.addWidget(self.label_33)
- self.tableWidget_2 = QtGui.QTableWidget(self.tab_3)
- self.tableWidget_2.setObjectName(_fromUtf8("tableWidget_2"))
- self.tableWidget_2.setColumnCount(4)
- self.tableWidget_2.setRowCount(0)
- item = QtGui.QTableWidgetItem()
- self.tableWidget_2.setHorizontalHeaderItem(0, item)
- item = QtGui.QTableWidgetItem()
- self.tableWidget_2.setHorizontalHeaderItem(1, item)
- item = QtGui.QTableWidgetItem()
- self.tableWidget_2.setHorizontalHeaderItem(2, item)
- item = QtGui.QTableWidgetItem()
- self.tableWidget_2.setHorizontalHeaderItem(3, item)
- self.verticalLayout_5.addWidget(self.tableWidget_2)
- self.frame_3 = QtGui.QFrame(self.tab_3)
- self.frame_3.setMinimumSize(QtCore.QSize(0, 200))
- self.frame_3.setFrameShape(QtGui.QFrame.StyledPanel)
- self.frame_3.setFrameShadow(QtGui.QFrame.Raised)
- self.frame_3.setObjectName(_fromUtf8("frame_3"))
- self.verticalLayout_7 = QtGui.QVBoxLayout(self.frame_3)
- self.verticalLayout_7.setObjectName(_fromUtf8("verticalLayout_7"))
- self.label_29 = QtGui.QLabel(self.frame_3)
- self.label_29.setObjectName(_fromUtf8("label_29"))
- self.verticalLayout_7.addWidget(self.label_29)
- self.gridLayout_4 = QtGui.QGridLayout()
- self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
- self.label_30 = QtGui.QLabel(self.frame_3)
- self.label_30.setObjectName(_fromUtf8("label_30"))
- self.gridLayout_4.addWidget(self.label_30, 0, 0, 1, 1)
- self.lineEdit_14 = QtGui.QLineEdit(self.frame_3)
- self.lineEdit_14.setObjectName(_fromUtf8("lineEdit_14"))
- self.gridLayout_4.addWidget(self.lineEdit_14, 0, 1, 1, 1)
- self.label_31 = QtGui.QLabel(self.frame_3)
- self.label_31.setObjectName(_fromUtf8("label_31"))
- self.gridLayout_4.addWidget(self.label_31, 1, 0, 1, 1)
- self.lineEdit_15 = QtGui.QLineEdit(self.frame_3)
- self.lineEdit_15.setObjectName(_fromUtf8("lineEdit_15"))
- self.gridLayout_4.addWidget(self.lineEdit_15, 1, 1, 1, 1)
- self.label_45 = QtGui.QLabel(self.frame_3)
- self.label_45.setObjectName(_fromUtf8("label_45"))
- self.gridLayout_4.addWidget(self.label_45, 2, 0, 1, 1)
- self.lineEdit_21 = QtGui.QLineEdit(self.frame_3)
- self.lineEdit_21.setText(_fromUtf8(""))
- self.lineEdit_21.setObjectName(_fromUtf8("lineEdit_21"))
- self.gridLayout_4.addWidget(self.lineEdit_21, 2, 1, 1, 1)
- self.verticalLayout_7.addLayout(self.gridLayout_4)
- self.checkBox_2 = QtGui.QCheckBox(self.frame_3)
- self.checkBox_2.setLayoutDirection(QtCore.Qt.RightToLeft)
- self.checkBox_2.setChecked(True)
- self.checkBox_2.setObjectName(_fromUtf8("checkBox_2"))
- self.verticalLayout_7.addWidget(self.checkBox_2)
- self.verticalLayout_5.addWidget(self.frame_3)
- self.tabWidget.addTab(self.tab_3, _fromUtf8(""))
- self.tab_4 = QtGui.QWidget()
- self.tab_4.setObjectName(_fromUtf8("tab_4"))
- self.verticalLayout_4 = QtGui.QVBoxLayout(self.tab_4)
- self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
- self.label_38 = QtGui.QLabel(self.tab_4)
- self.label_38.setObjectName(_fromUtf8("label_38"))
- self.verticalLayout_4.addWidget(self.label_38)
- self.tableWidget_3 = QtGui.QTableWidget(self.tab_4)
- self.tableWidget_3.setObjectName(_fromUtf8("tableWidget_3"))
- self.tableWidget_3.setColumnCount(4)
- self.tableWidget_3.setRowCount(0)
- item = QtGui.QTableWidgetItem()
- self.tableWidget_3.setHorizontalHeaderItem(0, item)
- item = QtGui.QTableWidgetItem()
- self.tableWidget_3.setHorizontalHeaderItem(1, item)
- item = QtGui.QTableWidgetItem()
- self.tableWidget_3.setHorizontalHeaderItem(2, item)
- item = QtGui.QTableWidgetItem()
- self.tableWidget_3.setHorizontalHeaderItem(3, item)
- self.verticalLayout_4.addWidget(self.tableWidget_3)
- self.frame_4 = QtGui.QFrame(self.tab_4)
- self.frame_4.setMinimumSize(QtCore.QSize(0, 200))
- self.frame_4.setFrameShape(QtGui.QFrame.StyledPanel)
- self.frame_4.setFrameShadow(QtGui.QFrame.Raised)
- self.frame_4.setObjectName(_fromUtf8("frame_4"))
- self.verticalLayout_8 = QtGui.QVBoxLayout(self.frame_4)
- self.verticalLayout_8.setObjectName(_fromUtf8("verticalLayout_8"))
- self.label_32 = QtGui.QLabel(self.frame_4)
- self.label_32.setObjectName(_fromUtf8("label_32"))
- self.verticalLayout_8.addWidget(self.label_32)
- self.gridLayout_5 = QtGui.QGridLayout()
- self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
- self.label_34 = QtGui.QLabel(self.frame_4)
- self.label_34.setObjectName(_fromUtf8("label_34"))
- self.gridLayout_5.addWidget(self.label_34, 0, 0, 1, 1)
- self.lineEdit_16 = QtGui.QLineEdit(self.frame_4)
- self.lineEdit_16.setObjectName(_fromUtf8("lineEdit_16"))
- self.gridLayout_5.addWidget(self.lineEdit_16, 0, 1, 1, 1)
- self.label_35 = QtGui.QLabel(self.frame_4)
- self.label_35.setObjectName(_fromUtf8("label_35"))
- self.gridLayout_5.addWidget(self.label_35, 1, 0, 1, 1)
- self.lineEdit_17 = QtGui.QLineEdit(self.frame_4)
- self.lineEdit_17.setObjectName(_fromUtf8("lineEdit_17"))
- self.gridLayout_5.addWidget(self.lineEdit_17, 1, 1, 1, 1)
- self.label_46 = QtGui.QLabel(self.frame_4)
- self.label_46.setObjectName(_fromUtf8("label_46"))
- self.gridLayout_5.addWidget(self.label_46, 2, 0, 1, 1)
- self.lineEdit_22 = QtGui.QLineEdit(self.frame_4)
- self.lineEdit_22.setText(_fromUtf8(""))
- self.lineEdit_22.setObjectName(_fromUtf8("lineEdit_22"))
- self.gridLayout_5.addWidget(self.lineEdit_22, 2, 1, 1, 1)
- self.verticalLayout_8.addLayout(self.gridLayout_5)
- self.checkBox_3 = QtGui.QCheckBox(self.frame_4)
- self.checkBox_3.setLayoutDirection(QtCore.Qt.RightToLeft)
- self.checkBox_3.setChecked(True)
- self.checkBox_3.setObjectName(_fromUtf8("checkBox_3"))
- self.verticalLayout_8.addWidget(self.checkBox_3)
- self.verticalLayout_4.addWidget(self.frame_4)
- self.tabWidget.addTab(self.tab_4, _fromUtf8(""))
- self.tab_5 = QtGui.QWidget()
- self.tab_5.setObjectName(_fromUtf8("tab_5"))
- self.horizontalLayout_2 = QtGui.QHBoxLayout(self.tab_5)
- self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
- self.frame_6 = QtGui.QFrame(self.tab_5)
- self.frame_6.setFrameShape(QtGui.QFrame.StyledPanel)
- self.frame_6.setFrameShadow(QtGui.QFrame.Raised)
- self.frame_6.setObjectName(_fromUtf8("frame_6"))
- self.gridLayout_7 = QtGui.QGridLayout(self.frame_6)
- self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7"))
- self.checkBox_7 = QtGui.QCheckBox(self.frame_6)
- self.checkBox_7.setChecked(True)
- self.checkBox_7.setObjectName(_fromUtf8("checkBox_7"))
- self.gridLayout_7.addWidget(self.checkBox_7, 0, 0, 1, 1)
- self.timeEdit = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit.setObjectName(_fromUtf8("timeEdit"))
- self.gridLayout_7.addWidget(self.timeEdit, 0, 1, 1, 1)
- self.timeEdit_2 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_2.setObjectName(_fromUtf8("timeEdit_2"))
- self.gridLayout_7.addWidget(self.timeEdit_2, 0, 2, 1, 1)
- self.checkBox_8 = QtGui.QCheckBox(self.frame_6)
- self.checkBox_8.setChecked(True)
- self.checkBox_8.setObjectName(_fromUtf8("checkBox_8"))
- self.gridLayout_7.addWidget(self.checkBox_8, 1, 0, 1, 1)
- self.timeEdit_3 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_3.setObjectName(_fromUtf8("timeEdit_3"))
- self.gridLayout_7.addWidget(self.timeEdit_3, 1, 1, 1, 1)
- self.timeEdit_4 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_4.setObjectName(_fromUtf8("timeEdit_4"))
- self.gridLayout_7.addWidget(self.timeEdit_4, 1, 2, 1, 1)
- self.checkBox_9 = QtGui.QCheckBox(self.frame_6)
- self.checkBox_9.setChecked(True)
- self.checkBox_9.setObjectName(_fromUtf8("checkBox_9"))
- self.gridLayout_7.addWidget(self.checkBox_9, 2, 0, 1, 1)
- self.timeEdit_5 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_5.setObjectName(_fromUtf8("timeEdit_5"))
- self.gridLayout_7.addWidget(self.timeEdit_5, 2, 1, 1, 1)
- self.timeEdit_6 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_6.setObjectName(_fromUtf8("timeEdit_6"))
- self.gridLayout_7.addWidget(self.timeEdit_6, 2, 2, 1, 1)
- self.checkBox_10 = QtGui.QCheckBox(self.frame_6)
- self.checkBox_10.setChecked(True)
- self.checkBox_10.setObjectName(_fromUtf8("checkBox_10"))
- self.gridLayout_7.addWidget(self.checkBox_10, 3, 0, 1, 1)
- self.timeEdit_7 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_7.setObjectName(_fromUtf8("timeEdit_7"))
- self.gridLayout_7.addWidget(self.timeEdit_7, 3, 1, 1, 1)
- self.timeEdit_8 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_8.setObjectName(_fromUtf8("timeEdit_8"))
- self.gridLayout_7.addWidget(self.timeEdit_8, 3, 2, 1, 1)
- self.checkBox_11 = QtGui.QCheckBox(self.frame_6)
- self.checkBox_11.setChecked(True)
- self.checkBox_11.setObjectName(_fromUtf8("checkBox_11"))
- self.gridLayout_7.addWidget(self.checkBox_11, 4, 0, 1, 1)
- self.timeEdit_10 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_10.setObjectName(_fromUtf8("timeEdit_10"))
- self.gridLayout_7.addWidget(self.timeEdit_10, 4, 1, 1, 1)
- self.timeEdit_11 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_11.setObjectName(_fromUtf8("timeEdit_11"))
- self.gridLayout_7.addWidget(self.timeEdit_11, 4, 2, 1, 1)
- self.checkBox_12 = QtGui.QCheckBox(self.frame_6)
- self.checkBox_12.setObjectName(_fromUtf8("checkBox_12"))
- self.gridLayout_7.addWidget(self.checkBox_12, 5, 0, 1, 1)
- self.timeEdit_12 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_12.setObjectName(_fromUtf8("timeEdit_12"))
- self.gridLayout_7.addWidget(self.timeEdit_12, 5, 1, 1, 1)
- self.timeEdit_9 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_9.setObjectName(_fromUtf8("timeEdit_9"))
- self.gridLayout_7.addWidget(self.timeEdit_9, 5, 2, 1, 1)
- self.checkBox_13 = QtGui.QCheckBox(self.frame_6)
- self.checkBox_13.setObjectName(_fromUtf8("checkBox_13"))
- self.gridLayout_7.addWidget(self.checkBox_13, 6, 0, 1, 1)
- self.timeEdit_13 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_13.setObjectName(_fromUtf8("timeEdit_13"))
- self.gridLayout_7.addWidget(self.timeEdit_13, 6, 1, 1, 1)
- self.timeEdit_14 = QtGui.QTimeEdit(self.frame_6)
- self.timeEdit_14.setObjectName(_fromUtf8("timeEdit_14"))
- self.gridLayout_7.addWidget(self.timeEdit_14, 6, 2, 1, 1)
- self.horizontalLayout_2.addWidget(self.frame_6)
- self.tabWidget.addTab(self.tab_5, _fromUtf8(""))
- self.tab_7 = QtGui.QWidget()
- self.tab_7.setObjectName(_fromUtf8("tab_7"))
- self.verticalLayout_10 = QtGui.QVBoxLayout(self.tab_7)
- self.verticalLayout_10.setObjectName(_fromUtf8("verticalLayout_10"))
- self.tabWidget.addTab(self.tab_7, _fromUtf8(""))
- self.verticalLayout.addWidget(self.tabWidget)
- MainWindow.setCentralWidget(self.centralwidget)
- self.menubar = QtGui.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
- self.menubar.setObjectName(_fromUtf8("menubar"))
- self.menuFile = QtGui.QMenu(self.menubar)
- self.menuFile.setObjectName(_fromUtf8("menuFile"))
- MainWindow.setMenuBar(self.menubar)
- self.statusbar = QtGui.QStatusBar(MainWindow)
- self.statusbar.setObjectName(_fromUtf8("statusbar"))
- MainWindow.setStatusBar(self.statusbar)
- self.actionLoad_Template = QtGui.QAction(MainWindow)
- self.actionLoad_Template.setObjectName(
- _fromUtf8("actionLoad_Template"))
- self.action_Save_Template = QtGui.QAction(MainWindow)
- 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())
-
- self.retranslateUi(MainWindow)
- self.tabWidget.setCurrentIndex(0)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- 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.label.setText(_("Practice Name"))
- self.label_18.setText(_("Used in receipts, appointment cards etc."))
- self.label_2.setText(_("Address Line 1"))
- self.label_3.setText(_("Address Line 2"))
- self.label_4.setText(_("Address Line 3"))
- self.label_5.setText(_("Town"))
- self.label_6.setText(_("County"))
- self.label_7.setText(_("Postcode / Zip"))
- self.label_8.setText(_("Telephone"))
- 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"))
- item = self.users_tableWidget.horizontalHeaderItem(0)
- item.setText(_("Id"))
- item = self.users_tableWidget.horizontalHeaderItem(1)
- item.setText(_("Initials"))
- item = self.users_tableWidget.horizontalHeaderItem(2)
- item.setText(_("Name"))
- item = self.users_tableWidget.horizontalHeaderItem(3)
- item.setText(_("User Group"))
- item = self.users_tableWidget.horizontalHeaderItem(4)
- item.setText(_("Active?"))
- item = self.users_tableWidget.horizontalHeaderItem(5)
- item.setText(_("DeActivation Date"))
- self.modifyUser_pushButton.setText(_("Modify Selected User"))
- self.user_groupBox.setTitle(_("New User Details"))
- self.label_14.setText(_("Name"))
- self.label_13.setText(_("Initials"))
- self.label_15.setText(_("User Group"))
- self.userGroup_comboBox.setItemText(0, _("Standard User"))
- self.userGroup_comboBox.setItemText(1, _("Dentist"))
- self.userGroup_comboBox.setItemText(2, _("Hygienist"))
- self.userGroup_comboBox.setItemText(3, _("Receptionist"))
- 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.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) "))
- item = self.tableWidget_2.horizontalHeaderItem(0)
- item.setText(_("Initials"))
- item = self.tableWidget_2.horizontalHeaderItem(1)
- item.setText(_("Name"))
- item = self.tableWidget_2.horizontalHeaderItem(2)
- item.setText(_("User Group"))
- item = self.tableWidget_2.horizontalHeaderItem(3)
- item.setText(_("Active?"))
- self.label_29.setText(_("Add a Dentist"))
- self.label_30.setText(_("Initials"))
- 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.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) "))
- item = self.tableWidget_3.horizontalHeaderItem(0)
- item.setText(_("Initials"))
- item = self.tableWidget_3.horizontalHeaderItem(1)
- item.setText(_("Name"))
- item = self.tableWidget_3.horizontalHeaderItem(2)
- item.setText(_("User Group"))
- item = self.tableWidget_3.horizontalHeaderItem(3)
- item.setText(_("Active?"))
- self.label_32.setText(_("Add a Dentist"))
- self.label_34.setText(_("Initials"))
- 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.checkBox_7.setText(_("Monday"))
- self.checkBox_8.setText(_("Tuesday"))
- self.checkBox_9.setText(_("Wednesday"))
- self.checkBox_10.setText(_("Thursday"))
- 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.menuFile.setTitle(_("File"))
- self.actionLoad_Template.setText(_("L&oad Template"))
- self.action_Save_Template.setText(_("&Save Template"))
-
-
-if __name__ == "__main__":
- import gettext
- gettext.install("openmolar")
- import sys
- app = QtGui.QApplication(sys.argv)
- MainWindow = QtGui.QMainWindow()
- ui = Ui_MainWindow()
- 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 8141858..fbaae2e 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_main.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_main.py
@@ -3,8 +3,8 @@
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/main.ui'
#
-# Created: Thu May 1 15:04:57 2014
-# by: PyQt4 UI code generator 4.10.3
+# Created: Mon Jun 23 13:41:48 2014
+# by: PyQt4 UI code generator 4.11
#
# WARNING! All changes made in this file will be lost!
@@ -283,7 +283,7 @@ class Ui_MainWindow(object):
self.scrollArea_4.setObjectName(_fromUtf8("scrollArea_4"))
self.scrollAreaWidgetContents_7 = QtGui.QWidget()
self.scrollAreaWidgetContents_7.setGeometry(
- QtCore.QRect(0, 0, 469, 644))
+ QtCore.QRect(0, 0, 743, 644))
self.scrollAreaWidgetContents_7.setObjectName(
_fromUtf8("scrollAreaWidgetContents_7"))
self.verticalLayout_6 = QtGui.QVBoxLayout(
@@ -919,7 +919,7 @@ class Ui_MainWindow(object):
self.scrollArea_5.setObjectName(_fromUtf8("scrollArea_5"))
self.scrollAreaWidgetContents_8 = QtGui.QWidget()
self.scrollAreaWidgetContents_8.setGeometry(
- QtCore.QRect(0, 0, 423, 421))
+ QtCore.QRect(0, 0, 725, 421))
self.scrollAreaWidgetContents_8.setObjectName(
_fromUtf8("scrollAreaWidgetContents_8"))
self.gridLayout = QtGui.QGridLayout(self.scrollAreaWidgetContents_8)
@@ -1112,7 +1112,7 @@ class Ui_MainWindow(object):
self.scrollArea_2.setObjectName(_fromUtf8("scrollArea_2"))
self.scrollAreaWidgetContents_5 = QtGui.QWidget()
self.scrollAreaWidgetContents_5.setGeometry(
- QtCore.QRect(0, 0, 283, 470))
+ QtCore.QRect(0, 0, 745, 470))
self.scrollAreaWidgetContents_5.setObjectName(
_fromUtf8("scrollAreaWidgetContents_5"))
self.horizontalLayout_26 = QtGui.QHBoxLayout(
@@ -1500,8 +1500,6 @@ class Ui_MainWindow(object):
self.chartsTableWidget.setSelectionBehavior(
QtGui.QAbstractItemView.SelectItems)
self.chartsTableWidget.setObjectName(_fromUtf8("chartsTableWidget"))
- self.chartsTableWidget.setColumnCount(0)
- self.chartsTableWidget.setRowCount(0)
self.horizontalLayout_4.addWidget(self.chartsTableWidget)
self.stackedWidget.addWidget(self.table)
self.charts = QtGui.QWidget()
@@ -1654,7 +1652,7 @@ class Ui_MainWindow(object):
_fromUtf8("estimate_scrollArea"))
self.scrollAreaWidgetContents_11 = QtGui.QWidget()
self.scrollAreaWidgetContents_11.setGeometry(
- QtCore.QRect(0, 0, 98, 200))
+ QtCore.QRect(0, 0, 532, 375))
self.scrollAreaWidgetContents_11.setObjectName(
_fromUtf8("scrollAreaWidgetContents_11"))
self.horizontalLayout_19 = QtGui.QHBoxLayout(
@@ -1677,7 +1675,7 @@ class Ui_MainWindow(object):
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
self.scrollAreaWidgetContents_4 = QtGui.QWidget()
self.scrollAreaWidgetContents_4.setGeometry(
- QtCore.QRect(0, 0, 139, 212))
+ QtCore.QRect(0, 0, 198, 375))
self.scrollAreaWidgetContents_4.setObjectName(
_fromUtf8("scrollAreaWidgetContents_4"))
self.verticalLayout_9 = QtGui.QVBoxLayout(
@@ -1730,139 +1728,18 @@ class Ui_MainWindow(object):
self.tab_patient_perio = QtGui.QWidget()
self.tab_patient_perio.setObjectName(_fromUtf8("tab_patient_perio"))
self.horizontalLayout_8 = QtGui.QHBoxLayout(self.tab_patient_perio)
+ self.horizontalLayout_8.setSpacing(0)
+ self.horizontalLayout_8.setMargin(0)
self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8"))
- 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.scrollAreaWidgetContents_6 = QtGui.QWidget()
- 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.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- 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))
- self.perioChart_frame.setFrameShape(QtGui.QFrame.StyledPanel)
- 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.setMinimumSize(QtCore.QSize(0, 0))
- self.perioChartData_scrollArea.setWidgetResizable(True)
- 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.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.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.groupBox_11 = QtGui.QGroupBox(self.scrollAreaWidgetContents_6)
- self.groupBox_11.setObjectName(_fromUtf8("groupBox_11"))
- self.verticalLayout_16 = QtGui.QVBoxLayout(self.groupBox_11)
- self.verticalLayout_16.setObjectName(_fromUtf8("verticalLayout_16"))
- self.label_41 = QtGui.QLabel(self.groupBox_11)
- font = QtGui.QFont()
- font.setPointSize(12)
- self.label_41.setFont(font)
- self.label_41.setAlignment(QtCore.Qt.AlignCenter)
- 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.verticalLayout_16.addWidget(self.perioChartDateComboBox)
- self.newPerioChartPushButton = QtGui.QPushButton(self.groupBox_11)
- self.newPerioChartPushButton.setAutoDefault(False)
- 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)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- 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.setFrameShape(QtGui.QFrame.StyledPanel)
- self.perioToothProps_frame.setFrameShadow(QtGui.QFrame.Raised)
- 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))
- self.groupBox_12.setObjectName(_fromUtf8("groupBox_12"))
- self.verticalLayout_15 = QtGui.QVBoxLayout(self.groupBox_12)
- self.verticalLayout_15.setObjectName(_fromUtf8("verticalLayout_15"))
- 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.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.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- 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.setObjectName(_fromUtf8("bpeDateComboBox"))
- self.verticalLayout_15.addWidget(self.bpeDateComboBox)
- self.gridLayout_15.addWidget(self.groupBox_12, 2, 2, 1, 1)
- self.perioCharts_scrollArea.setWidget(self.scrollAreaWidgetContents_6)
- self.horizontalLayout_8.addWidget(self.perioCharts_scrollArea)
+ self.perio_scrollArea = QtGui.QScrollArea(self.tab_patient_perio)
+ self.perio_scrollArea.setWidgetResizable(True)
+ self.perio_scrollArea.setObjectName(_fromUtf8("perio_scrollArea"))
+ self.scrollAreaWidgetContents = QtGui.QWidget()
+ self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 756, 393))
+ self.scrollAreaWidgetContents.setObjectName(
+ _fromUtf8("scrollAreaWidgetContents"))
+ self.perio_scrollArea.setWidget(self.scrollAreaWidgetContents)
+ self.horizontalLayout_8.addWidget(self.perio_scrollArea)
self.tabWidget.addTab(self.tab_patient_perio, _fromUtf8(""))
self.tab_patient_history = QtGui.QWidget()
self.tab_patient_history.setObjectName(
@@ -1892,10 +1769,6 @@ class Ui_MainWindow(object):
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.verticalLayout_25.addWidget(self.past_course_estimates_pushButton)
self.pastCourses_pushButton = QtGui.QPushButton(self.frame_3)
self.pastCourses_pushButton.setObjectName(
_fromUtf8("pastCourses_pushButton"))
@@ -1918,21 +1791,6 @@ class Ui_MainWindow(object):
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.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(
- self.historyPrint_pushButton.sizePolicy(
- ).hasHeightForWidth(
- ))
- self.historyPrint_pushButton.setSizePolicy(sizePolicy)
- self.historyPrint_pushButton.setIcon(icon10)
- self.historyPrint_pushButton.setObjectName(
- _fromUtf8("historyPrint_pushButton"))
- self.verticalLayout_25.addWidget(self.historyPrint_pushButton)
spacerItem15 = QtGui.QSpacerItem(
20,
123,
@@ -1963,6 +1821,33 @@ class Ui_MainWindow(object):
self.ptAtts_checkBox = QtGui.QCheckBox(self.frame_3)
self.ptAtts_checkBox.setObjectName(_fromUtf8("ptAtts_checkBox"))
self.verticalLayout_25.addWidget(self.ptAtts_checkBox)
+ spacerItem16 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_25.addItem(spacerItem16)
+ spacerItem17 = QtGui.QSpacerItem(
+ 20,
+ 40,
+ QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.verticalLayout_25.addItem(spacerItem17)
+ self.historyPrint_pushButton = QtGui.QPushButton(self.frame_3)
+ sizePolicy = QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Preferred,
+ QtGui.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(
+ self.historyPrint_pushButton.sizePolicy(
+ ).hasHeightForWidth(
+ ))
+ self.historyPrint_pushButton.setSizePolicy(sizePolicy)
+ self.historyPrint_pushButton.setIcon(icon10)
+ self.historyPrint_pushButton.setObjectName(
+ _fromUtf8("historyPrint_pushButton"))
+ self.verticalLayout_25.addWidget(self.historyPrint_pushButton)
self.horizontalLayout_29.addWidget(self.frame_3)
self.tabWidget.addTab(self.tab_patient_history, _fromUtf8(""))
self.new_notes_frame = QtGui.QFrame(self.splitter_patient)
@@ -2225,12 +2110,12 @@ class Ui_MainWindow(object):
self.cashbookDentComboBox.setObjectName(
_fromUtf8("cashbookDentComboBox"))
self.gridLayout_5.addWidget(self.cashbookDentComboBox, 1, 2, 1, 1)
- spacerItem16 = QtGui.QSpacerItem(
+ spacerItem18 = QtGui.QSpacerItem(
389,
20,
QtGui.QSizePolicy.Expanding,
QtGui.QSizePolicy.Minimum)
- self.gridLayout_5.addItem(spacerItem16, 1, 5, 1, 1)
+ self.gridLayout_5.addItem(spacerItem18, 1, 5, 1, 1)
self.all_payments_radioButton = QtGui.QRadioButton(self.tab_cashbook)
self.all_payments_radioButton.setChecked(True)
self.all_payments_radioButton.setObjectName(
@@ -2441,12 +2326,12 @@ class Ui_MainWindow(object):
_fromUtf8("loadAccountsTable_pushButton"))
self.horizontalLayout_28.addWidget(self.loadAccountsTable_pushButton)
self.gridLayout_9.addLayout(self.horizontalLayout_28, 0, 0, 1, 1)
- spacerItem17 = QtGui.QSpacerItem(
+ spacerItem19 = QtGui.QSpacerItem(
206,
20,
QtGui.QSizePolicy.Expanding,
QtGui.QSizePolicy.Minimum)
- self.gridLayout_9.addItem(spacerItem17, 0, 1, 1, 1)
+ self.gridLayout_9.addItem(spacerItem19, 0, 1, 1, 1)
self.printAccountsTable_pushButton = QtGui.QPushButton(
self.tab_accounts)
self.printAccountsTable_pushButton.setIcon(icon10)
@@ -2478,15 +2363,13 @@ class Ui_MainWindow(object):
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)
- spacerItem18 = QtGui.QSpacerItem(
+ spacerItem20 = QtGui.QSpacerItem(
746,
20,
QtGui.QSizePolicy.Expanding,
QtGui.QSizePolicy.Minimum)
- self.gridLayout_9.addItem(spacerItem18, 2, 0, 1, 2)
+ self.gridLayout_9.addItem(spacerItem20, 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)
@@ -2555,12 +2438,12 @@ class Ui_MainWindow(object):
4,
1,
1)
- spacerItem19 = QtGui.QSpacerItem(
+ spacerItem21 = QtGui.QSpacerItem(
40,
20,
QtGui.QSizePolicy.Expanding,
QtGui.QSizePolicy.Minimum)
- self.gridLayout_10.addItem(spacerItem19, 1, 1, 1, 1)
+ self.gridLayout_10.addItem(spacerItem21, 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"))
@@ -2597,12 +2480,12 @@ class Ui_MainWindow(object):
self.chooseFeescale_comboBox.setObjectName(
_fromUtf8("chooseFeescale_comboBox"))
self.verticalLayout_10.addWidget(self.chooseFeescale_comboBox)
- spacerItem20 = QtGui.QSpacerItem(
+ spacerItem22 = QtGui.QSpacerItem(
20,
40,
QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Expanding)
- self.verticalLayout_10.addItem(spacerItem20)
+ self.verticalLayout_10.addItem(spacerItem22)
self.frame_6 = QtGui.QFrame(self.frame_5)
self.frame_6.setEnabled(True)
self.frame_6.setFrameShape(QtGui.QFrame.StyledPanel)
@@ -2660,12 +2543,12 @@ class Ui_MainWindow(object):
_fromUtf8("feesearch_results_label"))
self.gridLayout_16.addWidget(self.feesearch_results_label, 4, 0, 1, 2)
self.verticalLayout_10.addWidget(self.frame_6)
- spacerItem21 = QtGui.QSpacerItem(
+ spacerItem23 = QtGui.QSpacerItem(
20,
40,
QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Expanding)
- self.verticalLayout_10.addItem(spacerItem21)
+ self.verticalLayout_10.addItem(spacerItem23)
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(
@@ -2683,12 +2566,12 @@ class Ui_MainWindow(object):
self.feeCompress_radioButton.setObjectName(
_fromUtf8("feeCompress_radioButton"))
self.verticalLayout_10.addWidget(self.feeCompress_radioButton)
- spacerItem22 = QtGui.QSpacerItem(
+ spacerItem24 = QtGui.QSpacerItem(
20,
40,
QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Expanding)
- self.verticalLayout_10.addItem(spacerItem22)
+ self.verticalLayout_10.addItem(spacerItem24)
self.groupBox = QtGui.QGroupBox(self.frame_5)
self.groupBox.setObjectName(_fromUtf8("groupBox"))
self.verticalLayout_13 = QtGui.QVBoxLayout(self.groupBox)
@@ -2701,12 +2584,12 @@ class Ui_MainWindow(object):
_fromUtf8("documents_pushButton"))
self.verticalLayout_13.addWidget(self.documents_pushButton)
self.verticalLayout_10.addWidget(self.groupBox)
- spacerItem23 = QtGui.QSpacerItem(
+ spacerItem25 = QtGui.QSpacerItem(
20,
40,
QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Expanding)
- self.verticalLayout_10.addItem(spacerItem23)
+ self.verticalLayout_10.addItem(spacerItem25)
self.feeadjuster_groupBox = QtGui.QGroupBox(self.frame_5)
self.feeadjuster_groupBox.setEnabled(True)
self.feeadjuster_groupBox.setToolTip(_fromUtf8(""))
@@ -2823,12 +2706,12 @@ class Ui_MainWindow(object):
self.feeSearch_lineEdit_2.setObjectName(
_fromUtf8("feeSearch_lineEdit_2"))
self.gridLayout_30.addWidget(self.feeSearch_lineEdit_2, 1, 0, 1, 2)
- spacerItem24 = QtGui.QSpacerItem(
+ spacerItem26 = QtGui.QSpacerItem(
67,
20,
QtGui.QSizePolicy.Expanding,
QtGui.QSizePolicy.Minimum)
- self.gridLayout_30.addItem(spacerItem24, 2, 0, 1, 1)
+ self.gridLayout_30.addItem(spacerItem26, 2, 0, 1, 1)
self.feeSearch_pushButton_2 = QtGui.QPushButton(self.frame_9)
self.feeSearch_pushButton_2.setEnabled(False)
sizePolicy = QtGui.QSizePolicy(
@@ -2953,8 +2836,12 @@ class Ui_MainWindow(object):
self.menuCashbook.setObjectName(_fromUtf8("menuCashbook"))
self.menuDaybook = QtGui.QMenu(self.menu_Prefences)
self.menuDaybook.setObjectName(_fromUtf8("menuDaybook"))
+ self.menu_History = QtGui.QMenu(self.menu_Prefences)
+ self.menu_History.setObjectName(_fromUtf8("menu_History"))
self.menuTools = QtGui.QMenu(self.menubar)
self.menuTools.setObjectName(_fromUtf8("menuTools"))
+ self.menu_Appointments = QtGui.QMenu(self.menubar)
+ self.menu_Appointments.setObjectName(_fromUtf8("menu_Appointments"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
@@ -2977,12 +2864,6 @@ class Ui_MainWindow(object):
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.actionAppointment_Tools = QtGui.QAction(MainWindow)
- self.actionAppointment_Tools.setObjectName(
- _fromUtf8("actionAppointment_Tools"))
self.actionChange_Language = QtGui.QAction(MainWindow)
self.actionChange_Language.setObjectName(
_fromUtf8("actionChange_Language"))
@@ -3036,9 +2917,6 @@ class Ui_MainWindow(object):
self.actionEdit_Phrasebooks = QtGui.QAction(MainWindow)
self.actionEdit_Phrasebooks.setObjectName(
_fromUtf8("actionEdit_Phrasebooks"))
- self.actionDocuments_Dialog = QtGui.QAction(MainWindow)
- 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"))
@@ -3046,10 +2924,52 @@ class Ui_MainWindow(object):
self.actionEnable_Filters.setCheckable(True)
self.actionEnable_Filters.setObjectName(
_fromUtf8("actionEnable_Filters"))
+ self.actionEdit_Courses = QtGui.QAction(MainWindow)
+ self.actionEdit_Courses.setCheckable(True)
+ self.actionEdit_Courses.setObjectName(_fromUtf8("actionEdit_Courses"))
+ self.actionEdit_Estimates = QtGui.QAction(MainWindow)
+ self.actionEdit_Estimates.setCheckable(True)
+ self.actionEdit_Estimates.setObjectName(
+ _fromUtf8("actionEdit_Estimates"))
+ self.actionAllow_Edit_Treatment = QtGui.QAction(MainWindow)
+ self.actionAllow_Edit_Treatment.setCheckable(True)
+ self.actionAllow_Edit_Treatment.setObjectName(
+ _fromUtf8("actionAllow_Edit_Treatment"))
+ self.action_all_history_edits = QtGui.QAction(MainWindow)
+ self.action_all_history_edits.setCheckable(True)
+ self.action_all_history_edits.setObjectName(
+ _fromUtf8("action_all_history_edits"))
+ self.actionEdit_Referral_Centres = QtGui.QAction(MainWindow)
+ self.actionEdit_Referral_Centres.setObjectName(
+ _fromUtf8("actionEdit_Referral_Centres"))
+ self.actionEdit_Feescales = QtGui.QAction(MainWindow)
+ self.actionEdit_Feescales.setObjectName(
+ _fromUtf8("actionEdit_Feescales"))
+ self.actionDocuments_Dialog = QtGui.QAction(MainWindow)
+ self.actionDocuments_Dialog.setObjectName(
+ _fromUtf8("actionDocuments_Dialog"))
+ self.actionReset_Supervisor_Password = QtGui.QAction(MainWindow)
+ self.actionReset_Supervisor_Password.setObjectName(
+ _fromUtf8("actionReset_Supervisor_Password"))
+ self.actionAdd_User = QtGui.QAction(MainWindow)
+ self.actionAdd_User.setObjectName(_fromUtf8("actionAdd_User"))
+ self.actionAdd_Clinician = QtGui.QAction(MainWindow)
+ self.actionAdd_Clinician.setObjectName(
+ _fromUtf8("actionAdd_Clinician"))
+ self.actionEdit_Practice_Details = QtGui.QAction(MainWindow)
+ self.actionEdit_Practice_Details.setObjectName(
+ _fromUtf8("actionEdit_Practice_Details"))
+ self.actionClear_Today_s_Emergency_Slots = QtGui.QAction(MainWindow)
+ self.actionClear_Today_s_Emergency_Slots.setObjectName(
+ _fromUtf8("actionClear_Today_s_Emergency_Slots"))
+ self.actionInsert_Regular_Blocks = QtGui.QAction(MainWindow)
+ self.actionInsert_Regular_Blocks.setObjectName(
+ _fromUtf8("actionInsert_Regular_Blocks"))
self.menuMenu.addAction(self.action_Open_Patient)
- self.menuMenu.addSeparator()
self.menuMenu.addAction(self.action_save_patient)
+ self.menuMenu.addSeparator()
self.menuMenu.addAction(self.actionPrint_Daylists)
+ self.menuMenu.addAction(self.actionDocuments_Dialog)
self.menuMenu.addSeparator()
self.menuMenu.addAction(self.action_Quit)
self.menu_Help.addAction(self.action_About)
@@ -3066,6 +2986,10 @@ class Ui_MainWindow(object):
self.menuDaybook.addSeparator()
self.menuDaybook.addAction(self.actionAllow_Edit)
self.menuDaybook.addAction(self.actionEnable_Filters)
+ self.menu_History.addAction(self.action_all_history_edits)
+ self.menu_History.addAction(self.actionEdit_Courses)
+ self.menu_History.addAction(self.actionEdit_Estimates)
+ self.menu_History.addAction(self.actionAllow_Edit_Treatment)
self.menu_Prefences.addAction(self.actionChange_Language)
self.menu_Prefences.addSeparator()
self.menu_Prefences.addAction(self.menuView.menuAction())
@@ -3074,23 +2998,33 @@ class Ui_MainWindow(object):
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.menu_History.menuAction())
self.menu_Prefences.addAction(self.menuPrinting.menuAction())
self.menu_Prefences.addSeparator()
self.menu_Prefences.addAction(self.menuMode.menuAction())
- self.menuTools.addAction(self.actionClear_Today_s_Emergency_Slots)
- self.menuTools.addAction(self.actionAppointment_Tools)
self.menuTools.addAction(self.actionAdvanced_Record_Management)
+ self.menuTools.addSeparator()
self.menuTools.addAction(self.actionFix_Locked_New_Course_of_Treatment)
self.menuTools.addSeparator()
self.menuTools.addAction(self.actionSet_Clinician)
self.menuTools.addAction(self.actionSet_Assistant)
self.menuTools.addAction(self.actionSet_Surgery_Number)
self.menuTools.addSeparator()
- self.menuTools.addAction(self.actionDocuments_Dialog)
- self.menuTools.addSeparator()
self.menuTools.addAction(self.actionEdit_Phrasebooks)
+ self.menuTools.addAction(self.actionEdit_Referral_Centres)
+ self.menuTools.addAction(self.actionEdit_Feescales)
+ self.menuTools.addSeparator()
+ self.menuTools.addAction(self.actionReset_Supervisor_Password)
+ self.menuTools.addAction(self.actionAdd_User)
+ self.menuTools.addAction(self.actionAdd_Clinician)
+ self.menuTools.addAction(self.actionEdit_Practice_Details)
+ self.menu_Appointments.addAction(
+ self.actionClear_Today_s_Emergency_Slots)
+ self.menu_Appointments.addSeparator()
+ self.menu_Appointments.addAction(self.actionInsert_Regular_Blocks)
self.menubar.addAction(self.menuMenu.menuAction())
self.menubar.addAction(self.menu_Prefences.menuAction())
+ self.menubar.addAction(self.menu_Appointments.menuAction())
self.menubar.addAction(self.menuTools.menuAction())
self.menubar.addAction(self.menu_Help.menuAction())
self.label_9.setBuddy(self.addr3Edit)
@@ -3161,10 +3095,7 @@ class Ui_MainWindow(object):
MainWindow.setTabOrder(
self.printAccount_pushButton,
self.takePayment_pushButton)
- MainWindow.setTabOrder(
- self.takePayment_pushButton,
- self.perioChartDateComboBox)
- MainWindow.setTabOrder(self.perioChartDateComboBox, self.dnt1comboBox)
+ MainWindow.setTabOrder(self.takePayment_pushButton, self.dnt1comboBox)
MainWindow.setTabOrder(self.dnt1comboBox, self.scrollArea)
MainWindow.setTabOrder(self.scrollArea, self.accounts_tableWidget)
MainWindow.setTabOrder(
@@ -3207,18 +3138,6 @@ class Ui_MainWindow(object):
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.contract_tabWidget, self.notesPrintButton)
MainWindow.setTabOrder(
@@ -3426,22 +3345,15 @@ class Ui_MainWindow(object):
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.pastPayments_pushButton.setText(_("Past Payments"))
+ self.pastPayments_pushButton.setText(_("Payments"))
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.setText(_("Courses / Estimates"))
+ self.pastTreatment_pushButton.setText(_("Treatment"))
self.pastCourses_pushButton.setToolTip(
_("View all Courses of treatment. This includes treatment that was planned but not completed."))
self.pastCourses_pushButton.setText(_("Courses"))
@@ -3451,14 +3363,14 @@ class Ui_MainWindow(object):
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.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."))
self.debug_toolButton.setText(_("debug tools"))
self.ptAtts_checkBox.setText(_("changes only"))
+ self.historyPrint_pushButton.setToolTip(
+ _("Print the text displayed on this page."))
+ self.historyPrint_pushButton.setText(_("Print"))
self.tabWidget.setTabText(
self.tabWidget.indexOf(self.tab_patient_history),
_("History"))
@@ -3592,15 +3504,14 @@ class Ui_MainWindow(object):
self.menuMode.setTitle(_("&Mode (reception or surgery)"))
self.menuCashbook.setTitle(_("&Cashbook"))
self.menuDaybook.setTitle(_("&Daybook"))
+ self.menu_History.setTitle(_("&History"))
self.menuTools.setTitle(_("&Tools"))
+ self.menu_Appointments.setTitle(_("&Appointments"))
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.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)"))
@@ -3625,9 +3536,23 @@ class Ui_MainWindow(object):
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"))
+ self.actionEdit_Courses.setText(_("Allow Edit &Courses"))
+ self.actionEdit_Estimates.setText(_("Allow Edit &Estimates"))
+ self.actionAllow_Edit_Treatment.setText(_("Allow Edit &Treatment"))
+ self.action_all_history_edits.setText(_("Allow &ALL Edits"))
+ self.actionEdit_Referral_Centres.setText(_("Edit Referral Centres"))
+ self.actionEdit_Feescales.setText(_("Edit Feescales"))
+ self.actionDocuments_Dialog.setText(_("Open Document Dialog"))
+ self.actionReset_Supervisor_Password.setText(
+ _("Reset Supervisor Password"))
+ self.actionAdd_User.setText(_("Add User"))
+ self.actionAdd_Clinician.setText(_("Add Clinician"))
+ self.actionEdit_Practice_Details.setText(_("Edit Practice Details"))
+ self.actionClear_Today_s_Emergency_Slots.setText(
+ _("Clear Today\'s Emergency Slots"))
+ self.actionInsert_Regular_Blocks.setText(_("Insert Regular Blocks"))
from PyQt4 import QtWebKit
from openmolar.qt4gui import resources_rc
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py b/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py
deleted file mode 100644
index 5dd0c5f..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_memo_item.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#! /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'
-#
-# 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_Form(object):
-
- def setupUi(self, Form):
- Form.setObjectName(_fromUtf8("Form"))
- Form.resize(400, 28)
- self.horizontalLayout = QtGui.QHBoxLayout(Form)
- 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.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(
- self.label.sizePolicy().hasHeightForWidth())
- self.label.setSizePolicy(sizePolicy)
- self.label.setMinimumSize(QtCore.QSize(60, 0))
- self.label.setMaximumSize(QtCore.QSize(60, 16777215))
- self.label.setAlignment(QtCore.Qt.AlignCenter)
- self.label.setObjectName(_fromUtf8("label"))
- self.horizontalLayout.addWidget(self.label)
- self.lineEdit = QtGui.QLineEdit(Form)
- self.lineEdit.setMaxLength(30)
- self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
- self.horizontalLayout.addWidget(self.lineEdit)
-
- self.retranslateUi(Form)
- QtCore.QMetaObject.connectSlotsByName(Form)
-
- def retranslateUi(self, Form):
- Form.setWindowTitle(_("Form"))
- self.label.setText(_("TextLabel"))
-
-
-if __name__ == "__main__":
- import gettext
- gettext.install("openmolar")
- import sys
- app = QtGui.QApplication(sys.argv)
- Form = QtGui.QWidget()
- ui = Ui_Form()
- ui.setupUi(Form)
- Form.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
deleted file mode 100644
index f9f3889..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_newSetup.py
+++ /dev/null
@@ -1,408 +0,0 @@
-#! /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: 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!
-
-from PyQt4 import QtCore, QtGui
-
-try:
- _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
- def _fromUtf8(s):
- return s
-
-
-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(self.centralwidget)
- font = QtGui.QFont()
- font.setBold(True)
- font.setWeight(75)
- self.title_label.setFont(font)
- self.title_label.setAlignment(QtCore.Qt.AlignCenter)
- self.title_label.setObjectName(_fromUtf8("title_label"))
- self.verticalLayout.addWidget(self.title_label)
- self.stackedWidget = QtGui.QStackedWidget(self.centralwidget)
- self.stackedWidget.setObjectName(_fromUtf8("stackedWidget"))
- 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.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.setWordWrap(True)
- self.label_7.setObjectName(_fromUtf8("label_7"))
- self.verticalLayout_3.addWidget(self.label_7)
- 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)
- self.verticalLayout_3.addItem(spacerItem)
- 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.application_password_page)
- self.mainPassword_label.setMinimumSize(QtCore.QSize(0, 80))
- font = QtGui.QFont()
- font.setBold(False)
- font.setWeight(50)
- self.mainPassword_label.setFont(font)
- self.mainPassword_label.setAlignment(QtCore.Qt.AlignCenter)
- 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.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.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.gridLayout.addWidget(self.main_password_lineEdit, 1, 1, 1, 1)
- self.mainpassword_checkBox = QtGui.QCheckBox(
- self.application_password_page)
- self.mainpassword_checkBox.setFocusPolicy(QtCore.Qt.NoFocus)
- self.mainpassword_checkBox.setObjectName(
- _fromUtf8("mainpassword_checkBox"))
- self.gridLayout.addWidget(self.mainpassword_checkBox, 1, 2, 1, 1)
- 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.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.gridLayout.addWidget(self.repeat_password_lineEdit, 2, 1, 1, 1)
- spacerItem1 = QtGui.QSpacerItem(
- 20,
- 40,
- QtGui.QSizePolicy.Minimum,
- QtGui.QSizePolicy.Expanding)
- self.gridLayout.addItem(spacerItem1, 3, 1, 1, 1)
- 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.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.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.mysql_server_location)
- self.label_12.setEnabled(True)
- 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.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.mysql_server_location)
- self.label_14.setEnabled(True)
- 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.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.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)
- self.gridLayout_2.addItem(spacerItem2, 3, 2, 1, 1)
- 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.database_choice)
- self.groupBox.setEnabled(True)
- self.groupBox.setFlat(False)
- self.groupBox.setObjectName(_fromUtf8("groupBox"))
- self.gridLayout_5 = QtGui.QGridLayout(self.groupBox)
- 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.setObjectName(_fromUtf8("label_2"))
- self.gridLayout_5.addWidget(self.label_2, 2, 0, 1, 1)
- self.user_lineEdit = QtGui.QLineEdit(self.groupBox)
- self.user_lineEdit.setEnabled(True)
- self.user_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
- self.user_lineEdit.setText(_fromUtf8("OMuser"))
- self.user_lineEdit.setObjectName(_fromUtf8("user_lineEdit"))
- 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.setObjectName(_fromUtf8("label_3"))
- self.gridLayout_5.addWidget(self.label_3, 3, 0, 1, 1)
- self.password_lineEdit = QtGui.QLineEdit(self.groupBox)
- self.password_lineEdit.setEnabled(True)
- self.password_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
- self.password_lineEdit.setText(_fromUtf8("password"))
- self.password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
- self.password_lineEdit.setObjectName(_fromUtf8("password_lineEdit"))
- self.gridLayout_5.addWidget(self.password_lineEdit, 3, 2, 1, 1)
- 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.gridLayout_5.addWidget(self.dbpassword_checkBox, 3, 3, 1, 1)
- self.database_lineEdit = QtGui.QLineEdit(self.groupBox)
- self.database_lineEdit.setEnabled(True)
- self.database_lineEdit.setMinimumSize(QtCore.QSize(100, 0))
- self.database_lineEdit.setText(_fromUtf8("openmolar_demo"))
- self.database_lineEdit.setObjectName(_fromUtf8("database_lineEdit"))
- self.gridLayout_5.addWidget(self.database_lineEdit, 1, 2, 1, 1)
- self.label_4 = QtGui.QLabel(self.groupBox)
- self.label_4.setObjectName(_fromUtf8("label_4"))
- self.gridLayout_5.addWidget(self.label_4, 1, 0, 1, 1)
- self.testDB_pushButton = QtGui.QPushButton(self.groupBox)
- self.testDB_pushButton.setEnabled(True)
- 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)
- 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.database_choice)
- self.createDemo_radioButton.setChecked(True)
- self.createDemo_radioButton.setObjectName(
- _fromUtf8("createDemo_radioButton"))
- self.gridLayout_3.addWidget(self.createDemo_radioButton, 0, 0, 1, 1)
- 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.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.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.setWordWrap(True)
- self.mainPassword_label_2.setObjectName(
- _fromUtf8("mainPassword_label_2"))
- self.gridLayout_4.addWidget(self.mainPassword_label_2, 0, 0, 1, 3)
- 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.gridLayout_4.addWidget(self.rootPassword_lineEdit, 3, 0, 1, 1)
- self.rootPassword_checkBox = QtGui.QCheckBox(self.create_database_page)
- self.rootPassword_checkBox.setFocusPolicy(QtCore.Qt.NoFocus)
- self.rootPassword_checkBox.setObjectName(
- _fromUtf8("rootPassword_checkBox"))
- self.gridLayout_4.addWidget(self.rootPassword_checkBox, 3, 1, 1, 1)
- 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"))
- 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)
- 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)
- 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(self.centralwidget)
- self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
- self.frame.setFrameShadow(QtGui.QFrame.Raised)
- self.frame.setObjectName(_fromUtf8("frame"))
- self.horizontalLayout_3 = QtGui.QHBoxLayout(self.frame)
- self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3"))
- self.back_pushButton = QtGui.QPushButton(self.frame)
- self.back_pushButton.setFocusPolicy(QtCore.Qt.TabFocus)
- self.back_pushButton.setObjectName(_fromUtf8("back_pushButton"))
- self.horizontalLayout_3.addWidget(self.back_pushButton)
- self.go_pushButton = QtGui.QPushButton(self.frame)
- 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(MainWindow)
- self.stackedWidget.setCurrentIndex(0)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
- 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 (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.label_5.setText(_("Password"))
- self.mainpassword_checkBox.setText(_("show"))
- self.label_8.setText(_("Repeat Password"))
- self.label_13.setText(_("Where is your mysql server located? **"))
- 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. "))
- self.groupBox.setTitle(_("Database Details"))
- 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_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"))
-
-
-if __name__ == "__main__":
- import gettext
- gettext.install("openmolar")
- import sys
- app = QtGui.QApplication(sys.argv)
- MainWindow = QtGui.QMainWindow()
- ui = Ui_MainWindow()
- ui.setupUi(MainWindow)
- MainWindow.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 83a18e9..5a1a626 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_patient_finder.py
@@ -3,8 +3,8 @@
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/patient_finder.ui'
#
-# Created: Wed Nov 6 23:05:24 2013
-# by: PyQt4 UI code generator 4.10.3
+# Created: Thu May 29 10:12:39 2014
+# by: PyQt4 UI code generator 4.10.4
#
# WARNING! All changes made in this file will be lost!
@@ -21,7 +21,7 @@ class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
- Dialog.resize(306, 367)
+ Dialog.resize(386, 360)
icon = QtGui.QIcon()
icon.addPixmap(
QtGui.QPixmap(_fromUtf8(":/logo.png")),
diff --git a/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py b/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py
deleted file mode 100644
index f80431a..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_permissions.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/permissions.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(308, 177)
- self.verticalLayout = QtGui.QVBoxLayout(Dialog)
- self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
- self.label = QtGui.QLabel(Dialog)
- self.label.setAlignment(QtCore.Qt.AlignCenter)
- self.label.setWordWrap(True)
- self.label.setObjectName(_fromUtf8("label"))
- self.verticalLayout.addWidget(self.label)
- self.lineEdit = QtGui.QLineEdit(Dialog)
- self.lineEdit.setEchoMode(QtGui.QLineEdit.Password)
- self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
- 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.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.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."))
-
-
-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_record_tools.py b/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py
index fdf558f..35b2408 100644
--- a/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py
+++ b/src/openmolar/qt4gui/compiled_uis/Ui_record_tools.py
@@ -3,8 +3,8 @@
# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/record_tools.ui'
#
-# Created: Wed Nov 6 23:05:24 2013
-# by: PyQt4 UI code generator 4.10.3
+# Created: Mon Jun 30 12:44:27 2014
+# by: PyQt4 UI code generator 4.11
#
# WARNING! All changes made in this file will be lost!
@@ -17,14 +17,14 @@ except AttributeError:
return s
-class Ui_Dialog(object):
+class Ui_Form(object):
- def setupUi(self, Dialog):
- Dialog.setObjectName(_fromUtf8("Dialog"))
- Dialog.resize(628, 521)
- self.verticalLayout = QtGui.QVBoxLayout(Dialog)
+ def setupUi(self, Form):
+ Form.setObjectName(_fromUtf8("Form"))
+ Form.resize(497, 585)
+ self.verticalLayout = QtGui.QVBoxLayout(Form)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
- self.tabWidget = QtGui.QTabWidget(Dialog)
+ self.tabWidget = QtGui.QTabWidget(Form)
self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
self.tab = QtGui.QWidget()
self.tab.setObjectName(_fromUtf8("tab"))
@@ -35,7 +35,7 @@ class Ui_Dialog(object):
self.money_scrollArea.setObjectName(_fromUtf8("money_scrollArea"))
self.money_scrollAreaWidgetContents = QtGui.QWidget()
self.money_scrollAreaWidgetContents.setGeometry(
- QtCore.QRect(0, 0, 443, 424))
+ QtCore.QRect(0, 0, 455, 503))
self.money_scrollAreaWidgetContents.setObjectName(
_fromUtf8("money_scrollAreaWidgetContents"))
self.gridLayout = QtGui.QGridLayout(
@@ -147,12 +147,12 @@ class Ui_Dialog(object):
self.label_14.setObjectName(_fromUtf8("label_14"))
self.gridLayout.addWidget(self.label_14, 0, 0, 1, 2)
self.money_scrollArea.setWidget(self.money_scrollAreaWidgetContents)
- self.gridLayout_2.addWidget(self.money_scrollArea, 0, 0, 4, 1)
+ self.gridLayout_2.addWidget(self.money_scrollArea, 0, 0, 1, 2)
self.label_13 = QtGui.QLabel(self.tab)
self.label_13.setAlignment(QtCore.Qt.AlignCenter)
self.label_13.setWordWrap(True)
self.label_13.setObjectName(_fromUtf8("label_13"))
- self.gridLayout_2.addWidget(self.label_13, 0, 1, 1, 1)
+ self.gridLayout_2.addWidget(self.label_13, 1, 0, 1, 1)
self.total_label = QtGui.QLabel(self.tab)
font = QtGui.QFont()
font.setBold(True)
@@ -161,41 +161,16 @@ class Ui_Dialog(object):
self.total_label.setAlignment(QtCore.Qt.AlignCenter)
self.total_label.setObjectName(_fromUtf8("total_label"))
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)
- 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)
- self.gridLayout_2.addItem(spacerItem1, 3, 1, 1, 1)
self.tabWidget.addTab(self.tab, _fromUtf8(""))
self.tab_2 = QtGui.QWidget()
self.tab_2.setObjectName(_fromUtf8("tab_2"))
self.gridLayout_4 = QtGui.QGridLayout(self.tab_2)
self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
- self.dates_pushButton = QtGui.QPushButton(self.tab_2)
- 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)
- 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.setGeometry(QtCore.QRect(0, 0, 455, 520))
self.scrollAreaWidgetContents.setObjectName(
_fromUtf8("scrollAreaWidgetContents"))
self.gridLayout_3 = QtGui.QGridLayout(self.scrollAreaWidgetContents)
@@ -293,247 +268,15 @@ class Ui_Dialog(object):
_fromUtf8("billdate_pushButton"))
self.horizontalLayout_7.addWidget(self.billdate_pushButton)
self.gridLayout_3.addLayout(self.horizontalLayout_7, 6, 1, 1, 1)
- spacerItem3 = QtGui.QSpacerItem(
+ spacerItem1 = QtGui.QSpacerItem(
20,
40,
QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Expanding)
- self.gridLayout_3.addItem(spacerItem3, 7, 0, 1, 1)
+ self.gridLayout_3.addItem(spacerItem1, 7, 0, 1, 1)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.gridLayout_4.addWidget(self.scrollArea, 0, 0, 2, 1)
self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
- self.tab_3 = QtGui.QWidget()
- self.tab_3.setObjectName(_fromUtf8("tab_3"))
- self.gridLayout_11 = QtGui.QGridLayout(self.tab_3)
- self.gridLayout_11.setObjectName(_fromUtf8("gridLayout_11"))
- self.scrollArea_2 = QtGui.QScrollArea(self.tab_3)
- self.scrollArea_2.setWidgetResizable(True)
- 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.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
- self.chartplan_frame = QtGui.QFrame(self.scrollAreaWidgetContents_2)
- self.chartplan_frame.setFrameShape(QtGui.QFrame.StyledPanel)
- self.chartplan_frame.setFrameShadow(QtGui.QFrame.Raised)
- self.chartplan_frame.setObjectName(_fromUtf8("chartplan_frame"))
- self.verticalLayout_2.addWidget(self.chartplan_frame)
- self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2)
- self.gridLayout_11.addWidget(self.scrollArea_2, 0, 0, 2, 3)
- self.plan_pushButton = QtGui.QPushButton(self.tab_3)
- 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)
- self.gridLayout_11.addItem(spacerItem4, 1, 3, 2, 1)
- self.gridLayout_9 = QtGui.QGridLayout()
- self.gridLayout_9.setObjectName(_fromUtf8("gridLayout_9"))
- self.label_22 = QtGui.QLabel(self.tab_3)
- self.label_22.setObjectName(_fromUtf8("label_22"))
- self.gridLayout_9.addWidget(self.label_22, 0, 0, 1, 2)
- self.xraypl_lineEdit = QtGui.QLineEdit(self.tab_3)
- self.xraypl_lineEdit.setMaxLength(56)
- self.xraypl_lineEdit.setObjectName(_fromUtf8("xraypl_lineEdit"))
- self.gridLayout_9.addWidget(self.xraypl_lineEdit, 0, 2, 1, 1)
- self.label_23 = QtGui.QLabel(self.tab_3)
- self.label_23.setObjectName(_fromUtf8("label_23"))
- self.gridLayout_9.addWidget(self.label_23, 1, 0, 1, 2)
- self.periopl_lineEdit = QtGui.QLineEdit(self.tab_3)
- self.periopl_lineEdit.setMaxLength(56)
- self.periopl_lineEdit.setObjectName(_fromUtf8("periopl_lineEdit"))
- self.gridLayout_9.addWidget(self.periopl_lineEdit, 1, 2, 1, 1)
- self.label_47 = QtGui.QLabel(self.tab_3)
- self.label_47.setObjectName(_fromUtf8("label_47"))
- self.gridLayout_9.addWidget(self.label_47, 2, 0, 1, 2)
- self.anaespl_lineEdit = QtGui.QLineEdit(self.tab_3)
- self.anaespl_lineEdit.setMaxLength(56)
- self.anaespl_lineEdit.setObjectName(_fromUtf8("anaespl_lineEdit"))
- self.gridLayout_9.addWidget(self.anaespl_lineEdit, 2, 2, 1, 1)
- self.label_48 = QtGui.QLabel(self.tab_3)
- self.label_48.setObjectName(_fromUtf8("label_48"))
- self.gridLayout_9.addWidget(self.label_48, 3, 0, 1, 2)
- self.otherpl_lineEdit = QtGui.QLineEdit(self.tab_3)
- self.otherpl_lineEdit.setMaxLength(56)
- self.otherpl_lineEdit.setObjectName(_fromUtf8("otherpl_lineEdit"))
- self.gridLayout_9.addWidget(self.otherpl_lineEdit, 3, 2, 1, 1)
- self.label_49 = QtGui.QLabel(self.tab_3)
- self.label_49.setObjectName(_fromUtf8("label_49"))
- self.gridLayout_9.addWidget(self.label_49, 4, 0, 1, 2)
- self.custompl_lineEdit = QtGui.QLineEdit(self.tab_3)
- self.custompl_lineEdit.setMaxLength(56)
- self.custompl_lineEdit.setObjectName(_fromUtf8("custompl_lineEdit"))
- self.gridLayout_9.addWidget(self.custompl_lineEdit, 4, 2, 1, 1)
- self.gridLayout_11.addLayout(self.gridLayout_9, 2, 0, 1, 1)
- self.line_2 = QtGui.QFrame(self.tab_3)
- self.line_2.setFrameShape(QtGui.QFrame.VLine)
- self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
- self.line_2.setObjectName(_fromUtf8("line_2"))
- self.gridLayout_11.addWidget(self.line_2, 2, 1, 1, 1)
- self.gridLayout_10 = QtGui.QGridLayout()
- self.gridLayout_10.setObjectName(_fromUtf8("gridLayout_10"))
- self.label_51 = QtGui.QLabel(self.tab_3)
- self.label_51.setObjectName(_fromUtf8("label_51"))
- self.gridLayout_10.addWidget(self.label_51, 0, 0, 1, 3)
- self.label_52 = QtGui.QLabel(self.tab_3)
- self.label_52.setObjectName(_fromUtf8("label_52"))
- self.gridLayout_10.addWidget(self.label_52, 1, 0, 1, 2)
- self.label_53 = QtGui.QLabel(self.tab_3)
- self.label_53.setObjectName(_fromUtf8("label_53"))
- self.gridLayout_10.addWidget(self.label_53, 2, 0, 1, 2)
- self.line = QtGui.QFrame(self.tab_3)
- self.line.setFrameShape(QtGui.QFrame.HLine)
- self.line.setFrameShadow(QtGui.QFrame.Sunken)
- self.line.setObjectName(_fromUtf8("line"))
- self.gridLayout_10.addWidget(self.line, 3, 0, 1, 3)
- self.label_54 = QtGui.QLabel(self.tab_3)
- self.label_54.setObjectName(_fromUtf8("label_54"))
- self.gridLayout_10.addWidget(self.label_54, 4, 0, 1, 2)
- self.odupl_lineEdit = QtGui.QLineEdit(self.tab_3)
- self.odupl_lineEdit.setMaxLength(56)
- self.odupl_lineEdit.setObjectName(_fromUtf8("odupl_lineEdit"))
- self.gridLayout_10.addWidget(self.odupl_lineEdit, 4, 2, 1, 1)
- self.label_55 = QtGui.QLabel(self.tab_3)
- self.label_55.setObjectName(_fromUtf8("label_55"))
- self.gridLayout_10.addWidget(self.label_55, 5, 0, 1, 2)
- self.odlpl_lineEdit = QtGui.QLineEdit(self.tab_3)
- self.odlpl_lineEdit.setMaxLength(56)
- self.odlpl_lineEdit.setObjectName(_fromUtf8("odlpl_lineEdit"))
- self.gridLayout_10.addWidget(self.odlpl_lineEdit, 5, 2, 1, 1)
- self.ndupl_lineEdit = QtGui.QLineEdit(self.tab_3)
- self.ndupl_lineEdit.setMaxLength(56)
- self.ndupl_lineEdit.setObjectName(_fromUtf8("ndupl_lineEdit"))
- self.gridLayout_10.addWidget(self.ndupl_lineEdit, 1, 2, 1, 1)
- self.ndlpl_lineEdit = QtGui.QLineEdit(self.tab_3)
- self.ndlpl_lineEdit.setMaxLength(56)
- self.ndlpl_lineEdit.setObjectName(_fromUtf8("ndlpl_lineEdit"))
- self.gridLayout_10.addWidget(self.ndlpl_lineEdit, 2, 2, 1, 1)
- self.gridLayout_11.addLayout(self.gridLayout_10, 2, 2, 1, 1)
- self.tabWidget.addTab(self.tab_3, _fromUtf8(""))
- self.tab_4 = QtGui.QWidget()
- self.tab_4.setObjectName(_fromUtf8("tab_4"))
- self.gridLayout_5 = QtGui.QGridLayout(self.tab_4)
- self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
- self.scrollArea_3 = QtGui.QScrollArea(self.tab_4)
- 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.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_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.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.gridLayout_5.addWidget(self.completed_pushButton, 0, 3, 1, 1)
- 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"))
- self.label_24 = QtGui.QLabel(self.tab_4)
- self.label_24.setObjectName(_fromUtf8("label_24"))
- self.gridLayout_12.addWidget(self.label_24, 0, 0, 1, 2)
- self.xraycmp_lineEdit = QtGui.QLineEdit(self.tab_4)
- self.xraycmp_lineEdit.setMaxLength(56)
- self.xraycmp_lineEdit.setObjectName(_fromUtf8("xraycmp_lineEdit"))
- self.gridLayout_12.addWidget(self.xraycmp_lineEdit, 0, 2, 1, 1)
- self.label_25 = QtGui.QLabel(self.tab_4)
- self.label_25.setObjectName(_fromUtf8("label_25"))
- self.gridLayout_12.addWidget(self.label_25, 1, 0, 1, 2)
- self.periocmp_lineEdit = QtGui.QLineEdit(self.tab_4)
- self.periocmp_lineEdit.setMaxLength(56)
- self.periocmp_lineEdit.setObjectName(_fromUtf8("periocmp_lineEdit"))
- self.gridLayout_12.addWidget(self.periocmp_lineEdit, 1, 2, 1, 1)
- self.label_50 = QtGui.QLabel(self.tab_4)
- self.label_50.setObjectName(_fromUtf8("label_50"))
- self.gridLayout_12.addWidget(self.label_50, 2, 0, 1, 2)
- self.anaescmp_lineEdit = QtGui.QLineEdit(self.tab_4)
- self.anaescmp_lineEdit.setMaxLength(56)
- self.anaescmp_lineEdit.setObjectName(_fromUtf8("anaescmp_lineEdit"))
- self.gridLayout_12.addWidget(self.anaescmp_lineEdit, 2, 2, 1, 1)
- self.label_56 = QtGui.QLabel(self.tab_4)
- self.label_56.setObjectName(_fromUtf8("label_56"))
- self.gridLayout_12.addWidget(self.label_56, 3, 0, 1, 2)
- self.othercmp_lineEdit = QtGui.QLineEdit(self.tab_4)
- self.othercmp_lineEdit.setMaxLength(56)
- self.othercmp_lineEdit.setObjectName(_fromUtf8("othercmp_lineEdit"))
- self.gridLayout_12.addWidget(self.othercmp_lineEdit, 3, 2, 1, 1)
- self.label_57 = QtGui.QLabel(self.tab_4)
- self.label_57.setObjectName(_fromUtf8("label_57"))
- self.gridLayout_12.addWidget(self.label_57, 4, 0, 1, 2)
- self.customcmp_lineEdit = QtGui.QLineEdit(self.tab_4)
- self.customcmp_lineEdit.setMaxLength(56)
- self.customcmp_lineEdit.setObjectName(_fromUtf8("customcmp_lineEdit"))
- self.gridLayout_12.addWidget(self.customcmp_lineEdit, 4, 2, 1, 1)
- self.gridLayout_5.addLayout(self.gridLayout_12, 2, 0, 1, 1)
- self.line_3 = QtGui.QFrame(self.tab_4)
- self.line_3.setFrameShape(QtGui.QFrame.VLine)
- self.line_3.setFrameShadow(QtGui.QFrame.Sunken)
- self.line_3.setObjectName(_fromUtf8("line_3"))
- self.gridLayout_5.addWidget(self.line_3, 2, 1, 1, 1)
- self.gridLayout_13 = QtGui.QGridLayout()
- self.gridLayout_13.setObjectName(_fromUtf8("gridLayout_13"))
- self.label_58 = QtGui.QLabel(self.tab_4)
- self.label_58.setObjectName(_fromUtf8("label_58"))
- self.gridLayout_13.addWidget(self.label_58, 0, 0, 1, 3)
- self.label_59 = QtGui.QLabel(self.tab_4)
- self.label_59.setObjectName(_fromUtf8("label_59"))
- self.gridLayout_13.addWidget(self.label_59, 1, 0, 1, 2)
- self.label_60 = QtGui.QLabel(self.tab_4)
- self.label_60.setObjectName(_fromUtf8("label_60"))
- self.gridLayout_13.addWidget(self.label_60, 2, 0, 1, 2)
- self.line_4 = QtGui.QFrame(self.tab_4)
- self.line_4.setFrameShape(QtGui.QFrame.HLine)
- self.line_4.setFrameShadow(QtGui.QFrame.Sunken)
- self.line_4.setObjectName(_fromUtf8("line_4"))
- self.gridLayout_13.addWidget(self.line_4, 3, 0, 1, 3)
- self.label_61 = QtGui.QLabel(self.tab_4)
- self.label_61.setObjectName(_fromUtf8("label_61"))
- self.gridLayout_13.addWidget(self.label_61, 4, 0, 1, 2)
- self.oducmp_lineEdit = QtGui.QLineEdit(self.tab_4)
- self.oducmp_lineEdit.setMaxLength(56)
- self.oducmp_lineEdit.setObjectName(_fromUtf8("oducmp_lineEdit"))
- self.gridLayout_13.addWidget(self.oducmp_lineEdit, 4, 2, 1, 1)
- self.label_62 = QtGui.QLabel(self.tab_4)
- self.label_62.setObjectName(_fromUtf8("label_62"))
- self.gridLayout_13.addWidget(self.label_62, 5, 0, 1, 2)
- self.odlcmp_lineEdit = QtGui.QLineEdit(self.tab_4)
- self.odlcmp_lineEdit.setMaxLength(56)
- self.odlcmp_lineEdit.setObjectName(_fromUtf8("odlcmp_lineEdit"))
- self.gridLayout_13.addWidget(self.odlcmp_lineEdit, 5, 2, 1, 1)
- self.nducmp_lineEdit = QtGui.QLineEdit(self.tab_4)
- self.nducmp_lineEdit.setMaxLength(56)
- self.nducmp_lineEdit.setObjectName(_fromUtf8("nducmp_lineEdit"))
- self.gridLayout_13.addWidget(self.nducmp_lineEdit, 1, 2, 1, 1)
- self.ndlcmp_lineEdit = QtGui.QLineEdit(self.tab_4)
- self.ndlcmp_lineEdit.setMaxLength(56)
- self.ndlcmp_lineEdit.setObjectName(_fromUtf8("ndlcmp_lineEdit"))
- self.gridLayout_13.addWidget(self.ndlcmp_lineEdit, 2, 2, 1, 1)
- self.gridLayout_5.addLayout(self.gridLayout_13, 2, 2, 1, 1)
- self.tabWidget.addTab(self.tab_4, _fromUtf8(""))
self.tab_5 = QtGui.QWidget()
self.tab_5.setObjectName(_fromUtf8("tab_5"))
self.gridLayout_6 = QtGui.QGridLayout(self.tab_5)
@@ -548,41 +291,18 @@ class Ui_Dialog(object):
_fromUtf8("hidden_notes_tableWidget"))
self.hidden_notes_tableWidget.setColumnCount(0)
self.hidden_notes_tableWidget.setRowCount(0)
+ self.hidden_notes_tableWidget.verticalHeader().setVisible(False)
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.gridLayout_6.addWidget(self.hidden_notes_pushButton, 0, 1, 1, 1)
- 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)
- self.buttonBox = QtGui.QDialogButtonBox(Dialog)
- self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close)
- self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
- self.verticalLayout.addWidget(self.buttonBox)
- self.retranslateUi(Dialog)
+ self.retranslateUi(Form)
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.QMetaObject.connectSlotsByName(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(Form)
- def retranslateUi(self, Dialog):
- Dialog.setWindowTitle(_("Advanced Record Alteration"))
+ def retranslateUi(self, Form):
+ Form.setWindowTitle(_("Form"))
self.label.setText(_("NHS current fees (money0)"))
self.label_2.setText(_("NHS payments (money2)"))
self.label_5.setText(_("NHS estimated (money4)"))
@@ -594,15 +314,13 @@ class Ui_Dialog(object):
self.label_9.setText(_("credit (money8)"))
self.label_10.setText(_("debt (money9)"))
self.label_11.setText(_("debt2 (money10)"))
- self.label_12.setText(_("money 11 (always 0!)"))
+ self.label_12.setText(_("money 11"))
self.label_3.setText(_("private current fees (money1) "))
self.label_4.setText(_("private payments (money3)"))
self.label_14.setText(_("ALL AMOUNTS ARE IN PENCE (cents)"))
- self.label_13.setText(_("Outstanding <br />amount"))
+ self.label_13.setText(_("Outstanding amount"))
self.total_label.setText(_("0.00"))
- self.money_pushButton.setText(_("Apply Changes"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _("Money"))
- self.dates_pushButton.setText(_("Apply Changes"))
self.label_15.setText(_("Last CE (pd5)"))
self.pd5_pushButton.setText(_("Add Date"))
self.label_16.setText(_("Last ECE (pd6)"))
@@ -620,49 +338,19 @@ class Ui_Dialog(object):
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"))
- self.label_47.setText(_("anaesthetics"))
- self.label_48.setText(_("other"))
- self.label_49.setText(_("custom"))
- self.label_51.setText(_("Dentures"))
- self.label_52.setText(_("new upper"))
- 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.completed_pushButton.setText(_("Apply Changes"))
- self.label_24.setText(_("Xray"))
- self.label_25.setText(_("Perio"))
- self.label_50.setText(_("anaesthetics"))
- self.label_56.setText(_("other"))
- self.label_57.setText(_("custom"))
- self.label_58.setText(_("Dentures"))
- self.label_59.setText(_("new upper"))
- 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.label_26.setText(_("Hidden Notes"))
- self.hidden_notes_pushButton.setText(_("Apply Changes"))
self.tabWidget.setTabText(
self.tabWidget.indexOf(self.tab_5),
_("Miscellaneous"))
-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()
+ Form = QtGui.QWidget()
+ ui = Ui_Form()
+ ui.setupUi(Form)
+ Form.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
deleted file mode 100644
index d21d7ed..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_select_patient.py
+++ /dev/null
@@ -1,66 +0,0 @@
-#! /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'
-#
-# 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(1014, 398)
- self.vboxlayout = QtGui.QVBoxLayout(Dialog)
- self.vboxlayout.setObjectName(_fromUtf8("vboxlayout"))
- self.tableWidget = QtGui.QTableWidget(Dialog)
- self.tableWidget.setAlternatingRowColors(True)
- 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.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.QMetaObject.connectSlotsByName(Dialog)
-
- def retranslateUi(self, Dialog):
- Dialog.setWindowTitle(_("Make a Selection"))
-
-
-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_startscreen.py b/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py
deleted file mode 100644
index b3f2aaa..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_startscreen.py
+++ /dev/null
@@ -1,186 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/startscreen.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.setWindowModality(QtCore.Qt.WindowModal)
- Dialog.resize(276, 343)
- 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)
- Dialog.setWindowIcon(icon)
- self.gridLayout_2 = QtGui.QGridLayout(Dialog)
- self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
- self.horizontalLayout = QtGui.QHBoxLayout()
- self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
- self.label_3 = QtGui.QLabel(Dialog)
- self.label_3.setLayoutDirection(QtCore.Qt.RightToLeft)
- self.label_3.setAlignment(QtCore.Qt.AlignCenter)
- self.label_3.setWordWrap(True)
- self.label_3.setObjectName(_fromUtf8("label_3"))
- self.horizontalLayout.addWidget(self.label_3)
- self.password_lineEdit = QtGui.QLineEdit(Dialog)
- self.password_lineEdit.setMinimumSize(QtCore.QSize(80, 0))
- self.password_lineEdit.setMaximumSize(QtCore.QSize(71, 16777215))
- self.password_lineEdit.setMaxLength(10)
- self.password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
- self.password_lineEdit.setObjectName(_fromUtf8("password_lineEdit"))
- 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.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(
- self.line.sizePolicy().hasHeightForWidth())
- self.line.setSizePolicy(sizePolicy)
- self.line.setMinimumSize(QtCore.QSize(0, 16))
- self.line.setFrameShape(QtGui.QFrame.HLine)
- self.line.setFrameShadow(QtGui.QFrame.Sunken)
- self.line.setObjectName(_fromUtf8("line"))
- self.gridLayout_2.addWidget(self.line, 1, 0, 1, 2)
- self.gridLayout = QtGui.QGridLayout()
- self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
- self.label = QtGui.QLabel(Dialog)
- self.label.setLayoutDirection(QtCore.Qt.LeftToRight)
- self.label.setAlignment(QtCore.Qt.AlignCenter)
- self.label.setObjectName(_fromUtf8("label"))
- self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
- self.user1_lineEdit = QtGui.QLineEdit(Dialog)
- self.user1_lineEdit.setMaximumSize(QtCore.QSize(40, 16777215))
- self.user1_lineEdit.setText(_fromUtf8(""))
- self.user1_lineEdit.setMaxLength(6)
- self.user1_lineEdit.setObjectName(_fromUtf8("user1_lineEdit"))
- self.gridLayout.addWidget(self.user1_lineEdit, 0, 1, 1, 1)
- self.label_2 = QtGui.QLabel(Dialog)
- self.label_2.setLayoutDirection(QtCore.Qt.LeftToRight)
- self.label_2.setAlignment(QtCore.Qt.AlignCenter)
- self.label_2.setObjectName(_fromUtf8("label_2"))
- self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
- self.user2_lineEdit = QtGui.QLineEdit(Dialog)
- self.user2_lineEdit.setMaximumSize(QtCore.QSize(40, 16777215))
- self.user2_lineEdit.setMaxLength(6)
- self.user2_lineEdit.setObjectName(_fromUtf8("user2_lineEdit"))
- self.gridLayout.addWidget(self.user2_lineEdit, 1, 1, 1, 1)
- 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.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.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.setCenterButtons(True)
- self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
- self.gridLayout_2.addWidget(self.buttonBox, 4, 0, 1, 2)
- self.advanced_frame = QtGui.QFrame(Dialog)
- self.advanced_frame.setMinimumSize(QtCore.QSize(0, 40))
- self.advanced_frame.setFrameShape(QtGui.QFrame.NoFrame)
- self.advanced_frame.setFrameShadow(QtGui.QFrame.Raised)
- self.advanced_frame.setObjectName(_fromUtf8("advanced_frame"))
- self.gridLayout_3 = QtGui.QGridLayout(self.advanced_frame)
- self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
- self.line_2 = QtGui.QFrame(self.advanced_frame)
- self.line_2.setFrameShape(QtGui.QFrame.HLine)
- self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
- self.line_2.setObjectName(_fromUtf8("line_2"))
- self.gridLayout_3.addWidget(self.line_2, 0, 0, 1, 2)
- self.chosenServer_label = QtGui.QLabel(self.advanced_frame)
- self.chosenServer_label.setWordWrap(True)
- 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.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- 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.setArrowType(QtCore.Qt.DownArrow)
- 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)
- 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.QMetaObject.connectSlotsByName(Dialog)
-
- def retranslateUi(self, Dialog):
- Dialog.setWindowTitle(_("openMolar"))
- self.label_3.setText(_("System Password"))
- self.label.setText(_("User 1(required)"))
- self.label_2.setText(_("User 2 (optional)"))
- self.surgery_radioButton.setText(_("Surgery Machine"))
- self.reception_radioButton.setText(_("Reception Machine"))
- self.chosenServer_label.setText(_("TextLabel"))
- self.advanced_toolButton.setText(_("change"))
-
-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_toothPerioProps.py b/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py
deleted file mode 100644
index 3ff2dae..0000000
--- a/src/openmolar/qt4gui/compiled_uis/Ui_toothPerioProps.py
+++ /dev/null
@@ -1,183 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file '/home/neil/openmolar/openmolar1/src/openmolar/qt-designer/toothPerioProps.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_Form(object):
-
- def setupUi(self, Form):
- Form.setObjectName(_fromUtf8("Form"))
- Form.resize(499, 148)
- Form.setMinimumSize(QtCore.QSize(0, 120))
- Form.setMaximumSize(QtCore.QSize(16777215, 517))
- self.gridLayout = QtGui.QGridLayout(Form)
- self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
- self.tooth_label = QtGui.QLabel(Form)
- self.tooth_label.setMaximumSize(QtCore.QSize(16777215, 28))
- font = QtGui.QFont()
- font.setPointSize(14)
- self.tooth_label.setFont(font)
- self.tooth_label.setAlignment(QtCore.Qt.AlignCenter)
- self.tooth_label.setObjectName(_fromUtf8("tooth_label"))
- self.gridLayout.addWidget(self.tooth_label, 0, 0, 1, 1)
- self.comboBox = QtGui.QComboBox(Form)
- self.comboBox.setObjectName(_fromUtf8("comboBox"))
- self.comboBox.addItem(_fromUtf8(""))
- self.comboBox.addItem(_fromUtf8(""))
- self.comboBox.addItem(_fromUtf8(""))
- self.comboBox.addItem(_fromUtf8(""))
- self.comboBox.addItem(_fromUtf8(""))
- self.comboBox.addItem(_fromUtf8(""))
- self.comboBox.addItem(_fromUtf8(""))
- self.comboBox.addItem(_fromUtf8(""))
- self.gridLayout.addWidget(self.comboBox, 0, 3, 1, 2)
- self.orig_frame = QtGui.QFrame(Form)
- self.orig_frame.setMinimumSize(QtCore.QSize(100, 100))
- self.orig_frame.setMaximumSize(QtCore.QSize(16777215, 100))
- self.orig_frame.setFrameShape(QtGui.QFrame.NoFrame)
- self.orig_frame.setFrameShadow(QtGui.QFrame.Raised)
- self.orig_frame.setObjectName(_fromUtf8("orig_frame"))
- self.gridLayout.addWidget(self.orig_frame, 1, 0, 2, 1)
- self.new_frame = QtGui.QFrame(Form)
- self.new_frame.setMinimumSize(QtCore.QSize(100, 100))
- self.new_frame.setMaximumSize(QtCore.QSize(16777215, 100))
- self.new_frame.setFrameShape(QtGui.QFrame.NoFrame)
- self.new_frame.setFrameShadow(QtGui.QFrame.Raised)
- self.new_frame.setObjectName(_fromUtf8("new_frame"))
- self.gridLayout.addWidget(self.new_frame, 1, 1, 2, 1)
- self.copy_pushButton = QtGui.QPushButton(Form)
- self.copy_pushButton.setMaximumSize(QtCore.QSize(16777215, 28))
- 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.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- 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.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- 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)
- self.clear_pushButton.setIcon(icon)
- self.clear_pushButton.setObjectName(_fromUtf8("clear_pushButton"))
- self.gridLayout.addWidget(self.clear_pushButton, 1, 4, 1, 1)
- self.horizontalLayout = QtGui.QHBoxLayout()
- self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
- self.leftTooth_pushButton = QtGui.QPushButton(Form)
- self.leftTooth_pushButton.setMinimumSize(QtCore.QSize(24, 24))
- 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)
- self.leftTooth_pushButton.setIcon(icon1)
- self.leftTooth_pushButton.setIconSize(QtCore.QSize(24, 18))
- 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))
- self.le_frame.setFrameShape(QtGui.QFrame.StyledPanel)
- self.le_frame.setFrameShadow(QtGui.QFrame.Raised)
- self.le_frame.setObjectName(_fromUtf8("le_frame"))
- self.horizontalLayout.addWidget(self.le_frame)
- self.rightTooth_pushButton = QtGui.QPushButton(Form)
- self.rightTooth_pushButton.setMinimumSize(QtCore.QSize(24, 24))
- 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)
- self.rightTooth_pushButton.setIcon(icon2)
- self.rightTooth_pushButton.setIconSize(QtCore.QSize(24, 18))
- 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)
- self.mobilitycomboBox.setMaximumSize(QtCore.QSize(16777215, 28))
- self.mobilitycomboBox.setObjectName(_fromUtf8("mobilitycomboBox"))
- self.mobilitycomboBox.addItem(_fromUtf8(""))
- self.mobilitycomboBox.addItem(_fromUtf8(""))
- self.mobilitycomboBox.addItem(_fromUtf8(""))
- self.mobilitycomboBox.addItem(_fromUtf8(""))
- self.gridLayout.addWidget(self.mobilitycomboBox, 2, 4, 1, 1)
-
- self.retranslateUi(Form)
- QtCore.QMetaObject.connectSlotsByName(Form)
-
- def retranslateUi(self, Form):
- Form.setWindowTitle(_("Form"))
- self.tooth_label.setText(_("ToothId"))
- self.comboBox.setItemText(0, _("Pocketing"))
- self.comboBox.setItemText(1, _("Bleeding"))
- self.comboBox.setItemText(2, _("Plaque"))
- self.comboBox.setItemText(3, _("Recession"))
- self.comboBox.setItemText(4, _("Furcation"))
- self.comboBox.setItemText(5, _("Suppuration"))
- self.comboBox.setItemText(6, _("Mobility"))
- self.comboBox.setItemText(7, _("Other"))
- self.copy_pushButton.setText(_("Copy &All"))
- self.cp_pushButton.setToolTip(_("delete tooth data"))
- self.cp_pushButton.setText(_("Cp"))
- self.clear_pushButton.setToolTip(_("delete tooth data"))
- self.leftTooth_pushButton.setToolTip(_("Apply and move Back a tooth"))
- self.rightTooth_pushButton.setToolTip(_("Apply & Move to Next Tooth"))
- self.mobilitycomboBox.setItemText(0, _("-"))
- self.mobilitycomboBox.setItemText(1, _("I"))
- self.mobilitycomboBox.setItemText(2, _("II"))
- self.mobilitycomboBox.setItemText(3, _("III"))
-
-from openmolar.qt4gui import resources_rc
-
-if __name__ == "__main__":
- import gettext
- gettext.install("openmolar")
- import sys
- app = QtGui.QApplication(sys.argv)
- Form = QtGui.QWidget()
- ui = Ui_Form()
- ui.setupUi(Form)
- Form.show()
- sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/customwidgets/appointmentwidget.py b/src/openmolar/qt4gui/customwidgets/appointmentwidget.py
index c0f5f46..756275e 100644
--- a/src/openmolar/qt4gui/customwidgets/appointmentwidget.py
+++ b/src/openmolar/qt4gui/customwidgets/appointmentwidget.py
@@ -135,7 +135,7 @@ class AppointmentWidget(QtGui.QFrame):
self.setOutOfOffice(False)
self.setMinimumSize(self.minimumSizeHint())
- self.setMaximumSize(self.maximumSizeHint())
+ # self.setMaximumSize(self.maximumSizeHint())
self.signals()
def setOutOfOffice(self, val):
diff --git a/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py b/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py
index 6d60cbc..cc2b35d 100755
--- a/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py
+++ b/src/openmolar/qt4gui/customwidgets/aptOVcontrol.py
@@ -22,15 +22,23 @@
# # # #
# ############################################################################ #
+from functools import partial
+import logging
+
from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings
+LOGGER = logging.getLogger("openmolar")
+
class control(QtGui.QLabel):
'''
a custom label for the top of the appointment overview widgets
'''
+ dayview_signal = QtCore.pyqtSignal(object)
+ edit_hours_signal = QtCore.pyqtSignal(object)
+ edit_memo_signal = QtCore.pyqtSignal(object)
def __init__(self, parent=None):
super(control, self).__init__(parent)
@@ -39,6 +47,8 @@ class control(QtGui.QLabel):
self.setWordWrap(True)
self.date = QtCore.QDate(1900, 1, 1)
+ self.recent_double_click = False
+
def setDate(self, arg):
'''
takes a QDate
@@ -61,10 +71,7 @@ class control(QtGui.QLabel):
str = "<center><b>%s</b><br />%s</center>" % (day, self.memo)
else:
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)
def mouseMoveEvent(self, e):
self.setStyleSheet("background:white")
@@ -72,29 +79,60 @@ class control(QtGui.QLabel):
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)
- else:
- print "unknown mousePressEvent", but
+ def mousePressEvent(self, event):
+ QtCore.QTimer.singleShot(200,
+ partial(self.raise_context_menu, event.globalPos()))
+
+ def raise_context_menu(self, point):
+ if not self.recent_double_click:
+ menu = QtGui.QMenu(self)
+ action = menu.addAction(_("Switch to day view of this date"))
+ action.triggered.connect(self.call_day_view)
+ menu.setDefaultAction(action)
+ menu.addSeparator()
+ action = menu.addAction(_("Edit Memos"))
+ action.triggered.connect(self.call_edit_memo)
+ action = menu.addAction(_("Edit Clinician Hours"))
+ action.triggered.connect(self.call_edit_hours)
+ menu.exec_(point)
+
+ def mouseDoubleClickEvent(self, event):
+ LOGGER.debug("doubleclick")
+ self.recent_double_click = True
+ self.call_day_view()
+ QtCore.QTimer.singleShot(500, self.reset_double_click)
+
+ def reset_double_click(self):
+ self.recent_double_click = False
+
+ def call_day_view(self):
+ LOGGER.debug("Call for Day View")
+ self.dayview_signal.emit(self.date)
+
+ def call_edit_hours(self):
+ self.edit_hours_signal.emit(self.date)
+
+ def call_edit_memo(self):
+ self.edit_memo_signal.emit(self.date.toPyDate())
+
+
+class _TestBook(QtGui.QWidget):
+
+ def __init__(self, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+ self.control = control()
+ self.control.setDate(QtCore.QDate.currentDate().addDays(3))
+ layout = QtGui.QVBoxLayout(self)
+ layout.addWidget(self.control)
+ layout.addWidget(QtGui.QTextEdit())
+
+ def sizeHint(self):
+ return QtCore.QSize(100, 400)
if __name__ == "__main__":
- def test(a):
- print "left click", a.toString()
-
- def test2(a):
- 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)
-
- Form.show()
-
- sys.exit(app.exec_())
+ LOGGER.setLevel(logging.DEBUG)
+
+ app = QtGui.QApplication([])
+ widg = _TestBook()
+ widg.show()
+ app.exec_()
diff --git a/src/openmolar/qt4gui/customwidgets/calendars.py b/src/openmolar/qt4gui/customwidgets/calendars.py
index d3cc857..a42f456 100644
--- a/src/openmolar/qt4gui/customwidgets/calendars.py
+++ b/src/openmolar/qt4gui/customwidgets/calendars.py
@@ -25,14 +25,12 @@
from __future__ import division
import calendar
import datetime
+from functools import partial
import sys
from PyQt4 import QtGui, QtCore
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)
@@ -128,99 +126,23 @@ class weekCalendar(controlCalendar):
painter.fillRect(rect, self.color)
-class calDialogs():
+class monthCalendar(QtGui.QWidget):
'''
- a sub class for month and year calendars
+ A month calendar
'''
-
- 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)
- current = parent.headingdata.get(datekey, "")
- 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
- '''
- Dialog = QtGui.QDialog(parent)
- 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 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)
-
- memoDict = {}
- if key in parent.data:
- memoDict = parent.data[key]
-
- memowidget_dict = {}
- for dentix in parent.dents:
- if dentix in memoDict:
- memo = memoDict[dentix].memo
- else:
- memo = ""
-
- if dentix == 0:
- dl.lineEdit.setText(memo)
- memowidget_dict[0] = dl.lineEdit
- else:
- widg = QtGui.QWidget()
- memoitem = Ui_memo_item.Ui_Form()
- memoitem.setupUi(widg)
- memoitem.label.setText(
- 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)
- dl.layout.addItem(spacerItem)
-
- if Dialog.exec_():
- retarg = []
- 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
- parent.emit(QtCore.SIGNAL("add_memo"), tuple(retarg))
-
-
-class monthCalendar(QtGui.QWidget, calDialogs):
+ memo_dialog_signal = QtCore.pyqtSignal(object)
+ public_holiday_signal = QtCore.pyqtSignal(object)
+ selected_date_signal = QtCore.pyqtSignal(object)
def __init__(self, parent=None):
'''
initiate the widget
'''
super(monthCalendar, self).__init__(parent)
- self.setSizePolicy(QtGui.QSizePolicy(
- QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding))
+ self.setSizePolicy(
+ QtGui.QSizePolicy(
+ QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding))
self.parent = parent
self.rowNo = 1
self.colNo = 1
@@ -373,7 +295,19 @@ class monthCalendar(QtGui.QWidget, calDialogs):
d = self.getDateFromPosition(event.x(), event.y())
if d and d != self.selectedDate:
self.setSelectedDate(d)
- self.emit(QtCore.SIGNAL("selectedDate"), d)
+ self.selected_date_signal.emit(d)
+ else:
+ menu = QtGui.QMenu(self)
+ action = menu.addAction(_("Edit day memos"))
+ action2 = menu.addAction(_("Edit Public Holiday information"))
+
+ action.triggered.connect(
+ partial(self.memo_dialog_signal.emit, self.selectedDate))
+ action2.triggered.connect(
+ partial(self.public_holiday_signal.emit, self.selectedDate))
+
+ menu.setDefaultAction(action)
+ menu.exec_(event.globalPos())
def mouseDoubleClickEvent(self, event):
'''
@@ -382,9 +316,9 @@ class monthCalendar(QtGui.QWidget, calDialogs):
d = self.getDateFromPosition(event.x(), event.y())
if d and d != self.selectedDate:
self.setSelectedDate(d)
- self.emit(QtCore.SIGNAL("selectedDate"), d)
+ self.selected_date_signal.emit(d)
if d:
- self.raisememoDialog()
+ self.memo_dialog_signal.emit(d)
def leaveEvent(self, event):
'''
@@ -559,11 +493,14 @@ class monthCalendar(QtGui.QWidget, calDialogs):
self.bankHolColwidth + self.vheaderwidth, self.height())
-class yearCalendar(QtGui.QWidget, calDialogs):
+class yearCalendar(QtGui.QWidget):
'''
a pyqt4 custom widget to show a year calendar
'''
+ memo_dialog_signal = QtCore.pyqtSignal(object)
+ public_holiday_signal = QtCore.pyqtSignal(object)
+ selected_date_signal = QtCore.pyqtSignal(object)
def __init__(self, parent=None):
'''
@@ -683,30 +620,6 @@ class yearCalendar(QtGui.QWidget, calDialogs):
if d != self.highlightedDate:
self.highlightedDate = d
self.update()
- advisory = ""
- if d:
- 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
- else:
- if not dent.flag:
- if 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)
- if advisory.endswith(" <br />"):
- advisory = advisory.rstrip(" <br />")
-
- QtGui.QToolTip.showText(event.globalPos(), advisory)
def mousePressEvent(self, event):
'''
@@ -716,20 +629,19 @@ class yearCalendar(QtGui.QWidget, calDialogs):
if d:
if d != self.selectedDate:
self.setSelectedDate(d)
- self.emit(QtCore.SIGNAL("selectedDate"), d)
- if event.button() == 2:
+ self.selected_date_signal.emit(d)
+ else:
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
- if result.text() == _("Edit day memos"):
- self.raisememoDialog()
- elif result.text() == _("Edit Public Holiday information"):
- self.publicHolidayEnter()
+ action = menu.addAction(_("Edit day memos"))
+ action2 = menu.addAction(_("Edit Public Holiday information"))
+
+ action.triggered.connect(
+ partial(self.memo_dialog_signal.emit, self.selectedDate))
+ action2.triggered.connect(
+ partial(self.public_holiday_signal.emit, self.selectedDate))
+
+ menu.setDefaultAction(action)
+ menu.exec_(event.globalPos())
def getDayData(self):
'''
@@ -752,9 +664,9 @@ class yearCalendar(QtGui.QWidget, calDialogs):
d = self.getDateFromPosition(event.x(), event.y())
if d and d != self.selectedDate:
self.setSelectedDate(d)
- self.emit(QtCore.SIGNAL("selectedDate"), d)
+ self.selected_date_signal.emit(d)
if d:
- self.raisememoDialog()
+ self.memo_dialog_signal.emit(self.selectedDate)
def leaveEvent(self, event):
'''
diff --git a/src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py b/src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py
index 5667719..30b899c 100644
--- a/src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py
+++ b/src/openmolar/qt4gui/customwidgets/dent_hyg_selector.py
@@ -27,11 +27,11 @@ from PyQt4 import QtGui, QtCore
class dentHygSelector(QtGui.QTreeWidget):
- def __init__(self, dents, hygs):
+ def __init__(self):
QtGui.QTreeWidget.__init__(self)
self.setHeaderHidden(True)
- self.dents = dents
- self.hygs = hygs
+ self.dents = []
+ self.hygs = []
self.root = QtGui.QTreeWidgetItem(self, ["All Clinicians"])
self.root.setCheckState(0, QtCore.Qt.Checked)
@@ -42,22 +42,25 @@ class dentHygSelector(QtGui.QTreeWidget):
self.hyg_root.setCheckState(0, QtCore.Qt.Checked)
self.dent_cbs = {}
+ self.hyg_cbs = {}
+
+ self.expandAll()
+ self.signals(True)
+
+ def set_dents(self, dents):
+ self.dents = dents
for dent in self.dents:
i = QtGui.QTreeWidgetItem(self.dent_root, [dent])
i.setCheckState(0, QtCore.Qt.Checked)
self.dent_cbs[dent] = i
- self.hyg_cbs = {}
+ def set_hygs(self, hygs):
+ self.hygs = hygs
for hyg in self.hygs:
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
- self.signals(True)
-
def signals(self, connect):
if connect:
self.connect(self,
@@ -88,21 +91,14 @@ class dentHygSelector(QtGui.QTreeWidget):
elif item == self.hyg_root:
self.checkAll(self.hyg_root.checkState(0), ignoreDents=True)
- self.selectedDents = []
- self.selectedHygs = []
-
allDentsChecked = QtCore.Qt.Checked
for dent in self.dent_cbs:
- if self.dent_cbs[dent].checkState(0):
- self.selectedDents.append(dent)
- else:
+ if not self.dent_cbs[dent].checkState(0):
allDentsChecked = QtCore.Qt.Unchecked
allHygsChecked = QtCore.Qt.Checked
for hyg in self.hyg_cbs:
- if self.hyg_cbs[hyg].checkState(0):
- self.selectedHygs.append(hyg)
- else:
+ if not self.hyg_cbs[hyg].checkState(0):
allHygsChecked = QtCore.Qt.Unchecked
self.dent_root.setCheckState(0, allDentsChecked)
@@ -118,22 +114,35 @@ class dentHygSelector(QtGui.QTreeWidget):
self.signals(True)
self.emit(QtCore.SIGNAL("selectionChanged"))
- def getSelectedDents(self):
- return self.selectedDents
-
- def getSelectedHygs(self):
- return self.selectedHygs
-
- def getSelectedClinicians(self):
- return self.selectedDents + self.selectedHygs
+ @property
+ def selectedDents(self):
+ for initials, cb in self.dent_cbs.iteritems():
+ if cb.checkState(0):
+ yield initials
+
+ @property
+ def selectedHygs(self):
+ for initials, cb in self.hyg_cbs.iteritems():
+ if cb.checkState(0):
+ yield initials
+
+ @property
+ def selectedClinicians(self):
+ for clinician in self.selectedDents:
+ yield clinician
+ for clinician in self.selectedHygs:
+ yield clinician
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"]
hygs = ["Rosie", "Sally", "Ariana"]
- w = dentHygSelector(dents, hygs)
+ w = dentHygSelector()
+ w.set_dents(dents)
+ w.set_hygs(hygs)
w.show()
app.exec_()
+ print list(w.selectedClinicians)
diff --git a/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py b/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py
index a295041..43589c0 100644
--- a/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py
+++ b/src/openmolar/qt4gui/customwidgets/estimate_item_widget.py
@@ -23,9 +23,10 @@
# ############################################################################ #
import logging
-
+import re
from PyQt4 import QtGui, QtCore
+from openmolar.settings import localsettings
from openmolar.qt4gui.customwidgets.chainLabel import ChainLabel
from openmolar.qt4gui.customwidgets.confirming_check_box import ConfirmingCheckBox
@@ -33,10 +34,6 @@ from openmolar.qt4gui.customwidgets.confirming_check_box import ConfirmingCheckB
LOGGER = logging.getLogger("openmolar")
-def decimalise(pence):
- return "%d.%02d" % (pence // 100, pence % 100)
-
-
class EstimateItemWidget(QtGui.QWidget):
'''
@@ -238,6 +235,13 @@ class EstimateItemWidget(QtGui.QWidget):
self.completed_checkBox.new_state_signal.connect(
self.completed_state_changed)
+ for le in (self.description_lineEdit,
+ self.cset_lineEdit,
+ self.fee_lineEdit,
+ self.ptFee_lineEdit
+ ):
+ le.editingFinished.connect(self.edited_signal.emit)
+
def update_cset(self, arg):
'''
csetype has been altered, alter ALL underying data
@@ -246,13 +250,16 @@ class EstimateItemWidget(QtGui.QWidget):
for item in self.est_items:
item.csetype = str(arg)
- def update_descr(self, arg):
+ def update_descr(self, description):
'''
description has been altered, alter ALL underying data
(for multiple items)
+ jump through hoops here in case user enters a UK pound sign!
'''
+ description = str(description.toAscii()
+ ).decode("ascii", "replace").replace('"', '\"')
for item in self.est_items:
- item.description = str(arg.toAscii()).replace('"', '\"')
+ item.description = description
def update_Fee(self, arg, userPerforming=True):
'''
@@ -261,7 +268,7 @@ class EstimateItemWidget(QtGui.QWidget):
of items.
'''
try:
- newVal = int(float(arg) * 100)
+ newVal = localsettings.pencify(arg)
if self.feesLinked and userPerforming:
self.ptFee_lineEdit.setText(arg)
self.update_ptFee(arg, False)
@@ -279,7 +286,7 @@ class EstimateItemWidget(QtGui.QWidget):
of items.
'''
try:
- newVal = int(float(arg) * 100)
+ newVal = localsettings.pencify(arg)
if self.feesLinked and userPerforming:
self.fee_lineEdit.setText(arg)
self.update_Fee(arg, False)
@@ -326,13 +333,13 @@ class EstimateItemWidget(QtGui.QWidget):
'''
update the fee lineedit
'''
- self.fee_lineEdit.setText(decimalise(fee))
+ self.fee_lineEdit.setText(localsettings.decimalise(fee))
def setPtFee(self, fee):
'''
update the fee lineedit
'''
- self.ptFee_lineEdit.setText(decimalise(fee))
+ self.ptFee_lineEdit.setText(localsettings.decimalise(fee))
def setCompleted(self, arg):
'''
@@ -414,12 +421,24 @@ class EstimateItemWidget(QtGui.QWidget):
perform logic here first to see if he/she is allowed to do this
'''
LOGGER.debug("EstimateItemWidget.check_first")
+
+ if localsettings.clinicianNo == 0:
+ QtGui.QMessageBox.warning(
+ self,
+ _("Not Allowed"),
+ _("You have no clinician login. "
+ "Treatments cannot be completed by you!"))
+ return
+
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:
+ 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:
self.deleteItem()
return
diff --git a/src/openmolar/qt4gui/customwidgets/estimate_widget.py b/src/openmolar/qt4gui/customwidgets/estimate_widget.py
index d31ce03..f83b82e 100644
--- a/src/openmolar/qt4gui/customwidgets/estimate_widget.py
+++ b/src/openmolar/qt4gui/customwidgets/estimate_widget.py
@@ -31,7 +31,8 @@ import logging
from PyQt4 import QtGui, QtCore
-from estimate_item_widget import decimalise, EstimateItemWidget
+from openmolar.settings import localsettings
+from estimate_item_widget import EstimateItemWidget
from openmolar.qt4gui.fees import manipulate_plan
@@ -48,6 +49,8 @@ class EstimateWidget(QtGui.QWidget):
'''
separate_codes = set([])
updated_fees_signal = QtCore.pyqtSignal()
+ delete_estimate_item = QtCore.pyqtSignal(object)
+ edited_signal = QtCore.pyqtSignal()
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
@@ -98,15 +101,14 @@ class EstimateWidget(QtGui.QWidget):
self.interim_fees_total_le = QtGui.QLineEdit()
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):
+ 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):
le.setFixedWidth(EstimateItemWidget.MONEY_WIDTH)
le.setAlignment(QtCore.Qt.AlignRight)
@@ -183,16 +185,20 @@ class EstimateWidget(QtGui.QWidget):
total += est.fee
ptTotal += est.ptfee
- self.fees_total_le.setText(decimalise(total))
- self.charges_total_le.setText(decimalise(ptTotal))
- self.planned_fees_total_le.setText(decimalise(plan_total))
- self.planned_charges_total_le.setText(decimalise(pt_plan_total))
- self.completed_fees_total_le.setText(decimalise(comp_total))
- self.completed_charges_total_le.setText(decimalise(pt_cmp_total))
-
- self.interim_fees_total_le.setText(decimalise(interim_total))
+ self.fees_total_le.setText(localsettings.decimalise(total))
+ self.charges_total_le.setText(localsettings.decimalise(ptTotal))
+ self.planned_fees_total_le.setText(
+ localsettings.decimalise(plan_total))
+ self.planned_charges_total_le.setText(
+ localsettings.decimalise(pt_plan_total))
+ self.completed_fees_total_le.setText(
+ localsettings.decimalise(comp_total))
+ self.completed_charges_total_le.setText(
+ localsettings.decimalise(pt_cmp_total))
+ self.interim_fees_total_le.setText(
+ localsettings.decimalise(interim_total))
self.interim_charges_total_le.setText(
- decimalise(pt_interim_total))
+ localsettings.decimalise(pt_interim_total))
interim_in_use = interim_total != 0 and pt_interim_total != 0
if interim_in_use:
@@ -203,6 +209,7 @@ class EstimateWidget(QtGui.QWidget):
widg.setVisible(interim_in_use)
self.updated_fees_signal.emit()
+ self.edited_signal.emit()
def set_expand_mode(self, expand=False):
self.expandAll = expand
@@ -246,6 +253,7 @@ class EstimateWidget(QtGui.QWidget):
LOGGER.warning("called when patient is None!")
return
self.setEstimate(self.pt.estimates)
+ self.edited_signal.emit()
def setEstimate(self, ests):
'''
@@ -358,29 +366,15 @@ class EstimateWidget(QtGui.QWidget):
self.set_expand_mode(self.expandAll)
# self.updateTotals()
- def deleteItemWidget(self, item_widget, confirm_first=True):
+ def deleteItemWidget(self, item_widget):
'''
deletes a widget when delete button pressed.
such an item will ALWAYS have only one treatment.
'''
LOGGER.debug("EstimateWidget.deleteItemWidget")
-
- if not confirm_first:
- 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:
- return False
-
assert len(item_widget.est_items) == 1, "bad est item passed"
est = item_widget.est_items[0]
- self.emit(QtCore.SIGNAL("deleteItem"), est)
+ self.delete_estimate_item.emit(est)
self.resetEstimate()
def expandItems(self):
@@ -548,3 +542,4 @@ if __name__ == "__main__":
form.show()
app.exec_()
+ print pt.estimates
diff --git a/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py b/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
index c522f34..534002a 100644
--- a/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
+++ b/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
@@ -31,25 +31,29 @@ class FiveMinuteTimeEdit(QtGui.QTimeEdit):
A custom timeEdit which enforces only 5 minutes
NB - connect to slot "verifiedTime"
'''
+ time_changed_signal = QtCore.pyqtSignal(object)
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)
+ self.timeChanged.connect(self.time_changed)
def stepBy(self, steps):
+ '''
+ re-implement the stepBy function
+ isn't foolproof - 55 minutes + 5 steps == 59 :(
+ '''
if self.currentSection() == self.MinuteSection:
QtGui.QTimeEdit.stepBy(self, steps * 5)
else:
QtGui.QTimeEdit.stepBy(self, steps)
- def timeChanged(self, t):
+ def time_changed(self, t):
min = self.time().minute()
if min % 5 != 0:
min -= min % 5
self.setTime(QtCore.QTime(self.time().hour(), min))
- self.emit(QtCore.SIGNAL("verifiedTime"), self.time())
+ self.time_changed_signal.emit(self.time())
if __name__ == "__main__":
def test(t):
@@ -58,7 +62,6 @@ if __name__ == "__main__":
import sys
app = QtGui.QApplication([])
te = FiveMinuteTimeEdit()
- QtCore.QObject.connect(te,
- QtCore.SIGNAL("verifiedTime"), test)
+ te.time_changed_signal.connect(test)
te.show()
sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/customwidgets/perioChartWidget.py b/src/openmolar/qt4gui/customwidgets/perioChartWidget.py
deleted file mode 100644
index fc87232..0000000
--- a/src/openmolar/qt4gui/customwidgets/perioChartWidget.py
+++ /dev/null
@@ -1,247 +0,0 @@
-#! /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 __future__ import division
-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)
- self.setMinimumSize(self.minimumSizeHint())
- 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]
- 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)
- else:
- 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)
- if event.y() < yOffset:
- y = 0
- else:
- y = 1
- self.setSelected(x, y)
-
- def keyPressEvent(self, event):
- '''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
- elif event.key() == QtCore.Qt.Key_Right:
- 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
- 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.repaint()
-
- 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
- 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
- for y in range(2):
- lowerlimit = self.height() / 2
- if y == 0: # upper teeth
- quadrant += 1
- upperlimit = 0
- else:
- 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
- for i in range(3):
- 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]
- 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
- else:
- 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.restore()
-
- 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.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)
-
- 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/toothProps.py b/src/openmolar/qt4gui/customwidgets/toothProps.py
index 5ab2bdd..913915a 100644
--- a/src/openmolar/qt4gui/customwidgets/toothProps.py
+++ b/src/openmolar/qt4gui/customwidgets/toothProps.py
@@ -49,6 +49,8 @@ class chartLineEdit(QtGui.QLineEdit):
and is self aware when verification is needed
override the keypress event for up and down arrow keys.
'''
+ changed_properties_signal = QtCore.pyqtSignal(object)
+ deleted_comments_signal = QtCore.pyqtSignal()
def __init__(self, parent=None):
QtGui.QLineEdit.__init__(self, parent)
@@ -89,7 +91,7 @@ class chartLineEdit(QtGui.QLineEdit):
if not re.match("..* $", props):
if props != "":
props = props + " "
- self.emit(QtCore.SIGNAL("Changed_Properties"), props)
+ self.changed_properties_signal.emit(props)
def additional(self, checkedAlready=False):
'''
@@ -156,7 +158,7 @@ class chartLineEdit(QtGui.QLineEdit):
deleted = True
if deleted:
self.updateFromPropList(snapshotPropList)
- self.emit(QtCore.SIGNAL("DeletedComments"))
+ self.deleted_comments_signal.emit()
def addItem(self, item):
if not item in ("", " "):
@@ -225,28 +227,35 @@ class chartLineEdit(QtGui.QLineEdit):
def keyPressEvent(self, event):
'''
- overrides QWidget's keypressEvent
+ overrides QWidget's keypressEvent.
+ Catch special keys, and disable lower case
'''
if event.key() == QtCore.Qt.Key_Up:
self.specialKeyPressed("up")
- elif event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Down):
+ return
+ if 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)
+ return
+ if event.text().toAscii() == "!" and not self.om_gui.is_Static:
+ # don't allow comments if not in static:
+ return
+
+ if event.key() == QtCore.Qt.Key_Space:
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())
- if not (inputT == "!" and not self.om_gui.is_Static):
- # don't allow comments if not in static
- QtGui.QLineEdit.keyPressEvent(self, event)
+ elif 65 <= event.key() <= 90:
+ event = QtGui.QKeyEvent(
+ event.type(),
+ event.key(),
+ event.modifiers(),
+ event.text().toUpper()
+ )
+
+ QtGui.QLineEdit.keyPressEvent(self, event)
class ToothPropertyEditingWidget(QtGui.QWidget, Ui_toothProps.Ui_Form):
static_chosen = QtCore.pyqtSignal(object)
+ next_tooth_signal = QtCore.pyqtSignal(object)
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
@@ -549,12 +558,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.next_tooth_signal.emit("up")
def nextTooth(self):
if self.lineEdit.verifyProps():
self.lineEdit.finishedEdit()
- self.emit(QtCore.SIGNAL("NextTooth"), ("down"))
+ self.next_tooth_signal.emit("down")
def static_input(self, value):
self.lineEdit.addItem(value)
diff --git a/src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py b/src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py
index 9fafce4..a72efca 100644
--- a/src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py
+++ b/src/openmolar/qt4gui/customwidgets/upper_case_line_edit.py
@@ -39,9 +39,10 @@ class UpperCaseLineEdit(QtGui.QLineEdit):
convert the text to upper case, and pass the signal on to the
base widget
'''
+ if 65 <= event.key() <= 90:
+ event = QtGui.QKeyEvent(event.type(), event.key(),
+ event.modifiers(), event.text().toUpper())
QtGui.QLineEdit.keyPressEvent(self, event)
- self.setText(self.text())
- self.textEdited.emit(self.text())
if __name__ == "__main__":
app = QtGui.QApplication([])
diff --git a/build_scripts/update_messages.py b/src/openmolar/qt4gui/customwidgets/warning_label.py
old mode 100755
new mode 100644
similarity index 69%
rename from build_scripts/update_messages.py
rename to src/openmolar/qt4gui/customwidgets/warning_label.py
index 19b3b5c..0eb7372
--- a/build_scripts/update_messages.py
+++ b/src/openmolar/qt4gui/customwidgets/warning_label.py
@@ -22,32 +22,34 @@
# # # #
# ############################################################################ #
-'''
-get all translatable strings into a single messages.pot
-requires pygettext available on the command line - i.e. NOT windows friendly.
-'''
+from PyQt4 import QtGui, QtCore
-import os
-import subprocess
-from get_git_branch import module_path
-def source_files():
+class WarningLabel(QtGui.QWidget):
- 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 __init__(self, text, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+ icon = QtGui.QIcon(":/openmolar.svg")
-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!"
+ icon_label = QtGui.QLabel()
+ icon_label.setPixmap(icon.pixmap(48, 48))
-if __name__ == "__main__":
+ self.label = QtGui.QLabel(text)
+ self.label.setAlignment(QtCore.Qt.AlignCenter)
+ self.label.setWordWrap(True)
+
+ layout = QtGui.QHBoxLayout(self)
+ layout.addWidget(icon_label)
+ layout.addWidget(self.label)
+ layout.setStretch(1, 9)
- main()
+ def setText(self, message):
+ self.label.setText(message)
+
+if __name__ == "__main__":
+ app = QtGui.QApplication([])
+ from openmolar.qt4gui import resources_rc
+ wl = WarningLabel("hello world!")
+ wl.show()
+ app.exec_()
diff --git a/src/openmolar/qt4gui/dialogs/__init__.py b/src/openmolar/qt4gui/dialogs/__init__.py
index 3af96a9..c701215 100755
--- a/src/openmolar/qt4gui/dialogs/__init__.py
+++ b/src/openmolar/qt4gui/dialogs/__init__.py
@@ -21,57 +21,3 @@
# # 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/add_clinician_dialog.py b/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py
new file mode 100644
index 0000000..bc5cd93
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/add_clinician_dialog.py
@@ -0,0 +1,206 @@
+#! /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 collections import namedtuple
+import logging
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.customwidgets.upper_case_line_edit \
+ import UpperCaseLineEdit
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+from openmolar.qt4gui.dialogs.add_user_dialog import AddUserDialog
+
+from openmolar.dbtools import db_settings
+
+LOGGER = logging.getLogger("openmolar")
+
+NewClinician = namedtuple('NewClinician',
+ ('initials', 'name', 'formal_name', 'qualifications',
+ 'type', 'speciality', 'data', 'start_date', 'end_date', "new_diary")
+ )
+
+
+class AddClinicianDialog(ExtendableDialog):
+
+ def __init__(self, ftr=False, parent=None):
+ ExtendableDialog.__init__(self, parent)
+ self.setWindowTitle(_("Add User Dialog"))
+
+ self.top_label = WarningLabel(_('Add a new clinician to the system?'))
+
+ self.user_id_comboBox = QtGui.QComboBox()
+ but = QtGui.QPushButton(_("Add New Login"))
+
+ self.name_lineedit = QtGui.QLineEdit()
+ self.f_name_lineedit = QtGui.QLineEdit()
+ self.quals_lineedit = QtGui.QLineEdit()
+ self.type_comboBox = QtGui.QComboBox()
+ self.type_comboBox.addItems([
+ _("Dentist"),
+ _("Hygienist"),
+ _("Therapist")
+ ])
+ self.speciality_lineedit = QtGui.QLineEdit()
+ self.date_edit = QtGui.QDateEdit()
+ self.date_edit.setDate(localsettings.currentDay())
+ self.data_lineedit = QtGui.QLineEdit()
+ self.new_diary_checkbox = QtGui.QCheckBox(
+ _("Create a new diary for this clinician "
+ "(uncheck to map to an existing diary)"))
+ self.new_diary_checkbox.setChecked(True)
+
+ row1 = QtGui.QWidget()
+ layout = QtGui.QHBoxLayout(row1)
+ layout.setMargin(0)
+ layout.addWidget(self.user_id_comboBox)
+ layout.addWidget(but)
+
+ frame = QtGui.QFrame(self)
+ layout = QtGui.QFormLayout(frame)
+ layout.addRow(_("Initials/Nickname (must be an existing Login)"),
+ row1)
+ layout.addRow(_("Name eg. Fred Smith"), self.name_lineedit)
+ layout.addRow(_("Formal Name eg. Dr.F. Smith"), self.f_name_lineedit)
+ layout.addRow(_("Qualifications"), self.quals_lineedit)
+ layout.addRow(_("Speciality"), self.speciality_lineedit)
+ layout.addRow(_("Clinician Type"), self.type_comboBox)
+ layout.addRow(_("Start Date"), self.date_edit)
+ layout.addRow(_("Additional Data"), self.data_lineedit)
+ layout.addRow(self.new_diary_checkbox)
+ self.insertWidget(self.top_label)
+ self.insertWidget(frame)
+
+ for le in (self.name_lineedit, self.f_name_lineedit):
+ le.textChanged.connect(self._check_enable)
+ self.name_lineedit.setFocus()
+
+ list_widget = QtGui.QListWidget()
+ list_widget.addItems([str(val) for val in sorted(localsettings.dentDict.values())])
+ self.add_advanced_widget(list_widget)
+ self.set_advanced_but_text(_("view existing dentists"))
+
+ self.load_logins()
+ but.clicked.connect(self.add_user)
+
+ def sizeHint(self):
+ return QtCore.QSize(500, 400)
+
+ def _check_enable(self, *args):
+ self.enableApply(self.initials != ""
+ and self.name != "" and self.full_name != "")
+
+ def load_logins(self, chosen=None):
+ poss_inits = localsettings.allowed_logins
+ for val in localsettings.ops.values() + ["rec"]:
+ try:
+ poss_inits.remove(val)
+ except ValueError:
+ print "couldn't remove %s" % val
+ pass
+ self.user_id_comboBox.clear()
+ self.user_id_comboBox.addItems(poss_inits)
+ if chosen:
+ try:
+ index = poss_inits.index(chosen)
+ except ValueError:
+ index = -1
+ self.user_id_comboBox.setCurrentIndex(index)
+
+ def add_user(self):
+ dl = AddUserDialog(self.parent())
+ if dl.exec_():
+ self.load_logins(dl.username)
+
+ @property
+ def initials(self):
+ return unicode(self.user_id_comboBox.currentText().toUtf8())
+
+ @property
+ def name(self):
+ return unicode(self.name_lineedit.text().toUtf8())
+
+ @property
+ def full_name(self):
+ return unicode(self.f_name_lineedit.text().toUtf8())
+
+ @property
+ def qualifications(self):
+ return unicode(self.quals_lineedit.text().toUtf8())
+
+ @property
+ def speciality(self):
+ return unicode(self.speciality_lineedit.text().toUtf8())
+
+ @property
+ def type(self):
+ return self.type_comboBox.currentIndex() + 1
+
+ @property
+ def data(self):
+ return unicode(self.data_lineedit.text().toUtf8())
+
+ @property
+ def start_date(self):
+ return self.date_edit.date().toPyDate()
+
+ @property
+ def end_date(self):
+ return None
+
+ @property
+ def new_diary(self):
+ return self.new_diary_checkbox.isChecked()
+
+ def apply(self):
+ new_clinician = NewClinician(self.initials,
+ self.name,
+ self.full_name,
+ self.qualifications,
+ self.type,
+ self.speciality,
+ self.data,
+ self.start_date,
+ self.end_date,
+ self.new_diary,
+ )
+ LOGGER.info(new_clinician)
+ return db_settings.insert_clinician(new_clinician)
+
+ def exec_(self):
+ if ExtendableDialog.exec_(self):
+ return self.apply()
+ return False
+
+if __name__ == "__main__":
+ LOGGER.setLevel(logging.DEBUG)
+ app = QtGui.QApplication([])
+ localsettings.initiateUsers()
+ localsettings.initiate()
+
+ dl = AddClinicianDialog(True)
+ if dl.exec_():
+ print "clinician added to database successfully"
diff --git a/src/openmolar/qt4gui/dialogs/add_user_dialog.py b/src/openmolar/qt4gui/dialogs/add_user_dialog.py
new file mode 100644
index 0000000..4b39e3e
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/add_user_dialog.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/>. # #
+# # # #
+# ############################################################################ #
+
+import logging
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.customwidgets.upper_case_line_edit \
+ import UpperCaseLineEdit
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+from openmolar.dbtools import db_settings
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class AddUserDialog(ExtendableDialog):
+
+ def __init__(self, parent=None):
+ ExtendableDialog.__init__(self, parent)
+ self.setWindowTitle(_("Add User Dialog"))
+
+ self.top_label = WarningLabel("%s<br />%s<hr />%s" % (
+ _('Add a new user to the system?'),
+ _("This is done using initials or a short nickname."),
+ _("Must be unique and Maximum allowed in 5 characters")))
+
+ self.line_edit = UpperCaseLineEdit()
+
+ frame = QtGui.QFrame(self)
+ layout = QtGui.QFormLayout(frame)
+ layout.addRow(_("User Initials or nickname"), self.line_edit)
+
+ self.insertWidget(self.top_label)
+ self.insertWidget(frame)
+
+ self.line_edit.textChanged.connect(self._check_enable)
+ self.line_edit.setFocus()
+
+ list_widget = QtGui.QListWidget()
+ list_widget.addItems(sorted(localsettings.allowed_logins))
+ self.add_advanced_widget(list_widget)
+ self.set_advanced_but_text(_("view existing users"))
+
+ def _check_enable(self, *args):
+ input_ = self.username
+ if input_ in localsettings.allowed_logins:
+ QtGui.QMessageBox.warning(self,
+ _("error"),
+ _("Initials/nickname mut be unique"),
+ )
+ self.enableApply(False)
+ else:
+ self.enableApply(input_ != "")
+
+ @property
+ def username(self):
+ return unicode(self.line_edit.text().toUtf8())
+
+ def apply(self):
+ if db_settings.insert_login(self.username):
+ localsettings.initiateUsers()
+ return True
+
+ def exec_(self):
+ if ExtendableDialog.exec_(self):
+ return self.apply()
+ return False
+
+if __name__ == "__main__":
+ LOGGER.setLevel(logging.DEBUG)
+ app = QtGui.QApplication([])
+ localsettings.initiateUsers()
+
+ dl = AddUserDialog()
+ if dl.exec_():
+ print dl.username
diff --git a/src/openmolar/qt4gui/dialogs/advanced_record_management_dialog.py b/src/openmolar/qt4gui/dialogs/advanced_record_management_dialog.py
new file mode 100644
index 0000000..95b5fcf
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/advanced_record_management_dialog.py
@@ -0,0 +1,290 @@
+#! /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.qt4gui.compiled_uis import Ui_record_tools
+
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class AdvancedRecordManagementDialog(BaseDialog):
+
+ def __init__(self, pt, parent):
+ BaseDialog.__init__(self, parent, remove_stretch=True)
+ self.pt = pt
+ self.om_gui = parent
+ widget = QtGui.QWidget(self)
+ self.ui = Ui_record_tools.Ui_Form()
+ self.ui.setupUi(widget)
+
+ self.insertWidget(widget)
+
+ self.ui.tabWidget.setCurrentIndex(0)
+ self.initialMoney()
+ self.initialDates()
+ self.initialHidden_notes()
+ self.signals()
+
+ self.setMinimumSize(self.sizeHint())
+
+ self.DATE_ATTRIBUTES = (
+ self.pt.pd5,
+ self.pt.pd6,
+ self.pt.pd7,
+ self.pt.pd8,
+ self.pt.pd9,
+ self.pt.pd10,
+ self.pt.billdate)
+
+ self.check_before_reject_if_dirty = True
+
+ def sizeHint(self):
+ return QtCore.QSize(600, 600)
+
+ def initialMoney(self):
+ '''
+ loads the money at startup
+ '''
+ self.ui.total_label.setText(localsettings.formatMoney(
+ self.pt.fees))
+
+ self.ui.money0_spinBox.setValue(self.pt.money0)
+ self.ui.money1_spinBox.setValue(self.pt.money1)
+ self.ui.money2_spinBox.setValue(self.pt.money2)
+ self.ui.money3_spinBox.setValue(self.pt.money3)
+ self.ui.money4_spinBox.setValue(self.pt.money4)
+ self.ui.money5_spinBox.setValue(self.pt.money5)
+ self.ui.money6_spinBox.setValue(self.pt.money6)
+ self.ui.money7_spinBox.setValue(self.pt.money7)
+ self.ui.money8_spinBox.setValue(self.pt.money8)
+ self.ui.money9_spinBox.setValue(self.pt.money9)
+ self.ui.money10_spinBox.setValue(self.pt.money10)
+ self.ui.money11_spinBox.setValue(self.pt.money11)
+
+ def updateMoneyTotal(self, arg=0):
+ '''
+ updates the money label
+ '''
+ fees = (self.ui.money0_spinBox.value() +
+ self.ui.money1_spinBox.value() +
+ self.ui.money9_spinBox.value() +
+ self.ui.money10_spinBox.value() +
+ self.ui.money11_spinBox.value() -
+ self.ui.money2_spinBox.value() -
+ self.ui.money3_spinBox.value() -
+ self.ui.money8_spinBox.value()
+ )
+
+ self.ui.total_label.setText(localsettings.formatMoney(fees))
+ self._check_enable()
+
+ def changeMoney(self):
+ '''
+ modify the money fields on a patient record
+ '''
+ self.pt.money0 = self.ui.money0_spinBox.value()
+ self.pt.money1 = self.ui.money1_spinBox.value()
+ self.pt.money2 = self.ui.money2_spinBox.value()
+ self.pt.money3 = self.ui.money3_spinBox.value()
+ self.pt.money4 = self.ui.money4_spinBox.value()
+ self.pt.money5 = self.ui.money5_spinBox.value()
+ self.pt.money6 = self.ui.money6_spinBox.value()
+ self.pt.money7 = self.ui.money7_spinBox.value()
+ self.pt.money8 = self.ui.money8_spinBox.value()
+ self.pt.money9 = self.ui.money9_spinBox.value()
+ self.pt.money10 = self.ui.money10_spinBox.value()
+ self.pt.money11 = self.ui.money11_spinBox.value()
+
+ @property
+ def has_money_changes(self):
+ return (
+ self.pt.money0 != self.ui.money0_spinBox.value() or
+ self.pt.money1 != self.ui.money1_spinBox.value() or
+ self.pt.money2 != self.ui.money2_spinBox.value() or
+ self.pt.money3 != self.ui.money3_spinBox.value() or
+ self.pt.money4 != self.ui.money4_spinBox.value() or
+ self.pt.money5 != self.ui.money5_spinBox.value() or
+ self.pt.money6 != self.ui.money6_spinBox.value() or
+ self.pt.money7 != self.ui.money7_spinBox.value() or
+ self.pt.money8 != self.ui.money8_spinBox.value() or
+ self.pt.money9 != self.ui.money9_spinBox.value() or
+ self.pt.money10 != self.ui.money10_spinBox.value() or
+ self.pt.money11 != self.ui.money11_spinBox.value()
+ )
+
+ def initialDates(self):
+ '''
+ modify Date fields
+ '''
+ def initialise(date_, de, but):
+ try:
+ de.setDate(date_)
+ but.hide()
+ except TypeError:
+ de.hide()
+ but.clicked.connect(de.show)
+ but.clicked.connect(but.hide)
+ finally:
+ but.clicked.connect(self._check_enable)
+ de.dateChanged.connect(self._check_enable)
+
+ initialise(self.pt.pd5, self.ui.pd5_dateEdit, self.ui.pd5_pushButton)
+ initialise(self.pt.pd6, self.ui.pd6_dateEdit, self.ui.pd6_pushButton)
+ initialise(self.pt.pd7, self.ui.pd7_dateEdit, self.ui.pd7_pushButton)
+ initialise(self.pt.pd8, self.ui.pd8_dateEdit, self.ui.pd8_pushButton)
+ initialise(self.pt.pd9, self.ui.pd9_dateEdit, self.ui.pd9_pushButton)
+ initialise(self.pt.pd10, self.ui.pd10_dateEdit,
+ self.ui.pd10_pushButton)
+ initialise(self.pt.billdate, self.ui.billdate_dateEdit,
+ self.ui.billdate_pushButton)
+
+ @property
+ def new_dates(self):
+ for de in (self.ui.pd5_dateEdit,
+ self.ui.pd6_dateEdit,
+ self.ui.pd7_dateEdit,
+ self.ui.pd8_dateEdit,
+ self.ui.pd9_dateEdit,
+ self.ui.pd10_dateEdit,
+ self.ui.billdate_dateEdit
+ ):
+ yield de.date().toPyDate() if de.isVisible() else None
+
+ def changeDates(self):
+ '''
+ apply date changes
+ '''
+ for i, date_ in enumerate(self.new_dates):
+ if date_:
+ self.DATE_ATTRIBUTES[i] = date_
+ self._check_enable()
+
+ @property
+ def has_date_changes(self):
+ changed = False
+ for i, date_ in enumerate(self.new_dates):
+ if date_ and self.DATE_ATTRIBUTES[i] != date_:
+ LOGGER.debug("user has changed date from %s to %s",
+ self.DATE_ATTRIBUTES[i], date_)
+ changed = True
+ return changed
+
+ def initialHidden_notes(self):
+ '''
+ load the patients hidden notes
+ '''
+ self.ui.hidden_notes_tableWidget.clear()
+ self.ui.hidden_notes_tableWidget.setColumnCount(2)
+ self.ui.hidden_notes_tableWidget.setRowCount(
+ len(self.pt.HIDDENNOTES))
+ header = self.ui.hidden_notes_tableWidget.horizontalHeader()
+ self.ui.hidden_notes_tableWidget.setHorizontalHeaderLabels(
+ [_("type"), _("note")])
+ header.setStretchLastSection(True)
+ for row_no, (ntype, note) in enumerate(self.pt.HIDDENNOTES):
+ ntype_item = QtGui.QTableWidgetItem(ntype)
+ self.ui.hidden_notes_tableWidget.setItem(row_no, 0, ntype_item)
+
+ note_item = QtGui.QTableWidgetItem(note)
+ self.ui.hidden_notes_tableWidget.setItem(row_no, 1, note_item)
+
+ self.ui.hidden_notes_tableWidget.itemChanged.connect(
+ self._check_enable)
+
+ @property
+ def new_hidden_notes(self):
+ '''
+ apply new notes
+ '''
+ HN = []
+ for row_no in range(self.ui.hidden_notes_tableWidget.rowCount()):
+ ntype = self.ui.hidden_notes_tableWidget.item(row_no, 0).text()
+ note = self.ui.hidden_notes_tableWidget.item(row_no, 1).text()
+
+ HN.append((ntype, note))
+ return HN
+
+ def changeHidden_notes(self):
+ '''
+ apply new notes
+ '''
+ self.pt.HIDDENNOTES = self.new_hidden_notes
+ self._check_enable()
+
+ @property
+ def has_hidden_note_changes(self):
+ return self.new_hidden_notes != self.pt.HIDDENNOTES
+
+ def signals(self):
+ '''
+ connect signals
+ '''
+ for widg in self.ui.money_scrollAreaWidgetContents.children():
+ if isinstance(widg, QtGui.QSpinBox):
+ widg.valueChanged.connect(self.updateMoneyTotal)
+
+ def reject(self):
+ self.dirty = self.has_changes
+ BaseDialog.reject(self)
+
+ @property
+ def has_changes(self):
+ LOGGER.debug("checking for changes")
+ return (self.has_money_changes or
+ self.has_date_changes or
+ self.has_hidden_note_changes)
+
+ def _check_enable(self):
+ self.enableApply(self.has_changes)
+
+ def apply(self):
+ LOGGER.warning("advanced record management dialog applying changes")
+ self.changeMoney()
+ self.changeDates()
+ self.changeHidden_notes()
+
+if __name__ == "__main__":
+ localsettings.initiate()
+ localsettings.loadFeeTables()
+ LOGGER.setLevel(logging.DEBUG)
+
+ from openmolar.dbtools.patient_class import patient
+ pt = patient(1)
+
+ app = QtGui.QApplication([])
+ pt.HIDDENNOTES = [
+ ('COURSE OPENED', '= = = = = '),
+ ('TC: EXAM', 'CE')
+ ]
+
+ dl = AdvancedRecordManagementDialog(pt, None)
+ if dl.exec_():
+ dl.apply()
diff --git a/src/openmolar/qt4gui/dialogs/alterAday.py b/src/openmolar/qt4gui/dialogs/alterAday.py
index faef87a..6041d23 100644
--- a/src/openmolar/qt4gui/dialogs/alterAday.py
+++ b/src/openmolar/qt4gui/dialogs/alterAday.py
@@ -30,10 +30,10 @@ from openmolar.settings import localsettings
from openmolar.dbtools import appointments
-class adayData():
+class adayData(object):
'''
- a custom data structure to stor data
+ a custom data structure to store data
'''
def __init__(self, dent):
diff --git a/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py b/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py
index 8e5ee56..c5dc352 100644
--- a/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/alter_cashbook_dialog.py
@@ -29,9 +29,6 @@ from openmolar.connect import connect
from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
from openmolar.qt4gui.dialogs import permissions
-from openmolar.dbtools.cashbook import cashbookCodesDict
-
-
QUERY = '''select cbdate, ref, descr, code, dntid, amt from cashbook
where id = %s'''
@@ -64,7 +61,7 @@ class AlterCashbookDialog(ExtendableDialog):
self.amount_sb = QtGui.QDoubleSpinBox()
self.amount_sb.setRange(0, 10000)
- self.codestrings = cashbookCodesDict.values()
+ self.codestrings = localsettings.cashbookCodesDict.values()
self.code_cb.addItems(self.codestrings)
form_layout.addRow(_("Patient Number"), self.serialno_le)
@@ -126,7 +123,7 @@ class AlterCashbookDialog(ExtendableDialog):
pos = -1
self.dentist_cb.setCurrentIndex(pos)
- code_str = cashbookCodesDict.get(code)
+ code_str = localsettings.cashbookCodesDict.get(code)
self.code_cb.setCurrentIndex(self.codestrings.index(code_str))
pounds = amt // 100
@@ -140,7 +137,7 @@ class AlterCashbookDialog(ExtendableDialog):
date_ = self.date_edit.date().toPyDate()
ref = str(self.serialno_le.text().toAscii())
descr = str(self.patient_le.text().toAscii())
- for key, value in cashbookCodesDict.viewitems():
+ for key, value in localsettings.cashbookCodesDict.viewitems():
if self.code_cb.currentText() == value:
code = key
break
diff --git a/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py b/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py
index dccad6c..4dd331a 100644
--- a/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/alter_denture_dialog.py
@@ -202,15 +202,18 @@ class PageThree(_OptionPage):
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
+ self.dl = parent
self.label.setText(_(
"Please select teeth to be added to this denture"))
self.chartwidg = SimpleChartWidg(self, auto_ctrl_key=True)
- if parent.is_upper_input:
+ layout = QtGui.QVBoxLayout(self.frame)
+ layout.addWidget(self.chartwidg)
+
+ def showEvent(self, event=None):
+ if self.dl.is_upper_input:
self.chartwidg.disable_lowers()
else:
self.chartwidg.disable_uppers()
- layout = QtGui.QVBoxLayout(self.frame)
- layout.addWidget(self.chartwidg)
@property
def is_completed(self):
diff --git a/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py b/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py
new file mode 100644
index 0000000..7bf9787
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/appointments_insert_blocks_dialog.py
@@ -0,0 +1,252 @@
+#! /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 __future__ import division
+
+from functools import partial
+from PyQt4 import QtGui, QtCore
+
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+from openmolar.qt4gui.customwidgets.fiveminutetimeedit import FiveMinuteTimeEdit
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+
+from openmolar.settings import localsettings
+from openmolar.dbtools import appointments
+
+
+class InsertBlocksDialog(BaseDialog):
+ REASONS = [_("Lunch"), _("Emergency"), _("Staff Meeting"), ("Other")]
+ CHOSEN_REASON = 0
+ CLINICIAN_DICT = {}
+ DAY_DICT = {}
+ START_DATE = None
+ END_DATE = None
+ TIME = None
+ DURATION = None
+
+ def __init__(self, parent=None):
+ BaseDialog.__init__(self, parent)
+ label = WarningLabel(_("Insert a number of blocks to various books"))
+ clinicians_groupbox = QtGui.QGroupBox(self)
+ clinicians_groupbox.setTitle(_("Clinicians"))
+ layout = QtGui.QHBoxLayout(clinicians_groupbox)
+ for initials in (localsettings.activedents + localsettings.activehygs):
+ cb = QtGui.QCheckBox(initials)
+ layout.addWidget(cb)
+ try:
+ cb.setChecked(self.CLINICIAN_DICT[initials])
+ except KeyError:
+ self.CLINICIAN_DICT[initials] = False
+ cb.toggled.connect(partial(self.update_clinician_dict, initials))
+
+ days_groupbox = QtGui.QGroupBox(self)
+ days_groupbox.setTitle(_("Days to Apply"))
+ g_layout = QtGui.QGridLayout(days_groupbox)
+ for day in range(7):
+ cb = QtGui.QCheckBox(localsettings.DAYNAMES[day])
+ row = 0 if day < 4 else 1
+ g_layout.addWidget(cb, row, day % 4)
+ try:
+ cb.setChecked(self.DAY_DICT[day])
+ except KeyError:
+ self.DAY_DICT[day] = False
+ cb.toggled.connect(partial(self.update_day_dict, day))
+
+ if self.START_DATE is None:
+ self.START_DATE = QtCore.QDate.currentDate()
+ self.start_dateedit = QtGui.QDateEdit()
+ self.start_dateedit.setDate(self.START_DATE)
+ self.start_dateedit.setCalendarPopup(True)
+ self.start_dateedit.dateChanged.connect(self.new_start_date)
+
+ if self.END_DATE is None:
+ self.END_DATE = localsettings.BOOKEND
+ self.end_dateedit = QtGui.QDateEdit()
+ self.end_dateedit.setCalendarPopup(True)
+ self.end_dateedit.setDate(self.END_DATE)
+ self.end_dateedit.dateChanged.connect(self.new_end_date)
+
+ if self.TIME is None:
+ self.TIME = QtCore.QTime(13, 0, 0)
+ self.time_edit = FiveMinuteTimeEdit()
+ self.time_edit.setTime(self.TIME)
+ self.time_edit.time_changed_signal.connect(self.new_time)
+
+ self.duration_spinbox = QtGui.QSpinBox()
+ self.duration_spinbox.setMaximum(300)
+ self.duration_spinbox.setSingleStep(5)
+ self.duration_spinbox.setSuffix(" " + _("Minutes"))
+ self.duration_spinbox.setValue(60)
+
+ self.combo_box = QtGui.QComboBox()
+
+ frame = QtGui.QFrame()
+ layout = QtGui.QFormLayout(frame)
+ layout.addRow(_("Start Date"), self.start_dateedit)
+ layout.addRow(_("End Date"), self.end_dateedit)
+ layout.addRow(_("What time does this recurr?"), self.time_edit)
+ layout.addRow(_("Duration"), self.duration_spinbox)
+ layout.addRow(_("What is this block for?"), self.combo_box)
+
+ self.insertWidget(label)
+ self.insertWidget(clinicians_groupbox)
+ self.insertWidget(days_groupbox)
+ self.insertWidget(frame)
+ self.load_combo_box()
+
+ self.enableApply(True)
+
+ def load_combo_box(self, reload=False):
+ if reload:
+ self.combo_box.currentIndexChanged.disconnect(self.check_reason)
+ self.combo_box.clear()
+ self.combo_box.addItems(self.REASONS)
+ self.combo_box.currentIndexChanged.connect(self.check_reason)
+ self.combo_box.setCurrentIndex(self.CHOSEN_REASON)
+
+ def update_clinician_dict(self, initials, bool_):
+ self.CLINICIAN_DICT[initials] = bool_
+
+ def update_day_dict(self, day, bool_):
+ self.DAY_DICT[day] = bool_
+
+ def check_reason(self, i):
+ if self.combo_box.currentText() == _("Other"):
+ reason, result = QtGui.QInputDialog.getText(
+ self,
+ _("reason"),
+ _("Please enter the text to use for this block"))
+ if not result:
+ self.combo_box.setCurrentIndex(0)
+ return
+ self.REASONS.insert(i, reason)
+ self.load_combo_box(True)
+ self.combo_box.setCurrentIndex(i)
+ else:
+ InsertBlocksDialog.CHOSEN_REASON = i
+ return
+
+ def new_start_date(self, date_):
+ InsertBlocksDialog.START_DATE = date_
+
+ def new_end_date(self, date_):
+ InsertBlocksDialog.END_DATE = date_
+
+ def new_time(self, time_):
+ InsertBlocksDialog.TIME = time_
+
+ @property
+ def chosen_days(self):
+ for day, checked in self.DAY_DICT.iteritems():
+ if checked:
+ yield day+1
+
+ @property
+ def chosen_clinicians(self):
+ for clinician, checked in self.CLINICIAN_DICT.iteritems():
+ if checked:
+ yield clinician
+
+ @property
+ def block_text(self):
+ return unicode(self.combo_box.currentText())
+
+ @property
+ def is_valid_input(self):
+ valid = True
+ warnings = []
+ if self.start_dateedit.date() > self.end_dateedit.date():
+ valid = False
+ warnings.append(_("End Date is greater than Start Date"))
+ if self.duration_spinbox.value() == 0:
+ valid = False
+ warnings.append(_("Block has zero duration"))
+ if not list(self.chosen_days):
+ valid = False
+ warnings.append(_("You have no days selected"))
+ if not list(self.chosen_clinicians):
+ valid = False
+ warnings.append(_("You have no clinicians (ie.books) selected"))
+ return valid, warnings
+
+ def apply(self):
+ '''
+ user has entered a good sequence, so write it to the DB now
+ '''
+ sdate = self.start_dateedit.date()
+ fdate = self.end_dateedit.date()
+ n_days = sdate.daysTo(fdate)
+
+ start = localsettings.humanTimetoWystime(
+ self.time_edit.time().toString("h:mm"))
+ end = localsettings.minutesPastMidnighttoWystime(
+ localsettings.minutesPastMidnight(start) +
+ self.duration_spinbox.value())
+
+ #print sdate, fdate, n_days, start, end
+
+ p_dl = QtGui.QProgressDialog(self)
+ p_dl.show()
+ days = list(self.chosen_days)
+ n_attempts, n_inserted = 0, 0
+ for clinician in self.chosen_clinicians:
+ p_dl.setLabelText("%s %s" % (_("applying changes for"), clinician))
+ dt = sdate
+ while dt <= fdate:
+ progress = int(100 * (n_days - dt.daysTo(fdate)) / n_days)
+ p_dl.setValue(progress)
+ if dt.dayOfWeek() in days:
+ n_attempts += 1
+ n_inserted += appointments.make_appt(dt.toPyDate(),
+ localsettings.apptix[clinician],
+ start, end, self.block_text,
+ 0, "", "", "", "", -128, 0, 0, 0)
+ dt = dt.addDays(1)
+
+ message = "%d/%d %s" % (
+ n_inserted, n_attempts, _("Appointment(s) inserted"))
+
+ if n_inserted != n_attempts:
+ message += "<hr />%s" % _(
+ "Some were rejected by the database as they clashed"
+ " with existing appointments or blocks")
+ QtGui.QMessageBox.information(self, _("Information"), message)
+
+ def exec_(self):
+ while BaseDialog.exec_(self):
+ result, warnings = self.is_valid_input
+ if result:
+ self.accept()
+ return True
+ else:
+ QtGui.QMessageBox.warning(self, _("Bad Input"),
+ "<ul><li>%s</li></ul>" % "</li><li>".join(warnings))
+ self.reject()
+
+if __name__ == "__main__":
+ localsettings.initiate()
+ app = QtGui.QApplication([])
+ dl = InsertBlocksDialog()
+ if dl.exec_():
+ dl.apply()
diff --git a/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py b/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py
new file mode 100644
index 0000000..938116a
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/appointments_memo_dialog.py
@@ -0,0 +1,155 @@
+#! /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.qt4gui.dialogs.base_dialogs import ExtendableDialog
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+
+from openmolar.dbtools import appointments
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class AppointmentsMemoDialog(ExtendableDialog):
+
+ def __init__(self, date_, parent=None):
+ ExtendableDialog.__init__(self, parent, remove_stretch=True)
+ self.date = date_
+ label = WarningLabel(
+ "%s %s" % (_("Edit Memos for"),
+ localsettings.longDate(date_))
+ )
+
+ self.bank_hol_label = QtGui.QLabel("")
+ font = self.font()
+ font.setBold(True)
+ font.setItalic(True)
+ self.bank_hol_label.setFont(font)
+ self.bank_hol_label.setAlignment(QtCore.Qt.AlignCenter)
+ self.bank_hol_label.hide()
+
+ self.global_lineedit = QtGui.QLineEdit()
+
+ frame = QtGui.QFrame()
+ form_layout = QtGui.QFormLayout(frame)
+ form_layout.addRow(_("Global Memo"), self.global_lineedit)
+
+ frame2 = QtGui.QFrame()
+ form_layout = QtGui.QFormLayout(frame2)
+
+ self.le_dict = {}
+ for apptix in localsettings.activedent_ixs + localsettings.activehyg_ixs:
+ le = QtGui.QLineEdit()
+ form_layout.addRow(localsettings.apptix_reverse.get(apptix), le)
+ self.le_dict[apptix] = le
+
+ scroll_area = QtGui.QScrollArea()
+ scroll_area.setWidget(frame2)
+ scroll_area.setWidgetResizable(True)
+
+ clinician_groupbox = QtGui.QGroupBox()
+ clinician_groupbox.setTitle(_("Clinician Memos"))
+ layout = QtGui.QVBoxLayout(clinician_groupbox)
+ layout.addWidget(scroll_area)
+
+ self.public_holiday_le = QtGui.QLineEdit()
+ public_holiday_widget = QtGui.QFrame()
+ form_layout = QtGui.QFormLayout(public_holiday_widget)
+ form_layout.addRow(_("Public Holiday Text"), self.public_holiday_le)
+ self.add_advanced_widget(public_holiday_widget)
+ self.set_advanced_but_text(_("Edit Public Holiday Text"))
+
+ self.insertWidget(label)
+ self.insertWidget(self.bank_hol_label)
+ self.insertWidget(frame)
+ self.insertWidget(clinician_groupbox)
+
+ self.setMinimumSize(self.sizeHint())
+ self.check_before_reject_if_dirty = True
+ QtCore.QTimer.singleShot(100, self.load_values)
+
+ def sizeHint(self):
+ return QtCore.QSize(400, 450)
+
+ def load_values(self):
+ self.orig_pub_holiday = appointments.getBankHol(self.date)
+ self.bank_hol_label.setText(self.orig_pub_holiday)
+ self.public_holiday_le.setText(self.orig_pub_holiday)
+ self.bank_hol_label.setVisible(self.orig_pub_holiday != "")
+
+ self.memo_dict = appointments.getMemos(self.date)
+ for apptix, memo in self.memo_dict.iteritems():
+ if apptix == 0:
+ self.global_lineedit.setText(memo)
+ continue
+ try:
+ self.le_dict[apptix].setText(memo)
+ except KeyError:
+ LOGGER.warning("couldn't display memo for apptix %s", apptix)
+ self.enableApply(True)
+
+ def reject(self):
+ self.dirty = self._dirty
+ ExtendableDialog.reject(self)
+
+ @property
+ def _dirty(self):
+ return (self.public_holiday_text != self.orig_pub_holiday or
+ list(self.changed_memos) != [])
+
+ @property
+ def public_holiday_text(self):
+ return unicode(self.public_holiday_le.text().toUtf8())
+
+ @property
+ def changed_memos(self):
+ new_memo = unicode(self.global_lineedit.text().toUtf8())
+ if new_memo != self.memo_dict.get(0, ""):
+ yield (0, new_memo)
+ for apptix, le in self.le_dict.iteritems():
+ memo = self.memo_dict.get(apptix, "")
+ new_memo = unicode(le.text().toUtf8())
+ if new_memo != memo:
+ yield (apptix, new_memo)
+
+ def apply(self):
+ if self.public_holiday_text != self.orig_pub_holiday:
+ appointments.setPubHol(self.date, self.public_holiday_text)
+
+ new_memos = list(self.changed_memos)
+ if new_memos:
+ appointments.setMemos(self.date, new_memos)
+
+if __name__ == "__main__":
+ LOGGER.setLevel(logging.DEBUG)
+ localsettings.initiate()
+ app = QtGui.QApplication([])
+ dl = AppointmentsMemoDialog(QtCore.QDate.currentDate().toPyDate())
+ if dl.exec_():
+ dl.apply()
diff --git a/src/openmolar/qt4gui/dialogs/apptOpenDay.py b/src/openmolar/qt4gui/dialogs/apptOpenDay.py
deleted file mode 100644
index 17581ae..0000000
--- a/src/openmolar/qt4gui/dialogs/apptOpenDay.py
+++ /dev/null
@@ -1,235 +0,0 @@
-#! /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
-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):
- self.setupUi(dialog)
- self.dialog = dialog
- self.comboBox.addItems(
- 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")
-
- def getMinTime(self):
- return QtCore.QTime.fromString("08:30", "hh:mm")
-
- def getMaxTime(self):
- 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,
- ):
- widg.setMinimumTime(self.minTime)
- widg.setMaximumTime(self.maxTime)
- self.day_limits()
-
- def day_limits(self, start=None, finish=None):
- '''
- set day start and finish
- '''
- if start is None:
- self.dayStart_timeEdit.setTime(self.minTime)
- else:
- self.dayStart_timeEdit.setTime(
- 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):
- self.es1_checkBox.setChecked(True)
- self.es1Start_timeEdit.setTime(
- QtCore.QTime.fromString(start, "hh:mm"))
-
- self.es1Finish_timeEdit.setTime(
- 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"))
-
- self.es2Finish_timeEdit.setTime(
- 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"))
-
- self.lunchFinish_timeEdit.setTime(
- QtCore.QTime.fromString(finish, "hh:mm"))
-
- def checkDate(self):
- 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 is not None:
- return True
-
- def checkTimes(self):
- result = True
- #-- does the day end before it starts?
- 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()
-
- if self.lunch_checkBox.isChecked():
- 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()
- else:
- 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.lunchStart_timeEdit.time(
- ) < self.lunchFinish_timeEdit.time()
-
- if self.es2_checkBox.isChecked():
- result = result and \
- self.lunchFinish_timeEdit.time(
- ) <= self.es2Start_timeEdit.time(
- )
- else:
- 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.es2Start_timeEdit.time() < self.es2Finish_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
- '''
- print "writing to DB"
- day = appointments.DentistDay(self.chosenDent)
- day.date = self.dateEdit.date().toPyDate()
- 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)
- if result:
- return True
- else:
- QtGui.QMessageBox.information(self.dialog, "error",
- result.message)
-
- def exec_(self):
- while True:
- if not self.dialog.exec_():
- return False
- else:
- result = True
- if not self.checkTimes():
- result = False
- QtGui.QMessageBox.information(self.dialog,
- "Error", "Incorrect Time sequence - Please Try Again")
- if not self.checkDent():
- result = False
- QtGui.QMessageBox.information(self.dialog,
- "Error", "Dentist not understood - Please Try Again")
- if not self.checkDate():
- result = False
- QtGui.QMessageBox.information(self.dialog,
- "Error", "Date is in the past - Please Try Again")
- if result:
- return self.writeToDB()
-
-
-if __name__ == "__main__":
- localsettings.initiate()
- import sys
- app = QtGui.QApplication(sys.argv)
- Dialog = QtGui.QDialog()
- dl = apptDialog(Dialog)
- if dl.exec_():
- print "accepted"
diff --git a/src/openmolar/qt4gui/dialogs/base_dialogs.py b/src/openmolar/qt4gui/dialogs/base_dialogs.py
index cebda35..a8e2843 100644
--- a/src/openmolar/qt4gui/dialogs/base_dialogs.py
+++ b/src/openmolar/qt4gui/dialogs/base_dialogs.py
@@ -42,6 +42,7 @@ class BaseDialog(QtGui.QDialog):
def __init__(self, parent=None, remove_stretch=False):
QtGui.QDialog.__init__(self, parent)
+ self.setWindowTitle("OpenMolar")
self.button_box = QtGui.QDialogButtonBox(self)
self.button_box.setOrientation(QtCore.Qt.Horizontal)
@@ -61,14 +62,16 @@ class BaseDialog(QtGui.QDialog):
self.dirty = False
self.enableApply(False)
- self.spacer = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Expanding,
- QtGui.QSizePolicy.Expanding)
- self.layout_.addItem(self.spacer)
+ if not remove_stretch:
+ self.spacer = QtGui.QSpacerItem(
+ 0, 50, QtGui.QSizePolicy.Expanding,
+ QtGui.QSizePolicy.Expanding)
+ self.layout_.addItem(self.spacer)
+ self.insertpoint_offset = 2
+ else:
+ self.spacer = None
+ self.insertpoint_offset = 1
self.layout_.addWidget(self.button_box)
- self.insertpoint_offset = 2
-
- if remove_stretch:
- self.remove_spacer()
def sizeHint(self):
'''
@@ -87,8 +90,13 @@ class BaseDialog(QtGui.QDialog):
If this is called, then the spacer added at init is removed.
sometimes the spacer mucks up dialogs
'''
- self.layout_.removeItem(self.spacer)
- self.insertpoint_offset = 1
+ if self.spacer is not None:
+ self.layout_.removeItem(self.spacer)
+ self.insertpoint_offset = 1
+
+ @property
+ def abandon_message(self):
+ return _("Abandon Changes?")
def set_check_on_cancel(self, check):
'''
@@ -127,13 +135,17 @@ class BaseDialog(QtGui.QDialog):
if role == QtGui.QDialogButtonBox.ApplyRole:
self.accept()
else:
- 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):
- self.reject()
+ self.reject()
+
+ def reject(self):
+ if not (self.check_before_reject_if_dirty and self.dirty):
+ QtGui.QDialog.reject(self)
+ else:
+ if QtGui.QMessageBox.question(self,
+ _("Confirm"), self.abandon_message,
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+ QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
+ QtGui.QDialog.reject(self)
def enableApply(self, enable=True):
'''
diff --git a/src/openmolar/qt4gui/dialogs/block_wizard.py b/src/openmolar/qt4gui/dialogs/block_wizard.py
deleted file mode 100644
index b4c402e..0000000
--- a/src/openmolar/qt4gui/dialogs/block_wizard.py
+++ /dev/null
@@ -1,137 +0,0 @@
-#! /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
-from openmolar.qt4gui.compiled_uis import Ui_block_wizard
-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):
- self.setupUi(dialog)
- self.progressBar.hide()
- self.dialog = dialog
- self.clinicianDict = self.addClinicians()
- self.dayDict = self.addDays()
- self.addTimeEdit()
- self.start_dateEdit.setDate(QtCore.QDate.currentDate())
- self.end_dateEdit.setDate(localsettings.bookEnd)
- self.lineEdit.setText(_("emergency"))
- QtCore.QObject.connect(self.buttonBox,
- QtCore.SIGNAL("clicked(QAbstractButton*)"), self.writeToDB)
-
- def addClinicians(self):
- '''
- assemble some checkboxes to put into the gui
- '''
- retarg = {}
- vbox = QtGui.QHBoxLayout()
- for clinician in (localsettings.activedents
- + localsettings.activehygs):
- cb = QtGui.QCheckBox(clinician)
- vbox.addWidget(cb)
- retarg[clinician] = cb
- self.clinicians_groupBox.setLayout(vbox)
- return retarg
-
- def addDays(self):
- '''
- assemble some checkboxes to put into the gui
- '''
- retarg = {}
- vbox = QtGui.QGridLayout()
- for day in range(7):
- cb = QtGui.QCheckBox(localsettings.DAYNAMES[day])
- if day < 4:
- row = 0
- else:
- row = 1
- vbox.addWidget(cb, row, day % 4)
- retarg[day] = cb
- self.day_groupBox.setLayout(vbox)
- return retarg
-
- def addTimeEdit(self):
- '''
- adds a custom widget which enforces a five minute time
- '''
- vlayout = QtGui.QVBoxLayout(self.time_frame)
- vlayout.setMargin(0)
- self.start_timeEdit = fiveminutetimeedit.FiveMinuteTimeEdit()
- vlayout.addWidget(self.start_timeEdit)
- 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):
- self.dialog.reject()
- return
- sdate = self.start_dateEdit.date()
- fdate = self.end_dateEdit.date()
-
- total = sdate.daysTo(fdate)
-
- start = localsettings.humanTimetoWystime(
- self.start_timeEdit.time().toString("h:mm"))
- end = localsettings.minutesPastMidnighttoWystime(
- localsettings.minutesPastMidnight(start) + self.spinBox.value())
-
- self.progressBar.show()
- for clinician in self.clinicianDict.keys():
- if self.clinicianDict[clinician].isChecked():
- self.progress_label.setText("%s %s" % (
- _("applying changes for"), clinician))
-
- dt = sdate
-
- while dt <= fdate:
- progress = int(100 * (total - dt.daysTo(fdate)) / total)
- if self.progressBar.value() != progress:
- self.progressBar.setValue(progress)
- 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)
-
- dt = dt.addDays(1)
-
- self.dialog.accept()
-
-if __name__ == "__main__":
-
- localsettings.initiate()
- import sys
- app = QtGui.QApplication(sys.argv)
- 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 c06dde3..0df1ca8 100644
--- a/src/openmolar/qt4gui/dialogs/blockslot.py
+++ b/src/openmolar/qt4gui/dialogs/blockslot.py
@@ -60,20 +60,12 @@ class blockDialog(Ui_blockSlot.Ui_Dialog):
self.block = True
self.tabWidget.setCurrentIndex(0)
- QtCore.QObject.connect(self.changePt_pushButton,
- QtCore.SIGNAL("clicked()"), self.changePt)
-
- QtCore.QObject.connect(self.start_timeEdit,
- QtCore.SIGNAL("verifiedTime"), self.changedTimes)
-
- QtCore.QObject.connect(self.finish_timeEdit,
- QtCore.SIGNAL("verifiedTime"), self.changedTimes)
-
- QtCore.QObject.connect(self.appointment_timeEdit,
- QtCore.SIGNAL("verifiedTime"), self.changedStart)
-
- QtCore.QObject.connect(self.length_spinBox,
- QtCore.SIGNAL("valueChanged (int)"), self.changedLength)
+ self.changePt_pushButton.clicked.connect(self.changePt)
+ self.start_timeEdit.time_changed_signal.connect(self.changedTimes)
+ self.finish_timeEdit.time_changed_signal.connect(self.changedTimes)
+ self.appointment_timeEdit.time_changed_signal.connect(
+ self.changedStart)
+ self.length_spinBox.valueChanged.connect(self.changedLength)
self.earliestStart = None
self.latestFinish = None
diff --git a/src/openmolar/qt4gui/dialogs/bridge_denture.py b/src/openmolar/qt4gui/dialogs/bridge_denture.py
deleted file mode 100644
index ba44d6a..0000000
--- a/src/openmolar/qt4gui/dialogs/bridge_denture.py
+++ /dev/null
@@ -1,161 +0,0 @@
-#! /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 __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
- self.setRect()
- self.setDefaultColors()
- self.setMouseTracking(True)
-
- def setRect(self):
- 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.update()
-
- def mousePressEvent(self, event):
- print "clicked %s" % self.name
-
- def leaveEvent(self, event):
- self.setDefaultColors()
- self.update()
-
- 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
- sansFont = QtGui.QFont("Sans", 8)
- painter.setFont(sansFont)
- 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)
- 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.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]
- self.repaint()
- 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)
- self.teeth.append(t)
- self.update()
-
- def paintEvent(self, event=None):
- '''override the paint event so that we can draw our grid'''
-
- 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
- sansFont = QtGui.QFont("Helvetica", 8)
- painter.setFont(sansFont)
- fm = QtGui.QFontMetrics(sansFont)
- leftpad = fm.width("Right ")
- rightpad = fm.width(" Left")
-
- 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")))
-
- for tooth in self.teeth:
- tooth.update()
-
- painter.restore()
-
-
-if __name__ == "__main__":
- import sys
- app = QtGui.QApplication(sys.argv)
- Form = QtGui.QWidget()
- ui = labChartWidget(Form)
- # Form.setEnabled(False)
- Form.show()
- sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/dialogs/close_course_dialog.py b/src/openmolar/qt4gui/dialogs/close_course_dialog.py
new file mode 100644
index 0000000..aacd8e0
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/close_course_dialog.py
@@ -0,0 +1,103 @@
+#! /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.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class CloseCourseDialog(BaseDialog):
+
+ def __init__(self, ftr=False, parent=None):
+ BaseDialog.__init__(self, parent)
+ self.setWindowTitle(_("Close Course Dialog"))
+
+ self.patient_label = QtGui.QLabel("")
+ self.patient_label.setAlignment(QtCore.Qt.AlignCenter)
+ f = self.patient_label.font()
+ f.setBold(True)
+ self.patient_label.setFont(f)
+
+ self.tx_complete_label = WarningLabel(
+ _('You have no further treatment proposed for this patient, '
+ 'yet they are deemed to be "under treatment".'))
+ self.tx_complete_label.setMaximumHeight(120)
+
+ self.date_edit = QtGui.QDateEdit()
+ self.date_edit.setDate(QtCore.QDate.currentDate())
+ self.date_edit.setMaximumDate(QtCore.QDate().currentDate())
+ self.date_edit.setCalendarPopup(True)
+
+ frame = QtGui.QFrame(self)
+ layout = QtGui.QFormLayout(frame)
+ layout.addRow(_("Suggested Completion Date"), self.date_edit)
+
+ question_label = QtGui.QLabel(
+ "<b>%s</b>" %
+ _("Close this course now?"))
+ question_label.setAlignment(QtCore.Qt.AlignCenter)
+
+ self.ftr_checkbox = QtGui.QCheckBox(_("Pt failed to return"))
+ self.ftr_checkbox.setChecked(ftr)
+
+ self.insertWidget(self.patient_label)
+ self.insertWidget(self.tx_complete_label)
+ self.insertWidget(frame)
+ self.insertWidget(question_label)
+
+ if ftr:
+ self.layout().insertStretch(4, 200)
+ self.insertWidget(self.ftr_checkbox)
+
+ self.enableApply()
+
+ def set_minimum_date(self, date_):
+ self.date_edit.setMinimumDate(date_)
+
+ def set_date(self, date_):
+ self.date_edit.setDate(date_)
+
+ @property
+ def completion_date(self):
+ return self.date_edit.date().toPyDate()
+
+ @property
+ def ftr(self):
+ return self.ftr_checkbox.isChecked()
+
+if __name__ == "__main__":
+ LOGGER.setLevel(logging.DEBUG)
+ app = QtGui.QApplication([])
+
+ dl = CloseCourseDialog(True)
+ dl.patient_label.setText("test")
+ # dl.tx_complete_label.hide()
+ dl.set_minimum_date(QtCore.QDate().currentDate().addMonths(-1))
+
+ if dl.exec_():
+ print dl.completion_date, dl.ftr
diff --git a/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py b/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py
index c3f8315..29c14c9 100644
--- a/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/complete_treatment_dialog.py
@@ -30,8 +30,6 @@ from functools import partial
from PyQt4 import QtCore, QtGui
from openmolar.dbtools.treatment_course import CURRTRT_ROOT_ATTS
-from openmolar.qt4gui.customwidgets.upper_case_line_edit \
- import UpperCaseLineEdit
from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
LOGGER = logging.getLogger("openmolar")
diff --git a/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py b/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py
new file mode 100644
index 0000000..0181534
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/course_consistency_dialog.py
@@ -0,0 +1,107 @@
+#! /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.ptModules.course_checker import get_course_checker
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class CourseConsistencyDialog(ExtendableDialog):
+
+ def __init__(self, serialno, courseno, parent=None):
+ ExtendableDialog.__init__(self, parent)
+ self.serialno = serialno
+ self.courseno = courseno
+
+ header_label = QtGui.QLabel("<b>%s %s</b>" % (
+ _("Course Daybook Estimate Checker"), self.courseno))
+ header_label.setAlignment(QtCore.Qt.AlignCenter)
+
+ self.polling_label = QtGui.QLabel(_("Polling Database"))
+
+ self.trt_widget = QtGui.QTextBrowser()
+ self.day_trt_widget = QtGui.QTextBrowser()
+
+ self.insertWidget(header_label)
+ self.insertWidget(self.polling_label)
+
+ self.adv_widget = QtGui.QLabel(_("No advanced options available"))
+ self.add_advanced_widget(self.adv_widget)
+
+ QtCore.QTimer.singleShot(100, self.get_data)
+
+ def advise(self, message):
+ QtGui.QMessageBox.information(self, _("message"), message)
+
+ def sizeHint(self):
+ return QtCore.QSize(800, 600)
+
+ def get_data(self):
+ self.course_checker = get_course_checker(self.serialno, self.courseno)
+ html1 = self.course_checker.course.to_html()
+ html1c = self.course_checker.course.to_html(completed_only = True)
+ html2 = self.course_checker.daybook_course.to_html()
+ self.polling_label.hide()
+ self.insertWidget(QtGui.QLabel("course"))
+ self.insertWidget(self.trt_widget)
+ self.insertWidget(QtGui.QLabel("daybook course"))
+ self.insertWidget(self.day_trt_widget)
+
+ self.trt_widget.setText(html1)
+ self.day_trt_widget.setText(html2)
+
+ # for comparision puporses - dev code!!
+ #f = open("/home/neil/course.txt", "w")
+ #f.write(html1c)
+ #f.close()
+
+ #f = open("/home/neil/day_course.txt", "w")
+ #f.write(html2)
+ #f.close()
+
+ match = "<b>%s</b>" % ("match!" if html1c == html2 else "differs")
+ self.insertWidget(QtGui.QLabel(match))
+
+ def update_db(self):
+ '''
+ apply any edits (should be called if self.exec_() == True)
+ '''
+ pass
+
+if __name__ == "__main__":
+
+ app = QtGui.QApplication([])
+ LOGGER.setLevel(logging.DEBUG)
+ serialno = 14469
+ coursenos = (9568, 11394, 14016, 15946, 16161, 16433, 17677, 20644, 21411,
+ 23844, 26049, 27230, 30876, 31820, 32526, 41921, 42138, 45151)
+
+ for courseno in coursenos:
+ dl = CourseConsistencyDialog(serialno, courseno)
+ if dl.exec_():
+ dl.update_db()
diff --git a/src/openmolar/qt4gui/dialogs/course_edit_dialog.py b/src/openmolar/qt4gui/dialogs/course_edit_dialog.py
new file mode 100644
index 0000000..36cdbf0
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/course_edit_dialog.py
@@ -0,0 +1,143 @@
+#! /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 treatment_course
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class CourseEditDialog(ExtendableDialog):
+
+ def __init__(self, courseno, parent=None):
+ ExtendableDialog.__init__(self, parent)
+ self.courseno = courseno
+
+ header_label = QtGui.QLabel(
+ "<b>%s %s</b>" % (_("Edit Treatment Course"), self.courseno))
+ header_label.setAlignment(QtCore.Qt.AlignCenter)
+
+ self.accd_date_edit = QtGui.QDateEdit()
+ self.accd_date_edit.setCalendarPopup(True)
+ self.cmpd_date_edit = QtGui.QDateEdit()
+ self.cmpd_date_edit.setCalendarPopup(True)
+ self.examd_date_edit = QtGui.QDateEdit()
+ self.examd_date_edit.setEnabled(False)
+
+ self.polling_label = QtGui.QLabel(_("Polling Database"))
+ self.insertWidget(header_label)
+
+ self.insertWidget(self.polling_label)
+
+ self.adv_widget = QtGui.QLabel(_("No advanced options available"))
+ self.add_advanced_widget(self.adv_widget)
+
+ 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)
+
+ @property
+ def accd(self):
+ return self.accd_date_edit.date().toPyDate()
+
+ @property
+ def cmpd(self):
+ if self.cmpd_db:
+ return self.cmpd_date_edit.date().toPyDate()
+ return self.accd
+
+ @property
+ def examd(self):
+ if self.examd_db:
+ self.examd_db
+ return self.accd
+
+ def get_data(self):
+ accd, cmpd, examd = treatment_course.get_course_dates(self.courseno)
+ self.polling_label.hide()
+
+ self.accd_db = accd
+ self.cmpd_db = cmpd
+ self.examd_db = examd
+
+ frame = QtGui.QFrame()
+ form_layout = QtGui.QFormLayout(frame)
+ self.insertWidget(frame)
+
+ self.accd_date_edit.setDate(accd)
+ form_layout.addRow(_("acceptance date"), self.accd_date_edit)
+ if cmpd:
+ self.cmpd_date_edit.setDate(cmpd)
+ form_layout.addRow(_("completion date"), self.cmpd_date_edit)
+ if cmpd != accd:
+ sync_but = QtGui.QPushButton(
+ _("Set completion date to match Acceptance date"))
+ sync_but.clicked.connect(self.sync_dates)
+ self.insertWidget(sync_but)
+ else:
+ but = QtGui.QPushButton(_("Add Completion Date"))
+ form_layout.addRow(but)
+ but.clicked.connect(self.add_a_completion_date)
+ if examd:
+ self.examd_date_edit.setDate(examd)
+ form_layout.addRow(_("exam date"), self.examd_date_edit)
+ else:
+ form_layout.addRow(QtGui.QLabel(_("No Exam Date on this course")))
+ self.accd_date_edit.dateChanged.connect(self._check_applicable)
+ self.cmpd_date_edit.dateChanged.connect(self._check_applicable)
+
+ def add_a_completion_date(self):
+ self.advise("function not yet implemented")
+
+ def sync_dates(self):
+ self.cmpd_date_edit.setDate(self.accd)
+
+ def _check_applicable(self):
+ if self.accd <= self.examd <= self.cmpd:
+ self.enableApply(True)
+ else:
+ self.enableApply(False)
+ self.advise(_("Bad Date Sequence"))
+
+ def update_db(self):
+ '''
+ apply any edits (should be called if self.exec_() == True)
+ '''
+ treatment_course.update_course_dates(
+ self.accd, self.cmpd if self.cmpd_db else None, self.courseno)
+
+if __name__ == "__main__":
+
+ app = QtGui.QApplication([])
+ LOGGER.setLevel(logging.DEBUG)
+ dl = CourseEditDialog(17437)
+ if dl.exec_():
+ dl.update_db()
diff --git a/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py b/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py
similarity index 53%
copy from src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
copy to src/openmolar/qt4gui/dialogs/course_history_options_dialog.py
index c522f34..4cc4fc7 100644
--- a/src/openmolar/qt4gui/customwidgets/fiveminutetimeedit.py
+++ b/src/openmolar/qt4gui/dialogs/course_history_options_dialog.py
@@ -22,43 +22,57 @@
# # # #
# ############################################################################ #
+import logging
+
from PyQt4 import QtGui, QtCore
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
-class FiveMinuteTimeEdit(QtGui.QTimeEdit):
+class CourseHistoryOptionsDialog(BaseDialog):
- '''
- A custom timeEdit which enforces only 5 minutes
- NB - connect to slot "verifiedTime"
- '''
+ include_estimates = False
+ include_daybook = False
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)
-
- 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
- self.setTime(QtCore.QTime(self.time().hour(), min))
- self.emit(QtCore.SIGNAL("verifiedTime"), self.time())
+ BaseDialog.__init__(self, parent)
+ self.setWindowTitle(_("Options Dialog"))
+ label = QtGui.QLabel("<b>%s</b>" % _("What do you wish to show?"))
+ label.setAlignment(QtCore.Qt.AlignCenter)
-if __name__ == "__main__":
- def test(t):
- print "signal received", t
+ self.estimates_checkbox = QtGui.QCheckBox(_("Include Estimates"))
+ self.estimates_checkbox.setChecked(self.include_estimates)
+ self.estimates_checkbox.toggled.connect(self.toggle_estimates)
+
+ self.daybook_checkbox = QtGui.QCheckBox(_("Include Daybook"))
+ self.daybook_checkbox.setChecked(self.include_daybook)
+ self.daybook_checkbox.toggled.connect(self.toggle_daybook)
+
+ help_label = QtGui.QLabel(_("Leave both unchecked for courses only"))
+ help_label.setAlignment(QtCore.Qt.AlignCenter)
+
+ self.insertWidget(label)
+ self.insertWidget(self.estimates_checkbox)
+ self.insertWidget(self.daybook_checkbox)
+ self.insertWidget(help_label)
+
+ self.enableApply()
- import sys
+ def sizeHint(self):
+ return QtCore.QSize(200, 150)
+
+ def toggle_estimates(self, value):
+ CourseHistoryOptionsDialog.include_estimates = value
+
+ def toggle_daybook(self, value):
+ CourseHistoryOptionsDialog.include_daybook = value
+
+
+if __name__ == "__main__":
+ LOGGER.setLevel(logging.DEBUG)
app = QtGui.QApplication([])
- te = FiveMinuteTimeEdit()
- QtCore.QObject.connect(te,
- QtCore.SIGNAL("verifiedTime"), test)
- te.show()
- sys.exit(app.exec_())
+
+ dl = CourseHistoryOptionsDialog()
+ if dl.exec_():
+ print dl.include_estimates, dl.include_daybook
diff --git a/src/openmolar/qt4gui/dialogs/course_merge_dialog.py b/src/openmolar/qt4gui/dialogs/course_merge_dialog.py
new file mode 100644
index 0000000..e970b9e
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/course_merge_dialog.py
@@ -0,0 +1,180 @@
+#! /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 copy
+import logging
+from PyQt4 import QtGui, QtCore
+
+from openmolar.dbtools import treatment_course
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class CourseMergeDialog(ExtendableDialog):
+
+ def __init__(self, serialno, courseno1, courseno2, parent=None):
+ ExtendableDialog.__init__(self, parent, remove_stretch=True)
+ assert courseno1 > courseno2, "courses in wrong order"
+ self.serialno = serialno
+ self.courseno1 = courseno1
+ self.courseno2 = courseno2
+ self._merged_course = None
+
+ header_label = QtGui.QLabel(
+ "<b>%s %s & %s</b>" % (_("Merge Treatment Courses"),
+ self.courseno1, self.courseno2))
+ header_label.setAlignment(QtCore.Qt.AlignCenter)
+
+ self.polling_label = QtGui.QLabel(_("Polling Database"))
+
+ self.preview_button = QtGui.QPushButton(_("Preview Merged Course"))
+
+ self.courseno1_browser = QtGui.QTextBrowser()
+ self.courseno2_browser = QtGui.QTextBrowser()
+ self.preview_browser = QtGui.QTextBrowser()
+
+ self.splitter = QtGui.QSplitter()
+ self.splitter.setOrientation(QtCore.Qt.Vertical)
+
+ self.insertWidget(header_label)
+ self.insertWidget(self.polling_label)
+ self.insertWidget(self.splitter)
+
+ self.splitter.addWidget(self.courseno1_browser)
+ self.splitter.addWidget(self.courseno2_browser)
+ self.splitter.addWidget(self.preview_browser)
+
+ self.adv_widget = QtGui.QLabel(_("No advanced options available"))
+ self.add_advanced_widget(self.adv_widget)
+
+ QtCore.QTimer.singleShot(100, self.get_data)
+
+ def advise(self, message):
+ QtGui.QMessageBox.information(self, _("message"), message)
+
+ def sizeHint(self):
+ return QtCore.QSize(600, 600)
+
+ def get_data(self):
+ self.tx_course1 = treatment_course.TreatmentCourse(self.serialno,
+ self.courseno1)
+ self.tx_course2 = treatment_course.TreatmentCourse(self.serialno,
+ self.courseno2)
+ self.polling_label.hide()
+ course1_html = self.tx_course1.to_html()
+ course2_html = self.tx_course2.to_html()
+ self.courseno1_browser.setHtml(course1_html)
+ self.courseno2_browser.setHtml(course2_html)
+ if self.tx_course1.examt and self.tx_course2.examt:
+ message = _("Courses can't be merged, both have examinations")
+ else:
+ message = "<h2>%s</h2>%s" % (_("Merged Course Preview"),
+ self.merged_course.to_html()
+ )
+ self.preview_browser.setText(message)
+ sizes = [(course1_html.count("<tr>") + 1) * 300,
+ (course1_html.count("<tr>") + 1) * 300,
+ (message.count("<tr>") + 1) * 300]
+ self.splitter.setSizes(sizes)
+ LOGGER.debug(sizes)
+
+ self.enableApply(self._merged_course is not None)
+
+ @property
+ def _merge_atts(self):
+ exclusions = ("courseno", "accd", "cmpd", "examd", "examt")
+ for att in treatment_course.CURRTRT_ATTS:
+ if att not in exclusions:
+ yield att
+
+ @property
+ def merged_course(self):
+ if self._merged_course is None:
+ new_course = copy.deepcopy(self.tx_course2)
+ if self.tx_course1.accd < new_course.accd:
+ new_course.accd = self.tx_course1.accd
+ if (new_course.cmpd is not None or
+ self.tx_course1.cmpd > new_course.cmpd):
+ new_course.cmpd = self.tx_course1.cmpd
+ if (new_course.examd is None or
+ (self.tx_course1.examd and
+ self.tx_course1.examd < new_course.examd)):
+ new_course.examd = self.tx_course1.examd
+ if self.tx_course1.examt > new_course.examt:
+ new_course.examt = self.tx_course1.examt
+ for att in self._merge_atts:
+ value1 = new_course.__dict__[att]
+ value2 = self.tx_course1.__dict__[att]
+ if value1 in (None, ""):
+ new_course.__dict__[att] = value2
+ elif value2 in (None, ""):
+ pass
+ else:
+ new_course.__dict__[att] += value2
+ self._merged_course = new_course
+ return self._merged_course
+
+ def list_hashes(self):
+ for tx_course in self.tx_course1, self.tx_course2, self.merged_course:
+ print "TX_HASHES for course %s" % tx_course.courseno
+ for tx_hash in tx_course.tx_hashes:
+ print tx_hash
+
+ def update_db(self):
+ '''
+ apply any edits (should be called if self.exec_() == True)
+ to merge 2 courses, all treatments have to be combined, and placed
+ into the oldest course.
+ the newestimates table has to have the coursenumber adjusted.
+ NOTE - old tx_hashes will not longer be generatable
+ by the TreatmentCourseClass
+ '''
+ trtchanges = ""
+ trtvalues = []
+ for trt_att in treatment_course.CURRTRT_ATTS:
+ if trt_att == "courseno":
+ continue
+ value = self.merged_course.__dict__[trt_att]
+ existing = self.tx_course2.__dict__[trt_att]
+ if value != existing:
+ trtchanges += '%s = %%s ,' % trt_att
+ trtvalues.append(value)
+ self.list_hashes()
+ if treatment_course.update_course(trtchanges.rstrip(","),
+ trtvalues,
+ self.serialno,
+ self.courseno2
+ ):
+ treatment_course.update_estimate_courseno(self.courseno1,
+ self.courseno2)
+ treatment_course.delete_course(self.serialno, self.courseno1)
+
+if __name__ == "__main__":
+
+ app = QtGui.QApplication([])
+ LOGGER.setLevel(logging.DEBUG)
+ dl = CourseMergeDialog(12647, 6879, 2385)
+ if dl.exec_():
+ dl.update_db()
diff --git a/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py b/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py
index a367656..4170fad 100644
--- a/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/daybook_edit_dialog.py
@@ -51,6 +51,7 @@ class DaybookEditDialog(ExtendableDialog):
self.line_edits[key] = QtGui.QLineEdit()
self.chart_edit = QtGui.QTextEdit()
+ self.chart_edit.setWordWrapMode(QtGui.QTextOption.NoWrap)
form.addRow(_("Diagnosis"), self.line_edits[KEYS[0]])
form.addRow(_("Perio"), self.line_edits[KEYS[1]])
diff --git a/src/openmolar/qt4gui/dialogs/denture_dialog.py b/src/openmolar/qt4gui/dialogs/denture_dialog.py
index 7012189..f1b5405 100644
--- a/src/openmolar/qt4gui/dialogs/denture_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/denture_dialog.py
@@ -48,7 +48,7 @@ class DentureDialog(BaseDialog):
frame = QtGui.QFrame()
layout = QtGui.QHBoxLayout(frame)
- new_but = QtGui.QPushButton(_("Plan a New Denture"))
+ new_but = QtGui.QPushButton(_("Plan New Denture(s)"))
new_but.setMinimumSize(QtCore.QSize(150, 150))
alt_but = QtGui.QPushButton(_("Alter an Existing Denture"))
alt_but.setMinimumSize(QtCore.QSize(150, 150))
diff --git a/src/openmolar/qt4gui/dialogs/__init__.py b/src/openmolar/qt4gui/dialogs/dialog_collection.py
old mode 100755
new mode 100644
similarity index 69%
copy from src/openmolar/qt4gui/dialogs/__init__.py
copy to src/openmolar/qt4gui/dialogs/dialog_collection.py
index 3af96a9..ad52134
--- a/src/openmolar/qt4gui/dialogs/__init__.py
+++ b/src/openmolar/qt4gui/dialogs/dialog_collection.py
@@ -22,8 +22,12 @@
# # # #
# ############################################################################ #
+'''
+This is a convenience module so that maingui can simply import *
+'''
+
from openmolar.qt4gui.dialogs import saveMemo
-from openmolar.qt4gui.dialogs import permissions
+# from openmolar.qt4gui.dialogs import permissions
from openmolar.qt4gui.dialogs import select_language
from openmolar.qt4gui.dialogs.newBPE import BPE_Dialog
@@ -48,8 +52,26 @@ 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
+from openmolar.qt4gui.dialogs.course_edit_dialog import CourseEditDialog
+from openmolar.qt4gui.dialogs.course_merge_dialog import CourseMergeDialog
+from openmolar.qt4gui.dialogs.estimate_edit_dialog import EstimateEditDialog
+from openmolar.qt4gui.dialogs.course_history_options_dialog import CourseHistoryOptionsDialog
+from openmolar.qt4gui.dialogs.course_consistency_dialog import CourseConsistencyDialog
+from openmolar.qt4gui.dialogs.edit_treatment_dialog import EditTreatmentDialog
+from openmolar.qt4gui.dialogs.login_dialog import LoginDialog
+from openmolar.qt4gui.dialogs.edit_referral_centres_dialog import EditReferralCentresDialog
+from openmolar.qt4gui.dialogs.permissions import ResetSupervisorPasswordDialog
+from openmolar.qt4gui.dialogs.first_run_dialog import FirstRunDialog
+from openmolar.qt4gui.dialogs.add_user_dialog import AddUserDialog
+from openmolar.qt4gui.dialogs.add_clinician_dialog import AddClinicianDialog
+from openmolar.qt4gui.dialogs.initial_check_dialog import InitialCheckDialog
+from openmolar.qt4gui.dialogs.edit_practice_dialog import EditPracticeDialog
+from openmolar.qt4gui.dialogs.advanced_record_management_dialog import AdvancedRecordManagementDialog
__all__ = ['AccountSeverityDialog',
+ 'AddClinicianDialog',
+ 'AddUserDialog',
+ 'AdvancedRecordManagementDialog',
'AdvancedTxPlanningDialog',
'AlterTodaysNotesDialog',
'AssistantSelectDialog',
@@ -58,17 +80,29 @@ __all__ = ['AccountSeverityDialog',
'ChildSmileDialog',
'ChooseToothDialog',
'ClinicianSelectDialog',
+ 'CourseConsistencyDialog',
+ 'CourseEditDialog',
+ 'CourseMergeDialog',
+ 'CourseHistoryOptionsDialog',
'DaybookItemDialog',
'DaybookEditDialog',
'DocumentDialog',
'DuplicateReceiptDialog',
+ 'EditPracticeDialog',
+ 'EditTreatmentDialog',
+ 'EditReferralCentresDialog',
+ 'EstimateEditDialog',
'ExamWizard',
'FamilyManageDialog',
'FindPatientDialog',
+ 'FirstRunDialog',
'HygTreatWizard',
+ 'InitialCheckDialog',
'LoadRelativesDialog',
+ 'LoginDialog',
'MedNotesDialog',
'NHSFormsConfigDialog',
+ 'ResetSupervisorPasswordDialog',
'RecallDialog',
'SaveDiscardCancelDialog',
]
diff --git a/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py b/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py
index 2cbd8c0..3fa0d64 100644
--- a/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/duplicate_receipt_dialog.py
@@ -168,14 +168,14 @@ class DuplicateReceiptDialog(BaseDialog):
amount = self.amount_spinbox.value()
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
+ total = localsettings.pencify(str(amount))
+ myreceipt.total = total
- myreceipt.receivedDict = {_("Professional Services"): amount * 100}
+ myreceipt.receivedDict = {_("Professional Services"): total}
myreceipt.isDuplicate = True
myreceipt.dupdate = self.dup_date_edit.date()
diff --git a/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py b/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py
new file mode 100644
index 0000000..5ce6cc0
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/edit_practice_dialog.py
@@ -0,0 +1,116 @@
+#! /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.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+from openmolar.dbtools import db_settings
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class EditPracticeDialog(BaseDialog):
+
+ def __init__(self, parent=None):
+ BaseDialog.__init__(self, parent)
+ self.setWindowTitle(_("Edit Practice Address Dialog"))
+
+ self.top_label = WarningLabel("%s<hr />%s" % (
+ _('Edit the Practice Name and/or address.'),
+ _("This information is used on receipts and appointment slips."),
+ ))
+
+ self.practice_line_edit = QtGui.QLineEdit()
+ self.practice_line_edit.setText(localsettings.PRACTICE_NAME)
+
+ frame = QtGui.QFrame(self)
+ layout = QtGui.QFormLayout(frame)
+ layout.addRow(_("Practice Name"), self.practice_line_edit)
+
+ self.addr_line_edits = []
+ for i in range(7):
+ le = QtGui.QLineEdit()
+ self.addr_line_edits.append(le)
+ layout.addRow("%s %d" % (_("Address Line"), i + 1), le)
+
+ try:
+ le.setText(localsettings.PRACTICE_ADDRESS[i + 1])
+ except IndexError:
+ pass
+
+ self.insertWidget(self.top_label)
+ self.insertWidget(frame)
+
+ self.enableApply()
+
+ def sizeHint(self):
+ return QtCore.QSize(400, 400)
+
+ def showEvent(self, event):
+ self.practice_line_edit.setFocus()
+
+ @property
+ def practice_name(self):
+ return unicode(self.practice_line_edit.text().toUtf8()).strip(" ")
+
+ @property
+ def practice_address(self):
+ address_lines = []
+ for le in self.addr_line_edits:
+ line_ = unicode(le.text().toUtf8()).strip(" ")
+ if line_ != "":
+ address_lines.append(line_)
+ return "|".join(address_lines)
+
+ def apply(self):
+ changed = False
+ if self.practice_name != localsettings.PRACTICE_NAME:
+ changed = changed or db_settings.insert_practice_name(
+ self.practice_name)
+ if self.practice_address != localsettings.PRACTICE_ADDRESS:
+ changed = changed or db_settings.insert_practice_address(
+ self.practice_address)
+ if changed:
+ localsettings.initiate()
+ return True
+
+ def exec_(self):
+ if BaseDialog.exec_(self):
+ return self.apply()
+ return False
+
+if __name__ == "__main__":
+ LOGGER.setLevel(logging.DEBUG)
+ app = QtGui.QApplication([])
+ localsettings.initiate()
+
+ dl = EditPracticeDialog()
+ dl.exec_()
+ print dl.practice_name
+ print dl.practice_address
diff --git a/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py b/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py
new file mode 100644
index 0000000..2d009ee
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/edit_referral_centres_dialog.py
@@ -0,0 +1,305 @@
+#! /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 referral
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class ListModel(QtCore.QAbstractListModel):
+
+ '''
+ A simple model to provide an index for the dialog
+ '''
+
+ def __init__(self, parent=None):
+ QtCore.QAbstractListModel.__init__(self, parent)
+ self.labels = []
+
+ def rowCount(self, parent=QtCore.QModelIndex()):
+ return len(self.labels)
+
+ def data(self, index, role):
+ if not index.isValid():
+ pass
+ elif role == QtCore.Qt.DisplayRole:
+ return self.labels[index.row()]
+ elif role == QtCore.Qt.DecorationRole:
+ return QtGui.QIcon(":icons/pencil.png")
+
+ def clear(self):
+ self.beginResetModel()
+ self.labels = []
+ self.endResetModel()
+
+ def add_item(self, label):
+ self.beginResetModel()
+ self.labels.append(label)
+ self.endResetModel()
+
+
+class EditReferralCentresDialog(BaseDialog):
+
+ def __init__(self, parent=None):
+ BaseDialog.__init__(self, parent, remove_stretch=True)
+ message = _("Edit Referral Centres")
+ self.setWindowTitle(message)
+
+ self._referral_centres = None
+ self.deleted_centres = []
+
+ header_label = QtGui.QLabel("<b>%s</b>" % message)
+
+ self.list_model = ListModel()
+
+ self.list_view = QtGui.QListView()
+ self.list_view.setModel(self.list_model)
+
+ icon = QtGui.QIcon(":/eraser.png")
+ delete_but = QtGui.QPushButton(icon, "")
+ delete_but.setToolTip(_("Delete the currently selected Centre"))
+ delete_but.setMaximumWidth(80)
+
+ icon = QtGui.QIcon(":/add_user.png")
+ add_but = QtGui.QPushButton(icon, "")
+ add_but.setToolTip(_("Add a New Centre"))
+ add_but.setMaximumWidth(80)
+
+ left_frame = QtGui.QFrame()
+ layout = QtGui.QGridLayout(left_frame)
+ layout.setMargin(0)
+ layout.addWidget(self.list_view, 0, 0, 1, 3)
+ layout.addWidget(delete_but, 1, 0)
+ layout.addWidget(add_but, 1, 1)
+ left_frame.setMaximumWidth(250)
+
+ right_frame = QtGui.QFrame()
+ layout = QtGui.QFormLayout(right_frame)
+ layout.setMargin(0)
+ self.description_line_edit = QtGui.QLineEdit()
+ self.greeting_line_edit = QtGui.QLineEdit()
+ self.text_edit = QtGui.QTextEdit()
+
+ layout.addRow(_("Description"), self.description_line_edit)
+ layout.addRow(_("Greeting"), self.greeting_line_edit)
+ layout.addRow(_("Address"), self.text_edit)
+
+ splitter = QtGui.QSplitter()
+ splitter.addWidget(left_frame)
+ splitter.addWidget(right_frame)
+ splitter.setSizes([1, 10])
+ self.insertWidget(header_label)
+ self.insertWidget(splitter)
+
+ self.list_view.pressed.connect(self.show_data)
+
+ self.cancel_but.setText(_("Close"))
+ self.apply_but.setText(_("Apply Changes"))
+
+ self.set_check_on_cancel(True)
+ self.description_line_edit.editingFinished.connect(
+ self.description_edited)
+ self.signals()
+ add_but.clicked.connect(self.add_centre)
+ delete_but.clicked.connect(self.remove_centre)
+
+ self.orig_data = []
+ QtCore.QTimer.singleShot(100, self.load_existing)
+ # self.enableApply()
+
+ def sizeHint(self):
+ return QtCore.QSize(700, 300)
+
+ def signals(self, connect=True):
+ for signal in (
+ self.description_line_edit.textChanged,
+ self.greeting_line_edit.textChanged,
+ self.text_edit.textChanged
+ ):
+ if connect:
+ signal.connect(self.update_centre)
+ else:
+ signal.disconnect(self.update_centre)
+
+ @property
+ def referral_centres(self):
+ if self._referral_centres is None:
+ self._referral_centres = []
+ for centre in referral.get_referral_centres():
+ self._referral_centres.append(centre)
+ self.orig_data.append(str(centre))
+ return self._referral_centres
+
+ def load_existing(self, row=0):
+ if self.referral_centres == []:
+ return
+ self.signals(False)
+ self.list_model.clear()
+ for ref_centre in self.referral_centres:
+ if ref_centre not in self.deleted_centres:
+ self.list_model.add_item(ref_centre.description)
+ index = self.list_model.createIndex(row, 0)
+ self.list_view.setCurrentIndex(index)
+ self.signals()
+ self.show_data(index)
+
+ def show_data(self, index):
+ self.signals(False)
+ centre = self.current_centre
+ self.description_line_edit.setText(centre.description)
+ self.greeting_line_edit.setText(centre.greeting)
+ address = "\n".join(
+ [a for a in (centre.addr1,
+ centre.addr2,
+ centre.addr3,
+ centre.addr4,
+ centre.addr5,
+ centre.addr6,
+ centre.addr7)]
+ )
+ self.text_edit.setText(address)
+ self.signals()
+
+ @property
+ def current_row(self):
+ return self.list_view.currentIndex().row()
+
+ @property
+ def current_centre(self):
+ i = -1
+ for ref_centre in self.referral_centres:
+ if ref_centre not in self.deleted_centres:
+ i += 1
+ if i == self.current_row:
+ return ref_centre
+
+ @property
+ def description(self):
+ '''
+ return the current description text
+ '''
+ return self.description_line_edit.text()
+
+ @property
+ def greeting(self):
+ '''
+ return the current greeting text
+ '''
+ return self.greeting_line_edit.text()
+
+ @property
+ def address(self):
+ lines = unicode(self.text_edit.toPlainText()).split("\n")
+ while len(lines) < 8:
+ lines.append("")
+ return lines
+
+ def add_centre(self):
+ LOGGER.debug("add_centre")
+ if self.referral_centres == []:
+ centre = referral.ReferralCentre(
+ hash(0),
+ _("Example Referral Centre"),
+ _("Dear Sir/Madam"), _("My Local Hospital"),
+ _("Main Street"), _("My Town"), "", "", "", "")
+ else:
+ centre = referral.ReferralCentre(
+ hash(len(self.referral_centres)),
+ _("New"), "", "", "", "", "", "", "", "")
+ self.referral_centres.append(centre)
+ rowno = len(self.referral_centres) - len(self.deleted_centres) - 1
+ self.load_existing(rowno)
+ self.check_for_changes()
+
+ def remove_centre(self):
+ if len(self.referral_centres) < 2:
+ QtGui.QMessageBox.warning(
+ self,
+ _("Warning"),
+ _("You should have at least one referral centre in the database")
+ )
+ return
+ self.deleted_centres.append(self.current_centre)
+ self.load_existing()
+ self.check_for_changes()
+
+ def update_centre(self):
+ ix = self.current_centre.ix
+ centre = referral.ReferralCentre(ix,
+ self.description,
+ self.greeting,
+ self.address[0],
+ self.address[1],
+ self.address[2],
+ self.address[3],
+ self.address[4],
+ self.address[5],
+ self.address[6],
+ )
+ self._referral_centres[self.current_row] = centre
+ self.check_for_changes()
+
+ def check_for_changes(self):
+ if self.deleted_centres or self.new_centres:
+ self.dirty = True
+ else:
+ for i, centre in enumerate(self.referral_centres):
+ if self.orig_data[i] != str(centre):
+ self.dirty = True
+ break
+ self.enableApply(self.dirty)
+
+ def description_edited(self):
+ rowno = self.current_row
+ self.load_existing(rowno)
+
+ def new_centres(self):
+ return self.referral_centres[len(self.orig_data):]
+
+ def updated_centres(self):
+ for i in range(len(self.orig_data)):
+ centre = self.referral_centres[i]
+ if (self.orig_data[i] != str(centre) and
+ centre not in self.deleted_centres):
+ yield centre
+
+ def exec_(self):
+ if BaseDialog.exec_(self):
+ referral.update_centres(self.updated_centres())
+ referral.insert_centres(self.new_centres())
+ referral.delete_centres(self.deleted_centres)
+ return True
+ return False
+
+if __name__ == "__main__":
+ LOGGER.setLevel(logging.DEBUG)
+ app = QtGui.QApplication([])
+
+ dl = EditReferralCentresDialog()
+ dl.exec_()
diff --git a/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py b/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py
new file mode 100644
index 0000000..49f0fc0
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/edit_treatment_dialog.py
@@ -0,0 +1,141 @@
+#! /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 re
+
+from PyQt4 import QtCore, QtGui
+
+from openmolar.dbtools import treatment_course
+
+from openmolar.qt4gui.customwidgets.upper_case_line_edit \
+ import UpperCaseLineEdit
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+class EditTreatmentDialog(ExtendableDialog):
+
+ def __init__(self, serialno, courseno, parent=None):
+ ExtendableDialog.__init__(self, parent, remove_stretch=True)
+ self.setWindowTitle(_("Edit Treatment Dialog"))
+
+ self.serialno = serialno
+ self.courseno = courseno
+
+ planning = QtGui.QMessageBox.question(self, _("Option"),
+ "%s<hr /><em>%s</em>" %(
+ _("Edit Completed items?"),
+ _("Choosing 'NO' will offer edit of planned items")
+ ),
+ QtGui.QMessageBox.Yes|QtGui.QMessageBox.No,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No
+
+
+ if planning:
+ header = _("Planned Items")
+ self.suffix = "pl"
+ else:
+ header = _("Completed Items")
+ self.suffix = "cmp"
+
+ self._treatment_course = None
+ self.widgets = {}
+ self.orig_values = {}
+
+ frame = QtGui.QFrame()
+ form_layout = QtGui.QFormLayout(frame)
+
+ header_label = QtGui.QLabel(header)
+ header_label.setAlignment(QtCore.Qt.AlignCenter)
+
+ tooth_atts = []
+
+ for att in treatment_course.CURRTRT_ROOT_ATTS:
+ widg = UpperCaseLineEdit()
+ self.widgets[att] = widg
+ if re.match("[ul][lr][1-8]", att):
+ tooth_atts.append(att)
+ else:
+ form_layout.addRow(att, widg)
+ for att in sorted(tooth_atts):
+ form_layout.addRow(att.upper(), self.widgets[att])
+
+ scroll_area = QtGui.QScrollArea()
+ scroll_area.setWidget(frame)
+ scroll_area.setWidgetResizable(True)
+
+ self.insertWidget(header_label)
+ self.insertWidget(scroll_area)
+
+ self.add_advanced_widget(QtGui.QLabel(_("No Advanced Options")))
+ QtCore.QTimer.singleShot(100, self.load_values)
+
+ @property
+ def treatment_course(self):
+ if self._treatment_course is None:
+ self._treatment_course = treatment_course.TreatmentCourse(
+ self.serialno, self.courseno)
+ return self._treatment_course
+
+ def load_values(self):
+ for att in treatment_course.CURRTRT_ROOT_ATTS:
+ val = self.treatment_course.__dict__[att+self.suffix]
+ widg = self.widgets[att]
+ self.orig_values[att] = val
+ widg.setText(val)
+ widg.editingFinished.connect(self.check_appliable)
+
+ def new_value(self, att):
+ return str(self.widgets[att].text().toAscii()).strip(" ") + " "
+
+ def check_appliable(self):
+ for att in treatment_course.CURRTRT_ROOT_ATTS:
+ if self.new_value(att) != self.orig_values[att]:
+ self.enableApply()
+ return
+ self.enableApply(False)
+
+ def sizeHint(self):
+ return QtCore.QSize(200, 600)
+
+ def update_db(self):
+ changes = ""
+ values = []
+ for att in treatment_course.CURRTRT_ROOT_ATTS:
+ if self.new_value(att) != self.orig_values[att]:
+ changes += "%s%s=%%s ," %(att, self.suffix)
+ values.append(self.new_value(att))
+
+ treatment_course.update_course(
+ changes.rstrip(","),
+ values,
+ self.serialno,
+ self.courseno)
+
+if __name__ == "__main__":
+ from gettext import gettext as _
+
+ app = QtGui.QApplication([])
+ serialno, courseno = (14469, 45869)
+ dl = EditTreatmentDialog(serialno, courseno)
+ if dl.exec_():
+ dl.update_db()
\ No newline at end of file
diff --git a/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py b/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py
new file mode 100644
index 0000000..303c6c9
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/estimate_edit_dialog.py
@@ -0,0 +1,135 @@
+#! /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 copy
+import logging
+from PyQt4 import QtGui, QtCore
+
+from openmolar.dbtools import estimates
+
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+from openmolar.qt4gui.customwidgets.estimate_widget import EstimateWidget
+LOGGER = logging.getLogger("openmolar")
+
+
+class _Patient(object):
+
+ '''
+ A "duck" patient
+ '''
+
+ def __init__(self, serialno, courseno):
+ self.serialno = serialno
+ self.courseno0 = courseno
+ self.estimates = []
+
+
+class OldEstimateWidget(EstimateWidget):
+
+ '''
+ Estimate widget assumes current course, and parent being full blown gui.
+ Override some functions.
+ '''
+
+ def allow_check(self, *args):
+ return True
+
+ def tx_hash_complete(self, tx_hash):
+ pass
+
+
+class EstimateEditDialog(ExtendableDialog):
+ orig_ests = []
+
+ def __init__(self, serialno, courseno, parent=None):
+ ExtendableDialog.__init__(self, parent)
+ self.patient = _Patient(serialno, courseno)
+
+ header_label = QtGui.QLabel("<b>%s %s</b>" % (
+ _("Inspecting estimate for Course Number"), courseno))
+ header_label.setAlignment(QtCore.Qt.AlignCenter)
+
+ self.est_widget = OldEstimateWidget(self)
+
+ self.insertWidget(header_label)
+ self.insertWidget(self.est_widget)
+
+ self.adv_widget = QtGui.QLabel(_("No advanced options available"))
+ self.add_advanced_widget(self.adv_widget)
+ # self.remove_spacer()
+
+ self.est_widget.delete_estimate_item.connect(self.delete_item)
+ self.est_widget.edited_signal.connect(self._enable_apply)
+
+ QtCore.QTimer.singleShot(100, self.get_data)
+
+ def advise(self, message, severity=None):
+ QtGui.QMessageBox.information(self, _("message"), message)
+
+ def sizeHint(self):
+ return QtCore.QSize(400, 400)
+
+ def get_data(self):
+ ests = estimates.get_ests(
+ self.patient.serialno,
+ self.patient.courseno0)
+ self.orig_ests = copy.deepcopy(ests)
+ self.patient.estimates = ests
+ self.est_widget.setPatient(self.patient)
+
+ def delete_item(self, est):
+ assert isinstance(
+ est, estimates.Estimate), "bad object passed to delete"
+ LOGGER.debug("delete %s" % est)
+ self.patient.estimates.remove(est)
+
+ def _enable_apply(self):
+ LOGGER.debug("checking enable apply")
+ self.enableApply(self.patient.estimates != self.orig_ests)
+
+ def _clicked(self, but):
+ '''
+ overwrite BaseDialog method
+ '''
+ role = self.button_box.buttonRole(but)
+ if role == QtGui.QDialogButtonBox.ApplyRole and QtGui.QMessageBox.question(
+ self, _("Confirm"), _("Apply Changes?"),
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel,
+ QtGui.QMessageBox.Cancel
+ ) == QtGui.QMessageBox.Cancel:
+ return
+ ExtendableDialog._clicked(self, but)
+
+ def update_db(self):
+ estimates.apply_changes(
+ self.patient, self.orig_ests, self.patient.estimates)
+
+if __name__ == "__main__":
+
+ app = QtGui.QApplication([])
+ LOGGER.setLevel(logging.DEBUG)
+ dl = EstimateEditDialog(11956, 29749)
+ if dl.exec_():
+ dl.update_db()
+ print dl.patient.estimates
diff --git a/src/openmolar/qt4gui/dialogs/exam_wizard.py b/src/openmolar/qt4gui/dialogs/exam_wizard.py
index fcbcc7f..109473f 100644
--- a/src/openmolar/qt4gui/dialogs/exam_wizard.py
+++ b/src/openmolar/qt4gui/dialogs/exam_wizard.py
@@ -89,10 +89,12 @@ class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
_("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:
+ if QtGui.QMessageBox.question(
+ self,
+ _("Confirm"),
+ message,
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
self.pt.dnt2 = 0
self.om_gui.updateDetails()
APPLIED = True
@@ -113,13 +115,18 @@ class ExamWizard(QtGui.QDialog, Ui_exam_wizard.Ui_Dialog):
examdent,
_("the registered dentist"))
- if QtGui.QMessageBox.question(self,
- _("Confirm"), message,
- QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
+ if QtGui.QMessageBox.question(
+ self,
+ _("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
+ else:
+ APPLIED = False
+
+ self.om_gui.load_dentComboBoxes()
return APPLIED, examdent
@@ -131,10 +138,11 @@ 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)
+ message = u"<p>%s</p><hr /><p>%s</p>" % (
+ _('You already have a completed exam '
+ 'on this course of treatment'),
+ _("Unable to perform exam"))
+ self.om_gui.advise(message, 1)
return
APPLIED = False
@@ -160,7 +168,7 @@ 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]
@@ -184,11 +192,13 @@ 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)
+ message = "%s<hr />%s" % (
+ _("WARNING"),
+ _("Not updating recall due to patient's recall settings"))
+ self.om_gui.advise(message, 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_)
self.pt.appt_prefs.update_recdent()
@@ -200,7 +210,6 @@ if __name__ == "__main__":
localsettings.station = "reception"
from openmolar.qt4gui import maingui
- from openmolar.dbtools import patient_class
app = QtGui.QApplication([])
mw = maingui.OpenmolarGui()
diff --git a/src/openmolar/qt4gui/dialogs/family_manage_dialog.py b/src/openmolar/qt4gui/dialogs/family_manage_dialog.py
index 08305ff..2cfc24e 100644
--- a/src/openmolar/qt4gui/dialogs/family_manage_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/family_manage_dialog.py
@@ -246,7 +246,9 @@ class FamilyManageDialog(ExtendableDialog):
pt = _DuckPatient(member)
browser = QtGui.QTextBrowser()
- browser.setText(patientDetails.header(pt))
+ details = patientDetails.header(pt)
+ details = details.replace("<h1>DECEASED</h1>", "<h4>Deceased</h4>")
+ browser.setText(details)
row = (i // 4) * 2
column = i % 4
diff --git a/src/openmolar/qt4gui/dialogs/find_patient_dialog.py b/src/openmolar/qt4gui/dialogs/find_patient_dialog.py
index 2c3ee57..7cf041e 100644
--- a/src/openmolar/qt4gui/dialogs/find_patient_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/find_patient_dialog.py
@@ -22,6 +22,8 @@
# # # #
# ############################################################################ #
+from __future__ import division
+
import datetime
import logging
from PyQt4 import QtGui, QtCore
@@ -31,7 +33,7 @@ from openmolar.settings import localsettings
from openmolar.dbtools import search
from openmolar.qt4gui.compiled_uis import Ui_patient_finder
-from openmolar.qt4gui.compiled_uis import Ui_select_patient
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
class FindPatientDialog(QtGui.QDialog, Ui_patient_finder.Ui_Dialog):
@@ -55,7 +57,11 @@ class FindPatientDialog(QtGui.QDialog, Ui_patient_finder.Ui_Dialog):
self.pcde.setText(localsettings.lastsearch[5])
def exec_(self):
- if QtGui.QDialog.exec_(self):
+ if localsettings.PT_COUNT == 0:
+ QtGui.QMessageBox.warning(self.parent(), _("warning"),
+ _("You have no patients in your database"))
+ return False
+ if localsettings.PT_COUNT < 5 or QtGui.QDialog.exec_(self):
dob = self.dateEdit.date().toPyDate()
addr = str(self.addr1.text().toAscii())
tel = str(self.tel.text().toAscii())
@@ -71,73 +77,98 @@ class FindPatientDialog(QtGui.QDialog, Ui_patient_finder.Ui_Dialog):
if serialno > 0:
self.chosen_sno = serialno
- # self.getrecord(serialno, True)
else:
- candidates = search.getcandidates(dob, addr, tel, sname,
- self.snameSoundex_checkBox.checkState(
- ), fname,
- self.fnameSoundex_checkBox.checkState(), pcde)
+ candidates = search.getcandidates(
+ dob, addr, tel, sname,
+ self.snameSoundex_checkBox.checkState(), fname,
+ self.fnameSoundex_checkBox.checkState(), pcde
+ )
- if candidates == ():
+ if candidates == () and localsettings.PT_COUNT > 5:
QtGui.QMessageBox.warning(self.parent(), "warning",
_("no match found"))
return False
else:
- if len(candidates) > 1:
+ if localsettings.PT_COUNT < 5:
+ candidates = search.all_patients()
+ if len(candidates) == 1:
+ self.chosen_sno = int(candidates[0][0])
+ else:
dl = FinalChoiceDialog(candidates, self)
if dl.exec_():
self.chosen_sno = dl.chosen_sno
- else:
- self.chosen_sno = int(candidates[0][0])
-
return True
return False
-class FinalChoiceDialog(QtGui.QDialog, Ui_select_patient.Ui_Dialog):
+class FinalChoiceDialog(ExtendableDialog):
chosen_sno = None
def __init__(self, candidates, parent=None):
- QtGui.QDialog.__init__(self, parent)
- self.setupUi(self)
- self.tableWidget.clear()
- self.tableWidget.setSortingEnabled(False)
- #--good practice to disable this while loading
- self.tableWidget.setRowCount(len(candidates))
- headers = ('Serialno', 'Surname', 'Forename', 'dob', 'Address1',
- 'Address2', 'POSTCODE')
-
- 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
-
- for col in range(len(headers)):
- self.tableWidget.setColumnWidth(col, widthFraction[col] *
- (self.width() - 100) / 130)
-
- for candidate in candidates:
- col = 0
- for attr in candidate:
+ ExtendableDialog.__init__(self, parent, remove_stretch=True)
+ self.table_widget = QtGui.QTableWidget()
+ self.table_widget.setAlternatingRowColors(True)
+ self.table_widget.setSelectionBehavior(
+ QtGui.QAbstractItemView.SelectRows)
+ self.insertWidget(self.table_widget)
+
+ headers = (_('Serialno'),
+ _('Status'),
+ _('Title'),
+ _('Forename'),
+ _('Surname'),
+ _('Birth Date'),
+ _('Address Line 1'),
+ _('Address Line 2'),
+ _('Town'),
+ _('POSTCODE'),
+ _('Tel1'),
+ _('Tel2'),
+ _('Mobile')
+ )
+
+ self.table_widget.clear()
+ self.table_widget.setSortingEnabled(False)
+ self.table_widget.setRowCount(len(candidates))
+ self.table_widget.setColumnCount(len(headers))
+ self.table_widget.setHorizontalHeaderLabels(headers)
+ self.table_widget.verticalHeader().hide()
+ self.table_widget.horizontalHeader().setStretchLastSection(True)
+
+ for row, candidate in enumerate(candidates):
+ for col, attr in enumerate(candidate):
if isinstance(attr, datetime.date):
item = QtGui.QTableWidgetItem(
localsettings.formatDate(attr))
else:
item = QtGui.QTableWidgetItem(str(attr))
- self.tableWidget.setItem(row, col, item)
- col += 1
- row += 1
- self.tableWidget.setCurrentCell(0, 1)
+ self.table_widget.setItem(row, col, item)
+
+ self.table_widget.setCurrentCell(0, 1)
+ self.table_widget.setSortingEnabled(True)
+ self.table_widget.sortItems(4)
+
+ self.table_widget.itemDoubleClicked.connect(self.accept)
+ self.enableApply(True)
+ self.apply_but.setText(_("Load the Selected Patient"))
+ self.setMinimumWidth(
+ QtGui.QApplication.desktop().screenGeometry().width()-20)
+
+ def sizeHint(self):
+ return QtCore.QSize(self.minimumWidth(), 400)
- self.tableWidget.itemDoubleClicked.connect(self.accept)
+ def resizeEvent(self, event):
+ widths = (0, 12, 12, 15, 15, 15, 25, 20, 20, 15, 10, 10, 10)
+ sum_widths = sum(widths) + 10 # allow for vertical scrollbar
+ for col in range(self.table_widget.columnCount()):
+ col_width = widths[col] * self.width() / sum_widths
+ self.table_widget.setColumnWidth(col, col_width)
def exec_(self):
if QtGui.QDialog.exec_(self):
- row = self.tableWidget.currentRow()
- result = self.tableWidget.item(row, 0).text()
+ row = self.table_widget.currentRow()
+ result = self.table_widget.item(row, 0).text()
self.chosen_sno = int(result)
return True
return False
diff --git a/src/openmolar/qt4gui/dialogs/first_run_dialog.py b/src/openmolar/qt4gui/dialogs/first_run_dialog.py
new file mode 100644
index 0000000..f8f6d05
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/first_run_dialog.py
@@ -0,0 +1,789 @@
+#! /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 base64
+import hashlib
+import logging
+import os
+import MySQLdb
+
+from xml.dom import minidom
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+XML_TEMPLATE = '''<?xml version="1.1" ?>
+<settings>
+<system_password> </system_password>
+<connection name="existing_database">
+ <version>1.1</version>
+ <server>
+ <location> </location>
+ <port> </port>
+ </server>
+ <database>
+ <dbname> </dbname>
+ <user> </user>
+ <password> </password>
+ </database>
+</connection>
+</settings>'''
+
+HOST = "localhost"
+PORT = 3306
+DB_USER = "openmolar"
+DB_PASS = "password"
+DB_NAME = "openmolar"
+
+
+class _InputPage(QtGui.QWidget):
+
+ def __init__(self, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+ self.dialog = parent
+ self.label = QtGui.QLabel("text")
+ self.label.setWordWrap(True)
+ self.frame = QtGui.QFrame()
+
+ layout = QtGui.QVBoxLayout(self)
+ layout.addWidget(self.label)
+ layout.addStretch(30)
+ layout.addWidget(self.frame)
+ layout.addStretch(100)
+
+ def sizeHint(self):
+ return QtCore.QSize(400, 400)
+
+ @property
+ def is_completed(self):
+ '''
+ should be overwritten!
+ '''
+ return True
+
+ @property
+ def error_message(self):
+ '''
+ should be overwritten!
+ '''
+ return "input error! - try again"
+
+
+class PageZero(_InputPage):
+
+ def __init__(self, parent=None):
+ _InputPage.__init__(self, parent)
+
+ message = "%s<ul><li>%s</li><li>%s</li><li>%s</li><li>%s</li></ul>" % (
+ _("This Dialog will help you"),
+ _("secure openmolar with a password"),
+ _("note the location of your mysql/mariadb server"),
+ _("install a blank database schema if required."),
+ _("save a settings file so you do not have to endure this again!")
+ )
+ self.label.setText(message)
+
+ message2 = _("Click Next to continue, or Quit to leave OpenMolar now.")
+ label = QtGui.QLabel(message2)
+ layout = QtGui.QVBoxLayout(self.frame)
+ layout.addWidget(label)
+
+ @property
+ def header_text(self):
+ return "<b>%s</b><hr />%s" % (
+ _("This appears to be your first running of OpenMolar."),
+ _("We need to save a few settings to continue.")
+ )
+
+
+class PageOne(_InputPage):
+
+ def __init__(self, parent=None):
+ _InputPage.__init__(self, parent)
+
+ message = "%s<br />%s<br /><br /><em>%s</em>" % (
+ _("You may wish to enter a password which will hereafter be required"
+ " to login to the OpenMolar application"),
+ _("This password will help prevent an unauthorised person"
+ " accessing any sensitive data."),
+ _("If your data is simply demonstration data, "
+ "this can be left blank"))
+ self.label.setText(message)
+
+ layout = QtGui.QFormLayout(self.frame)
+ self.line_edit1 = QtGui.QLineEdit()
+ self.line_edit2 = QtGui.QLineEdit()
+
+ self.show_cb = QtGui.QCheckBox(_("Show Passwords"))
+ layout.addRow(_("Password"), self.line_edit1)
+ layout.addRow(_("Confirm Password"), self.line_edit2)
+ layout.addRow("", self.show_cb)
+
+ self.show_passwords()
+
+ self.show_cb.toggled.connect(self.show_passwords)
+
+ @property
+ def header_text(self):
+ return "<b>%s</b>" % _("Step 1 - Set a password for OpenMolar")
+
+ def showEvent(self, event):
+ self.line_edit1.setFocus()
+
+ def show_passwords(self, show=False):
+ if show:
+ e_mode = QtGui.QLineEdit.Normal
+ else:
+ e_mode = QtGui.QLineEdit.Password
+ self.line_edit1.setEchoMode(e_mode)
+ self.line_edit2.setEchoMode(e_mode)
+
+ @property
+ def is_completed(self):
+ return self.line_edit1.text() == self.line_edit2.text()
+
+ @property
+ def error_message(self):
+ return _("Passwords don't match!")
+
+
+class PageTwo(_InputPage):
+
+ def __init__(self, parent=None):
+ _InputPage.__init__(self, parent)
+
+ message = "%s<br />%s<br />%s" % (
+ _("OpenMolar is simply a database client."),
+ _("It requires a database server such as MySQL or MariaDB."),
+ _("Please enter the hostname and port number "
+ "where your server can be reached.")
+ )
+
+ message1 = "** %s\n\n (%s)" % (
+ _("If you do not have a mysql/mariadb server on your computer"
+ " or local network, please quit this setup, "
+ "and install one now!"),
+ _(
+ "Make a note of the root password you create during this set up.")
+ )
+ self.label.setText(message)
+
+ frame1 = QtGui.QFrame()
+
+ layout = QtGui.QFormLayout(frame1)
+ self.line_edit1 = QtGui.QLineEdit()
+ self.line_edit1.setText(HOST)
+ self.line_edit2 = QtGui.QLineEdit()
+ self.line_edit2.setText(str(PORT))
+
+ layout.addRow(_("Host"), self.line_edit1)
+ layout.addRow(_("Port"), self.line_edit2)
+
+ layout = QtGui.QVBoxLayout(self.frame)
+ layout.addWidget(frame1)
+ layout.addStretch(100)
+ label = QtGui.QLabel(message1)
+ layout.addWidget(label)
+
+ @property
+ def header_text(self):
+ return "<b>%s</b>" % _("Step 2 - Where is your database server?")
+
+ def showEvent(self, event):
+ self.line_edit1.setFocus()
+
+ @property
+ def port(self):
+ try:
+ return int(self.line_edit2.text().toAscii())
+ except ValueError:
+ pass
+ return None
+
+ @property
+ def is_completed(self):
+ for le in (self.line_edit1, self.line_edit2):
+ if le.text() == "":
+ return False
+ return self.port is not None
+
+ @property
+ def error_message(self):
+ message = "%s<ul>" % _("The Following errors were found")
+ if self.line_edit1.text() == "":
+ message += "<li>%s</li>" % _("Host Field is Blank")
+ if self.line_edit2.text() == "":
+ message += "<li>%s</li>" % _("Port Field is Blank")
+ elif self.port is None:
+ message += "<li>%s</li>" % _(
+ "Port Field must be a number. Default is 3306")
+
+ return message + "</ul>"
+
+
+class PageThree(_InputPage):
+
+ def __init__(self, parent=None):
+ _InputPage.__init__(self, parent)
+
+ message1 = "%s<hr />%s" % (
+ _("Do you already have an openmolar database on this server?"),
+ _("If not, you should lay out one now.")
+ )
+ self.label.setText(message1)
+
+ layout = QtGui.QVBoxLayout(self.frame)
+ self.radio_button1 = QtGui.QRadioButton(
+ _("Create a database user and install a blank (demo) Database"))
+ self.radio_button2 = QtGui.QRadioButton(
+ _("Use an existing database"))
+
+ self.radio_button1.setChecked(True)
+ layout.addWidget(self.radio_button1)
+ layout.addWidget(self.radio_button2)
+
+ @property
+ def header_text(self):
+ return "<b>%s</b>" % _("Step 3 - select a database option")
+
+ def showEvent(self, event):
+ self.radio_button1.setFocus()
+
+ @property
+ def create_new(self):
+ return self.radio_button1.isChecked()
+
+
+class PageFour(_InputPage):
+
+ def __init__(self, parent=None):
+ _InputPage.__init__(self, parent)
+
+ message = "%s<br />%s" % (
+ _("Please enter connection criteria for the database."),
+ _("If the user and/or database does not exist, "
+ "you will be given an opportunity to create them ")
+ )
+ self.label.setText(message)
+
+ layout = QtGui.QFormLayout(self.frame)
+ self.line_edit1 = QtGui.QLineEdit()
+ self.line_edit2 = QtGui.QLineEdit()
+ self.line_edit3 = QtGui.QLineEdit()
+
+ self.line_edit1.setText(DB_NAME)
+ self.line_edit2.setText(DB_USER)
+ self.line_edit3.setText(DB_PASS)
+ self.show_cb = QtGui.QCheckBox(_("Show Password"))
+
+ layout.addRow(_("Database Name"), self.line_edit1)
+ layout.addRow(_("(mysql) user"), self.line_edit2)
+ layout.addRow(_("(mysql) password"), self.line_edit3)
+ layout.addRow("", self.show_cb)
+ self.show_passwords()
+
+ self.show_cb.toggled.connect(self.show_passwords)
+
+ @property
+ def header_text(self):
+ return "<b>%s</b>" % _("Step 5(a) - Your Database Details")
+
+ def showEvent(self, event):
+ self.line_edit1.setFocus()
+
+ def show_passwords(self, show=False):
+ if show:
+ e_mode = QtGui.QLineEdit.Normal
+ else:
+ e_mode = QtGui.QLineEdit.Password
+ self.line_edit3.setEchoMode(e_mode)
+
+ @property
+ def is_completed(self):
+ for le in (self.line_edit1, self.line_edit2, self.line_edit3):
+ if le.text() == "":
+ return False
+ return True
+
+ @property
+ def error_message(self):
+ message = "%s<ul>" % _("The Following errors were found")
+ if self.line_edit1.text() == "":
+ message += "<li>%s</li>" % _("Database Name Field is Blank")
+ if self.line_edit2.text() == "":
+ message += "<li>%s</li>" % _("User Field is Blank")
+ if self.line_edit3.text() == "":
+ message += "<li>%s</li>" % _("Password Field is Blank")
+
+ return message + "</ul>"
+
+
+class PageFive(_InputPage):
+
+ def __init__(self, parent=None):
+ _InputPage.__init__(self, parent)
+
+ message = "%s<br />%s" % (
+ _("To create a database, and set the privileges for user, "
+ "OpenMolar must log into mysql as a privileged mysql user."),
+ _("OpenMolar does NOT store this username or password.")
+ )
+
+ message2 = "%s<br /><em>%s</em>" % (
+ _("Please enter the username and password of a "
+ "privileged mysql user."),
+ _("(note - on most mysql setups, login by 'root' is only allowed"
+ " on localhost)")
+ )
+
+ self.label.setText(message)
+
+ layout = QtGui.QFormLayout(self.frame)
+ self.line_edit1 = QtGui.QLineEdit()
+ self.line_edit1.setText("root")
+ self.line_edit2 = QtGui.QLineEdit()
+ self.show_cb = QtGui.QCheckBox(_("Show Password"))
+
+ layout.addRow(_("Privileged user"), self.line_edit1)
+ layout.addRow(_("Password for this user"), self.line_edit2)
+ layout.addRow("", self.show_cb)
+ self.show_passwords()
+
+ self.show_cb.toggled.connect(self.show_passwords)
+
+ @property
+ def header_text(self):
+ return "<b>%s</b>" % _(
+ "Step 5b - Create an authenticated user and database")
+
+ def showEvent(self, event):
+ self.line_edit2.setFocus()
+
+ def show_passwords(self, show=False):
+ if show:
+ e_mode = QtGui.QLineEdit.Normal
+ else:
+ e_mode = QtGui.QLineEdit.Password
+ self.line_edit2.setEchoMode(e_mode)
+
+ @property
+ def is_completed(self):
+ return self.line_edit1.text() != "" and self.line_edit2.text() != ""
+
+ @property
+ def error_message(self):
+ message = "%s<ul>" % _("The Following errors were found")
+ if self.line_edit1.text() == "":
+ message += "<li>%s</li>" % _("Privileged User Field is Blank")
+ if self.line_edit2.text() == "":
+ message += "<li>%s</li>" % _("Password Field is Blank")
+
+ return message + "</ul>"
+
+
+class PageSix(_InputPage):
+
+ def __init__(self, parent=None):
+ _InputPage.__init__(self, parent)
+
+ self.db_created = False
+ message = _("Creating Database")
+ self.label.setText(message)
+ self.progress_bar = QtGui.QProgressBar()
+
+ layout = QtGui.QVBoxLayout(self.frame)
+ layout.addWidget(self.progress_bar)
+
+ @property
+ def header_text(self):
+ return "<b>%s</b>" % _("Step 6 - Create Database")
+
+ def showEvent(self, event):
+ if not self.db_created:
+ QtCore.QTimer.singleShot(100, self.create_database)
+
+ def create_database(self):
+ self.progress_bar.setValue(0)
+ PB_LIMIT = 50
+
+ def updatePB():
+ val = self.progress_bar.value()
+ if val < PB_LIMIT:
+ self.progress_bar.setValue(val + 5)
+ self.progress_bar.update()
+
+ self.timer1 = QtCore.QTimer()
+ self.connect(self.timer1, QtCore.SIGNAL("timeout()"),
+ updatePB)
+
+ try:
+ from openmolar import create_db
+ if (create_db.exists_already(
+ self.dialog.host,
+ self.dialog.port,
+ self.dialog.db_name,
+ self.dialog.privileged_user_pass,
+ self.dialog.privileged_user
+ ) and
+ QtGui.QMessageBox.question(self, _("Confirm"),
+ "%s '%s' %s<hr />%s" % (_("A database named"),
+ self.dialog.db_name,
+ _(
+ "exists already"),
+ _("Overwrite this database?")),
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
+ QtGui.QMessageBox.No) == QtGui.QMessageBox.No):
+ self.dialog.database_exists_already()
+ return
+ self.timer1.start(10) # 1/100thsecond
+
+ self.progress_bar.setValue(10)
+ create_db.create_database(
+ self.dialog.host,
+ self.dialog.port,
+ self.dialog.db_user,
+ self.dialog.db_pass,
+ self.dialog.db_name,
+ self.dialog.privileged_user_pass,
+ self.dialog.privileged_user
+ )
+
+ self.progress_bar.setValue(50)
+ PB_LIMIT = 90
+ create_db.create_tables(self.dialog.host,
+ self.dialog.port,
+ self.dialog.db_user,
+ self.dialog.db_pass,
+ self.dialog.db_name,
+ )
+
+ self.progress_bar.setValue(100)
+ QtGui.QMessageBox.information(
+ self,
+ _("Success!"),
+ _("Database created successfully!")
+ )
+ self.db_created = True
+ self.dialog.next()
+ except Exception as exc:
+ LOGGER.exception("error creating database")
+ message = "%s<hr />%s" % (_("Error Creating Database"), exc)
+ QtGui.QMessageBox.warning(self, _("Error"), message)
+ self.db_created = False
+
+
+class PageSeven(_InputPage):
+
+ def __init__(self, parent=None):
+ _InputPage.__init__(self, parent)
+
+ message = _("Testing connection")
+ self.label.setText(message + ".......")
+
+ layout = QtGui.QVBoxLayout(self.frame)
+
+ @property
+ def header_text(self):
+ return "<b>%s</b>" % _(
+ "Final Step - Test Connection & Write Config File")
+
+ def showEvent(self, event):
+ QtCore.QTimer.singleShot(100, self.test_connection)
+
+ def test_connection(self):
+ self.dialog.wait()
+ try:
+ LOGGER.info("attempting to connect to mysql server")
+
+ db = MySQLdb.connect(host=self.dialog.host,
+ port=self.dialog.port,
+ db=self.dialog.db_name,
+ passwd=self.dialog.db_pass,
+ user=self.dialog.db_user)
+ result = db.open
+ db.close()
+ self.dialog.wait(False)
+ self.label.setText(_("Your database is accepting connections!"))
+ return True
+ except Exception as exc:
+ self.dialog.wait(False)
+ LOGGER.exception("connection attempt failed")
+ self.label.setText("<b>%s</b>" % (
+ _("WARNING"),
+ _("Your database is NOT accepting connections!"))
+ )
+ return False
+ finally:
+ self.dialog.wait(False)
+
+
+class FirstRunDialog(BaseDialog):
+
+ def __init__(self, parent=None):
+ BaseDialog.__init__(self, parent)
+ self.setWindowTitle(_("First Run Dialog"))
+
+ self.top_label = WarningLabel("FirstRun")
+
+ self.wizard_widget = QtGui.QStackedWidget()
+
+ page0 = PageZero(self)
+ self.page1 = PageOne(self)
+ self.page2 = PageTwo(self)
+ self.page3 = PageThree(self)
+ self.page4 = PageFour(self)
+ self.page5 = PageFive(self)
+ page6 = PageSix(self)
+ self.page7 = PageSeven(self)
+ # accept_page = AcceptPage(self)
+
+ self.wizard_widget.addWidget(page0)
+ self.wizard_widget.addWidget(self.page1)
+ self.wizard_widget.addWidget(self.page2)
+ self.wizard_widget.addWidget(self.page3)
+ self.wizard_widget.addWidget(self.page4)
+ self.wizard_widget.addWidget(self.page5)
+ self.wizard_widget.addWidget(page6)
+ self.wizard_widget.addWidget(self.page7)
+ # self.wizard_widget.addWidget(accept_page)
+
+ self.insertWidget(self.top_label)
+ self.insertWidget(self.wizard_widget)
+
+ self.next_but = self.button_box.addButton(
+ _("Next"), self.button_box.ActionRole)
+ self.back_but = self.button_box.addButton(
+ _("Back"), self.button_box.ActionRole)
+
+ self.apply_but.hide()
+ self.back_but.hide()
+ self.cancel_but.setText(_("Quit OpenMolar"))
+
+ self.set_labels()
+
+ def sizeHint(self):
+ return QtCore.QSize(400, 400)
+
+ def wait(self, waiting=True):
+ if waiting:
+ QtGui.QApplication.instance().setOverrideCursor(
+ QtCore.Qt.WaitCursor)
+ else:
+ QtGui.QApplication.instance().restoreOverrideCursor()
+
+ def set_labels(self):
+ self.top_label.setText(self.current_page.header_text)
+ self.cancel_but.setVisible(self.current_index == 0)
+ self.back_but.setVisible(self.current_index != 0)
+
+ if self.current_index == 5:
+ self.next_but.setText(_("Create Database Now!"))
+ elif self.current_index == 7:
+ self.next_but.setText(_("Write Config File and Proceed"))
+ else:
+ self.next_but.setText(_("Next"))
+
+ def next(self):
+ '''
+ 0 = intro
+ 1 = application password
+ 2 = host and port
+ 3 = database option (create new or use existing)
+ 4 = database details (dbname, user and password)
+ 5 = enter privileged user
+ 6 = create database
+ 7 = test connection, write config and exit.
+ '''
+ i = self.wizard_widget.currentIndex()
+ if not self.current_page.is_completed:
+ QtGui.QMessageBox.warning(self,
+ _("error"),
+ self.current_page.error_message)
+ new_i = i
+ elif i == 4 and not self.page3.create_new:
+ new_i = i + 3
+ elif i == 7:
+ self.finish()
+ return
+ else:
+ new_i = i + 1
+ self.wizard_widget.setCurrentIndex(new_i)
+ self.set_labels()
+
+ def back(self):
+ i = self.wizard_widget.currentIndex()
+ if i == 0:
+ new_i = 0
+ elif i == 7: # shouldn't happen?
+ new_i = 0 # don't create a database by hitting "back"
+ else:
+ new_i = i - 1
+ self.wizard_widget.setCurrentIndex(new_i)
+ self.set_labels()
+
+ def database_exists_already(self):
+ self.wizard_widget.setCurrentIndex(4)
+ self.set_labels()
+
+ def finish(self):
+ dom = minidom.parseString(XML_TEMPLATE)
+ #-- hash the password and save it
+ PSWORD = hashlib.md5(
+ hashlib.sha1(
+ str("diqug_ADD_SALT_3i2some" + self.sys_password)).hexdigest()
+ ).hexdigest()
+ dom.getElementsByTagName(
+ "system_password")[0].firstChild.replaceWholeText(PSWORD)
+ #-- server settings
+ xmlnode = dom.getElementsByTagName("server")[0]
+ #-- host
+ xmlnode.getElementsByTagName(
+ "location")[0].firstChild.replaceWholeText(self.host)
+ #--port
+ xmlnode.getElementsByTagName(
+ "port")[0].firstChild.replaceWholeText(str(self.port))
+ #-- database settings
+ xmlnode = dom.getElementsByTagName("database")[0]
+ #--user
+ xmlnode.getElementsByTagName(
+ "user")[0].firstChild.replaceWholeText(self.db_user)
+ #--password
+ xmlnode.getElementsByTagName(
+ "password")[0].firstChild.replaceWholeText(
+ base64.b64encode(self.db_pass))
+ #--db name
+ xmlnode.getElementsByTagName(
+ "dbname")[0].firstChild.replaceWholeText(self.db_name)
+
+ settings_dir = os.path.dirname(localsettings.global_cflocation)
+ successful_save = False
+ try:
+ if not os.path.exists(settings_dir):
+ LOGGER.info("creating settings directory '%s'", settings_dir)
+ os.mkdir(settings_dir)
+ LOGGER.info(
+ 'writing settings to %s', localsettings.global_cflocation)
+ f = open(localsettings.global_cflocation, "w")
+ f.write(dom.toxml())
+ f.close()
+ localsettings.cflocation = localsettings.global_cflocation
+ successful_save = True
+ except OSError:
+ pass
+ except IOError:
+ pass
+
+ if not successful_save:
+ message = (
+ "unable to write to '%s' "
+ "we need root privileges for that\n"
+ "will resort to putting settings into a local file '%s'")
+ LOGGER.warning(message, settings_dir, localsettings.cflocation)
+ settings_dir = os.path.dirname(localsettings.cflocation)
+ if not os.path.exists(settings_dir):
+ os.mkdir(settings_dir)
+ LOGGER.info("putting a local settings file in '%s'", settings_dir)
+ f = open(localsettings.cflocation, "w")
+ f.write(dom.toxml())
+ f.close()
+ localsettings.cflocation = localsettings.cflocation
+
+ conf_text = "[login]\nPASSWORD=\nUSER1=\nUSER2="
+ if self.page3.create_new:
+ conf_text = conf_text.replace("USER1=", "USER1=USER")
+ f = open(localsettings.LOGIN_CONF, "w")
+ f.write(conf_text)
+ f.close()
+
+ self.accept()
+
+ def _clicked(self, but):
+ '''
+ "private" function called when button box is clicked
+ '''
+ if but == self.next_but:
+ self.next()
+ elif but == self.back_but:
+ self.back()
+ else:
+ BaseDialog._clicked(self, but)
+
+ @property
+ def current_index(self):
+ return self.wizard_widget.currentIndex()
+
+ @property
+ def current_page(self):
+ return self.wizard_widget.currentWidget()
+
+ @property
+ def sys_password(self):
+ return str(self.page1.line_edit1.text().toAscii())
+
+ @property
+ def host(self):
+ return str(self.page2.line_edit1.text().toAscii())
+
+ @property
+ def port(self):
+ return int(str(self.page2.line_edit2.text().toAscii()))
+
+ @property
+ def db_name(self):
+ return str(self.page4.line_edit1.text().toAscii())
+
+ @property
+ def db_user(self):
+ return str(self.page4.line_edit2.text().toAscii())
+
+ @property
+ def db_pass(self):
+ return str(self.page4.line_edit3.text().toAscii())
+
+ @property
+ def privileged_user(self):
+ return str(self.page5.line_edit1.text().toAscii())
+
+ @property
+ def privileged_user_pass(self):
+ return str(self.page5.line_edit2.text().toAscii())
+
+if __name__ == "__main__":
+ LOGGER.setLevel(logging.DEBUG)
+ app = QtGui.QApplication([])
+
+ dl = FirstRunDialog()
+ print dl.exec_()
+ print dl.host
+ print dl.port
+ print dl.db_name
+ print dl.db_user
+ print dl.db_pass
+ print dl.privileged_user
+ print dl.privileged_user_pass
diff --git a/src/openmolar/qt4gui/dialogs/initial_check_dialog.py b/src/openmolar/qt4gui/dialogs/initial_check_dialog.py
new file mode 100644
index 0000000..694add2
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/initial_check_dialog.py
@@ -0,0 +1,155 @@
+#! /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.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+from openmolar.dbtools import appointments
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class InitialCheckDialog(ExtendableDialog):
+
+ def __init__(self, parent=None):
+ ExtendableDialog.__init__(self, parent)
+ self.setWindowTitle(_("Initial Check Dialog"))
+
+ top_label = WarningLabel(
+ _('OpenMolar has found the following issues with your database.'))
+
+ frame = QtGui.QFrame(self)
+ self.form_layout = QtGui.QFormLayout(frame)
+
+ self.add_advanced_widget(QtGui.QLabel(_("No Advanced options")))
+ self.enableApply(True)
+
+ self.insertWidget(top_label)
+ self.insertWidget(frame)
+
+ self.apply_but.setText(_("Proceed"))
+ self.cancel_but.hide()
+
+ def advise(self, message):
+ QtGui.QMessageBox.information(self.parent(), _("Information"),
+ message)
+
+ @property
+ def has_issues(self):
+ example_name = _("Example Dental Practice")
+ has_issues = (
+ len(localsettings.cashbookCodesDict) < 1 or
+ len(localsettings.activedents) < 1 or
+ localsettings.PRACTICE_NAME == example_name
+ )
+
+ if not has_issues:
+ return False
+
+ if not localsettings.activedents:
+ but = QtGui.QPushButton(_("How do I Fix This?"))
+ but.clicked.connect(self.show_add_clinician_advise)
+ message = _("Your database contains no dentists")
+ self.form_layout.addRow(message, but)
+
+ if localsettings.PRACTICE_NAME == example_name:
+ but = QtGui.QPushButton(_("How do I Fix This?"))
+ but.clicked.connect(self.show_edit_practice)
+ message = "%s <b>'%s'</b>" % (
+ _("Your practice name is"),
+ example_name)
+ self.form_layout.addRow(message, but)
+
+ if len(appointments.future_slots(localsettings.currentDay(),
+ localsettings.BOOKEND,
+ localsettings.apptix.values(),
+ override_emergencies=True)
+ ) == 0:
+ but = QtGui.QPushButton(_("Why is this?"))
+ but.clicked.connect(self.show_appt_space)
+ message = _("You have no appointment space in your diary!")
+ self.form_layout.addRow(message, but)
+
+ return True
+
+ @property
+ def critical_messages(self):
+ if len(localsettings.cashbookCodesDict) < 1:
+ yield "%s<br />%s" % (
+ _("The cbcodes table in your database is inadequate."),
+ _("This will create problems when accepting payments.")
+ )
+
+ @property
+ def messages(self):
+ yield "%s %d %s" % (
+ _("you have"), localsettings.PT_COUNT, _("patients"))
+
+ yield "%s %d %s" % (
+ _("you have"), len(localsettings.activedents), _("active dentists"))
+
+ yield "%s %d %s" % (
+ _("you have"), len(localsettings.activehygs), _("active hygienists"))
+
+ yield "%s %s" % (
+ _("appointment search final date is"),
+ localsettings.formatDate(localsettings.BOOKEND))
+
+ def show_add_clinician_advise(self):
+ self.advise(
+ _("Once the application is open, click on Tools - > Menu - > Add Clinician"))
+
+ def show_edit_practice(self):
+ self.advise(
+ _("Once the application is open, click on Tools - > Menu - > Edit Practice Details"))
+
+ def show_appt_space(self):
+ self.advise("<h4>%s</h4><ul><li>%s</li><li>%s</li><li>%s</li><li>%s</li></ul>" % (
+ _("This could be for a variety of reasons"),
+ _(
+ "You need to have at least one clinician with an appointment book"),
+ _(
+ "No Clinicians have any days contracted to work in the practice?"),
+ _("Perhaps all future clinical time is already booked?"),
+ _(
+ "The BOOKEND value (last day to search for appointments) may simply need adjusting"),
+ ))
+
+if __name__ == "__main__":
+ LOGGER.setLevel(logging.DEBUG)
+ app = QtGui.QApplication([])
+ localsettings.initiate()
+
+ dl = InitialCheckDialog()
+ if dl.has_issues:
+ dl.exec_()
+ for message in dl.critical_messages:
+ LOGGER.warning(message)
+ for message in dl.messages:
+ LOGGER.info(message)
diff --git a/src/openmolar/qt4gui/dialogs/login_dialog.py b/src/openmolar/qt4gui/dialogs/login_dialog.py
new file mode 100644
index 0000000..962e989
--- /dev/null
+++ b/src/openmolar/qt4gui/dialogs/login_dialog.py
@@ -0,0 +1,307 @@
+#! /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 hashlib
+import logging
+import os
+import sys
+from xml.dom import minidom
+
+from PyQt4 import QtGui, QtCore
+
+from openmolar.settings import localsettings
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.customwidgets.upper_case_line_edit import \
+ UpperCaseLineEdit
+
+from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+class AlternateServersWidget(QtGui.QWidget):
+ chosen = 0
+
+ def __init__(self, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+ self.radio_buttons = []
+ layout = QtGui.QVBoxLayout(self)
+ for i, server in enumerate(localsettings.server_names):
+ if i == 0:
+ server = "%s (%s)" % (server, _("Default"))
+ radio_button = (QtGui.QRadioButton(server, self))
+ radio_button.setChecked(i == 0)
+
+ self.radio_buttons.append(radio_button)
+ radio_button.toggled.connect(self.input)
+ layout.addWidget(radio_button)
+
+ @property
+ def has_options(self):
+ return self.radio_buttons != []
+
+ @property
+ def confirm_message(self):
+ return "%s <b>%s</b>< hr />%s" % (
+ _("You have selected to connect to"),
+ localsettings.server_names[self.chosen],
+ _("This is not the default database - "
+ "are you sure you wish to use this database?")
+ )
+
+ def input(self, bool_):
+ if not bool_:
+ return
+ self.chosen = self.radio_buttons.index(self.sender())
+ if self.chosen != 0:
+ if QtGui.QMessageBox.question(
+ self,
+ _("confirm"),
+ self.confirm_message,
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
+ self.radio_buttons[0].setChecked(True)
+ LOGGER.warning("chosen server = %s", self.chosen)
+
+
+class LoginDialog(ExtendableDialog):
+
+ sys_password = None
+ uninitiated = True
+ __is_developer_environment = None
+
+ def __init__(self, parent=None):
+ ExtendableDialog.__init__(self, parent)
+ self.setWindowTitle(_("Login Dialog"))
+
+ header_label = WarningLabel(_('Login Required'))
+
+ self.password_lineEdit = QtGui.QLineEdit()
+ self.password_lineEdit.setEchoMode(QtGui.QLineEdit.Password)
+ self.user1_lineEdit = UpperCaseLineEdit()
+ self.user1_lineEdit.setMaximumWidth(50)
+ self.user2_lineEdit = UpperCaseLineEdit()
+ self.user2_lineEdit.setMaximumWidth(50)
+
+ self.reception_radioButton = QtGui.QRadioButton(_("Reception Machine"))
+ self.surgery_radioButton = QtGui.QRadioButton(_("Surgery Machine"))
+ self.surgery_radioButton.setChecked(True)
+
+ frame = QtGui.QFrame()
+ form_layout = QtGui.QFormLayout(frame)
+
+ form_layout.addRow(_("System Password"), self.password_lineEdit)
+
+ form_layout.addRow(_("User 1 (Required)"), self.user1_lineEdit)
+ form_layout.addRow(_("User 2 (Optional)"), self.user2_lineEdit)
+
+ but_group = QtGui.QButtonGroup(self)
+ but_group.addButton(self.surgery_radioButton)
+ but_group.addButton(self.reception_radioButton)
+
+ self.insertWidget(header_label)
+ self.insertWidget(frame)
+ self.insertWidget(self.surgery_radioButton)
+ self.insertWidget(self.reception_radioButton)
+ self.enableApply()
+
+ # grab any stored information
+ PASSWORD, USER1, USER2 = localsettings.autologin()
+ self.password_lineEdit.setText(PASSWORD)
+ self.user1_lineEdit.setText(USER1)
+ self.user2_lineEdit.setText(USER2)
+ self.autoreception(QtCore.QString(USER1))
+ self.autoreception(QtCore.QString(USER2))
+
+ self.parse_conf_file()
+
+ self.alternate_servers_widget = AlternateServersWidget(self)
+ if self.alternate_servers_widget.has_options:
+ self.more_but.setText(_("Database choice"))
+ self.add_advanced_widget(self.alternate_servers_widget)
+ else:
+ self.more_but.hide()
+
+ self.user1_lineEdit.textEdited.connect(self.autoreception)
+ self.user2_lineEdit.textEdited.connect(self.autoreception)
+
+ self.dirty = True
+ self.set_check_on_cancel(True)
+
+ QtCore.QTimer.singleShot(0, self._developer_login)
+
+ def sizeHint(self):
+ return QtCore.QSize(350, 300)
+
+ def showEvent(self, event):
+ self.password_lineEdit.setFocus(True)
+
+ @property
+ def abandon_message(self):
+ return _("Are you sure you wish to cancel the login process?")
+
+ def parse_conf_file(self):
+ try:
+ dom = minidom.parse(localsettings.cflocation)
+ self.sys_password = dom.getElementsByTagName(
+ "system_password")[0].firstChild.data
+
+ servernames = dom.getElementsByTagName("connection")
+
+ for i, server in enumerate(servernames):
+ nameDict = server.attributes
+ try:
+ localsettings.server_names.append(nameDict["name"].value)
+ except KeyError:
+ localsettings.server_names.append("%d" % i + 1)
+
+ except IOError as e:
+ LOGGER.warning("still no settings file. quitting politely")
+ QtGui.QMessageBox.information(None, _("Unable to Run OpenMolar"),
+ _("Good Bye!"))
+
+ QtGui.QApplication.instance().closeAllWindows()
+ sys.exit("unable to run - openMolar couldn't find a settings file")
+
+ def autoreception(self, user):
+ '''
+ check to see if the user is special user "rec"
+ which implies a reception machine
+ '''
+ if user.toLower() == "rec":
+ self.reception_radioButton.setChecked(True)
+
+ @property
+ def _is_developer_environment(self):
+ if self.__is_developer_environment is None:
+ self.__is_developer_environment = False
+ try:
+ dev_path = os.path.join(
+ localsettings.localFileDirectory, "dev_login.txt")
+ f = open(dev_path, "r")
+ data = f.read().strip("\n")
+ f.close()
+ if localsettings.hash_func(data) == \
+ '1fd0c27f4d65caaa10ef5ef6a714faf96ed44fdd':
+ LOGGER.warning("allowing developer login")
+ self.__is_developer_environment = True
+ else:
+ LOGGER.warning(
+ "dev_login - file present, but with bad checksum")
+ except:
+ # fail quietly
+ pass
+ return self.__is_developer_environment
+
+ def _developer_login(self):
+ '''
+ convenience function for developer to login without password
+ '''
+ if self._is_developer_environment and not "--no-dev-login" in sys.argv:
+ self.accept()
+
+ @property
+ def password_ok(self):
+ LOGGER.info("checking password")
+ pword = "diqug_ADD_SALT_3i2some%s" % (
+ self.password_lineEdit.text().toAscii())
+ #-- 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()
+
+ match = stored_password == self.sys_password
+ return match
+
+ @property
+ def user1(self):
+ return str(self.user1_lineEdit.text().toAscii())
+
+ @property
+ def user1_ok(self):
+ return self.user1 in localsettings.allowed_logins
+
+ @property
+ def user2(self):
+ return str(self.user2_lineEdit.text().toAscii())
+
+ @property
+ def user2_ok(self):
+ return self.user2 == "" or self.user2 in localsettings.allowed_logins
+
+ @property
+ def login_ok(self):
+ return self.user1_ok and self.user2_ok and (
+ self._is_developer_environment or self.password_ok)
+
+ @property
+ def chosen_server(self):
+ return self.alternate_servers_widget.chosen
+
+ def db_check(self):
+ LOGGER.debug("performing db_check")
+ changedServer = localsettings.chosenserver != self.chosen_server
+ localsettings.setChosenServer(self.chosen_server)
+
+ if self.uninitiated or changedServer:
+ #- user has entered the correct password
+ #- so now we connect to the mysql database
+ #- for the 1st time
+ #- I do it this way so that anyone sniffing the network
+ #- won't see the mysql password until this point
+ #- this could and should possibly still be improved upon
+ #- maybe by using an ssl connection to the server.
+ localsettings.initiateUsers(changedServer)
+ self.uninitiated = False
+
+ def exec_(self):
+ while ExtendableDialog.exec_(self):
+ self.db_check()
+ if self.login_ok:
+ if self.reception_radioButton.isChecked():
+ localsettings.station = "reception"
+ localsettings.setOperator(self.user1, self.user2)
+ self.accept()
+ return True
+ else:
+ # LOGGER.debug("passwords ok %s", self.password_ok)
+ # LOGGER.debug("user1 ok %s", self.user1_ok)
+ # LOGGER.debug("user2 ok %s", self.user2_ok)
+ QtGui.QMessageBox.warning(
+ self.parent(),
+ _("Login Error"),
+ u'<h2>%s %s</h2><em>%s</em>' % (
+ _('Incorrect'),
+ _("User/password combination!"),
+ _('Please Try Again.')
+ )
+ )
+ return False
+
+if __name__ == "__main__":
+ LOGGER.setLevel(logging.DEBUG)
+ app = QtGui.QApplication([])
+
+ dl = LoginDialog()
+ print dl.exec_()
diff --git a/src/openmolar/qt4gui/dialogs/newBPE.py b/src/openmolar/qt4gui/dialogs/newBPE.py
index 2b90648..00b914f 100644
--- a/src/openmolar/qt4gui/dialogs/newBPE.py
+++ b/src/openmolar/qt4gui/dialogs/newBPE.py
@@ -49,9 +49,13 @@ class BPE_Dialog(QtGui.QDialog, Ui_newBPE.Ui_Dialog):
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()):
+ 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 = "_"
@@ -59,11 +63,6 @@ class BPE_Dialog(QtGui.QDialog, Ui_newBPE.Ui_Dialog):
return retarg # a 6 character string.
if __name__ == "__main__":
- import sys
- app = QtGui.QApplication(sys.argv)
- ui = BPE_Dialog()
- print str(ui.getInput())
- # if Dialog.exec_():
- # print "accepted"
- # else:
- # print "rejected"
+ app = QtGui.QApplication([])
+ dl = BPE_Dialog()
+ print dl.getInput()
diff --git a/src/openmolar/qt4gui/dialogs/new_denture_dialog.py b/src/openmolar/qt4gui/dialogs/new_denture_dialog.py
index 16be470..ed462a0 100644
--- a/src/openmolar/qt4gui/dialogs/new_denture_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/new_denture_dialog.py
@@ -47,6 +47,7 @@ VALID_INPUTS = (
class _OptionPage(QtGui.QWidget):
+ finished_signal = QtCore.pyqtSignal()
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
@@ -130,27 +131,56 @@ class PageZero(_OptionPage):
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
- self.upper_radioButton = QtGui.QRadioButton(_("Upper Denture"))
- self.lower_radioButton = QtGui.QRadioButton(_("Lower Denture"))
-
- layout = QtGui.QVBoxLayout(self.frame)
- layout.addWidget(self.upper_radioButton)
- layout.addWidget(self.lower_radioButton)
+ self._is_completed = False
+ self._chosen_arch = "upper"
+ self._return_text = ""
+
+ upper_but = QtGui.QPushButton(_("New UPPER Denture"))
+ upper_but.setMinimumSize(QtCore.QSize(150, 150))
+ lower_but = QtGui.QPushButton(_("New LOWER Denture"))
+ lower_but.setMinimumSize(QtCore.QSize(150, 150))
+ full_fulls_but = QtGui.QPushButton(
+ _("Complete Upper AND Lower Acrylic Dentures"))
+ full_fulls_but.setMinimumSize(QtCore.QSize(150, 150))
+
+ layout = QtGui.QGridLayout(self.frame)
+ layout.addWidget(upper_but, 0, 0)
+ layout.addWidget(lower_but, 0, 1)
+ layout.addWidget(full_fulls_but, 1, 0, 1, 2)
+
+ upper_but.clicked.connect(self._finished)
+ lower_but.clicked.connect(self._lower)
+ full_fulls_but.clicked.connect(self._full_fulls)
@property
def is_completed(self):
- return (self.upper_radioButton.isChecked() or
- self.lower_radioButton.isChecked())
+ return self._is_completed
@property
def return_text(self):
- return ""
+ return self._return_text
@property
def chosen_arch(self):
- if self.upper_radioButton.isChecked():
- return "upper"
- return "lower"
+ return self._chosen_arch
+
+ def _finished(self):
+ self._is_completed = True
+ self.finished_signal.emit()
+
+ def _lower(self):
+ self._chosen_arch = "lower"
+ self._finished()
+
+ @property
+ def next_index(self):
+ if self._return_text == "SR_F/F":
+ return 4
+ return 1
+
+ def _full_fulls(self):
+ self._return_text = "SR_F/F"
+ self._finished()
class PageOne(_OptionPage):
@@ -167,6 +197,12 @@ class PageOne(_OptionPage):
layout.addWidget(self.flexible_radioButton)
@property
+ def is_completed(self):
+ return (self.acrylic_radioButton.isChecked() or
+ self.metal_radioButton.isChecked() or
+ self.flexible_radioButton.isChecked())
+
+ @property
def return_text(self):
if self.acrylic_radioButton.isChecked():
return "SR_"
@@ -181,8 +217,8 @@ 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"))
+ self.label.setText(
+ _("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)
@@ -223,8 +259,8 @@ class PageFour(_OptionPage):
def __init__(self, parent=None):
_OptionPage.__init__(self, parent)
- self.label.setText(_(
- "You may wish to add the following optional items"))
+ self.label.setText(
+ _("You may wish to add the following optional items"))
self.st_checkBox = QtGui.QCheckBox(_("Special Tray"))
self.sl_checkBox = QtGui.QCheckBox(_("Soft Lining"))
@@ -244,7 +280,7 @@ class PageFour(_OptionPage):
@property
def return_text(self):
- if self.dialog.ndu_le.text() != "":
+ if self.dialog.default_lineedit.text() != "":
return self._additional_text
return ""
@@ -278,6 +314,7 @@ class NewDentureDialog(ExtendableDialog):
self.wizard_widget = QtGui.QStackedWidget()
page0 = PageZero(self)
+ page0.finished_signal.connect(self.next_widget)
page1 = PageOne(self)
page2 = PageTwo(self)
page3 = PageThree(self)
@@ -334,6 +371,11 @@ class NewDentureDialog(ExtendableDialog):
self.current_page.cleanup()
+ if self.current_index == 4:
+ if "F/F" in self.upper_input:
+ le = self.ndl_le
+ le.setText(le.text() + self.current_page.return_text)
+
index_ = self.current_index + self.current_page.next_index
if index_ >= self.wizard_widget.count() - 1:
self.apply_but.show()
@@ -374,8 +416,10 @@ class NewDentureDialog(ExtendableDialog):
if re.match(input_, ndu):
matched = True
if not matched:
- QtGui.QMessageBox.warning(self, _("Warning"),
- _("Your upper denture input is invalid"))
+ QtGui.QMessageBox.warning(
+ self,
+ _("Warning"),
+ _("Your upper denture input is invalid"))
return False
for ndl in ndls.split(" "):
LOGGER.debug("checking '%s'" % ndl)
@@ -384,8 +428,10 @@ class NewDentureDialog(ExtendableDialog):
if re.match(input_, ndl):
matched = True
if not matched:
- QtGui.QMessageBox.warning(self, _("Warning"),
- _("Your lower denture input is invalid"))
+ QtGui.QMessageBox.warning(
+ self,
+ ("Warning"),
+ _("Your lower denture input is invalid"))
return False
return True
diff --git a/src/openmolar/qt4gui/dialogs/permissions.py b/src/openmolar/qt4gui/dialogs/permissions.py
index 45b8311..52c9c05 100644
--- a/src/openmolar/qt4gui/dialogs/permissions.py
+++ b/src/openmolar/qt4gui/dialogs/permissions.py
@@ -22,12 +22,102 @@
# # # #
# ############################################################################ #
-from PyQt4 import QtGui, QtCore
import datetime
import hashlib
+import logging
+
+from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings
-from openmolar.qt4gui.compiled_uis import Ui_permissions
+from openmolar.dbtools import db_settings
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+
+LOGGER = logging.getLogger("openmolar")
+
+
+def _hashed_input(input_):
+ salted_input = "%s%s" % (input_, localsettings.SALT)
+ return hashlib.sha1(salted_input).hexdigest()
+
+
+class RaisePermissionsDialog(BaseDialog):
+
+ def __init__(self, parent=None):
+ BaseDialog.__init__(self, parent)
+ self.setWindowTitle(_("Raise Permissions Dialog"))
+ label = WarningLabel("%s<hr />%s" % (
+ _("Supervisor privileges required to perform this action"),
+ _("Please enter the supervisor password"))
+ )
+
+ frame = QtGui.QFrame()
+ self.form_layout = QtGui.QFormLayout(frame)
+ self.line_edit = QtGui.QLineEdit()
+ self.line_edit.setEchoMode(QtGui.QLineEdit.Password)
+ self.form_layout.addRow(_("Supervisor Password"), self.line_edit)
+
+ self.insertWidget(label)
+ self.insertWidget(frame)
+ self.enableApply()
+ self.line_edit.setFocus(True)
+
+ @property
+ def correct_password(self):
+ return _hashed_input(self.line_edit.text().toAscii()) == \
+ localsettings.SUPERVISOR
+
+ def exec_(self):
+ if not BaseDialog.exec_(self):
+ return False
+ if self.correct_password:
+ localsettings.permissionsRaised = True
+ resetExpireTime()
+ return True
+ else:
+ QtGui.QMessageBox.information(self,
+ _("whoops"),
+ _("incorrect supervisor password")
+ )
+ return False
+
+
+class ResetSupervisorPasswordDialog(RaisePermissionsDialog):
+
+ def __init__(self, parent=None):
+ RaisePermissionsDialog.__init__(self, parent)
+
+ self.new_password_line_edit = QtGui.QLineEdit()
+ self.confirm_password_line_edit = QtGui.QLineEdit()
+
+ self.new_password_line_edit.setEchoMode(QtGui.QLineEdit.Password)
+ self.confirm_password_line_edit.setEchoMode(QtGui.QLineEdit.Password)
+
+ self.form_layout.addRow(_("New Password"), self.new_password_line_edit)
+ self.form_layout.addRow(_("Confirm New Password"),
+ self.confirm_password_line_edit)
+
+ @property
+ def _new_password(self):
+ return self.new_password_line_edit.text().toAscii()
+
+ def passwords_match(self):
+ if self._new_password == \
+ self.confirm_password_line_edit.text().toAscii():
+ return True
+ QtGui.QMessageBox.warning(self, _("error"),
+ _("new passwords didn't match"))
+
+ def exec_(self):
+ if RaisePermissionsDialog.exec_(self) and self.passwords_match():
+ localsettings.SUPERVISOR = _hashed_input(self._new_password)
+ db_settings.updateData("supervisor_pword",
+ localsettings.SUPERVISOR,
+ localsettings.operator)
+ message = _("password changed successfully")
+ else:
+ message = _("Password unchanged")
+ QtGui.QMessageBox.information(self, _("information"), message)
def granted(parent=None):
@@ -38,18 +128,8 @@ def granted(parent=None):
else:
localsettings.permissionsRaised = False
- 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
- resetExpireTime()
- return True
- else:
- QtGui.QMessageBox.information(parent, "whoops", "wrong password")
- return False
+ dl = RaisePermissionsDialog(parent)
+ return dl.exec_()
def resetExpireTime():
@@ -60,4 +140,6 @@ if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
print granted()
+ dl = ResetSupervisorPasswordDialog()
+ dl.exec_()
sys.exit(app.exec_())
diff --git a/src/openmolar/qt4gui/dialogs/denture_dialog.py b/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py
similarity index 52%
copy from src/openmolar/qt4gui/dialogs/denture_dialog.py
copy to src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py
index 7012189..ff0e152 100644
--- a/src/openmolar/qt4gui/dialogs/denture_dialog.py
+++ b/src/openmolar/qt4gui/dialogs/recall_prompt_dialog.py
@@ -25,72 +25,65 @@
import logging
from PyQt4 import QtGui, QtCore
-
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
-from openmolar.qt4gui.dialogs.alter_denture_dialog import AlterDentureDialog
-from openmolar.qt4gui.dialogs.new_denture_dialog import NewDentureDialog
LOGGER = logging.getLogger("openmolar")
-class DentureDialog(BaseDialog):
- chosen_treatments = []
+class RecallPromptDialog(BaseDialog):
+ APPLY = 0
+ IGNORE = 1
+ CANCEL = 2
+ result = APPLY
+
+ def __init__(self, pt, parent=None):
+ BaseDialog.__init__(self, parent)
+ self.setWindowTitle(_("Recall Prompt Dialog"))
- def __init__(self, om_gui=None):
- BaseDialog.__init__(self, om_gui)
+ pt_details = "<b>%s %s %s</b>" % (pt.title, pt.fname, pt.sname)
+ self.patient_label = QtGui.QLabel(pt_details)
+ self.patient_label.setAlignment(QtCore.Qt.AlignCenter)
- self.om_gui = om_gui
- message = _("Denture Treatment Dialog")
- self.setWindowTitle(message)
- self.header_label = QtGui.QLabel(message)
- self.header_label.setAlignment(QtCore.Qt.AlignCenter)
+ message = _("There is a problem with the recall date of this patient.")
+ action = _("Would you like to fix this now?")
- frame = QtGui.QFrame()
- layout = QtGui.QHBoxLayout(frame)
+ self.warning_label = WarningLabel("%s<hr />%s" % (message, action))
- new_but = QtGui.QPushButton(_("Plan a New Denture"))
- new_but.setMinimumSize(QtCore.QSize(150, 150))
- alt_but = QtGui.QPushButton(_("Alter an Existing Denture"))
- alt_but.setMinimumSize(QtCore.QSize(150, 150))
+ self.apply_but.setText(_("Fix"))
- layout.addWidget(new_but)
- layout.addWidget(alt_but)
+ self.ignore_but = self.button_box.addButton(
+ QtGui.QDialogButtonBox.Discard)
+ self.ignore_but.setText(_("Ignore Recall Date"))
+ self.ignore_but.setToolTip(_("Ignore this for now."))
- self.insertWidget(self.header_label)
- self.insertWidget(frame)
+ self.cancel_but.setToolTip(_("Cancel and Continue Editing"))
- self.apply_but.hide()
+ self.insertWidget(self.patient_label)
+ self.insertWidget(self.warning_label)
- new_but.clicked.connect(self.new_denture)
- alt_but.clicked.connect(self.alt_denture)
+ self.enableApply()
def sizeHint(self):
- return QtCore.QSize(400, 400)
+ return QtCore.QSize(400, 200)
- def new_denture(self):
- self.hide()
- chosen_dialog = NewDentureDialog(self)
- if chosen_dialog.exec_():
- self.chosen_treatments = list(chosen_dialog.chosen_treatments)
- self.accept()
- else:
- self.reject()
-
- def alt_denture(self):
- self.hide()
- chosen_dialog = AlterDentureDialog(self)
- if chosen_dialog.exec_():
- self.chosen_treatments = list(chosen_dialog.chosen_treatments)
+ def _clicked(self, but):
+ if but == self.ignore_but:
+ self.result = self.IGNORE
self.accept()
- else:
- self.reject()
+ return
+ BaseDialog._clicked(self, but)
-if __name__ == "__main__":
+ def reject(self):
+ self.result = self.CANCEL
+ BaseDialog.reject(self)
- app = QtGui.QApplication([])
+if __name__ == "__main__":
LOGGER.setLevel(logging.DEBUG)
- dl = DentureDialog(None)
- if dl.exec_():
- print dl.chosen_treatments
- else:
- print "dialog rejected"
+ app = QtGui.QApplication([])
+ from openmolar.dbtools.patient_class import patient
+
+ dl = RecallPromptDialog(patient(11932))
+
+ dl.exec_()
+ print dl.result
diff --git a/src/openmolar/qt4gui/dialogs/save_discard_cancel.py b/src/openmolar/qt4gui/dialogs/save_discard_cancel.py
index fabfc1f..77dd763 100644
--- a/src/openmolar/qt4gui/dialogs/save_discard_cancel.py
+++ b/src/openmolar/qt4gui/dialogs/save_discard_cancel.py
@@ -24,6 +24,7 @@
from PyQt4 import QtCore, QtGui
+from openmolar.qt4gui.customwidgets.warning_label import WarningLabel
from openmolar.qt4gui.dialogs.base_dialogs import ExtendableDialog
@@ -44,8 +45,7 @@ class SaveDiscardCancelDialog(ExtendableDialog):
self.enableApply()
self.save_on_exit = True
- label = QtGui.QLabel(message)
- label.setAlignment(QtCore.Qt.AlignCenter)
+ label = WarningLabel(message)
self.insertWidget(label)
self.discard_but = self.button_box.addButton(
@@ -70,11 +70,12 @@ class SaveDiscardCancelDialog(ExtendableDialog):
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:
+ 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()
diff --git a/src/openmolar/qt4gui/diary_widget.py b/src/openmolar/qt4gui/diary_widget.py
index 418d3c0..9fa17a7 100644
--- a/src/openmolar/qt4gui/diary_widget.py
+++ b/src/openmolar/qt4gui/diary_widget.py
@@ -41,13 +41,15 @@ from openmolar.qt4gui.dialogs import permissions
from openmolar.qt4gui.dialogs import choose_clinicians
from openmolar.qt4gui.dialogs.find_patient_dialog import FinalChoiceDialog
from openmolar.qt4gui.dialogs import begin_make_appt_dialog
+from openmolar.qt4gui.dialogs.appointments_insert_blocks_dialog \
+ import InsertBlocksDialog
+from openmolar.qt4gui.dialogs.appointments_memo_dialog \
+ import AppointmentsMemoDialog
from openmolar.qt4gui.customwidgets import appointmentwidget
from openmolar.qt4gui.printing import om_printing
-from openmolar.qt4gui.tools import apptTools
-
from openmolar.qt4gui.compiled_uis import Ui_diary_widget
from openmolar.qt4gui.customwidgets.schedule_control \
@@ -55,7 +57,6 @@ from openmolar.qt4gui.customwidgets.schedule_control \
from openmolar.qt4gui.customwidgets.diary_view_controller \
import DiaryViewController
-
from openmolar.qt4gui.customwidgets.appointment_overviewwidget \
import AppointmentOverviewWidget
@@ -88,6 +89,7 @@ class DiaryWidget(QtGui.QWidget):
alterAday_clipboard_date = None
message_alert = None
+ laid_out = False
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
@@ -114,25 +116,31 @@ class DiaryWidget(QtGui.QWidget):
#-appointment OVerview widget
self.ui.apptoverviews = []
- for day in range(7):
+ 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
+ ):
bw = AppointmentOverviewWidget("0820", "1910", 10, 3, self)
self.ui.apptoverviews.append(bw)
- 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)
hlayout.setMargin(2)
- hlayout.addWidget(self.ui.apptoverviews[i])
- i += 1
+ hlayout.addWidget(bw)
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):
+ 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
+ ):
hlayout = QtGui.QHBoxLayout(widg)
hlayout.setMargin(0)
control = aptOVcontrol.control()
@@ -141,11 +149,8 @@ class DiaryWidget(QtGui.QWidget):
self.ui.weekView_splitter.setSizes([600, 10])
- self.appt_clinician_selector = dent_hyg_selector.dentHygSelector(
- localsettings.activedents, localsettings.activehygs)
-
- self.monthClinicianSelector = dent_hyg_selector.dentHygSelector(
- localsettings.activedents, localsettings.activehygs)
+ self.appt_clinician_selector = dent_hyg_selector.dentHygSelector()
+ self.monthClinicianSelector = dent_hyg_selector.dentHygSelector()
#--customise the appointment widget calendar
self.ui.dayCalendar = calendars.controlCalendar()
@@ -181,9 +186,18 @@ class DiaryWidget(QtGui.QWidget):
self.ticker.start(30000) # fire every 30 seconds
self.ticker.timeout.connect(self.triangles)
+ def initiate(self):
+ LOGGER.debug("initialising diary clinicians")
+ for selector in (self.appt_clinician_selector,
+ self.monthClinicianSelector):
+ selector.set_dents(localsettings.activedents)
+ selector.set_hygs(localsettings.activehygs)
+
def showEvent(self, event):
- LOGGER.debug("DiaryWidget.showEvent called")
- # QtCore.QTimer.singleShot(10, self.layout_diary)
+ LOGGER.debug("ShowEvent called laid_out = %s", self.laid_out)
+ if not self.laid_out:
+ self.initiate()
+ QtCore.QTimer.singleShot(10, self.layout_diary)
def advise(self, arg, warning_level=0):
'''
@@ -457,9 +471,9 @@ class DiaryWidget(QtGui.QWidget):
seldate = self.selected_date()
- if seldate.toPyDate() > localsettings.bookEnd:
+ if seldate.toPyDate() > localsettings.BOOKEND:
message = (_("Reached") +
- ' %s <br />' % localsettings.longDate(localsettings.bookEnd) +
+ ' %s <br />' % localsettings.longDate(localsettings.BOOKEND) +
_("which is specified as the book end point"))
return (False, message, ())
@@ -630,11 +644,10 @@ class DiaryWidget(QtGui.QWidget):
def apptOVheaderclick(self, arg):
'''
a click on the dentist portion of the appointment overview widget
+ current implementation has little value!
'''
-
- # TODO should I abandon this?
apptix, adate = arg
- self.advise("week header clicked %s %s" % (apptix, adate), 1)
+ LOGGER.debug("week header clicked apptix=%s date=%s", apptix, adate)
def offer_appointment_card(self):
result = QtGui.QMessageBox.question(self,
@@ -732,22 +745,6 @@ class DiaryWidget(QtGui.QWidget):
self.advise("Cleared %d emergency slots" % number_cleared, 1)
self.layout_diary()
- def updateDayMemos(self, memos):
- '''
- user has added some memos
- '''
- d = self.selected_date().toPyDate()
- appointments.setMemos(d, memos)
- self.layout_diary()
-
- def addpubHol(self, details):
- '''
- user has update/added a pub holiday
- '''
- d = self.selected_date().toPyDate()
- appointments.setPubHol(d, details)
- self.layout_diary()
-
def add_appointmentwidget(self):
LOGGER.debug("initiating a new AppointmentWidget")
book = appointmentwidget.AppointmentWidget(
@@ -784,6 +781,7 @@ class DiaryWidget(QtGui.QWidget):
OR a memo has been added
'''
LOGGER.debug("DiaryWidget.layout_diary")
+ self.laid_out = True
date_ = self.selected_date()
self.ui.weekCalendar.setSelectedDate(date_)
@@ -813,7 +811,7 @@ class DiaryWidget(QtGui.QWidget):
self.layout_agenda()
if self.appt_mode == self.SCHEDULING_MODE:
- if date_ > localsettings.bookEnd:
+ 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."),
@@ -977,7 +975,7 @@ class DiaryWidget(QtGui.QWidget):
self.finding_next_slot = 0
# self.set_date(localsettings.currentDay())
# return
- if date_ > localsettings.bookEnd:
+ if date_ > localsettings.BOOKEND:
# self.advise(_("You are beyond scheduling range"),1)
self.finding_next_slot = 0
available_slots = []
@@ -1092,7 +1090,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([])
@@ -1330,7 +1328,7 @@ class DiaryWidget(QtGui.QWidget):
returns a list
'''
retlist = []
- for dent in self.monthClinicianSelector.getSelectedClinicians():
+ for dent in self.monthClinicianSelector.selectedClinicians:
retlist.append(localsettings.apptix.get(dent))
return tuple(retlist)
@@ -1350,17 +1348,20 @@ class DiaryWidget(QtGui.QWidget):
def edit_appointment_memo_clicked(self, list_of_snos, start, dentist):
if len(list_of_snos) != 1:
self.advise(
- "multiple appointments selected, unable to edit memo", 2)
+ _("multiple appointments selected, unable to edit memo"), 2)
return
sno = list_of_snos[0]
adate = self.selected_date().toPyDate()
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)
+ 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_note, result = QtGui.QInputDialog.getText(
+ self,
+ _("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)
@@ -1403,14 +1404,16 @@ 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:
+ 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
if appointments.delete_appt_from_apr(appt):
- self.advise(_("Sucessfully removed appointment"))
+ self.advise(_("Successfully removed appointment"))
self.schedule_controller.get_data()
else:
self.advise(_("Error removing from patient diary"), 2)
@@ -1436,9 +1439,12 @@ class DiaryWidget(QtGui.QWidget):
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:
+ if QtGui.QMessageBox.question(
+ self,
+ _("Confirm"),
+ message,
+ 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
@@ -1460,7 +1466,8 @@ class DiaryWidget(QtGui.QWidget):
if not appointments.block_appt(adate, dent, start, end,
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):
@@ -1478,8 +1485,8 @@ class DiaryWidget(QtGui.QWidget):
if not appointments.fill_appt(adate, dent, start, end,
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)
@@ -1526,15 +1533,13 @@ class DiaryWidget(QtGui.QWidget):
if dl.getInput():
self.layout_weekView()
- def appointmentTools(self):
+ def insert_regular_blocks(self):
'''
- called from the main menu
- this just invokes a dialog which has a choice of options
+ insert blocks and appointments
'''
- if permissions.granted(self):
- self.appointmentToolsWindow = QtGui.QMainWindow(self)
- self.ui2 = apptTools.apptTools(self.appointmentToolsWindow)
- self.appointmentToolsWindow.show()
+ dl = InsertBlocksDialog()
+ if dl.exec_():
+ dl.apply()
def diary_tabWidget_nav(self, i):
'''
@@ -1620,6 +1625,29 @@ class DiaryWidget(QtGui.QWidget):
'''
return self.ui.diary_tabWidget.currentIndex() == 4
+ def memo_dialog(self, date_):
+ dl = AppointmentsMemoDialog(date_, self)
+ if dl.exec_():
+ dl.apply()
+ self.layout_diary()
+
+ def edit_public_hol(self, date_):
+ '''
+ enter/modify the stored public holiday field
+ '''
+ LOGGER.debug("edit pub hol for %s", date_)
+ current = appointments.getBankHol(date_)
+ new, result = QtGui.QInputDialog.getText(
+ self,
+ _("Public Holidays"),
+ _("Enter the information for ") + localsettings.longDate(date_),
+ QtGui.QLineEdit.Normal,
+ current)
+ new_value = unicode(new.toUtf8())
+ if result and current != new_value:
+ appointments.setPubHol(date_, new_value)
+ self.layout_diary()
+
def init_signals(self):
self.ui.diary_tabWidget.currentChanged.connect(
self.diary_tabWidget_nav)
@@ -1704,16 +1732,14 @@ 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)
- QtCore.QObject.connect(cal, QtCore.SIGNAL("add_memo"),
- self.updateDayMemos)
-
- QtCore.QObject.connect(self.ui.yearView,
- QtCore.SIGNAL("add_pub_hol"), self.addpubHol)
+ cal.selected_date_signal.connect(
+ self.ui.dayCalendar.setSelectedDate)
+ cal.memo_dialog_signal.connect(self.memo_dialog)
+ cal.public_holiday_signal.connect(self.edit_public_hol)
self.ui.aptOVprevmonth.clicked.connect(self.aptOV_monthBack)
self.ui.aptOVnextmonth.clicked.connect(self.aptOV_monthForward)
@@ -1739,11 +1765,9 @@ class DiaryWidget(QtGui.QWidget):
self.apptOVheaderclick)
for control in self.ui.apptoverviewControls:
- self.connect(control,
- QtCore.SIGNAL("clicked"), self.aptOVlabelClicked)
-
- self.connect(control,
- QtCore.SIGNAL("right-clicked"), self.aptOVlabelRightClicked)
+ control.dayview_signal.connect(self.aptOVlabelClicked)
+ control.edit_hours_signal.connect(self.aptOVlabelRightClicked)
+ control.edit_memo_signal.connect(self.memo_dialog)
class _testDiary(QtGui.QMainWindow):
@@ -1752,23 +1776,31 @@ class _testDiary(QtGui.QMainWindow):
QtGui.QMainWindow.__init__(self, parent)
dw = DiaryWidget()
-
+ dw.initiate()
dw.patient_card_request.connect(self.sig_catcher)
from openmolar.dbtools import patient_class
- pt = patient_class.patient(20862)
+ pt = patient_class.patient(1)
dw.schedule_controller.set_patient(pt)
self.setCentralWidget(dw)
+ action1 = QtGui.QAction("clear emergency slots", self)
+ action1.triggered.connect(dw.clearTodaysEmergencyTime)
+
+ action2 = QtGui.QAction("insert regular blocks", self)
+ action2.triggered.connect(dw.insert_regular_blocks)
+
+ self.menuBar().addAction(action1)
+ self.menuBar().addAction(action2)
+
def sig_catcher(self, *args):
print "signal caught", args
if __name__ == "__main__":
+ LOGGER.setLevel(logging.DEBUG)
+ import gettext
import gettext
- import sys
-
- sys.argv.append("-v")
gettext.install("openmolar")
localsettings.initiate()
diff --git a/src/openmolar/qt4gui/fees/course_module.py b/src/openmolar/qt4gui/fees/course_module.py
index 266ca9a..d3416b7 100644
--- a/src/openmolar/qt4gui/fees/course_module.py
+++ b/src/openmolar/qt4gui/fees/course_module.py
@@ -25,15 +25,18 @@
'''
functions to open a course, close a course, or check if one is needed.
'''
+import datetime
import logging
from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings
from openmolar.dbtools import writeNewCourse
-from openmolar.qt4gui.dialogs import newCourse
+from openmolar.qt4gui.dialogs.close_course_dialog import CloseCourseDialog
+from openmolar.qt4gui.dialogs.newCourse import NewCourseDialog
+from openmolar.qt4gui.dialogs.appt_prefs_dialog import ApptPrefsDialog
+from openmolar.qt4gui.dialogs.recall_prompt_dialog import RecallPromptDialog
from openmolar.qt4gui.printing import om_printing
-from openmolar.qt4gui.compiled_uis import Ui_completionDate
from openmolar.qt4gui import contract_gui_module
from openmolar.ptModules import plan
from openmolar.qt4gui.printing.gp17.gp17_printer import GP17Printer
@@ -48,7 +51,8 @@ def newCourseNeeded(om_gui):
'''
if om_gui.pt.underTreatment:
return False
- if om_gui.pt.treatment_course.cmpd != om_gui.pt.dbstate.treatment_course.cmpd:
+ 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)
return True
@@ -58,17 +62,19 @@ def newCourseNeeded(om_gui):
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)
-
+ message = 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"))
+ om_gui.advise(message, 1)
+ elif course_should_be_resumed(om_gui):
+ return False
elif setupNewCourse(om_gui):
- LOGGER.info("new course started with accd of '%s'" %
+ LOGGER.info("new course started with accd of '%s'",
om_gui.pt.treatment_course.accd)
return False
else:
@@ -95,10 +101,10 @@ 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)
+ dl = NewCourseDialog(dialog,
+ localsettings.ops.get(om_gui.pt.dnt1),
+ localsettings.ops.get(cdnt),
+ om_gui.pt.cset)
result, atts = dl.getInput()
@@ -117,31 +123,33 @@ def setupNewCourse(om_gui):
accd = atts[3].toPyDate()
new_courseno = writeNewCourse.write(om_gui.pt.serialno, accd)
+ om_gui.load_dentComboBoxes()
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.treatment_course.setAccd(accd)
- # force a recheck for the new course date
- om_gui.pt.forget_fee_table()
- om_gui.pt.estimates = []
- om_gui.load_newEstPage()
- om_gui.ui.planChartWidget.clear(keepSelection=True)
- om_gui.ui.completedChartWidget.clear(keepSelection=True)
- om_gui.updateDetails()
- om_gui.load_clinicalSummaryPage()
- om_gui.load_receptionSummaryPage()
- om_gui.pt.addHiddenNote("open_course")
- om_gui.updateHiddenNotesLabel()
- 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
+ new_course = om_gui.pt.new_tx_course(new_courseno)
+ # 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()
+ om_gui.pt.estimates = []
+ om_gui.load_newEstPage()
+ om_gui.ui.planChartWidget.clear(keepSelection=True)
+ om_gui.ui.completedChartWidget.clear(keepSelection=True)
+ om_gui.updateDetails()
+ om_gui.load_clinicalSummaryPage()
+ om_gui.load_receptionSummaryPage()
+ om_gui.pt.addHiddenNote("open_course")
+ om_gui.updateHiddenNotesLabel()
+ message = "%s<hr />%s <em>%s</em>" % (
+ _("Successfully started new course of treatment"),
+ _("Using Feescale"),
+ om_gui.pt.fee_table.briefName
+ )
+ om_gui.debug_browser_refresh_func = None
+ om_gui.advise(message)
+ return True
def prompt_close_course(om_gui):
@@ -154,6 +162,25 @@ def prompt_close_course(om_gui):
closeCourse(om_gui, True)
+def recall_check(om_gui):
+ if (not om_gui.pt.recall_active or
+ om_gui.pt.recd > localsettings.currentDay() or
+ om_gui.pt.has_exam_booked):
+ return True
+ dl = RecallPromptDialog(om_gui.pt, om_gui)
+ if dl.exec_():
+ if dl.result == dl.IGNORE:
+ return True
+ else:
+ dl = ApptPrefsDialog(om_gui.pt, om_gui)
+ if dl.exec_():
+ om_gui.pt.appt_prefs.commit_changes()
+ om_gui.updateDetails()
+ om_gui.advise(_("Appointment Preferences Applied"))
+ return True
+ return False
+
+
def delete_new_course(om_gui):
'''
user is discarding all changes to a record.
@@ -169,34 +196,27 @@ def closeCourse(om_gui, leaving=False):
'''
allow the user to add a completion Date to a course of treatment
'''
- 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))
-
+ ftr = om_gui.pt.treatment_course.has_treatment_outstanding
+ dl = CloseCourseDialog(ftr, om_gui)
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
- 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):
-
- cmpd = my_dialog.dateEdit.date().toPyDate()
- om_gui.pt.treatment_course.setCmpd(cmpd)
+ dl.tx_complete_label.hide()
+ dl.patient_label.setText("%s %s - (%s)" % (
+ om_gui.pt.fname, om_gui.pt.sname, om_gui.pt.serialno))
+ dl.set_minimum_date(om_gui.pt.treatment_course.accd)
+ dl.set_date(om_gui.pt.last_treatment_date)
+
+ if dl.exec_():
+ om_gui.pt.treatment_course.setCmpd(dl.completion_date)
+ om_gui.pt.treatment_course.ftr = dl.ftr
om_gui.pt.addHiddenNote("close_course")
om_gui.updateDetails()
om_gui.updateHiddenNotesLabel()
offerFinalPaperWork(om_gui)
plan.completedFillsToStatic(om_gui.pt)
+ if not leaving:
+ om_gui.refresh_charts()
+ om_gui.debug_browser_refresh_func = None
+
return True
return False
@@ -212,21 +232,52 @@ def offerFinalPaperWork(om_gui):
form_printer.print_(final_paperwork=True)
+def course_should_be_resumed(om_gui):
+ '''
+ see if it would make more sense to resume a course rather than start a new
+ one.
+ '''
+
+ if not om_gui.pt.treatment_course.cmpd:
+ return False
+ elapsed = localsettings.currentDay() - om_gui.pt.treatment_course.cmpd
+ if elapsed > datetime.timedelta(days=7):
+ return False
+ elif elapsed == datetime.timedelta(days=0):
+ message = _("A course was closed earlier today.")
+ elif elapsed == datetime.timedelta(days=1):
+ message = _("A course was closed yesterday.")
+ else:
+ message = _("A course was closed less than a week ago.")
+
+ if QtGui.QMessageBox.question(
+ om_gui,
+ _("Question"),
+ "%s<hr />%s" % (message, _("Would you like to resume this course?")),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
+ return resumeCourse(om_gui)
+ return False
+
+
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)
+ if QtGui.QMessageBox.question(
+ om_gui,
+ _("Confirm"),
+ _("Are you sure you wish to Resume the previous course of treatment?"),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.Yes:
- if result == QtGui.QMessageBox.Yes:
om_gui.pt.treatment_course.cmpd = None
+ om_gui.pt.treatment_course.ftr = False
om_gui.updateDetails()
om_gui.pt.addHiddenNote("resume_course")
om_gui.updateHiddenNotesLabel()
-
+ plan.reverse_completedFillsToStatic(om_gui.pt)
+ om_gui.debug_browser_refresh_func = None
return True
@@ -242,12 +293,16 @@ def fix_zombied_course(om_gui):
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)")
+ " (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:
+
+ 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:
cno = om_gui.pt.max_tx_courseno
apply_new_courseno(om_gui, cno)
diff --git a/src/openmolar/qt4gui/fees/fees_module.py b/src/openmolar/qt4gui/fees/fees_module.py
index acdf846..840ba95 100644
--- a/src/openmolar/qt4gui/fees/fees_module.py
+++ b/src/openmolar/qt4gui/fees/fees_module.py
@@ -119,7 +119,7 @@ def takePayment(om_gui):
total=dl.grand_total_text)
#-- always refer to money in terms of pence
- print "adjusting money"
+ LOGGER.debug("adjusting money")
if om_gui.pt.cset[:1] == "N":
om_gui.pt.money2 += dl.tx_total
else:
@@ -134,8 +134,10 @@ def takePayment(om_gui):
paymentPt.HIDDENNOTES)
LOGGER.debug("writing payment notes")
- if patient_write_changes.discreet_changes(paymentPt,
- ("money2", "money3", "money11")) and om_gui.pt.serialno != 0:
+ if (patient_write_changes.discreet_money_changes(
+ paymentPt, ("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
@@ -355,7 +357,7 @@ def makeBadDebt(om_gui):
om_gui.pt.resetAllMonies()
om_gui.pt.status = "BAD DEBT"
om_gui.ui.notesEnter_textEdit.setText(
- _("changed patients status to BAD DEBT")
+ _("changed patient's status to BAD DEBT")
)
om_gui.updateStatus()
diff --git a/src/openmolar/qt4gui/fees/manipulate_plan.py b/src/openmolar/qt4gui/fees/manipulate_plan.py
index 97051a8..8742288 100644
--- a/src/openmolar/qt4gui/fees/manipulate_plan.py
+++ b/src/openmolar/qt4gui/fees/manipulate_plan.py
@@ -136,17 +136,19 @@ def add_treatment_to_estimate(om_gui, att, shortcut, dentid, tx_hashes,
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:
+ 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:
return alt_code, alt_table
return itemcode, table
@@ -161,17 +163,19 @@ def add_treatment_to_estimate(om_gui, att, shortcut, dentid, tx_hashes,
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:
+ 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:
return alt_code, alt_table
return itemcode, table
@@ -326,7 +330,7 @@ def customAdd(om_gui, description=None):
descr = "??"
usercode = str(descr.replace(" ", "_"))[:20].upper()
- fee = int(dl.fee_doubleSpinBox.value() * 100)
+ fee = localsettings.pencify(str(dl.fee_doubleSpinBox.value()))
for i in range(no):
pt.treatment_course.custompl += "%s " % usercode
@@ -594,9 +598,10 @@ 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
@@ -700,8 +705,13 @@ def complex_shortcut_addition(om_gui, att, shortcut, n_txs, tx_hash,
for item_code in case.additions:
LOGGER.debug("adding additional code %s" % item_code)
- add_treatment_to_estimate(om_gui,
- att, shortcut, dentid, list(tx_hashes), item_code)
+ add_treatment_to_estimate(
+ om_gui,
+ att,
+ shortcut,
+ dentid,
+ list(tx_hashes),
+ item_code)
for item_code in case.alterations:
# instead of adding a new estimate item
@@ -787,8 +797,13 @@ def complex_shortcut_removal_handled(om_gui, att, shortcut, n_txs, tx_hash):
for item_code in case.additions:
LOGGER.debug("adding additional code %s" % item_code)
- add_treatment_to_estimate(om_gui,
- att, shortcut, dentid, tx_hashes, item_code)
+ add_treatment_to_estimate(
+ om_gui,
+ att,
+ shortcut,
+ dentid,
+ tx_hashes,
+ item_code)
for item_code in case.alterations:
# instead of adding a new estimate item
@@ -916,6 +931,7 @@ def remove_estimate_item(om_gui, est_item):
pt.addHiddenNote("exam", treat_code, attempt_delete=True)
for est in pt.ests_from_hash(tx_hash):
pt.estimates.remove(est)
+ om_gui.updateHiddenNotesLabel()
elif treat_code.strip(" ") == "!FEE":
LOGGER.debug("special case - removing feescale added item")
if tx_hash.completed:
@@ -924,13 +940,17 @@ def remove_estimate_item(om_gui, est_item):
pt.estimates.remove(est)
else:
LOGGER.debug("not a special case")
- remove_treatments_from_plan_and_est(om_gui,
- ((att, treat_code.strip(" ")),), tx_hash.completed)
+ remove_treatments_from_plan_and_est(
+ om_gui,
+ ((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):
@@ -1045,6 +1065,12 @@ def complete_txs(om_gui, treatments, confirm_multiples=True):
args is a list - [("ul5","MOD"),("ul5", "RT"), ("perio", "SP")]
'''
+ if localsettings.clinicianNo == 0:
+ om_gui.advise(
+ _("You have no clinician login. "
+ "Treatments cannot be completed by you!"),
+ 2)
+ return
LOGGER.debug(treatments)
pt = om_gui.pt
@@ -1087,6 +1113,13 @@ def tx_hash_complete(om_gui, tx_hash):
reponds to a signal when the user completes an item of treatment by
checking a checkbox on the estwidget
'''
+ if localsettings.clinicianNo == 0:
+ om_gui.advise(
+ _("You have no clinician login. "
+ "Treatments cannot be completed by you!"),
+ 2)
+ return
+
LOGGER.debug(tx_hash)
pt = om_gui.pt
diff --git a/src/openmolar/qt4gui/feescale_editor/feescale_editor.py b/src/openmolar/qt4gui/feescale_editor/feescale_editor.py
index 0b5fb23..332c913 100755
--- a/src/openmolar/qt4gui/feescale_editor/feescale_editor.py
+++ b/src/openmolar/qt4gui/feescale_editor/feescale_editor.py
@@ -118,7 +118,7 @@ class FeescaleEditor(QtGui.QMainWindow):
QtGui.QMainWindow.__init__(self, parent)
self.window_title = _("Feescale Editor")
self.setWindowTitle(self.window_title)
- self.loading = True
+ self.is_loading = True
statusbar = QtGui.QStatusBar()
self.setStatusBar(statusbar)
@@ -260,7 +260,7 @@ class FeescaleEditor(QtGui.QMainWindow):
self.feescale_parsers = OrderedDict()
self.text_editors = []
self.feescale_handler = feescale_handler
-
+ self.feescale_handler.check_dir()
self.action_refactor = QtGui.QAction(_("XML tidy"), self)
self.action_refactor.triggered.connect(self.refactor)
@@ -406,7 +406,15 @@ class FeescaleEditor(QtGui.QMainWindow):
self.view_feescale(0)
def load_feescales(self):
- self.loading = True
+ self.is_loading = True
+
+ # if reloading.. disconnect signals.
+ for editor in self.text_editors:
+ editor.editing_finished.disconnect(self.te_editing_finished)
+ editor.cursorPositionChanged.disconnect(
+ self.cursor_position_changed)
+ editor.deleteLater()
+
self.text_editors = []
self.feescale_parsers = OrderedDict()
for ix, filepath in self.feescale_handler.local_files:
@@ -430,10 +438,10 @@ class FeescaleEditor(QtGui.QMainWindow):
self.tab_widget.addTab(editor, title)
- self.loading = False
+ self.is_loading = False
def view_feescale(self, i=0):
- while self.loading:
+ while self.is_loading:
QtCore.QTimer.singleShot(1000, self.view_feescale)
return
if len(self.text_editors) > 1:
@@ -665,9 +673,11 @@ class FeescaleEditor(QtGui.QMainWindow):
parser = self.current_parser
try:
if filepath is None:
- filepath = QtGui.QFileDialog.getSaveFileName(self,
- _("save as"), parser.filepath,
- "%s %s" % (_("xml_files"), "(*.xml)"))
+ filepath = unicode(
+ QtGui.QFileDialog.getSaveFileName(self,
+ _("save as"), parser.filepath,
+ "%s (*.xml)" % _("xml_files")).toUtf8()
+ )
if filepath == '':
return
if not re.match(".*\.xml$", filepath):
@@ -677,7 +687,7 @@ class FeescaleEditor(QtGui.QMainWindow):
f.close()
if filepath != parser.filepath:
self.advise("%s %s" % (_("Copy saved to"), filepath), 1)
- if os.path.dirname(filepath) == FEESCALE_DIR:
+ if os.path.dirname(filepath) == FEESCALE_DIR():
self.advise(_("Reload files to edit the new feescale"), 1)
else:
if parser in self._known_deleted_parsers:
@@ -700,26 +710,57 @@ class FeescaleEditor(QtGui.QMainWindow):
) == QtGui.QMessageBox.Cancel):
return
- for fp in self.feescale_parsers.values():
- fp.refresh()
- self.view_feescale(self.tab_widget.currentIndex())
+ self.tab_widget.clear()
+ self.load_feescales()
def apply_changes(self):
+ if self.is_dirty:
+ self.advise(
+ _("Please save local files before pushing to database"), 1)
+ return
if QtGui.QMessageBox.question(self, _("confirm"),
- _("commit all local files to database?"),
+ _("update all existing feescales with data from the local files?"),
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)
+ ) == QtGui.QMessageBox.Cancel:
+ return
+
+ message, insert_ids = self.feescale_handler.update_db_all()
+ LOGGER.info("message")
+ self.advise("<pre>%s</pre>" % message, 1)
+
+ mappings = {}
+ for ins_id in insert_ids:
+ if QtGui.QMessageBox.question(self, _("confirm"),
+ "%s %s?" % (_("Insert new Feescale"),
+ self.feescale_handler.index_to_local_filepath(ins_id)),
+ QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel
+ ) == QtGui.QMessageBox.Ok:
+ mappings[ins_id] = self.feescale_handler.insert_db(ins_id)
+
+ move_required = False
+ for file_ix, db_ix in mappings.iteritems():
+ if file_ix != db_ix:
+ move_required = True
+ self.advise(_("your local files will now be moved to "
+ "comply with the database indexes they have been given"), 1)
+ break
+ if not move_required:
+ return
+
+ # self._checking_files = True
+ for file_ix in mappings.keys():
+ self.feescale_handler.temp_move(file_ix)
+ for file_ix, db_ix in mappings.iteritems():
+ self.feescale_handler.final_move(file_ix, db_ix)
+ self.refresh_files()
def cursor_position_changed(self, row, col):
self.cursor_pos_label.setText("Line %d, Column %d" % (row + 1, col))
def text_changed(self):
new_text = self.text_edit.text()
- if self.current_parser.text.count("\n") == new_text.count("\n"):
- return
+ # if self.current_parser.text.count("\n") == new_text.count("\n"):
+ # return
if self.current_parser.set_edited_text(new_text):
self.update_index()
diff --git a/src/openmolar/qt4gui/maingui.py b/src/openmolar/qt4gui/maingui.py
index 118dcb2..264073a 100755
--- a/src/openmolar/qt4gui/maingui.py
+++ b/src/openmolar/qt4gui/maingui.py
@@ -28,7 +28,6 @@ provides the main class which is my gui
from __future__ import division
-import copy
import datetime
import logging
import os
@@ -42,7 +41,7 @@ from functools import partial
from PyQt4 import QtGui, QtCore
-from openmolar.connect import database_name
+from openmolar.connect import params
from openmolar.settings import localsettings, utilities
from openmolar.qt4gui import colours
@@ -76,15 +75,12 @@ from openmolar.qt4gui.dialogs import saveMemo
from openmolar.qt4gui.dialogs import permissions
from openmolar.qt4gui.dialogs import select_language
-from openmolar.qt4gui.dialogs import *
+from openmolar.qt4gui.dialogs.dialog_collection 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
-# secondary applications
-from openmolar.qt4gui.tools import recordtools
-
#--database modules
#--(do not even think of making db queries from ANYWHERE ELSE)
from openmolar.dbtools import appointments
@@ -103,13 +99,14 @@ from openmolar.dbtools import estimatesHistory
from openmolar.dbtools import est_logger
from openmolar.dbtools import daybook
from openmolar.dbtools.distinct_statuses import DistinctStatuses
+from openmolar.dbtools import schema_version
+from openmolar.dbtools import referral
#--modules which act upon the pt class type (and subclasses)
from openmolar.ptModules import patientDetails
from openmolar.ptModules import formatted_notes
from openmolar.ptModules import plan
-from openmolar.ptModules import referral
from openmolar.ptModules import debug_html
from openmolar.ptModules import estimates
from openmolar.ptModules import tooth_history
@@ -125,25 +122,25 @@ from openmolar.qt4gui.diary_widget import DiaryWidget
from openmolar.qt4gui.pt_diary_widget import PtDiaryWidget
from openmolar.qt4gui.customwidgets import chartwidget
from openmolar.qt4gui.customwidgets import toothProps
-from openmolar.qt4gui.customwidgets import perioToothProps
-from openmolar.qt4gui.customwidgets import perioChartWidget
from openmolar.qt4gui.customwidgets import estimate_widget
from openmolar.qt4gui.customwidgets import notification_widget
from openmolar.qt4gui.customwidgets.static_control_panel \
import StaticControlPanel
+from openmolar.backports.advisor import Advisor
+
LOGGER = logging.getLogger("openmolar")
-LOGGER.setLevel(logging.INFO)
-class OpenmolarGui(QtGui.QMainWindow):
+class OpenmolarGui(QtGui.QMainWindow, Advisor):
fee_table_editor = None
fee_table_tester = None
phrasebook_editor = None
entering_new_patient = False
- def __init__(self):
- QtGui.QMainWindow.__init__(self)
+ def __init__(self, parent=None):
+ QtGui.QMainWindow.__init__(self, parent)
+ Advisor.__init__(self, parent)
self.ui = Ui_main.Ui_MainWindow()
self.ui.setupUi(self)
self.diary_widget = DiaryWidget(self)
@@ -172,7 +169,6 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.actionSurgery_Mode.setChecked(
localsettings.station == "surgery")
self.setupSignals()
- self.loadDentistComboboxes()
self.feestableLoaded = False
self.forum_parenting_mode = (False, None)
self.ui.new_patient_frame.hide()
@@ -185,43 +181,153 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.completed_listView.setContextMenuPolicy(
QtCore.Qt.CustomContextMenu)
- self.setWindowTitle("OpenMolar - %s '%s'" % (
- _("connected to"), database_name()))
+ self.setWindowTitle("OpenMolar - %s" % _("OFFLINE"))
# 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)
- QtCore.QTimer.singleShot(2000, self.load_fee_tables)
-
- def advise(self, arg, warning_level=0):
- '''
- inform the user of events -
- warning level0 = status bar only.
- warning level 1 advisory
- warning level 2 critical (and logged)
- '''
- if warning_level == 0:
- m = QtGui.QMessageBox(self)
- m.setText(arg)
- m.setStandardButtons(QtGui.QMessageBox.NoButton)
- m.setWindowTitle(_("advisory"))
- m.setModal(False)
- QtCore.QTimer.singleShot(3 * 1000, m.accept)
- m.show()
- 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()
- QtGui.QMessageBox.warning(self, _("Error"), arg)
- #--for logging purposes
- print "%d:%02d ERROR MESSAGE" % (now.hour(), now.minute())
- print arg
+ self.ui.backButton.setEnabled(False)
+ self.ui.nextButton.setEnabled(False)
+ self.ui.reloadButton.setEnabled(False)
+ self.ui.relatedpts_pushButton.setEnabled(False)
+
+ self.debug_browser_refresh_func = None
+
+ self.forum_timer = QtCore.QTimer()
+ QtCore.QTimer.singleShot(100, self.check_first_run)
+
+ def initiate(self):
+ localsettings.initiate()
+ self.setWindowTitle("OpenMolar - %s '%s'" % (
+ _("connected to"), params.database_name))
+
+ dl = InitialCheckDialog(self)
+ for message in dl.critical_messages:
+ self.advise("%s<hr />%s" % (_("CRITICAL MESSAGE"), message), 2)
+ if dl.has_issues:
+ dl.exec_()
+ for message in dl.messages:
+ self.advise(message)
+ self.set_surgery_mode()
+ self.load_pt_statuses()
+ self.loadDentistComboboxes()
+ self.ui.reception_textBrowser.setHtml(localsettings.message)
+ self.ui.notesSummary_webView.setHtml(localsettings.message)
+ self.ui.forumViewFilter_comboBox.addItems(
+ localsettings.allowed_logins)
+
+ QtCore.QTimer.singleShot(500, self.load_todays_patients_combobox)
+ QtCore.QTimer.singleShot(1000, self.load_fee_tables)
+ self.forum_timer.start(60000) # fire every minute
+ self.forum_timer.timeout.connect(self.checkForNewForumPosts)
+ self.set_referral_centres()
+ self.diary_widget.initiate()
+
+ def check_first_run(self):
+ if os.path.exists(localsettings.global_cflocation):
+ localsettings.cflocation = localsettings.global_cflocation
+ cf_Found = True
+ else:
+ cf_found = os.path.exists(localsettings.cflocation)
+ if not cf_found or localsettings.FORCE_FIRST_RUN:
+ dl = FirstRunDialog(self)
+ if not dl.exec_():
+ QtGui.QApplication.instance().closeAllWindows()
+ return
+ params.reload()
+ self.login()
+
+ def login(self):
+ dl = LoginDialog(self)
+ if not dl.exec_():
+ app = QtGui.QApplication.instance()
+ QtCore.QTimer.singleShot(4000, app.closeAllWindows)
+ self.advise(_("Login Cancelled- Closing Application"), 2)
+ app.closeAllWindows()
+ else:
+ self.advise("%s %s %s" % (
+ _("Login by"), localsettings.operator, "accepted"))
+ self.check_schema()
+ self.initiate()
+
+ def check_schema(self):
+ LOGGER.debug("checking schema version...")
+
+ if localsettings.IGNORE_SCHEMA_CHECK:
+ LOGGER.warning(
+ "Ignoring schema check - I hope you know what you are doing!")
+ self.advise(_("Warning - ignoring schema check!"), 2)
+ return
+ sv = schema_version.getVersion()
+ if localsettings.CLIENT_SCHEMA_VERSION == sv:
+ self.advise(_("database schema is up to date"))
+
+ elif localsettings.CLIENT_SCHEMA_VERSION > sv:
+ LOGGER.warning("schema is out of date")
+ self.advise(_("database schema is incompatible"))
+ from openmolar.qt4gui.schema_updater import SchemaUpdater
+ schema_updater = SchemaUpdater()
+ if not schema_updater.exec_():
+ QtGui.QApplication.instance().closeAllWindows()
+
+ elif localsettings.CLIENT_SCHEMA_VERSION < sv:
+ LOGGER.warning("client is out of date")
+ compatible = schema_version.clientCompatibility(
+ localsettings.CLIENT_SCHEMA_VERSION)
+
+ if not compatible:
+ self.advise("<p>%s</p><p>%s %s %s %s</p><hr />%s" % (
+ _('Sorry, you cannot run this version of the openMolar '
+ 'client because your database schema is more advanced.'),
+ _('this client requires schema version '),
+ localsettings.CLIENT_SCHEMA_VERSION,
+ _('but your database is at'),
+ sv,
+ _('Please Update openMolar now')), 2)
+ QtGui.QApplication.instance().closeAllWindows()
+ else:
+ message = '''<p>%s</p><p>%s %s %s %s</p>
+ <p>%s<br />%s</p><hr />%s''' % (
+ _('This openMolar client has fallen behind your database '
+ 'schema version'),
+ _('This client was written for schema version'),
+ localsettings.CLIENT_SCHEMA_VERSION,
+ _('and your database is now at'),
+ sv.
+ _('However, the differences are not critical, and you can '
+ 'continue if you wish'),
+ _('It would still be wise to update this client ASAP'),
+ _('Do you wish to continue?'))
+
+ if QtGui.QMessageBox.question(
+ self,
+ _("Proceed without upgrade?"),
+ message,
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
+ QtGui.QApplication.instance().closeAllWindows()
+
+ def resizeEvent(self, event):
+ '''
+ this function is overwritten so that the advisor popup can be
+ put in the correct place
+ '''
+ QtGui.QMainWindow.resizeEvent(self, event)
+ self.setBriefMessageLocation()
+
+ def setBriefMessageLocation(self):
+ '''
+ make the Advisor sub class aware of the windows geometry.
+ set it top right, and right_to_left
+ '''
+ widg = self.menuBar()
+ brief_pos_x = (widg.pos().x() + widg.width())
+ brief_pos_y = (widg.pos().y() + widg.height())
+
+ brief_pos = QtCore.QPoint(brief_pos_x, brief_pos_y)
+ self.setBriefMessagePosition(brief_pos, True)
def wait(self, waiting=True):
if waiting:
@@ -287,7 +393,6 @@ 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.sepline = QtGui.QFrame(self.statusbar_frame)
self.sepline.setFrameShape(QtGui.QFrame.VLine)
self.sepline.setFrameShadow(QtGui.QFrame.Sunken)
@@ -305,11 +410,6 @@ class OpenmolarGui(QtGui.QMainWindow):
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.addWidget(self.ui.perioChartWidget)
-
#-static chart
self.ui.staticChartWidget = chartwidget.chartWidget()
self.ui.staticChartWidget.setFocusPolicy(QtCore.Qt.StrongFocus)
@@ -345,46 +445,7 @@ class OpenmolarGui(QtGui.QMainWindow):
hlayout.setMargin(0)
hlayout.addWidget(self.ui.toothPropsWidget)
- #-PERIOPROPS
- self.ui.perioToothPropsWidget = perioToothProps.tpWidget()
- hlayout = QtGui.QHBoxLayout(self.ui.perioToothProps_frame)
- hlayout.addWidget(self.ui.perioToothPropsWidget)
-
- self.ui.perioChartWidgets = []
- self.ui.perioGroupBoxes = []
- hlayout = QtGui.QVBoxLayout(self.ui.perioChartData_frame)
- hlayout.setMargin(2)
- for i in range(8):
- gbtitle = (_("Recession"), _("Pocketing"), _("Plaque"),
- _("Bleeding"), _("Other"), _(
- "Suppuration"), _("Furcation"),
- _("Mobility"))[i]
- periogb = QtGui.QGroupBox(gbtitle)
- periogb.setCheckable(True)
- periogb.setChecked(True)
- # periogb.setMinimumSize(0, 120)
- pchart = perioChartWidget.chartWidget()
- pchart.type = gbtitle
- gblayout = QtGui.QVBoxLayout(periogb)
- gblayout.setMargin(2)
- gblayout.addWidget(pchart)
- hlayout.addWidget(periogb)
-
- # 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.timeout.connect(self.checkForNewForumPosts)
-
self.enableEdit(False)
- for desc in referral.getDescriptions():
- s = QtCore.QString(desc)
- self.ui.referralLettersComboBox.addItem(s)
#-- add a header to the estimates page
self.ui.estWidget = estimate_widget.EstimateWidget(self)
@@ -407,6 +468,11 @@ class OpenmolarGui(QtGui.QMainWindow):
layout.setMargin(0)
layout.addWidget(self.ui.cashbookTextBrowser)
+ def set_referral_centres(self):
+ #--updates the current time in appointment books
+ self.ui.referralLettersComboBox.clear()
+ self.ui.referralLettersComboBox.addItems(referral.getDescriptions())
+
def setClinician(self):
result, selected = ClinicianSelectDialog(self).result()
if result:
@@ -421,7 +487,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.set_operator_label()
def saveButtonClicked(self):
- self.okToLeaveRecord(cont=True)
+ self.okToLeaveRecord(discard_possible=False)
def bpe_table(self, arg):
'''
@@ -429,12 +495,6 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
charts_gui.bpe_table(self, arg)
- def layoutPerioCharts(self):
- '''
- layout the perio charts
- '''
- charts_gui.layoutPerioCharts(self)
-
def deleteComments(self):
'''
called when user has trigger deleted comments in the toothProp
@@ -519,17 +579,16 @@ class OpenmolarGui(QtGui.QMainWindow):
dl = ChooseToothDialog(self)
return dl.getInput()
- def okToLeaveRecord(self, cont=False):
+ def okToLeaveRecord(self, discard_possible=True):
'''
leaving a pt record - has state changed?
'''
if self.pt.serialno == 0:
return True
- #--a debug print statement
- if not cont:
- LOGGER.debug(
- "leaving record checking to see if save is required...")
- course_module.prompt_close_course(self)
+
+ course_module.prompt_close_course(self)
+ if not course_module.recall_check(self):
+ return False
#--apply changes to patient details
self.pt.synopsis = str(self.ui.synopsis_lineEdit.text().toAscii())
@@ -549,7 +608,7 @@ class OpenmolarGui(QtGui.QMainWindow):
dl = SaveDiscardCancelDialog(message, changes, self)
# dl.setPatient()
# dl.setChanges(uc)
- dl.discard_but.setVisible(not cont)
+ dl.discard_but.setVisible(discard_possible)
dl.exec_()
if dl.result == dl.DISCARD:
LOGGER.info(
@@ -634,9 +693,10 @@ class OpenmolarGui(QtGui.QMainWindow):
self.update_plan_est()
elif ci == 8: # -- perio tab
- charts_gui.periochart_dates(self)
- # load the periocharts (if the patient has data)
- charts_gui.layoutPerioCharts(self)
+ LOGGER.debug("perio interface being rewritten")
+
+ elif ci == 9: # -- history tab
+ self.refresh_debug_browser()
self.wait(False)
@@ -677,7 +737,7 @@ class OpenmolarGui(QtGui.QMainWindow):
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"
self.ui.dobEdit.setDate(QtCore.QDate(1900, 1, 1))
@@ -690,8 +750,9 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.synopsis_lineEdit.setText("")
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,
+ for chart in (self.ui.staticChartWidget,
+ self.ui.planChartWidget,
+ self.ui.completedChartWidget,
self.ui.summaryChartWidget):
chart.clear()
chart.update()
@@ -790,40 +851,46 @@ class OpenmolarGui(QtGui.QMainWindow):
return True
def load_dentComboBoxes(self, newpatient=False):
- # print "loading dnt comboboxes."
+ LOGGER.debug("loading dnt comboboxes. dnt1=%s dnt2=%s",
+ self.pt.dnt1, self.pt.dnt2)
+
inits = localsettings.ops.get(self.pt.dnt1, "")
- if inits in localsettings.activedents:
+ if len(localsettings.activedents) == 0:
+ self.advise(_("You have no dentists in your database."), 1)
+ elif inits in localsettings.activedents:
self.ui.dnt1comboBox.setCurrentIndex(
localsettings.activedents.index(inits))
else:
self.ui.dnt1comboBox.setCurrentIndex(-1)
if not newpatient:
- print "dnt1 error - record %d" % self.pt.serialno
- if not inits in ("", "NONE"):
+ LOGGER.warning("dnt1 error %s - record %s",
+ self.pt.dnt1, self.pt.serialno)
+ if inits != "":
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")
self.advise(message, 2)
inits = localsettings.ops.get(self.pt.dnt2, "")
- if inits in localsettings.activedents:
- self.ui.dnt2comboBox.setCurrentIndex(
- localsettings.activedents.index(inits))
+ if self.pt.dnt2 is None:
+ i = -1
+ elif inits in localsettings.activedents:
+ i = localsettings.activedents.index(inits)
else:
- self.ui.dnt2comboBox.setCurrentIndex(-1)
+ i = -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")
- self.advise(message, 2)
- elif inits == "":
- print "unknown dentist number", self.pt.dnt2
- message = _("unknown course dentist - please correct this")
+ elif inits != "":
+ message = "%s '%s' %s" % (
+ _("Course dentist"),
+ inits,
+ _("is no longer an active dentist in this practice")
+ )
+ self.pt.dnt2 = None
self.advise(message, 2)
+ self.ui.dnt2comboBox.setCurrentIndex(i)
def enterNewPatient(self):
'''
@@ -843,8 +910,8 @@ class OpenmolarGui(QtGui.QMainWindow):
if they are, function will return the user to that part of the gui
and return True. otherwise, will return False.
'''
- LOGGER.debug("enteringNewPatient")
if self.entering_new_patient:
+ LOGGER.debug("enteringNewPatient")
self.ui.main_tabWidget.setCurrentIndex(0)
self.ui.tabWidget.setCurrentIndex(0)
return not new_patient_gui.abortNewPatientEntry(self)
@@ -875,23 +942,25 @@ 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)
+ 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)
if result == QtGui.QMessageBox.Yes:
html, version = docsprinted.getData(ix)
- type = item.text(1).replace("(html)", "")
- if om_printing.htmlEditor(self, type, html, version):
+ 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)
+ 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)
if result == QtGui.QMessageBox.Yes:
try:
data, version = docsprinted.getData(ix)
@@ -916,8 +985,13 @@ class OpenmolarGui(QtGui.QMainWindow):
load the docsImported listWidget
'''
self.ui.importDoc_treeWidget.clear()
- self.ui.importDoc_treeWidget.setHeaderLabels([_("Date imported"),
- _("Description"), _("Size"), _("Type"), "Index"])
+ self.ui.importDoc_treeWidget.setHeaderLabels([
+ _("Date imported"),
+ _("Description"),
+ _("Size"),
+ _("Type"),
+ _("Index")
+ ])
docs = docsimported.storedDocs(self.pt.serialno)
for doc in docs:
@@ -949,11 +1023,12 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
ix = int(item.text(4))
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)
+ 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)
if result == QtGui.QMessageBox.Yes:
try:
fpath = os.path.join(localsettings.localFileDirectory,
@@ -1030,12 +1105,13 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
cycle forwards through the list of recently visited records
'''
- desiredPos = localsettings.recent_sno_index + 1
+ offset = 0 if self.pt.serialno == 0 else 1
+ desiredPos = localsettings.recent_sno_index + offset
try:
self.getrecord(localsettings.recent_snos[desiredPos],
addToRecentSnos=False)
except IndexError:
- self.advise(_("Reached end of the List"))
+ self.advise(_("Reached End of Record History"))
def last_patient(self):
'''
@@ -1045,11 +1121,11 @@ class OpenmolarGui(QtGui.QMainWindow):
desiredPos = localsettings.recent_sno_index
else:
desiredPos = localsettings.recent_sno_index - 1
- if len(localsettings.recent_snos) > desiredPos >= 0:
+ try:
self.getrecord(localsettings.recent_snos[desiredPos],
addToRecentSnos=False)
- else:
- self.advise(_("Reached Start of the List"))
+ except IndexError:
+ self.advise(_("Reached Start Record History"))
def apply_editpage_changes(self):
'''
@@ -1092,7 +1168,8 @@ class OpenmolarGui(QtGui.QMainWindow):
sno = self.ui.accounts_tableWidget.item(row, 1).text()
self.getrecord(int(sno))
- def getrecord(self, serialno,
+ def getrecord(self,
+ serialno,
checkedNeedToLeaveAlready=False,
addToRecentSnos=True,
newPatientReload=False
@@ -1105,47 +1182,51 @@ class OpenmolarGui(QtGui.QMainWindow):
if serialno in (0, None):
self.update_family_label()
return
+ LOGGER.info("loading record %s", serialno)
+ if self.pt and serialno == self.pt.serialno and not newPatientReload:
+ self.ui.main_tabWidget.setCurrentIndex(0)
+ self.advise(_("Patient already loaded"))
+ return
+ elif not checkedNeedToLeaveAlready and not self.okToLeaveRecord():
+ print "not loading"
+ self.advise(_("Not loading patient"))
+ return
- if addToRecentSnos:
+ try:
+ self.pt = patient_class.patient(serialno)
+ self.pt_diary_widget.set_patient(self.pt)
+
+ try:
+ 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)
+
+ except localsettings.PatientNotFoundError:
+ print "NOT FOUND ERROR"
+ 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 %s",
+ serialno)
+ self.advise("Unknown Error - Tell Neil<br />%s" % exc, 2)
+
+ if addToRecentSnos: # add to end of list
try:
localsettings.recent_snos.remove(serialno)
except ValueError:
pass
localsettings.recent_snos.append(serialno)
+ can_go_forwards = False
+ else:
+ can_go_forwards = serialno != localsettings.recent_snos[-1]
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"))
- elif not checkedNeedToLeaveAlready and not self.okToLeaveRecord():
- print "not loading"
- self.advise(_("Not loading patient"))
- else:
- try:
- self.pt = patient_class.patient(serialno)
- self.pt_diary_widget.set_patient(self.pt)
-
- try:
- 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)
-
- except localsettings.PatientNotFoundError:
- print "NOT FOUND ERROR"
- 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)
+ self.ui.nextButton.setEnabled(can_go_forwards)
def reload_patient(self):
'''
@@ -1201,6 +1282,13 @@ class OpenmolarGui(QtGui.QMainWindow):
self.load_receptionSummaryPage()
self.ui.actionFix_Locked_New_Course_of_Treatment.setEnabled(False)
#--populate dnt1 and dnt2 comboboxes
+ if not self.pt.dnt1:
+ if len(localsettings.activedents) == 1:
+ self.pt.dnt1 = localsettings.activedent_ixs[0]
+ self.advise("%s %s %s" % (_("Setting"),
+ localsettings.activedents[0],
+ _("as patient's dentist"))
+ )
self.load_dentComboBoxes(newPatientReload)
self.pt.checkExemption()
self.updateDetails()
@@ -1209,9 +1297,11 @@ 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):
+ for chart in (self.ui.staticChartWidget,
+ self.ui.planChartWidget,
+ self.ui.completedChartWidget,
+ self.ui.summaryChartWidget
+ ):
chart.clear()
#--necessary to restore the chart to full dentition
self.selectedChartWidget = "st"
@@ -1221,7 +1311,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.toothPropsWidget.setTooth("ur8", "st")
charts_gui.chartsTable(self)
- charts_gui.bpe_dates(self)
+ charts_gui.bpe_table(self, 0)
try:
pos = localsettings.CSETYPES.index(self.pt.cset)
@@ -1243,6 +1333,7 @@ class OpenmolarGui(QtGui.QMainWindow):
if self.ui.tabWidget.currentIndex() == 4: # clinical summary
self.ui.summaryChartWidget.update()
self.ui.debugBrowser.setText("")
+ self.debug_browser_refresh_func = None
self.update_family_label()
self.medalert()
@@ -1274,7 +1365,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):
@@ -1375,19 +1466,19 @@ class OpenmolarGui(QtGui.QMainWindow):
def find_patient(self):
if self.enteringNewPatient():
- return
- if not self.okToLeaveRecord():
- print "not loading"
+ pass
+ elif not self.okToLeaveRecord():
self.advise(_("Not loading patient"))
- return
-
- dl = FindPatientDialog(self)
- if dl.exec_():
- if dl.chosen_sno:
+ else:
+ dl = FindPatientDialog(self)
+ if dl.exec_() and dl.chosen_sno:
self.getrecord(dl.chosen_sno, True)
- def set_surgery_mode(self, surgery):
- localsettings.station = "surgery" if surgery else "reception"
+ def set_surgery_mode(self, is_surgery=None):
+ if is_surgery is None:
+ is_surgery = localsettings.station == "surgery"
+ localsettings.station = "surgery" if is_surgery else "reception"
+ self.ui.actionSurgery_Mode.setChecked(is_surgery)
self.set_operator_label()
self.gotoDefaultTab()
@@ -1396,8 +1487,7 @@ class OpenmolarGui(QtGui.QMainWindow):
if localsettings.station == "surgery":
op_text = " <b>" + _("NO CLINICIAN SET") + "</b> - "
self.advise(
- _("you are in surgery mode without a clinician"),
- 1)
+ _("You are in surgery mode without a clinician"))
else:
op_text = ""
else:
@@ -1427,9 +1517,7 @@ class OpenmolarGui(QtGui.QMainWindow):
else:
self.ui.tabWidget.setCurrentIndex(3)
- self.ui.reception_textBrowser.setHtml(localsettings.message)
self.ui.recNotes_webView.setHtml("")
- self.ui.notesSummary_webView.setHtml(localsettings.message)
today = QtCore.QDate().currentDate()
self.ui.daybookEndDateEdit.setDate(today)
@@ -1447,12 +1535,12 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.pcdeEdit, self.ui.sexEdit):
widg.setPalette(palette)
- self.ui.forumViewFilter_comboBox.addItems(
- localsettings.allowed_logins)
-
self.forum_mode()
self.addHistoryMenu()
+ self.ui.perio_scrollArea.setWidget(
+ QtGui.QLabel("perio interface is being rewritten"))
+
def addHistoryMenu(self):
'''
add items to a toolbutton for trawling the database
@@ -1626,8 +1714,9 @@ class OpenmolarGui(QtGui.QMainWindow):
dl = MedNotesDialog(self.pt, self)
if dl.exec_():
dl.apply()
- self.advise("Updated Medical Notes", 1)
+ self.advise("Updated Medical Notes")
self.medalert()
+ self.updateHiddenNotesLabel()
def newBPE_Dialog(self):
'''
@@ -1644,10 +1733,8 @@ class OpenmolarGui(QtGui.QMainWindow):
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:
self.advise("BPE not applied", 2)
- charts_gui.bpe_dates(self)
charts_gui.bpe_table(self, 0)
def nhsformOptionsDialog(self):
@@ -1663,9 +1750,12 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
if self.pt.serialno != self.pt.dbstate.serialno:
# this should NEVER happen!!!
- self.advise(
- _('''POTENTIALLY SERIOUS CONFUSION PROBLEM WITH PT RECORDS''') +
- ' %d and %d' % (self.pt.serialno, self.pt.dbstate.serialno), 2)
+ message = "%s %s %s %s" % (
+ _('POTENTIALLY SERIOUS CONFUSION PROBLEM WITH PT RECORDS'),
+ self.pt.serialno,
+ _("AND"),
+ self.pt.dbstate.serialno)
+ self.advise(message, 2)
return []
changes = self.pt.changes
@@ -1696,14 +1786,16 @@ class OpenmolarGui(QtGui.QMainWindow):
self.apply_editpage_changes()
uc = self.unsavedChanges()
if uc != []:
- print "changes made to patient atttributes..... updating database"
+ LOGGER.info(
+ "changes made to patient atttributes..... updating database")
result = patient_write_changes.all_changes(self.pt, uc)
- daybook_module.updateDaybook(self)
- if self.pt.est_logger is not None:
- self.pt.est_logger.add_row(
- self.pt.courseno0, self.pt.est_logger_text)
- if result: # True if sucessful
+ if result: # True if successful
+ daybook_module.updateDaybook(self)
+ if self.pt.est_logger is not None:
+ self.pt.est_logger.add_row(
+ self.pt.courseno0, self.pt.est_logger_text)
+
if not leavingRecord and "estimates" in uc:
#-- necessary to get index numbers for estimate data types
self.pt.getEsts()
@@ -1727,9 +1819,9 @@ class OpenmolarGui(QtGui.QMainWindow):
result = patient_write_changes.toNotes(
self.pt.serialno, notetuplets)
- #--sucessful write to db?
+ #--successful write to db?
if result:
- #--result will be a "line number" or -1 if unsucessful write
+ #--result will be a "line number" or -1 if unsuccessful write
self.ui.notesEnter_textEdit.setText("")
self.ui.hiddenNotes_label.setText("")
self.pt.getNotesTuple()
@@ -1760,27 +1852,38 @@ class OpenmolarGui(QtGui.QMainWindow):
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.reloadButton,
):
-
widg.setEnabled(arg)
+ enable_tx_buts = arg and localsettings.clinicianNo != 0
+ for widg in (
+ self.ui.exampushButton,
+ self.ui.xray_pushButton,
+ self.ui.newBPE_pushButton,
+ self.ui.hygWizard_pushButton,
+ self.ui.childsmile_button,
+ self.ui.completedChartWidget
+ ):
+ widg.setEnabled(enable_tx_buts)
+
self.ui.closeCourse_pushButton.setEnabled(False)
self.ui.actionFix_Locked_New_Course_of_Treatment.setEnabled(False)
+ if not arg:
+ self.ui.backButton.setEnabled(len(localsettings.recent_snos))
+ self.ui.nextButton.setEnabled(False)
+
+ self.ui.relatedpts_pushButton.setEnabled(
+ bool(self.pt.serialno or self.pt.familyno))
for i in (0, 1, 2, 5, 6, 7, 8, 9):
if self.ui.tabWidget.isTabEnabled(i) != arg:
@@ -1820,15 +1923,23 @@ class OpenmolarGui(QtGui.QMainWindow):
self.advise(_("no record selected"), 1)
else:
if permissions.granted(self):
- dl = recordtools.recordTools(self)
- dl.exec_()
+ dl = AdvancedRecordManagementDialog(self.pt, self)
+ if dl.exec_():
+ LOGGER.warning(
+ "Applying changes from AdvancedRecordManagementDialog")
+ dl.apply()
+ self.updateDetails()
+ self.updateHiddenNotesLabel()
def apptBook_fontSize(self):
'''
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)
+ i, result = QtGui.QInputDialog.getInteger(
+ self,
+ _("FontSize"),
+ _("Enter your preferred font size for appointment book"),
+ 8, 6, 16)
if result:
self.diary_widget.aptFontSize(i)
@@ -1889,9 +2000,7 @@ class OpenmolarGui(QtGui.QMainWindow):
fees_module.expandFees(self)
def plan_page_course_but_clicked(self):
- if self.pt.underTreatment: # shouldn't happen
- return
- course_module.setupNewCourse(self)
+ course_module.newCourseNeeded(self)
def closeTx_pushButton_clicked(self):
'''
@@ -1899,13 +2008,15 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
if self.pt.underTreatment:
course_module.closeCourse(self)
- # static items may have changed
- charts_gui.chartsTable(self)
- self.load_clinicalSummaryPage()
- self.ui.summaryChartWidget.update()
-
else:
course_module.resumeCourse(self)
+ # static items may have changed
+ self.refresh_charts()
+
+ def refresh_charts(self):
+ charts_gui.chartsTable(self)
+ self.load_clinicalSummaryPage()
+ self.ui.summaryChartWidget.update()
def showExamDialog(self):
'''
@@ -1941,6 +2052,8 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
add Xray items to COMPLETED tx
'''
+ if course_module.newCourseNeeded(self):
+ return
manipulate_plan.xrayAdd(self, complete=True)
def addPerioItems(self):
@@ -1980,7 +2093,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
@@ -2008,19 +2121,18 @@ class OpenmolarGui(QtGui.QMainWindow):
continue
n_txs = existing_cmp_items.count(tx)
courseno = self.pt.treatment_course.courseno
- if (completed and tx in existing_pl_items):
+ if completed and tx in existing_pl_items:
hash_ = localsettings.hash_func(
"%s%s%s%s" % (courseno, tooth, n_txs + 1, tx))
tx_hash = estimates.TXHash(hash_)
+ self.advise(
+ _("Moving existing treatment from plan to completed."))
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))
- tx_hash = estimates.TXHash(hash_)
- manipulate_plan.tx_hash_reverse(self, tx_hash)
else:
- manipulate_plan.add_treatments_to_plan(self,
- ((tooth, tx),), completed)
+ manipulate_plan.add_treatments_to_plan(
+ self,
+ ((tooth, tx),),
+ completed)
if removals:
manipulate_plan.remove_treatments_from_plan_and_est(
@@ -2206,60 +2318,65 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
show all past payments for a patient
'''
- html = paymentHistory.details(self.pt.serialno)
- self.ui.debugBrowser.setText(html)
+ self.debug_browser_refresh_func = partial(
+ paymentHistory.details, self.pt.serialno)
+ self.refresh_debug_browser()
def pastTreatment_clicked(self):
'''
show all past estimates for a patient
'''
- html = daybookHistory.details(self.pt.serialno)
- self.ui.debugBrowser.setText(html)
+ self.debug_browser_refresh_func = partial(
+ daybookHistory.details, self.pt.serialno)
+ self.refresh_debug_browser()
def pastCourses_clicked(self):
'''
show all past treatment plans for a patient
(including treatment that was never carried out)
'''
- html = courseHistory.details(self.pt.serialno)
- self.ui.debugBrowser.setText(html)
+ dl = CourseHistoryOptionsDialog(self)
+ if dl.exec_():
+ self.debug_browser_refresh_func = partial(
+ courseHistory.details,
+ self.pt.serialno,
+ self.pt.courseno0 if self.pt.underTreatment else None,
+ dl.include_estimates,
+ dl.include_daybook
+ )
+ self.refresh_debug_browser()
def pastEstimates_clicked(self):
'''
show all past estimates for a patient
'''
- html = estimatesHistory.details(self.pt.serialno)
- self.ui.debugBrowser.setText(html)
-
- def past_course_estimates_clicked(self):
- '''
- show all past treatment plans for a patient
- (including treatment that was never carried out)
- and include the estimate for that course
- '''
- html = courseHistory.all_details(self.pt.serialno)
- self.ui.debugBrowser.setText(html)
+ self.debug_browser_refresh_func = partial(
+ estimatesHistory.details, self.pt.serialno)
+ self.refresh_debug_browser()
def NHSClaims_clicked(self):
'''
show all past NHS claims for a patient
'''
- html = nhs_claims.details(self.pt.serialno)
- self.ui.debugBrowser.setText(html)
+ self.debug_browser_refresh_func = partial(
+ nhs_claims.details, self.pt.serialno)
+ self.refresh_debug_browser()
def show_memo_history(self):
'''
show all memos for a patient
'''
- html = memos.html_history(self.pt.serialno)
- self.ui.debugBrowser.setText(html)
+ self.debug_browser_refresh_func = partial(
+ memos.html_history, self.pt.serialno)
+ self.refresh_debug_browser()
def show_estimate_versioning(self):
'''
show how the current estimate has changed
'''
- html = est_logger.html_history(self.pt.courseno0)
- self.ui.debugBrowser.setText(html)
+ self.debug_browser_refresh_func = partial(
+ est_logger.html_history, self.pt.serialno)
+ self.refresh_debug_browser()
def nhsClaimsShortcut(self):
'''
@@ -2287,8 +2404,9 @@ class OpenmolarGui(QtGui.QMainWindow):
txtype = None
changesOnly = self.ui.ptAtts_checkBox.isChecked()
- html = debug_html.toHtml(self.pt, txtype, changesOnly)
- self.ui.debugBrowser.setText(html)
+ self.debug_browser_refresh_func = partial(
+ debug_html.toHtml, self.pt, txtype, changesOnly)
+ self.refresh_debug_browser()
def cashbookView(self):
'''
@@ -2418,10 +2536,9 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
normal notes print
'''
- self.advise(
- _(
- "use the checkboxes on the notes tab to control what is printed."),
- 1)
+ message = _("use the checkboxes on the notes tab "
+ "to control what is printed.")
+ self.advise(message, 1)
om_printing.printNotes(self)
def printMH(self):
@@ -2440,7 +2557,7 @@ class OpenmolarGui(QtGui.QMainWindow):
def notes_link_clicked(self, url):
url_text = url.toString()
- m = re.match("edit_notes\?(\d+|\|\|SNO\|\|)", url_text)
+ m = re.match(r"edit_notes\?(\d+|\|\|SNO\|\|)", url_text)
if m:
if m.groups()[0] == "||SNO||":
serialno = self.pt.serialno
@@ -2492,7 +2609,6 @@ class OpenmolarGui(QtGui.QMainWindow):
self.signals_charts()
self.signals_editPatient()
self.signals_notesPage()
- self.signals_periochart()
self.signals_tabs()
self.signals_appointments()
self.signals_forum()
@@ -2505,99 +2621,59 @@ class OpenmolarGui(QtGui.QMainWindow):
connect the signals from various buttons which do not
belong to any other function
'''
- QtCore.QObject.connect(self.ui.closeCourse_pushButton,
- QtCore.SIGNAL("clicked()"), self.closeTx_pushButton_clicked)
-
- QtCore.QObject.connect(self.ui.saveButton,
- QtCore.SIGNAL("clicked()"), self.saveButtonClicked)
-
- QtCore.QObject.connect(self.ui.exampushButton,
- QtCore.SIGNAL("clicked()"), self.showExamDialog)
-
- QtCore.QObject.connect(self.ui.hygWizard_pushButton,
- QtCore.SIGNAL("clicked()"), self.showHygDialog)
-
- QtCore.QObject.connect(self.ui.xray_pushButton,
- QtCore.SIGNAL("clicked()"), self.addXrays)
-
- QtCore.QObject.connect(self.ui.newBPE_pushButton,
- QtCore.SIGNAL("clicked()"), self.newBPE_Dialog)
-
- QtCore.QObject.connect(self.ui.medNotes_pushButton,
- QtCore.SIGNAL("clicked()"), self.showMedNotes)
-
+ self.ui.closeCourse_pushButton.clicked.connect(
+ self.closeTx_pushButton_clicked)
+ self.ui.saveButton.clicked.connect(self.saveButtonClicked)
+ self.ui.exampushButton.clicked.connect(self.showExamDialog)
+ self.ui.hygWizard_pushButton.clicked.connect(self.showHygDialog)
+ self.ui.xray_pushButton.clicked.connect(self.addXrays)
+ self.ui.newBPE_pushButton.clicked.connect(self.newBPE_Dialog)
+ self.ui.medNotes_pushButton.clicked.connect(self.showMedNotes)
self.ui.phraseBook_pushButton.clicked.connect(
self.show_phrase_book_dialog)
self.ui.clinician_phrasebook_pushButton.clicked.connect(
self.show_clinician_phrase_book_dialog)
-
- QtCore.QObject.connect(self.ui.memos_pushButton,
- QtCore.SIGNAL("clicked()"), self.newCustomMemo)
-
- QtCore.QObject.connect(self.ui.childsmile_button,
- QtCore.SIGNAL("clicked()"), self.childsmile_button_clicked)
-
+ self.ui.memos_pushButton.clicked.connect(self.newCustomMemo)
+ self.ui.childsmile_button.clicked.connect(
+ 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
- QtCore.QObject.connect(self.ui.home_pushButton,
- QtCore.SIGNAL("clicked()"), self.home)
-
- QtCore.QObject.connect(self.ui.newPatientPushButton,
- QtCore.SIGNAL("clicked()"), self.enterNewPatient)
-
- QtCore.QObject.connect(self.ui.findButton,
- QtCore.SIGNAL("clicked()"), self.find_patient)
-
- QtCore.QObject.connect(self.ui.reloadButton,
- QtCore.SIGNAL("clicked()"), self.reload_patient)
-
- QtCore.QObject.connect(self.ui.backButton,
- QtCore.SIGNAL("clicked()"), self.last_patient)
-
- QtCore.QObject.connect(self.ui.nextButton,
- QtCore.SIGNAL("clicked()"), self.next_patient)
-
- QtCore.QObject.connect(self.ui.relatedpts_pushButton,
- QtCore.SIGNAL("clicked()"), self.find_related)
-
- QtCore.QObject.connect(self.ui.dayList_comboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"), self.todays_pts)
+ self.ui.home_pushButton.clicked.connect(self.home)
+ self.ui.newPatientPushButton.clicked.connect(self.enterNewPatient)
+ self.ui.findButton.clicked.connect(self.find_patient)
+ self.ui.reloadButton.clicked.connect(self.reload_patient)
+ self.ui.backButton.clicked.connect(self.last_patient)
+ self.ui.nextButton.clicked.connect(self.next_patient)
+ self.ui.relatedpts_pushButton.clicked.connect(self.find_related)
+ self.ui.dayList_comboBox.currentIndexChanged.connect(self.todays_pts)
def signals_reception(self):
'''
a function to connect all the receptionists buttons
'''
-
- QtCore.QObject.connect(self.ui.printAccount_pushButton,
- QtCore.SIGNAL("clicked()"), self.printaccount)
-
- QtCore.QObject.connect(self.ui.printEst_pushButton,
- QtCore.SIGNAL("clicked()"), self.printEstimate)
-
- QtCore.QObject.connect(self.ui.printRecall_pushButton,
- QtCore.SIGNAL("clicked()"), self.printrecall)
-
- QtCore.QObject.connect(self.ui.takePayment_pushButton,
- QtCore.SIGNAL("clicked()"), self.takePayment_pushButton_clicked)
-
- QtCore.QObject.connect(self.ui.printGP17_pushButton,
- QtCore.SIGNAL("clicked()"), self.printGP17_clicked)
+ self.ui.printAccount_pushButton.clicked.connect(self.printaccount)
+ self.ui.printEst_pushButton.clicked.connect(self.printEstimate)
+ self.ui.printRecall_pushButton.clicked.connect(self.printrecall)
+ self.ui.takePayment_pushButton.clicked.connect(
+ self.takePayment_pushButton_clicked)
+ self.ui.printGP17_pushButton.clicked.connect(self.printGP17_clicked)
def signals_notes(self):
'''
all the notes browsers need to send a signal when they have loaded
so that they can be scrolled to the end
'''
- for wv in (self.ui.recNotes_webView, self.ui.notes_webView,
+ for wv in (self.ui.recNotes_webView,
+ self.ui.notes_webView,
self.ui.notesSummary_webView):
- QtCore.QObject.connect(wv,
- QtCore.SIGNAL("loadFinished(bool)"), self.webviewloaded)
+ wv.loadFinished.connect(self.webviewloaded)
- for wv in (self.ui.notes_webView, self.ui.notesSummary_webView,
+ for wv in (self.ui.notes_webView,
+ self.ui.notesSummary_webView,
self.diary_widget.ui.appt_notes_webView):
wv.linkClicked.connect(self.notes_link_clicked)
@@ -2605,46 +2681,23 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
connect buttons which print stuff
'''
- QtCore.QObject.connect(self.ui.receiptPrintButton,
- QtCore.SIGNAL("clicked()"), self.printDupReceipt)
-
- QtCore.QObject.connect(self.ui.notesPrintButton,
- QtCore.SIGNAL("clicked()"), self.printNotes)
-
- QtCore.QObject.connect(self.ui.referralLettersPrintButton,
- QtCore.SIGNAL("clicked()"), self.printReferral)
-
- QtCore.QObject.connect(self.ui.standardLetterPushButton,
- QtCore.SIGNAL("clicked()"), self.printLetter)
-
- QtCore.QObject.connect(self.ui.recallLoad_pushButton,
- QtCore.SIGNAL("clicked()"), self.exportRecalls)
-
- QtCore.QObject.connect(self.ui.bulkMail_options_pushButton,
- QtCore.SIGNAL("clicked()"), self.bulkMailLetterOptions)
-
- QtCore.QObject.connect(self.ui.bulkMailPrint_pushButton,
- QtCore.SIGNAL("clicked()"), self.bulkMailPrint)
-
- QtCore.QObject.connect(self.ui.bulk_mail_expand_pushButton,
- QtCore.SIGNAL("clicked()"), self.bulkMailExpand)
-
- QtCore.QObject.connect(self.ui.importDoc_pushButton,
- QtCore.SIGNAL("clicked()"), self.importDoc)
-
- QtCore.QObject.connect(self.ui.account2_pushButton,
- QtCore.SIGNAL("clicked()"), self.accountButton2Clicked)
-
- QtCore.QObject.connect(self.ui.prevCorres_treeWidget,
- QtCore.SIGNAL(
- "itemDoubleClicked (QTreeWidgetItem *,int)"),
- self.showPrevPrintedDoc)
-
- QtCore.QObject.connect(self.ui.importDoc_treeWidget,
- QtCore.SIGNAL(
- "itemDoubleClicked (QTreeWidgetItem *,int)"),
- self.showImportedDoc)
-
+ self.ui.receiptPrintButton.clicked.connect(self.printDupReceipt)
+ self.ui.notesPrintButton.clicked.connect(self.printNotes)
+ self.ui.referralLettersPrintButton.clicked.connect(
+ self.printReferral)
+ self.ui.standardLetterPushButton.clicked.connect(self.printLetter)
+ self.ui.recallLoad_pushButton.clicked.connect(self.exportRecalls)
+ self.ui.bulkMail_options_pushButton.clicked.connect(
+ self.bulkMailLetterOptions)
+ self.ui.bulkMailPrint_pushButton.clicked.connect(self.bulkMailPrint)
+ self.ui.bulk_mail_expand_pushButton.clicked.connect(
+ self.bulkMailExpand)
+ self.ui.importDoc_pushButton.clicked.connect(self.importDoc)
+ self.ui.account2_pushButton.clicked.connect(self.accountButton2Clicked)
+ self.ui.prevCorres_treeWidget.itemDoubleClicked.connect(
+ self.showPrevPrintedDoc)
+ self.ui.importDoc_treeWidget.itemDoubleClicked.connect(
+ self.showImportedDoc)
self.ui.medicalPrintButton.clicked.connect(self.printMH)
def signals_menu(self):
@@ -2664,153 +2717,124 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.actionTable_View_For_Charting.toggled.connect(
self.showChartTable)
self.ui.actionClear_Today_s_Emergency_Slots.triggered.connect(
- self.diary_widget.clearTodaysEmergencyTime)
+ self.clear_todays_emergencies)
+ self.ui.actionInsert_Regular_Blocks.triggered.connect(
+ self.insert_regular_blocks)
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.action_all_history_edits.triggered.connect(
+ self.allow_all_history_edits)
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.actionAllow_Edit.triggered.connect(self.allow_edit_daybook)
+ self.ui.actionAllow_Edit_Treatment.triggered.connect(
+ self.allow_edit_daybook)
self.ui.actionEnable_Filters.triggered.connect(
self.enable_daybook_filters)
+ self.ui.actionEdit_Courses.triggered.connect(self.edit_currtrtmt2)
+ self.ui.actionEdit_Estimates.triggered.connect(self.edit_estimates)
+ self.ui.actionEdit_Referral_Centres.triggered.connect(
+ self.edit_referral_centres)
+ self.ui.actionReset_Supervisor_Password.triggered.connect(
+ self.reset_supervisor)
+ self.ui.actionAdd_User.triggered.connect(self.add_user)
+ self.ui.actionAdd_Clinician.triggered.connect(self.add_clinician)
+ self.ui.actionEdit_Practice_Details.triggered.connect(
+ self.edit_practice)
def signals_estimates(self):
- # Estimates and course ManageMent
- QtCore.QObject.connect(self.ui.closeTx_pushButton,
- QtCore.SIGNAL("clicked()"), self.closeTx_pushButton_clicked)
-
- QtCore.QObject.connect(self.ui.estLetter_pushButton,
- QtCore.SIGNAL("clicked()"), self.customEstimate)
-
- QtCore.QObject.connect(self.ui.recalcEst_pushButton,
- QtCore.SIGNAL("clicked()"), self.recalculateEstimate)
-
- QtCore.QObject.connect(self.ui.apply_exemption_pushButton,
- QtCore.SIGNAL("clicked()"), self.apply_exemption)
-
- QtCore.QObject.connect(self.ui.rec_apply_exemption_pushButton,
- QtCore.SIGNAL("clicked()"), self.apply_exemption)
-
+ # Estimates and Course Management
+ self.ui.closeTx_pushButton.clicked.connect(
+ self.closeTx_pushButton_clicked)
+ self.ui.estLetter_pushButton.clicked.connect(
+ self.customEstimate)
+ self.ui.recalcEst_pushButton.clicked.connect(
+ self.recalculateEstimate)
+ self.ui.apply_exemption_pushButton.clicked.connect(
+ self.apply_exemption)
+ self.ui.rec_apply_exemption_pushButton.clicked.connect(
+ self.apply_exemption)
self.ui.xrayTxpushButton.clicked.connect(self.addXrayItems)
self.ui.perioTxpushButton.clicked.connect(self.addPerioItems)
self.ui.dentureTxpushButton.clicked.connect(self.add_denture_items)
self.ui.otherTxpushButton.clicked.connect(self.addOtherItems)
self.ui.customTx_pushButton.clicked.connect(self.addCustomItem)
-
self.ui.estWidget.updated_fees_signal.connect(self.updateDetails)
-
- QtCore.QObject.connect(self.ui.estWidget,
- QtCore.SIGNAL("deleteItem"), self.estwidget_deleteTxItem)
+ self.ui.estWidget.delete_estimate_item.connect(
+ self.estwidget_deleteTxItem)
def signals_plan(self):
self.ui.advanced_tx_planning_button.clicked.connect(
self.advanced_tx_planning)
-
self.ui.plan_listView.customContextMenuRequested.connect(
self.show_plan_listview_context_menu)
self.ui.plan_listView.doubleClicked.connect(
self.handle_plan_listview_2xclick)
-
self.ui.completed_listView.customContextMenuRequested.connect(
self.show_cmp_listview_context_menu)
self.ui.completed_listView.doubleClicked.connect(
self.handle_completed_listview_2xclick)
-
self.ui.planChartWidget.request_tx_context_menu_signal.connect(
self.show_plan_chart_context_menu)
self.ui.completedChartWidget.request_tx_context_menu_signal.connect(
self.show_cmp_chart_context_menu)
-
self.ui.plan_course_manage_button.clicked.connect(
self.plan_page_course_but_clicked)
def signals_bulk_mail(self):
- QtCore.QObject.connect(self.ui.bulk_mailings_treeView,
- QtCore.SIGNAL(
- "doubleClicked (const QModelIndex&)"),
- self.bulk_mail_doubleclicked)
+ self.ui.bulk_mailings_treeView.doubleClicked.connect(
+ self.bulk_mail_doubleclicked)
def signals_forum(self):
- QtCore.QObject.connect(self.ui.forum_treeWidget,
- QtCore.SIGNAL("itemSelectionChanged ()"),
- self.forum_treeWidget_selectionChanged)
-
+ self.ui.forum_treeWidget.itemSelectionChanged.connect(
+ self.forum_treeWidget_selectionChanged)
self.ui.action_forum_show_advanced_options.triggered.connect(
self.forum_mode)
-
- QtCore.QObject.connect(self.ui.forumDelete_pushButton,
- QtCore.SIGNAL("clicked()"), self.forumDeleteItem_clicked)
-
- QtCore.QObject.connect(self.ui.forumReply_pushButton,
- QtCore.SIGNAL("clicked()"), self.forumReply_clicked)
-
- QtCore.QObject.connect(self.ui.forumNewTopic_pushButton,
- QtCore.SIGNAL("clicked()"), self.forumNewTopic_clicked)
-
- QtCore.QObject.connect(self.ui.forumParent_pushButton,
- QtCore.SIGNAL("clicked()"), self.forumParent_clicked)
-
- QtCore.QObject.connect(self.ui.forumViewFilter_comboBox,
- QtCore.SIGNAL(
- "currentIndexChanged (const QString&)"),
- self.forumViewFilterChanged)
-
- QtCore.QObject.connect(self.ui.forumCollapse_pushButton,
- QtCore.SIGNAL("clicked()"), self.forumCollapse)
-
- QtCore.QObject.connect(self.ui.forumExpand_pushButton,
- QtCore.SIGNAL("clicked()"), self.forumExpand)
+ self.ui.forumDelete_pushButton.clicked.connect(
+ self.forumDeleteItem_clicked)
+ self.ui.forumReply_pushButton.clicked.connect(
+ self.forumReply_clicked)
+ self.ui.forumNewTopic_pushButton.clicked.connect(
+ self.forumNewTopic_clicked)
+ self.ui.forumParent_pushButton.clicked.connect(
+ self.forumParent_clicked)
+ self.ui.forumViewFilter_comboBox.currentIndexChanged[
+ QtCore.QString].connect(self.forumViewFilterChanged)
+ self.ui.forumCollapse_pushButton.clicked.connect(self.forumCollapse)
+ self.ui.forumExpand_pushButton.clicked.connect(self.forumExpand)
for widg in (self.ui.group_replies_radioButton,
self.ui.forum_deletedposts_checkBox):
- QtCore.QObject.connect(widg,
- QtCore.SIGNAL("toggled (bool)"), self.forum_radioButtons)
+ widg.toggled.connect(self.forum_radioButtons)
def signals_history(self):
- QtCore.QObject.connect(self.debugMenu,
- QtCore.SIGNAL("triggered (QAction *)"), self.showPtAttributes)
-
- QtCore.QObject.connect(self.ui.ptAtts_checkBox,
- QtCore.SIGNAL("stateChanged (int)"), self.updateAttributes)
-
- QtCore.QObject.connect(self.ui.historyPrint_pushButton,
- QtCore.SIGNAL("clicked()"), self.historyPrint)
-
- QtCore.QObject.connect(self.ui.pastPayments_pushButton,
- QtCore.SIGNAL("clicked()"), self.pastPayments_clicked)
-
- QtCore.QObject.connect(self.ui.pastTreatment_pushButton,
- QtCore.SIGNAL("clicked()"), self.pastTreatment_clicked)
-
- QtCore.QObject.connect(self.ui.pastCourses_pushButton,
- QtCore.SIGNAL("clicked()"), self.pastCourses_clicked)
-
- QtCore.QObject.connect(self.ui.pastEstimates_pushButton,
- QtCore.SIGNAL("clicked()"), self.pastEstimates_clicked)
-
- QtCore.QObject.connect(self.ui.past_course_estimates_pushButton,
- QtCore.SIGNAL("clicked()"), self.past_course_estimates_clicked)
-
- QtCore.QObject.connect(self.ui.NHSClaims_pushButton,
- QtCore.SIGNAL("clicked()"), self.NHSClaims_clicked)
-
+ self.debugMenu.triggered.connect(self.showPtAttributes)
+ self.ui.ptAtts_checkBox.stateChanged.connect(self.updateAttributes)
+ self.ui.historyPrint_pushButton.clicked.connect(self.historyPrint)
+ self.ui.pastPayments_pushButton.clicked.connect(
+ self.pastPayments_clicked)
+ self.ui.pastTreatment_pushButton.clicked.connect(
+ self.pastTreatment_clicked)
+ self.ui.pastCourses_pushButton.clicked.connect(
+ self.pastCourses_clicked)
+ self.ui.pastEstimates_pushButton.clicked.connect(
+ self.pastEstimates_clicked)
+ self.ui.NHSClaims_pushButton.clicked.connect(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
-
self.ui.daybookGoPushButton.clicked.connect(self.daybookView)
self.ui.daybookPrintButton.clicked.connect(self.daybookPrint)
self.ui.daybook_filters_pushButton.clicked.connect(
@@ -2824,104 +2848,69 @@ class OpenmolarGui(QtGui.QMainWindow):
def signals_accounts(self):
# accounts
- QtCore.QObject.connect(self.ui.loadAccountsTable_pushButton,
- QtCore.SIGNAL("clicked()"), self.loadAccountsTable_clicked)
-
- QtCore.QObject.connect(self.ui.printSelectedAccounts_pushButton,
- QtCore.SIGNAL("clicked()"), self.printSelectedAccounts)
-
- QtCore.QObject.connect(self.ui.printAccountsTable_pushButton,
- QtCore.SIGNAL("clicked()"), self.printAccountsTable)
-
- QtCore.QObject.connect(self.ui.accounts_tableWidget,
- QtCore.SIGNAL("cellDoubleClicked (int,int)"),
- self.accountsTableClicked)
+ self.ui.loadAccountsTable_pushButton.clicked.connect(
+ self.loadAccountsTable_clicked)
+ self.ui.printSelectedAccounts_pushButton.clicked.connect(
+ self.printSelectedAccounts)
+ self.ui.printAccountsTable_pushButton.clicked.connect(
+ self.printAccountsTable)
+ self.ui.accounts_tableWidget.cellDoubleClicked.connect(
+ self.accountsTableClicked)
def signals_contract(self):
# 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.QObject.connect(self.ui.contract_tabWidget,
- QtCore.SIGNAL("currentChanged(int)"), self.contractTab_navigated)
-
- QtCore.QObject.connect(self.ui.dnt1comboBox, QtCore.
- SIGNAL("activated(const QString&)"), self.dnt1comboBox_clicked)
-
- QtCore.QObject.connect(self.ui.dnt2comboBox, QtCore.
- SIGNAL("activated(const QString&)"), self.dnt2comboBox_clicked)
-
- QtCore.QObject.connect(self.ui.cseType_comboBox,
- QtCore.SIGNAL("activated(const QString&)"),
- self.cseType_comboBox_clicked)
-
- QtCore.QObject.connect(self.ui.editNHS_pushButton,
- 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(self.ui.editPriv_pushButton,
- QtCore.SIGNAL("clicked()"), self.editPriv_pushButton_clicked)
-
- QtCore.QObject.connect(self.ui.nhsclaims_pushButton,
- QtCore.SIGNAL("clicked()"), self.nhsclaims_pushButton_clicked)
-
- QtCore.QObject.connect(self.ui.editHDP_pushButton,
- QtCore.SIGNAL("clicked()"), self.editHDP_pushButton_clicked)
-
- QtCore.QObject.connect(self.ui.editRegDent_pushButton,
- QtCore.SIGNAL("clicked()"), self.editRegDent_pushButton_clicked)
+ self.ui.badDebt_pushButton.clicked.connect(self.makeBadDebt_clicked)
+ self.ui.contract_tabWidget.currentChanged.connect(
+ self.contractTab_navigated)
+ self.ui.dnt1comboBox.activated[QtCore.QString].connect(
+ self.dnt1comboBox_clicked)
+ self.ui.dnt2comboBox.activated[QtCore.QString].connect(
+ self.dnt2comboBox_clicked)
+ self.ui.cseType_comboBox.activated[QtCore.QString].connect(
+ self.cseType_comboBox_clicked)
+ self.ui.editNHS_pushButton.clicked.connect(
+ self.editNHS_pushButton_clicked)
+ self.ui.exemption_lineEdit.editingFinished.connect(
+ self.exemption_edited)
+ self.ui.exempttext_lineEdit.editingFinished.connect(
+ self.exemption_edited)
+ self.ui.editPriv_pushButton.clicked.connect(
+ self.editPriv_pushButton_clicked)
+ self.ui.nhsclaims_pushButton.clicked.connect(
+ self.nhsclaims_pushButton_clicked)
+ self.ui.editHDP_pushButton.clicked.connect(
+ self.editHDP_pushButton_clicked)
+ self.ui.editRegDent_pushButton.clicked.connect(
+ 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)
-
- QtCore.QObject.connect(self.ui.feeScales_treeView,
- QtCore.SIGNAL("clicked (QModelIndex)"),
- self.feeScale_clicked)
-
- QtCore.QObject.connect(self.ui.feeScales_treeView,
- QtCore.SIGNAL("expanded (QModelIndex)"),
- self.feeScale_expanded)
-
- QtCore.QObject.connect(self.ui.chooseFeescale_comboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"),
- self.chooseFeescale_comboBox_changed)
-
- QtCore.QObject.connect(self.ui.feeExpand_radioButton,
- QtCore.SIGNAL("clicked()"), self.feeExpand_radiobuttons_clicked)
-
- QtCore.QObject.connect(self.ui.feeCompress_radioButton,
- QtCore.SIGNAL("clicked()"), self.feeExpand_radiobuttons_clicked)
-
+ self.ui.feeScales_treeView.clicked.connect(self.feeScale_clicked)
+ self.ui.feeScales_treeView.expanded.connect(self.feeScale_expanded)
+ self.ui.chooseFeescale_comboBox.currentIndexChanged.connect(
+ self.chooseFeescale_comboBox_changed)
+ self.ui.feeExpand_radioButton.clicked.connect(
+ self.feeExpand_radiobuttons_clicked)
+ self.ui.feeCompress_radioButton.clicked.connect(
+ 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)
-
+ self.ui.feeSearch_lineEdit.returnPressed.connect(
+ self.feeSearch_lineEdit_edited)
self.ui.search_descriptions_radioButton.toggled.connect(
self.feeSearch_pushButton_clicked)
-
self.ui.feeSearch_pushButton.clicked.connect(
self.feeSearch_pushButton_clicked)
-
- QtCore.QObject.connect(self.ui.feescale_tester_pushButton,
- QtCore.SIGNAL("clicked()"), self.feescale_tester_pushButton_clicked)
-
- QtCore.QObject.connect(self.ui.feetable_xml_pushButton,
- QtCore.SIGNAL("clicked()"), self.feetable_xml)
-
+ self.ui.feescale_tester_pushButton.clicked.connect(
+ self.feescale_tester_pushButton_clicked)
+ self.ui.feetable_xml_pushButton.clicked.connect(self.feetable_xml)
self.ui.hide_rare_feescale_codes_checkBox.toggled.connect(
self.hide_rare_feescale_items)
-
self.ui.reload_feescales_pushButton.clicked.connect(
self.reload_feescales)
@@ -2929,7 +2918,6 @@ class OpenmolarGui(QtGui.QMainWindow):
for chart in (self.ui.summaryChartWidget, self.ui.staticChartWidget):
chart.teeth_selected_signal.connect(self.static_chartNavigation)
-
chart.show_history_signal.connect(self.toothHistory)
chart.flip_deciduous_signal.connect(self.flipDeciduous)
chart.add_comments_signal.connect(self.tooth_add_comments)
@@ -2938,31 +2926,23 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.planChartWidget.teeth_selected_signal.connect(
self.plan_chartNavigation)
-
self.ui.completedChartWidget.teeth_selected_signal.connect(
self.comp_chartNavigation)
-
self.ui.planChartWidget.complete_treatments_signal.connect(
self.complete_planned_chart_treatments)
self.ui.completedChartWidget.complete_treatments_signal.connect(
self.reverse_completed_chart_treatments)
-
- QtCore.QObject.connect(self.ui.toothPropsWidget,
- QtCore.SIGNAL("NextTooth"), self.navigateCharts)
-
+ self.ui.toothPropsWidget.next_tooth_signal.connect(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.QObject.connect(self.ui.toothPropsWidget.lineEdit,
- QtCore.SIGNAL("DeletedComments"), self.deleteComments)
-
+ self.ui.toothPropsWidget.lineEdit.changed_properties_signal.connect(
+ self.updateCharts)
+ self.ui.toothPropsWidget.lineEdit.deleted_comments_signal.connect(
+ self.deleteComments)
self.ui.static_control_panel.deciduous_signal.connect(
self.flipDeciduous)
-
self.ui.toothPropsWidget.static_chosen.connect(
self.ui.static_control_panel.setEnabled)
@@ -2987,59 +2967,37 @@ class OpenmolarGui(QtGui.QMainWindow):
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)
-
- QtCore.QObject.connect(self.ui.perioChartDateComboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"), self.layoutPerioCharts)
- QtCore.QObject.connect(self.ui.bpeDateComboBox,
- QtCore.SIGNAL("currentIndexChanged(int)"), self.bpe_table)
-
def signals_tabs(self, connect=True):
'''
connect (or disconnect) the slots for the main_tabWidget,
and patient tabWidget default is to connect
'''
if connect:
- QtCore.QObject.connect(self.ui.main_tabWidget,
- QtCore.SIGNAL("currentChanged(int)"), self.handle_mainTab)
-
- QtCore.QObject.connect(self.ui.tabWidget,
- QtCore.SIGNAL("currentChanged(int)"), self.handle_patientTab)
+ self.ui.main_tabWidget.currentChanged.connect(self.handle_mainTab)
+ self.ui.tabWidget.currentChanged.connect(self.handle_patientTab)
else:
- QtCore.QObject.disconnect(self.ui.main_tabWidget,
- QtCore.SIGNAL("currentChanged(int)"), self.handle_mainTab)
-
- QtCore.QObject.disconnect(self.ui.tabWidget,
- QtCore.SIGNAL("currentChanged(int)"), self.handle_patientTab)
+ self.ui.main_tabWidget.currentChanged.disconnect(
+ self.handle_mainTab)
+ self.ui.tabWidget.currentChanged.disconnect(self.handle_patientTab)
def signals_appointments(self):
# signals raised on the main appointment tab
- QtCore.QObject.connect(self.ui.actionSet_Font_Size,
- QtCore.SIGNAL("triggered ()"), self.apptBook_fontSize)
-
+ self.ui.actionSet_Font_Size.triggered.connect(self.apptBook_fontSize)
self.diary_widget.bring_to_front.connect(self.show_diary)
-
self.diary_widget.patient_card_request.connect(self.getrecord)
-
self.diary_widget.schedule_controller.appointment_selected.connect(
- self.pt_diary_widget.update_pt_diary_selection)
-
+ self.diary_widget_schedule_controller_appointment_selected)
self.diary_widget.pt_diary_changed.connect(
self.pt_diary_widget.refresh_ptDiary)
self.diary_widget.print_mh_signal.connect(self.print_mh_forms)
-
self.pt_diary_widget.start_scheduling.connect(self.start_scheduling)
self.pt_diary_widget.find_appt.connect(self.diary_widget.find_appt)
-
self.pt_diary_widget.appointment_selected.connect(
self.diary_widget.schedule_controller.update_appt_selection)
-
self.pt_diary_widget.preferences_changed.connect(
self.appt_prefs_changed)
+ self.pt_diary_widget.appointments_changed_signal.connect(
+ self.handle_pt_diary_update)
def start_scheduling(self):
self.diary_widget.schedule_controller.set_patient(self.pt)
@@ -3048,6 +3006,18 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.main_tabWidget.setCurrentIndex(1) # appointmenttab
self.signals_tabs()
self.diary_widget.start_scheduling(self.pt)
+ self.updateDetails()
+
+ def handle_pt_diary_update(self):
+ LOGGER.debug("handle_pt_diary_update")
+ self.pt.forget_exam_booked()
+ self.updateDetails()
+
+ def diary_widget_schedule_controller_appointment_selected(self, appt):
+ if (self.diary_widget.schedule_controller.pt.serialno ==
+ self.pt.serialno):
+ self.pt_diary_widget.layout_ptDiary()
+ self.pt_diary_widget.update_pt_diary_selection(appt)
def appt_prefs_changed(self):
self.updateDetails()
@@ -3059,18 +3029,19 @@ class OpenmolarGui(QtGui.QMainWindow):
'''
if not self.pt.underTreatment:
self.advise(
- _("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)
- if result == QtGui.QMessageBox.No:
+ _("Recalculate Estimate is not normally used on closed courses"), 1)
+ if not permissions.granted(self):
+ return
+ if 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) == QtGui.QMessageBox.No:
return
if manipulate_plan.recalculate_estimate(self):
@@ -3081,18 +3052,22 @@ 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)
- if result == QtGui.QMessageBox.No:
+ if QtGui.QMessageBox.question(
+ self,
+ _("Confirm"),
+ _("apply an exemption to the NHS items on this estimate?"),
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No) == 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"))
-
- if result and estimates.apply_exemption(self.pt, max):
+ max_, result = QtGui.QInputDialog.getInteger(
+ self,
+ _("input needed"),
+ "%s <br />%s" % (_("maximum charge for the patient"),
+ _("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()
self.updateDetails()
@@ -3149,7 +3124,7 @@ class OpenmolarGui(QtGui.QMainWindow):
self.ui.family_group_label.setText(message)
self.ui.relatedpts_pushButton.setText(message_2)
- LOGGER.debug("updating family label '%s' '%s'" % (message, message_2))
+ LOGGER.debug("updating family label '%s' '%s'", message, message_2)
def send_email(self):
if self.sender == self.ui.email2_button:
@@ -3169,9 +3144,9 @@ class OpenmolarGui(QtGui.QMainWindow):
_("error loading feetable"), warning), 2)
self.ui.cseType_comboBox.addItems(localsettings.CSETYPES)
- def hide_rare_feescale_items(self, bool):
+ def hide_rare_feescale_items(self, bool_):
# TODO - this could actually have 3 levels.
- if bool:
+ if bool_:
level = 1
else:
level = 0
@@ -3223,33 +3198,47 @@ class OpenmolarGui(QtGui.QMainWindow):
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))
+ QtCore.QTimer.singleShot(
+ 100,
+ partial(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))
+ QtCore.QTimer.singleShot(
+ 100,
+ partial(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)
- QtCore.QTimer.singleShot(100,
- partial(manipulate_plan.plan_list_right_click, self, point))
+ LOGGER.debug("plan listview pressed %s", point)
+ QtCore.QTimer.singleShot(
+ 100,
+ 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))
+ QtCore.QTimer.singleShot(
+ 100,
+ 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):
@@ -3264,10 +3253,6 @@ class OpenmolarGui(QtGui.QMainWindow):
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)
@@ -3289,26 +3274,131 @@ class OpenmolarGui(QtGui.QMainWindow):
def show_daybook_filter_help(self):
self.advise(daybook.filter_help_text(), 1)
+ def allow_all_history_edits(self, bool_value):
+ self.edit_currtrtmt2(bool_value, False)
+ self.ui.actionEdit_Courses.setChecked(bool_value)
+ self.edit_estimates(bool_value, False)
+ self.ui.actionEdit_Estimates.setChecked(bool_value)
+ self.allow_edit_daybook(bool_value, False)
+ self.refresh_debug_browser()
+
+ def edit_currtrtmt2(self, bool_value, refresh=True):
+ courseHistory.ALLOW_EDIT = bool_value
+ if refresh:
+ self.refresh_debug_browser()
+
+ def allow_edit_daybook(self, bool_value, refresh=True):
+ self.ui.actionAllow_Edit_Treatment.setChecked(bool_value)
+ self.ui.actionAllow_Edit.setChecked(bool_value)
+ daybook.ALLOW_TX_EDITS = bool_value
+ daybookHistory.ALLOW_TX_EDITS = bool_value
+ if refresh:
+ self.refresh_debug_browser()
+
+ def edit_estimates(self, bool_value, refresh=True):
+ estimatesHistory.ALLOW_EDIT = bool_value
+ if refresh:
+ self.refresh_debug_browser()
+
+ def refresh_debug_browser(self):
+ '''
+ update the debug browser
+ '''
+ LOGGER.debug("refreshing debug %s", self.debug_browser_refresh_func)
+ if self.debug_browser_refresh_func is None:
+ self.ui.debugBrowser.setText("")
+ else:
+ self.ui.debugBrowser.setText(self.debug_browser_refresh_func())
+
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)
+ m1 = re.match(r"daybook_id\?(\d+)feesa=(\d+)feesb=(\d+)", url)
+ m2 = re.match(r"daybook_id_edit\?(\d+)", url)
+ m3 = re.match(r"edit_courseno\?(\d+)", url)
+ m4 = re.match(r"edit_estimate\?(\d+)", url)
+ m5 = re.match(r"merge_courses\?(\d+)\+(\d+)", url)
+ m6 = re.match(r"consistent_courseno\?(\d+)", url)
+ m7 = re.match(r"edit_tx_courseno\?(\d+)", url)
+
+ if m1:
+ id_ = int(m1.groups()[0])
+ fee = int(m1.groups()[1])
+ ptfee = int(m1.groups()[2])
+ dl = DaybookItemDialog(id_, fee, ptfee, self)
dl.exec_()
- if n and permissions.granted():
- id = int(n.groups()[0])
- dl = DaybookEditDialog(id, self)
+ elif m2 and permissions.granted():
+ id_ = int(m2.groups()[0])
+ dl = DaybookEditDialog(id_, self)
if dl.exec_():
dl.update_treatments()
+ elif m3 and permissions.granted():
+ courseno = int(m3.groups()[0])
+ dl = CourseEditDialog(courseno, self)
+ if dl.exec_():
+ dl.update_db()
+ elif m4 and permissions.granted():
+ courseno = int(m4.groups()[0])
+ dl = EstimateEditDialog(self.pt.serialno, courseno, self)
+ if dl.exec_():
+ dl.update_db()
+ elif m5 and permissions.granted():
+ courseno1, courseno2 = m5.groups()
+ dl = CourseMergeDialog(self.pt.serialno,
+ int(courseno1), int(courseno2), self)
+ if dl.exec_():
+ dl.update_db()
+ elif m6 and permissions.granted():
+ courseno = int(m6.groups()[0])
+ dl = CourseConsistencyDialog(self.pt.serialno, courseno, self)
+ if dl.exec_():
+ dl.update_db()
+ elif m7 and permissions.granted():
+ courseno = int(m7.groups()[0])
+ dl = EditTreatmentDialog(self.pt.serialno, courseno, self)
+ if dl.exec_():
+ dl.update_db()
+ else:
+ LOGGER.info("Not editing %s", url)
+
+ def edit_referral_centres(self):
+ dl = EditReferralCentresDialog(self)
+ if dl.exec_():
+ self.set_referral_centres()
+
+ def reset_supervisor(self):
+ dl = ResetSupervisorPasswordDialog(self)
+ dl.exec_()
+
+ def add_user(self):
+ dl = AddUserDialog(self)
+ if dl.exec_():
+ self.advise(_("New user added to login table"), 1)
+
+ def add_clinician(self):
+ if self.pt.serialno:
+ self.advise(
+ _("Please exit any record before taking this action"), 1)
+ return
+ dl = AddClinicianDialog(self)
+ if dl.exec_():
+ self.initiate()
+
+ def edit_practice(self):
+ dl = EditPracticeDialog(self)
+ if dl.exec_():
+ self.advise(_("Practice Name and/or Address modified."), 1)
+
+ def clear_todays_emergencies(self):
+ self.show_diary()
+ self.diary_widget.clearTodaysEmergencyTime()
+
+ def insert_regular_blocks(self):
+ self.show_diary()
+ self.diary_widget.insert_regular_blocks()
def excepthook(self, exc_type, exc_val, tracebackobj):
'''
@@ -3320,41 +3410,26 @@ class OpenmolarGui(QtGui.QMainWindow):
for l in traceback.format_exception(exc_type, exc_val, tracebackobj):
message += l
self.advise('UNHANDLED EXCEPTION!<hr /><pre>%s' % message, 2)
+ sys.stderr.write(message)
-def main(app):
+def main():
'''
the entry point for the app
'''
- if not localsettings.successful_login:
- try:
- dev_path = os.path.join(
- localsettings.localFileDirectory, "dev_login.txt")
- f = open(dev_path, "r")
- data = f.read().strip("\n")
- f.close()
- if localsettings.hash_func(data) != \
- '1fd0c27f4d65caaa10ef5ef6a714faf96ed44fdd':
- raise IOError("bad checksum")
- LOGGER.warning("allowing developer login")
- except:
- sys.exit("unable to run... no login")
- localsettings.initiate()
+ os.chdir(os.path.expanduser("~"))
+ app = QtGui.QApplication(sys.argv)
mainWindow = OpenmolarGui()
sys.excepthook = mainWindow.excepthook
mainWindow.show()
mainWindow.setWindowState(QtCore.Qt.WindowMaximized)
-
sys.exit(app.exec_())
if __name__ == "__main__":
+ from gettext import gettext as _
LOGGER.setLevel(logging.DEBUG)
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"
- main(newapp)
+ main()
diff --git a/src/openmolar/qt4gui/new_patient_gui.py b/src/openmolar/qt4gui/new_patient_gui.py
index b41b97f..6cda6be 100644
--- a/src/openmolar/qt4gui/new_patient_gui.py
+++ b/src/openmolar/qt4gui/new_patient_gui.py
@@ -55,21 +55,24 @@ def check_use_family(om_gui):
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:
+ if localsettings.last_family_no in (None, 0):
+ 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())
+ LOGGER.info("starting new family group %s", om_gui.pt.familyno)
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:
+ 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
diff --git a/src/openmolar/qt4gui/printing/bulk_mail.py b/src/openmolar/qt4gui/printing/bulk_mail.py
index 0b07f15..13a593a 100644
--- a/src/openmolar/qt4gui/printing/bulk_mail.py
+++ b/src/openmolar/qt4gui/printing/bulk_mail.py
@@ -54,8 +54,6 @@ FAMILY_BODY = '''%s\n%s''' % (
SIGN_OFF = _("Yours sincerely,")
-SIGNATURE = localsettings.PRACTICE_NAME
-
FOOTER = _('''* If you already have a future appointment with us -
please accept our apologies and ignore this letter.''')
@@ -584,7 +582,7 @@ class bulkMails(object):
20, sign_off_rect.height(), 0, sig_font_height)
painter.save()
painter.setFont(sigFont)
- painter.drawText(sig_rect, SIGNATURE, option)
+ painter.drawText(sig_rect, localsettings.PRACTICE_NAME, option)
if DEBUG:
painter.drawRect(sig_rect.adjusted(2, 2, -2, -2))
painter.restore()
diff --git a/src/openmolar/qt4gui/printing/gp17/gp17_data.py b/src/openmolar/qt4gui/printing/gp17/gp17_data.py
index 4c29bd7..e6b161b 100644
--- a/src/openmolar/qt4gui/printing/gp17/gp17_data.py
+++ b/src/openmolar/qt4gui/printing/gp17/gp17_data.py
@@ -402,7 +402,7 @@ class Gp17Data(object):
except KeyError:
print "Key Error getting dentist", self.dentist
text = "\n"
- for line in localsettings.practiceAddress:
+ for line in localsettings.PRACTICE_ADDRESS:
text += line + "\n"
try:
text += localsettings.dentDict[self.dentist][3]
@@ -463,11 +463,20 @@ class Gp17Data(object):
'''
date of completion
'''
- if "cmpd" in self.exclusions:
+ if "cmpd" in self.exclusions or self.pftr:
return ""
return self.format_date(self.pt.treatment_course.cmpd)
@property
+ def pftr(self):
+ '''
+ patient failed to return
+ '''
+ if "pftr" in self.exclusions:
+ return False
+ return self.pt.treatment_course.ftr
+
+ @property
def show_chart(self):
if "chart" in self.exclusions:
return False
diff --git a/src/openmolar/qt4gui/printing/gp17/gp17v1_front.py b/src/openmolar/qt4gui/printing/gp17/gp17v1_front.py
index f9d5692..8dc8952 100644
--- a/src/openmolar/qt4gui/printing/gp17/gp17v1_front.py
+++ b/src/openmolar/qt4gui/printing/gp17/gp17v1_front.py
@@ -241,6 +241,7 @@ class GP17iFront(PrintedForm):
self._fill_pid,
self._fill_accd,
self._fill_cmpd,
+ self._fill_pftr,
self._fill_stampbox,
self._fill_previous_surname,
self._fill_address,
@@ -356,6 +357,11 @@ class GP17iFront(PrintedForm):
except IndexError:
break
+ def _fill_pftr(self, painter):
+ if self.data.pftr:
+ rect = self.rects["pftr"]
+ painter.drawText(rect, "X", OPTION)
+
def _fill_charting(self, painter):
if not self.data.show_chart:
return
diff --git a/src/openmolar/qt4gui/printing/mh_print.py b/src/openmolar/qt4gui/printing/mh_print.py
index aa6eb4a..2e1d2e0 100644
--- a/src/openmolar/qt4gui/printing/mh_print.py
+++ b/src/openmolar/qt4gui/printing/mh_print.py
@@ -118,10 +118,11 @@ class MHPrint(object):
y = MARGIN_TOP
- for value in localsettings.MH_HEADER:
+ for value in (localsettings.PRACTICE_NAME,
+ _("Confidential Medical History Questionaire")
+ ):
if not value:
continue
-
y += print_text(value, y, option=QtCore.Qt.AlignCenter)
print_line(y)
diff --git a/src/openmolar/qt4gui/printing/om_printing.py b/src/openmolar/qt4gui/printing/om_printing.py
index 48dd971..f7a6ca9 100644
--- a/src/openmolar/qt4gui/printing/om_printing.py
+++ b/src/openmolar/qt4gui/printing/om_printing.py
@@ -23,7 +23,7 @@
# ############################################################################ #
'''
-provides the main class which is my gui
+provides printing functions for the main gui.
'''
from __future__ import division
@@ -38,12 +38,12 @@ from openmolar.settings import localsettings, utilities
from openmolar.ptModules import estimates
from openmolar.ptModules import standardletter
-from openmolar.ptModules import referral
from openmolar.dbtools import docsprinted
from openmolar.dbtools import appointments
from openmolar.dbtools import patient_class
from openmolar.dbtools import patient_write_changes
+from openmolar.dbtools import referral
from openmolar.qt4gui.compiled_uis import Ui_enter_letter_text
from openmolar.qt4gui.compiled_uis import Ui_daylist_print
@@ -88,22 +88,6 @@ def commitPDFtoDB(om_gui, descr, serialno=None):
om_gui.advise(_("Error saving PDF copy %s") % e, 2)
-def printDupReceipt(om_gui):
- '''
- print a duplicate receipt
- '''
- dupdate = localsettings.currentDay()
- amount = om_gui.ui.receiptDoubleSpinBox.value()
-
- printReceipt(om_gui, {_("Professional Services"): amount * 100},
- total=amount * 100, duplicate=True, dupdate=dupdate)
-
- 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
@@ -183,7 +167,7 @@ def printAccountsTable(om_gui):
if col == 1:
html += '<td align="right">%s</td>' % item.text()
elif col == 12:
- money = int(float(item.text()) * 100)
+ money = localsettings.pencify(item.text())
money_str = localsettings.formatMoney(money)
html += '<td align="right">%s</td>' % money_str
total += money
@@ -486,12 +470,7 @@ 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), )
-
- recall_printer = recallprint.RecallPrinter(args)
+ recall_printer = recallprint.RecallPrinter(om_gui.pt)
recall_printer.print_()
om_gui.pt.addHiddenNote("printed", "recall - non batch")
@@ -576,8 +555,8 @@ def printSelectedAccounts(om_gui):
printpt.addHiddenNote(
"printed", "account - tone %s" % tone)
- patient_write_changes.discreet_changes(printpt, (
- "billct", "billdate", "billtype"))
+ patient_write_changes.discreet_changes(
+ printpt, ("billct", "billdate", "billtype"))
patient_write_changes.toNotes(sno,
printpt.HIDDENNOTES)
diff --git a/src/openmolar/qt4gui/printing/recallprint.py b/src/openmolar/qt4gui/printing/recallprint.py
index 3bdc3a8..6a7423c 100644
--- a/src/openmolar/qt4gui/printing/recallprint.py
+++ b/src/openmolar/qt4gui/printing/recallprint.py
@@ -30,12 +30,21 @@ import datetime
DATE_FORMAT = "MMMM, yyyy"
-class RecallPrinter():
+class RecallPrinter(object):
- def __init__(self, rows):
+ def __init__(self, pt):
self.printer = QtGui.QPrinter()
- self.printer.setPageSize(QtGui.QPrinter.A5)
- self.recalls = rows
+ self.pt = pt
+
+ self.line1 = _('We are writing to inform you that your '
+ 'dental examination is now due.')
+
+ self.line2 = _('Please contact the surgery to arrange '
+ 'an appointment. *')
+
+ self.line3 = _('We look forward to seeing you in the near future.')
+
+ self.sign_off = _("Yours Sincerely")
def print_(self):
dialog = QtGui.QPrintDialog(self.printer)
@@ -53,89 +62,98 @@ class RecallPrinter():
DateWidth = fm.width(" September 99, 2999 ")
painter = QtGui.QPainter(self.printer)
pageRect = self.printer.pageRect()
- page = 1
- for recall in self.recalls:
- 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()))
- y += sansLineHeight
- for line in recall[5:10]:
- if line:
- painter.drawText(x, y, str(line).title() + ",")
- y += serifLineHeight
- if recall[10]:
- 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))
- 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.'))
- 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.setPen(QtCore.Qt.black)
- y += serifLineHeight * 2
- painter.drawText(x, y, _("Yours sincerely,"))
- y += serifLineHeight * 1.5
- painter.setFont(sigFont)
- y += serifLineHeight * 2
- painter.drawText(x, y, "The Academy Dental Practice")
- painter.setFont(serifFont)
- y = pageRect.height() - 120
- painter.drawLine(x, y, pageRect.width() - (2 * AddressMargin), y)
- y += 2
- font = QtGui.QFont("Helvetica", 7)
- font.setItalic(True)
- painter.setFont(font)
- 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)
- page += 1
- if page <= len(self.recalls):
- self.printer.newPage()
- painter.restore()
+ painter.save()
+ painter.setPen(QtCore.Qt.black)
+ painter.setFont(sansFont)
+ # put dent serialno in topleft corner
+ painter.drawText(
+ LeftMargin,
+ TopMargin,
+ "%s %d" % (localsettings.ops.get(self.pt.dnt1, ""),
+ self.pt.serialno)
+ )
+ x, y = AddressMargin, TopMargin + 50
+ painter.drawText(
+ x, y,
+ "%s %s %s" % (self.pt.title.title(),
+ self.pt.fname.title(),
+ self.pt.sname.title())
+ )
+ y += sansLineHeight
+ for line_ in (self.pt.addr1,
+ self.pt.addr2,
+ self.pt.addr3,
+ self.pt.town,
+ self.pt.county
+ ):
+ if line_:
+ painter.drawText(x, y, "%s," % line_.title())
+ y += serifLineHeight
+ if self.pt.pcde:
+ painter.drawText(x, y, "%s." % self.pt.pcde)
+ y += serifLineHeight
+
+ 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,") %
+ (self.pt.title.title(), self.pt.sname.title()))
+ y += serifLineHeight * 2
+ painter.drawText(x, y, self.line1)
+ y += serifLineHeight
+ painter.drawText(x, y, self.line2)
+ y += serifLineHeight * 1.2
+ painter.drawText(x, y, self.line3)
+ painter.setPen(QtCore.Qt.black)
+ y += serifLineHeight * 2
+ painter.drawText(x, y, self.sign_off)
+ y += serifLineHeight * 1.5
+ painter.setFont(sigFont)
+ y += serifLineHeight * 2
+ painter.drawText(x, y, localsettings.PRACTICE_NAME)
+ painter.setFont(serifFont)
+ y = pageRect.height() - 120
+ painter.drawLine(x, y, pageRect.width() - (2 * AddressMargin), y)
+ y += 2
+ font = QtGui.QFont("Helvetica", 7)
+ font.setItalic(True)
+ painter.setFont(font)
+ 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)
+ painter.restore()
if __name__ == "__main__":
- import sys
- localsettings.initiate()
- app = QtGui.QApplication(sys.argv)
- pts = (
- ('TITLE', 'FNAME', 'SNAME', 6, 1809,
- "6 ST MARY'S ROAD", 'KIRKHILL', '', '', '', 'IV5 7NX'),
- )
+ import os
+ os.chdir(os.path.expanduser("~"))
- recall_printer = RecallPrinter(pts)
+ class DuckPatient(object):
+ title = 'TITLE'
+ fname = 'FNAME'
+ sname = 'SNAME'
+ dnt1 = 1
+ serialno = 1
+ addr1 = '1512 Rue de la Soleil'
+ addr2 = 'Tampa'
+ addr3 = ""
+ town = "Florida"
+ county = "USA"
+ pcde = "ZIPCODE"
+
+ localsettings.initiate()
+ app = QtGui.QApplication([])
+ recall_printer = RecallPrinter(DuckPatient())
recall_printer.print_()
diff --git a/src/openmolar/qt4gui/pt_diary_widget.py b/src/openmolar/qt4gui/pt_diary_widget.py
index 6246961..30b2707 100644
--- a/src/openmolar/qt4gui/pt_diary_widget.py
+++ b/src/openmolar/qt4gui/pt_diary_widget.py
@@ -49,6 +49,7 @@ class PtDiaryWidget(QtGui.QWidget):
find_appt = QtCore.pyqtSignal(object)
appointment_selected = QtCore.pyqtSignal(object)
preferences_changed = QtCore.pyqtSignal()
+ # also inherits a signal from the model "appointments_changed_signal"
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
@@ -63,6 +64,8 @@ class PtDiaryWidget(QtGui.QWidget):
QtGui.QSizePolicy(
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
)
+ self.appointments_changed_signal = \
+ self.diary_model.appointments_changed_signal
def sizeHint(self):
return QtCore.QSize(800, 200)
@@ -390,7 +393,7 @@ class PtDiaryWidget(QtGui.QWidget):
'''
def delete_appt():
if appointments.delete_appt_from_apr(appt):
- self.advise(_("Sucessfully removed appointment"))
+ self.advise(_("Successfully removed appointment"))
else:
self.advise(_("Error removing proposed appointment"), 2)
@@ -438,7 +441,7 @@ class PtDiaryWidget(QtGui.QWidget):
QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
# remove from the patients diary
if appointments.delete_appt_from_apr(appt):
- self.advise(_("Sucessfully removed appointment"))
+ self.advise(_("Successfully removed appointment"))
else:
self.advise(_("Error removing from patient diary"), 2)
diff --git a/src/openmolar/qt4gui/schema_updater.py b/src/openmolar/qt4gui/schema_updater.py
index 64fd420..7bca50b 100644
--- a/src/openmolar/qt4gui/schema_updater.py
+++ b/src/openmolar/qt4gui/schema_updater.py
@@ -26,17 +26,20 @@
this module is called when the schema is found to be out of date
'''
-from gettext import gettext as _
import logging
import sys
import time
+
from PyQt4 import QtGui, QtCore
from openmolar.settings import localsettings
from openmolar.dbtools import schema_version
+from openmolar.qt4gui.dialogs.base_dialogs import BaseDialog
+from openmolar.backports.advisor import Advisor
LOGGER = logging.getLogger("openmolar")
-MESSAGE = "<h3>%s</h3>%s<br />%s {OLD} %s {NEW}<hr />%s<br /><b>%s</b>" % (
+MESSAGE = '''<h3>%s</h3>
+%s<br />%s {OLD}<br />%s {NEW}<br /><br />%s<hr /><b>%s</b>''' % (
_("Update required"),
_("Your Openmolar database schema is out of date "
"for this version of the client."),
@@ -49,7 +52,7 @@ MESSAGE = "<h3>%s</h3>%s<br />%s {OLD} %s {NEW}<hr />%s<br /><b>%s</b>" % (
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>" % (
+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."),
@@ -62,206 +65,288 @@ class UserQuit(Exception):
pass
-def proceed():
- '''
- on to the main gui.
- '''
- from openmolar.qt4gui import maingui
- localsettings.loadFeeTables()
- sys.exit(maingui.main(QtGui.QApplication.instance()))
-
+class SchemaUpdater(BaseDialog, Advisor):
-def user_quit():
- raise UserQuit("user has quit the update")
+ def __init__(self, parent=None):
+ Advisor.__init__(self, parent)
+ BaseDialog.__init__(self, parent, remove_stretch=True)
+ self.setWindowTitle("openMolar")
+ self.header_label = QtGui.QLabel(_("Updating Database"))
+ self.header_label.setStyleSheet("font-weight:bold;")
+ self.label = QtGui.QLabel("")
+ self.pb = QtGui.QProgressBar()
-class SchemaUpdater(object):
+ self.insertWidget(self.header_label)
+ self.insertWidget(self.label)
+ self.insertWidget(self.pb)
+ self.pb.hide()
- def __init__(self):
- self.pb = QtGui.QProgressDialog()
- self.pb.canceled.connect(user_quit)
+ self._current_version = None
+ self.apply_but.setText(_("Continue"))
- required = localsettings.CLIENT_SCHEMA_VERSION
- self.current = schema_version.getVersion()
+ self.dbu = None
+ QtCore.QTimer.singleShot(100, self.confirm_update)
- message = MESSAGE.replace(
- "{OLD}",
- self.current).replace(
- "{NEW}",
- required)
+ @property
+ def current_version(self):
+ if self._current_version is None:
+ self._current_version = schema_version.getVersion()
+ return self._current_version
- if QtGui.QMessageBox.question(None, "Update Schema",
- message, QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
- QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
- self.pb.setWindowTitle("openMolar")
- self.pb.show()
- else:
- self.completed(False, ABORT_MESSAGE)
+ def confirm_update(self):
+ message = MESSAGE.replace("{OLD}", self.current_version)
+ message = message.replace("{NEW}", localsettings.CLIENT_SCHEMA_VERSION)
- self.apply_updates()
+ if QtGui.QMessageBox.question(
+ self,
+ _("Schema Update Required"),
+ message,
+ QtGui.QMessageBox.No | QtGui.QMessageBox.Yes,
+ QtGui.QMessageBox.No
+ ) == QtGui.QMessageBox.Yes:
- if schema_version.getVersion() == required:
- self.pb.destroy()
- proceed()
+ self.apply_updates()
else:
- self.completed(False, FAILURE_MESSAGE)
+ self.hide_brief_message()
+ self.label.setText(_("Operation Cancelled."))
+ self.completed(ABORT_MESSAGE)
+ time.sleep(2)
+ self.reject()
+
+ def sizeHint(self):
+ return QtCore.QSize(700, 300)
+
+ def resizeEvent(self, event):
+ '''
+ this function is overwritten so that the advisor popup can be
+ put in the correct place
+ '''
+ QtGui.QDialog.resizeEvent(self, event)
+ widg = self.header_label
+ brief_pos_x = widg.pos().x() + widg.width()
+ brief_pos_y = widg.pos().y()
+
+ brief_pos = QtCore.QPoint(brief_pos_x, brief_pos_y)
+ self.setBriefMessagePosition(brief_pos, True)
+
+ def reject(self):
+ if self.dbu is not None:
+ self.dbu.force_stop()
+ BaseDialog.reject(self)
+ sys.exit("user rejected")
+ # raise UserQuit("user has quit the update")
def updateProgress(self, arg, message):
LOGGER.info("%s %s" % (arg, message))
- self.pb.setLabelText(message)
+ self.label.setText(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))
-
- QtCore.QObject.connect(self.dbu,
- QtCore.SIGNAL("progress"), self.updateProgress)
- QtCore.QObject.connect(self.dbu,
- QtCore.SIGNAL("completed"), self.completed)
-
+ QtGui.QApplication.instance().processEvents()
+ time.sleep(2)
+ header_message = "%s <b>%s</b> %s <b>%s</b>" % (
+ _("Converting Database Schema from version"),
+ self.current_version,
+ _("to"),
+ self.next_version)
+ self.header_label.setText(header_message)
+ self.pb.show()
+ self.updateProgress(
+ 1,
+ "%s %s" % (_("upgrading to schema version"),
+ self.next_version))
+
+ self.dbu.progress_signal.connect(self.updateProgress)
+ self.dbu.completed_signal.connect(self.completed)
+ QtGui.QApplication.instance().processEvents()
try:
if self.dbu.run():
localsettings.DB_SCHEMA_VERSION = self.next_version
+ self._current_version = None
else:
- self.completed(False,
- _('Conversion to %s failed') % self.next_version)
+ self.completed(
+ False,
+ _('Conversion to %s failed') % self.next_version)
except UserQuit:
LOGGER.warning("user quit the database upgrade")
- completed(False, "Schema Upgrade Halted")
+ self.completed(False, _("Schema Upgrade Halted"))
except Exception as exc:
LOGGER.exception("unexpected exception")
# fatal error!
- completed(False, ('Unexpected Error updating the schema '
- 'please file a bug at http:www.openmolar.com'))
-
- def completed(self, sucess, message):
- def accept():
- m.accept()
- self.pb.hide()
- if sucess:
- m = QtGui.QMessageBox()
- m.setText(message)
- m.setStandardButtons(QtGui.QMessageBox.NoButton)
- m.setWindowTitle(_("OpenMolar"))
- m.setModal(False)
- 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)
- QtGui.QApplication.instance().closeAllWindows()
- sys.exit("FAILED TO UPGRADE SCHEMA")
+ self.completed(
+ _('Unexpected Error updating the schema '
+ 'please file a bug at http:www.openmolar.com')
+ )
+
+ def completed(self, message):
+ '''
+ called by DatabaseUpdaterThread when completed
+ '''
+ QtGui.QApplication.instance().processEvents()
+ self.advise(message)
+ time.sleep(2)
+ self.pb.hide()
+
+ def success(self):
+ message = _("All updates successully applied!")
+ self.advise(message)
+ self.label.setText("%s<hr />%s" % (
+ message, _("continuing to openmolar")))
+ self.enableApply()
+ self.cancel_but.setText(_("Quit"))
+ QtCore.QTimer.singleShot(5000, self.accept)
+
+ def failure(self, message=None):
+ if message is None:
+ message = FAILURE_MESSAGE
+ self.hide_brief_message()
+ self.label.setText(message)
def apply_updates(self):
# UPDATE TO SCHEMA 1.1 ########################
self.next_version = "1.1"
- if self.current < self.next_version:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema1_0to1_1 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(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:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema1_1to1_2 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(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:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema1_2to1_3 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(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:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema1_3to1_4 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(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:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema1_4to1_5 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(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:
+ if self.current_version < self.next_version:
+ from openmolar.schema_upgrades import schema1_5to1_6 as upmod
+ self.dbu = upmod.DatabaseUpdater(self.pb)
self.apply_update()
- # UPDATE TO SCHEMA 1.7 ########################
+ # UPDATE TO SCHEMA 1.7 ########################
self.next_version = "1.7"
- if self.current < self.next_version:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema1_6to1_7 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(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:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema1_7to1_8 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(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:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema1_8to1_9 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(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:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema1_9to2_0 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(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:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema2_0to2_1 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(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:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema2_1to2_2 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(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:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema2_2to2_3 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(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:
+ if self.current_version < self.next_version:
from openmolar.schema_upgrades import schema2_3to2_4 as upmod
- self.dbu = upmod.dbUpdater(self.pb)
+ self.dbu = upmod.DatabaseUpdater(self.pb)
self.apply_update()
+ # UPDATE TO SCHEMA 2.5 ########################
+ self.next_version = "2.5"
+ if self.current_version < self.next_version:
+ from openmolar.schema_upgrades import schema2_4to2_5 as upmod
+ self.dbu = upmod.DatabaseUpdater(self.pb)
+ self.apply_update()
-def main():
- LOGGER.info("running schema_updater")
- if QtGui.QApplication.instance() is None:
- app = QtGui.QApplication(sys.argv)
- schema_update = SchemaUpdater()
- schema_update.run()
+ # UPDATE TO SCHEMA 2.6 ########################
+ self.next_version = "2.6"
+ if self.current_version < self.next_version:
+ from openmolar.schema_upgrades import schema2_5to2_6 as upmod
+ self.dbu = upmod.DatabaseUpdater(self.pb)
+ self.apply_update()
+
+ # UPDATE TO SCHEMA 2.7 ########################
+ self.next_version = "2.7"
+ if self.current_version < self.next_version:
+ from openmolar.schema_upgrades import schema2_6to2_7 as upmod
+ self.dbu = upmod.DatabaseUpdater(self.pb)
+ self.apply_update()
+
+ # UPDATE TO SCHEMA 2.8 ########################
+ self.next_version = "2.8"
+ if self.current_version < self.next_version:
+ from openmolar.schema_upgrades import schema2_7to2_8 as upmod
+ self.dbu = upmod.DatabaseUpdater(self.pb)
+ self.apply_update()
+
+ # UPDATE TO SCHEMA 2.9 ########################
+ self.next_version = "2.9"
+ if self.current_version < self.next_version:
+ from openmolar.schema_upgrades import schema2_8to2_9 as upmod
+ self.dbu = upmod.DatabaseUpdater(self.pb)
+ self.apply_update()
+
+ self.dbu = None
+ if schema_version.getVersion() == localsettings.CLIENT_SCHEMA_VERSION:
+ self.success()
+ else:
+ self.failure()
if __name__ == "__main__":
+ from gettext import gettext as _
#-- put "openmolar" on the pyth path and go....
LOGGER.setLevel(logging.DEBUG)
LOGGER.debug("starting schema_updater")
@@ -284,4 +369,6 @@ if __name__ == "__main__":
wkdir = determine_path()
sys.path.append(os.path.dirname(wkdir))
- main()
+ app = QtGui.QApplication(sys.argv)
+ schema_updater = SchemaUpdater()
+ print schema_updater.exec_()
diff --git a/src/openmolar/qt4gui/tools/__init__.py b/src/openmolar/qt4gui/tools/__init__.py
deleted file mode 100644
index c701215..0000000
--- a/src/openmolar/qt4gui/tools/__init__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#! /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
deleted file mode 100644
index 30b0643..0000000
--- a/src/openmolar/qt4gui/tools/apptTools.py
+++ /dev/null
@@ -1,148 +0,0 @@
-#! /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
-
-import datetime
-
-from openmolar.settings import localsettings
-from openmolar.qt4gui.compiled_uis import Ui_apptTools
-from openmolar.qt4gui.dialogs import apptOpenDay, block_wizard
-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 -
- warning level0 = status bar only.
- warning level 1 advisory
- warning level 2 critical (and logged)
- '''
- if warning_level == 0:
- 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()
- QtGui.QMessageBox.warning(self.parent, _("Error"), arg)
- #--for logging purposes
- 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)
- 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)
-
- if result == QtGui.QMessageBox.No:
- return
- else:
- months, result = QtGui.QInputDialog.getInteger(self.parent,
- _("Extend Books"), _("How many months?"))
-
- if result:
-
- newBookEnd = QtCore.QDate(
- 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]
- db_settings.insertData(
- "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
- '''
- print "blocks called"
- 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.QObject.connect(self.extendBook_pushButton,
- QtCore.SIGNAL("clicked()"), self.extendBooks)
-
- QtCore.QObject.connect(self.editWeeks_pushButton,
- QtCore.SIGNAL("clicked()"), self.editWeeks)
-
- QtCore.QObject.connect(self.removeOld_pushButton,
- QtCore.SIGNAL("clicked()"), self.removeOld)
-
- QtCore.QObject.connect(self.blocks_pushButton,
- QtCore.SIGNAL("clicked()"), self.blocks)
-
-if __name__ == "__main__":
- localsettings.initiate()
- import sys
- app = QtGui.QApplication(sys.argv)
- MainWindow = QtGui.QMainWindow()
- 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
deleted file mode 100644
index d6e8ddc..0000000
--- a/src/openmolar/qt4gui/tools/new_setup.py
+++ /dev/null
@@ -1,457 +0,0 @@
-#! /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 re
-import sys
-from PyQt4 import QtGui, QtCore
-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")
-
-USER_ATTRIBS = ("user_id", "user_inits", "user_name", 'user_group',
- 'active', 'deactivation_dt')
-
-
-class om_user():
-
- def __init__(self, parent_ui):
- self.id = None
- self.inits = ""
- self.name = ""
- self.group = ""
- 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
- the USER_ATTRIBS expected
- '''
- 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
- '''
- self.id = tup[0]
- self.inits = tup[1]
- self.name = tup[2]
- self.group = tup[3]
- 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]))
-
- def load(self):
- '''
- grab the user entered values
- '''
- 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.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
- or (False,"error message") otherwise
- '''
- error = ""
- if self.inits == "":
- error = "<p>%s</p>" % _("Please enter initials for this user")
- if self.name == "":
- error += "<p>%s</p>" % _("Please set a name for this user")
-
- return (error == "", error)
-
- def toNode(self):
- '''
- create an xml Node
- '''
- d = minidom.Document()
- unode = d.createElement("user")
- i = 0
- values = self.toTuple()
- for attrib in USER_ATTRIBS:
- if values[i] != "None":
- c = d.createElement(attrib)
- c.appendChild(d.createTextNode(values[i]))
- unode.appendChild(c)
- i += 1
- return unode
-
- def fromNode(self, unode):
- '''
- creates an instance from existing xml
- '''
- tup = []
- for attrib in USER_ATTRIBS:
- d = unode.getElementsByTagName(attrib)
- value = None
- if d:
- try:
- child = d[0].childNodes
- value = child[0].data
- except IndexError:
- value = None
- tup.append(value)
-
- 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()
- self.ui.setupUi(self)
- self.app = app
- self.previousTabIndex = 0
- self.ui.tabWidget.setCurrentIndex(0)
- self.template = minidom.Document()
- 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_groupBox.hide()
- self.ui.modifyUser_pushButton.hide()
- self.signals()
-
- def advise(self, arg, warning_level=0):
- '''
- inform the user of events -
- warning level0 = status bar only.
- warning level 1 advisory
- warning level 2 critical (and logged)
- '''
- if warning_level == 0:
- 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()
- QtGui.QMessageBox.warning(self, _("Error"), arg)
- #--for logging purposes
- 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)
- return result == QtGui.QMessageBox.Ok
-
- def save_template(self):
- '''
- save the template, so it can be re-used in future
- '''
- try:
- filepath = QtGui.QFileDialog.getSaveFileName(self,
- _(
- "save template file"), "",
- _("openmolar template files ") + "(*.om_xml)")
- if filepath != '':
- if not re.match(".*\.om_xml$", filepath):
- filepath += ".om_xml"
- f = open(filepath, "w")
- f.write(self.template.toxml())
- f.close()
- self.advise(_("Template Saved"), 1)
- else:
- self.advise(_("operation cancelled"), 1)
- except Exception as e:
- self.advise(_("Template not saved") + " - %s" % e, 2)
-
- def load_template(self):
- '''
- change the default template for a new database
- '''
- if not self.confirmDataOverwrite():
- return
- filename = QtGui.QFileDialog.getOpenFileName(self,
- _(
- "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.tab_navigated(self.ui.tabWidget.currentIndex(), False)
- except Exception as e:
- self.advise(_("error parsing template file") + " - %s" % e, 2)
- else:
- self.advise(_("operation cancelled"), 1)
-
- def tab_navigated(self, i, updateTemplate=True):
- '''
- a slot called when the user navigates the tabwidget
- current tab is i
- previous tab stored in self.previousTabIndex
- '''
- if updateTemplate:
- # always true unless called following a load from file
- if self.previousTabIndex == 1:
- self.save_addy()
-
- if i == 1: # practice addy
- self.load_addy()
- elif i == 2: # users
- self.load_users()
- 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
- '''
- if i and self.confirmDataOverwrite():
- self.template = minidom.Document()
-
- def newdb_from_template_radioButton(self, i):
- '''
- user has altered the state of the newdb from template checkbox
- '''
- if i:
- self.load_template()
-
- def save_addy(self):
- '''
- save the practice address
- '''
- d = self.template.getElementsByTagName("practice")
- if d:
- d[0].parentNode.removeChild(d[0])
- foundText = False # a bool to prevent unnecessary nodes
- d = self.template.createElement("practice")
- i = 0
- for widg in self.ui.practice_frame.children():
- if isinstance(widg, QtGui.QLineEdit):
- attrib = PRACTICE_ATTRIBS[i]
- value = str(widg.text().toAscii())
- if value != "":
- foundText = True
- new_element = self.template.createElement(attrib)
- d.appendChild(new_element)
- new_element.appendChild(
- self.template.createTextNode(value))
- i += 1
- if foundText:
- self.template.childNodes[0].appendChild(d)
-
- def load_addy(self):
- '''
- load the practice address
- '''
- d = self.template.getElementsByTagName("practice")
- i = 0
- for widg in self.ui.practice_frame.children():
- if isinstance(widg, QtGui.QLineEdit):
- attrib = PRACTICE_ATTRIBS[i]
- try:
- value = \
- d[0].getElementsByTagName(attrib)[0].firstChild.data
- except IndexError:
- value = ""
- widg.setText(value)
- i += 1
-
- def nameEntered(self, arg):
- '''
- user is entering the name of a new user
- '''
- wordlist = arg.split(" ")
- inits = ""
- for word in wordlist:
- try:
- inits += word[0]
- except IndexError:
- pass
- self.ui.userInits_lineEdit.setText(inits)
-
- def add_modify_User(self):
- '''
- user has clicked the button to add a new user
- '''
- if self.ui.newUser_pushButton.text() in (
- _("Apply Now"), _("Modify Now")):
- user = om_user(self.ui)
- user.load()
- result, error = user.verifies()
- if result:
- nodelist = self.template.getElementsByTagName("users")
- if nodelist:
- d = nodelist[0]
- else:
- d = self.template.createElement("users")
- 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.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)
-
- else:
- self.ui.users_tableWidget.setCurrentCell(-1, -1)
- self.ui.user_groupBox.show()
- self.ui.userActive_checkBox.setChecked(True)
- self.ui.newUser_pushButton.setText(_("Apply Now"))
-
- def userSelected(self):
- '''
- user has navigated the users table
- '''
- if self.ui.users_tableWidget.currentRow() != -1:
- self.ui.user_groupBox.hide()
- self.ui.modifyUser_pushButton.show()
- else:
- self.ui.modifyUser_pushButton.hide()
-
- def modifyUser(self):
- '''
- modify user pushButton ha been pressed
- '''
- self.ui.newUser_pushButton.setText(_("Modify Now"))
- self.ui.modifyUser_pushButton.hide()
- selected = self.ui.users_tableWidget.selectedItems()
- tup = []
- for val in selected:
- tup.append(val.text())
- user = om_user(self.ui)
- user.fromTuple(tuple(tup))
- self.ui.user_groupBox.show()
- self.ui.userName_lineEdit.setText(user.name)
- self.ui.userInits_lineEdit.setText(user.inits)
- self.ui.userActive_checkBox.setChecked(user.active)
- try:
- 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
- '''
- users = self.template.getElementsByTagName("user")
- self.ui.users_tableWidget.setRowCount(len(users))
- rowno = 0
- for user in users:
- uclass = om_user(self)
- uclass.fromNode(user)
- colno = 0
- for val in uclass.toTuple():
- item = QtGui.QTableWidgetItem(val)
- 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.QObject.connect(self.ui.actionLoad_Template,
- QtCore.SIGNAL("triggered()"), self.load_template)
-
- QtCore.QObject.connect(self.ui.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.QObject.connect(self.ui.tabWidget,
- QtCore.SIGNAL("currentChanged(int)"), self.tab_navigated)
-
- QtCore.QObject.connect(self.ui.userName_lineEdit,
- QtCore.SIGNAL("textChanged (const QString&)"), self.nameEntered)
-
- QtCore.QObject.connect(self.ui.newUser_pushButton,
- QtCore.SIGNAL("clicked()"), self.add_modify_User)
-
- QtCore.QObject.connect(self.ui.users_tableWidget,
- QtCore.SIGNAL("itemSelectionChanged()"), self.userSelected)
-
- QtCore.QObject.connect(self.ui.users_tableWidget,
- QtCore.SIGNAL(
- "itemDoubleClicked (QTableWidgetItem *)"),
- self.modifyUser)
-
- QtCore.QObject.connect(self.ui.modifyUser_pushButton,
- QtCore.SIGNAL("clicked()"), self.modifyUser)
-
- QtCore.QObject.connect(self.ui.userActive_checkBox,
- QtCore.SIGNAL("stateChanged (int)"), self.handleUserActive)
-
-
-def main(args):
- app = QtGui.QApplication(args)
- ui = setup_gui(app)
- ui.show()
- sys.exit(app.exec_())
-
-
-if __name__ == "__main__":
-
- main(sys.argv)
diff --git a/src/openmolar/qt4gui/tools/recordtools.py b/src/openmolar/qt4gui/tools/recordtools.py
deleted file mode 100644
index 8429205..0000000
--- a/src/openmolar/qt4gui/tools/recordtools.py
+++ /dev/null
@@ -1,381 +0,0 @@
-#! /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 re
-from PyQt4 import QtGui, QtCore
-
-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')
-
-
-class recordTools(Ui_record_tools.Ui_Dialog):
-
- def __init__(self, om_gui):
- self.om_gui = om_gui
- self.dialog = QtGui.QDialog(om_gui)
- self.setupUi(self.dialog)
- self.tabWidget.setCurrentIndex(0)
- self.initialMoney()
- self.initialDates()
- self.chartplan_lineEdits = {}
- self.initialPlan()
- self.chartcompleted_lineEdits = {}
- self.initialCompleted()
- self.initialHidden_notes()
- self.signals()
-
- def initialMoney(self):
- '''
- loads the money at startup
- '''
- self.total_label.setText(localsettings.formatMoney(
- self.om_gui.pt.fees))
-
- self.money0_spinBox.setValue(self.om_gui.pt.money0)
- self.money1_spinBox.setValue(self.om_gui.pt.money1)
- self.money2_spinBox.setValue(self.om_gui.pt.money2)
- self.money3_spinBox.setValue(self.om_gui.pt.money3)
- self.money4_spinBox.setValue(self.om_gui.pt.money4)
- self.money5_spinBox.setValue(self.om_gui.pt.money5)
- self.money6_spinBox.setValue(self.om_gui.pt.money6)
- self.money7_spinBox.setValue(self.om_gui.pt.money7)
- self.money8_spinBox.setValue(self.om_gui.pt.money8)
- self.money9_spinBox.setValue(self.om_gui.pt.money9)
- self.money10_spinBox.setValue(self.om_gui.pt.money10)
- self.money11_spinBox.setValue(self.om_gui.pt.money11)
-
- def updateMoneyTotal(self, arg=0):
- '''
- 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.total_label.setText(localsettings.formatMoney(fees))
-
- def changeMoney(self):
- '''
- modify the money fields on a patient record
- '''
- self.om_gui.pt.money0 = self.money0_spinBox.value()
- self.om_gui.pt.money1 = self.money1_spinBox.value()
- self.om_gui.pt.money2 = self.money2_spinBox.value()
- self.om_gui.pt.money3 = self.money3_spinBox.value()
- self.om_gui.pt.money4 = self.money4_spinBox.value()
- self.om_gui.pt.money5 = self.money5_spinBox.value()
- self.om_gui.pt.money6 = self.money6_spinBox.value()
- self.om_gui.pt.money7 = self.money7_spinBox.value()
- self.om_gui.pt.money8 = self.money8_spinBox.value()
- self.om_gui.pt.money9 = self.money9_spinBox.value()
- self.om_gui.pt.money10 = self.money10_spinBox.value()
- self.om_gui.pt.money11 = self.money11_spinBox.value()
-
- self.om_gui.updateDetails()
- self.om_gui.advise(_("money changes applied"), 1)
-
- def initialDates(self):
- '''
- modify Date fields
- '''
- try:
- self.pd5_dateEdit.setDate(self.om_gui.pt.pd5)
- self.pd5_pushButton.hide()
- except TypeError:
- self.pd5_dateEdit.hide()
- QtCore.QObject.connect(self.pd5_pushButton,
- QtCore.SIGNAL("clicked()"), self.pd5_dateEdit.show)
-
- try:
- self.pd6_dateEdit.setDate(self.om_gui.pt.pd6)
- self.pd6_pushButton.hide()
- except TypeError:
- self.pd6_dateEdit.hide()
- QtCore.QObject.connect(self.pd6_pushButton,
- QtCore.SIGNAL("clicked()"), self.pd6_dateEdit.show)
-
- try:
- self.pd7_dateEdit.setDate(self.om_gui.pt.pd7)
- self.pd7_pushButton.hide()
- except TypeError:
- self.pd7_dateEdit.hide()
- QtCore.QObject.connect(self.pd7_pushButton,
- QtCore.SIGNAL("clicked()"), self.pd7_dateEdit.show)
-
- try:
- self.pd8_dateEdit.setDate(self.om_gui.pt.pd8)
- self.pd8_pushButton.hide()
- except TypeError:
- self.pd8_dateEdit.hide()
- QtCore.QObject.connect(self.pd8_pushButton,
- QtCore.SIGNAL("clicked()"), self.pd8_dateEdit.show)
-
- try:
- self.pd9_dateEdit.setDate(self.om_gui.pt.pd9)
- self.pd9_pushButton.hide()
- except TypeError:
- self.pd9_dateEdit.hide()
- QtCore.QObject.connect(self.pd9_pushButton,
- QtCore.SIGNAL("clicked()"), self.pd9_dateEdit.show)
-
- try:
- self.pd10_dateEdit.setDate(self.om_gui.pt.pd10)
- self.pd10_pushButton.hide()
- except TypeError:
- self.pd10_dateEdit.hide()
- QtCore.QObject.connect(self.pd10_pushButton,
- QtCore.SIGNAL("clicked()"), self.pd10_dateEdit.show)
-
- try:
- self.billdate_dateEdit.setDate(self.om_gui.pt.billdate)
- self.billdate_pushButton.hide()
- except TypeError:
- self.billdate_dateEdit.hide()
- QtCore.QObject.connect(self.billdate_pushButton,
- QtCore.SIGNAL("clicked()"), self.billdate_dateEdit.show)
-
- def changeDates(self):
- '''
- apply date changes
- '''
- if self.pd5_dateEdit.isVisible():
- self.om_gui.pt.pd5 = self.pd5_dateEdit.date().toPyDate()
- if self.pd6_dateEdit.isVisible():
- self.om_gui.pt.pd6 = self.pd6_dateEdit.date().toPyDate()
- if self.pd7_dateEdit.isVisible():
- self.om_gui.pt.pd7 = self.pd7_dateEdit.date().toPyDate()
- if self.pd8_dateEdit.isVisible():
- self.om_gui.pt.pd8 = self.pd8_dateEdit.date().toPyDate()
- if self.pd9_dateEdit.isVisible():
- self.om_gui.pt.pd9 = self.pd9_dateEdit.date().toPyDate()
- if self.pd10_dateEdit.isVisible():
- 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.om_gui.updateDetails()
- self.om_gui.advise(_("date changes applied"), 1)
-
- def initialPlan(self):
- '''
- set up the plan page
- '''
- glayout = QtGui.QGridLayout(self.chartplan_frame)
- # 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"))
-
- glayout.addWidget(label, row, 0)
- glayout.addWidget(self.chartplan_lineEdits[tooth], row, 1)
- row += 1
-
- self.xraypl_lineEdit.setText(self.om_gui.pt.treatment_course.xraypl)
- 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.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)
- self.odlpl_lineEdit.setText(self.om_gui.pt.treatment_course.odlpl)
-
- def planEntryCheck(self, le):
- '''
- does a quick check on anything entered
- takes a Line Edit as arg, returns a python string
- '''
- vals = str(le.text().toAscii()).upper().split(" ")
- retarg = ""
- for val in vals:
- if not val in ("", " "):
- retarg += val.upper()
- return retarg
-
- def dentureEntry(self, le):
- '''
- denture lines include spaces
- '''
- return str(le.text().toAscii()).upper()
-
- def changePlan(self):
- '''
- apply date changes
- '''
- for tooth in TEETH:
- self.om_gui.pt.treatment_course.__dict__[tooth + "pl"] = \
- self.planEntryCheck(self.chartplan_lineEdits[tooth])
-
- course = self.om_gui.pt.treatment_course
- course.xraypl = self.planEntryCheck(self.xraypl_lineEdit)
- course.periopl = self.planEntryCheck(self.periopl_lineEdit)
- course.anaespl = self.planEntryCheck(self.anaespl_lineEdit)
- course.custompl = self.planEntryCheck(self.custompl_lineEdit)
- course.ndupl = self.dentureEntry(self.ndupl_lineEdit)
- course.ndlpl = self.dentureEntry(self.ndlpl_lineEdit)
- course.odupl = self.dentureEntry(self.odupl_lineEdit)
- course.odlpl = self.dentureEntry(self.odlpl_lineEdit)
- self.om_gui.advise(_("plan changes applied"), 1)
-
- def initialCompleted(self):
- '''
- set up the plan page
- '''
- glayout = QtGui.QGridLayout(self.chartcompleted_frame)
- # 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"))
-
- glayout.addWidget(label, row, 0)
- glayout.addWidget(self.chartcompleted_lineEdits[tooth], row, 1)
- row += 1
-
- course = self.om_gui.pt.treatment_course
- self.xraycmp_lineEdit.setText(course.xraycmp)
- self.periocmp_lineEdit.setText(course.periocmp)
- self.anaescmp_lineEdit.setText(course.anaescmp)
- self.othercmp_lineEdit.setText(course.othercmp)
- self.customcmp_lineEdit.setText(course.customcmp)
- self.nducmp_lineEdit.setText(course.nducmp)
- self.ndlcmp_lineEdit.setText(course.ndlcmp)
- self.oducmp_lineEdit.setText(course.oducmp)
- self.odlcmp_lineEdit.setText(course.odlcmp)
-
- def changeCompleted(self):
- '''
- apply date changes
- '''
- for tooth in TEETH:
- 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)
- course.periocmp = self.planEntryCheck(self.periocmp_lineEdit)
- course.anaescmp = self.planEntryCheck(self.anaescmp_lineEdit)
- course.customcmp = self.planEntryCheck(self.customcmp_lineEdit)
- course.nducmp = self.dentureEntry(self.nducmp_lineEdit)
- course.ndlcmp = self.dentureEntry(self.ndlcmp_lineEdit)
- course.oducmp = self.dentureEntry(self.oducmp_lineEdit)
- course.odlcmp = self.dentureEntry(self.odlcmp_lineEdit)
- self.om_gui.advise(_("completed treatment changes applied"), 1)
-
- def initialHidden_notes(self):
- '''
- load the patients hidden notes
- '''
- self.hidden_notes_tableWidget.clear()
- self.hidden_notes_tableWidget.setColumnCount(2)
- self.hidden_notes_tableWidget.setRowCount(
- len(self.om_gui.pt.HIDDENNOTES))
- header = self.hidden_notes_tableWidget.horizontalHeader()
- self.hidden_notes_tableWidget.setHorizontalHeaderLabels(
- ["type", "note"])
- header.setStretchLastSection(True)
- for row_no, (ntype, note) in enumerate(self.om_gui.pt.HIDDENNOTES):
- ntype_item = QtGui.QTableWidgetItem(ntype)
- self.hidden_notes_tableWidget.setItem(row_no, 0, ntype_item)
-
- note_item = QtGui.QTableWidgetItem(note)
- self.hidden_notes_tableWidget.setItem(row_no, 1, note_item)
-
- def changeHidden_notes(self):
- '''
- apply new notes
- '''
- HN = []
- for row_no in range(self.hidden_notes_tableWidget.rowCount()):
- ntype = self.hidden_notes_tableWidget.item(row_no, 0).text()
- 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)
-
- def signals(self):
- '''
- connect signals
- '''
- for widg in self.money_scrollAreaWidgetContents.children():
- if isinstance(widg, QtGui.QSpinBox):
- QtCore.QObject.connect(widg,
- QtCore.SIGNAL("valueChanged (int)"), self.updateMoneyTotal)
-
- QtCore.QObject.connect(self.money_pushButton,
- QtCore.SIGNAL("clicked()"), self.changeMoney)
-
- QtCore.QObject.connect(self.dates_pushButton,
- QtCore.SIGNAL("clicked()"), self.changeDates)
-
- QtCore.QObject.connect(self.plan_pushButton,
- QtCore.SIGNAL("clicked()"), self.changePlan)
-
- QtCore.QObject.connect(self.completed_pushButton,
- QtCore.SIGNAL("clicked()"), self.changeCompleted)
-
- QtCore.QObject.connect(self.hidden_notes_pushButton,
- QtCore.SIGNAL("clicked()"), self.changeHidden_notes)
-
- def exec_(self):
- self.dialog.exec_()
-
-if __name__ == "__main__":
- localsettings.initiate()
- localsettings.loadFeeTables()
- import sys
- from openmolar.qt4gui import maingui
- app = QtGui.QApplication(sys.argv)
- om_gui = maingui.OpenmolarGui()
- om_gui.getrecord(1)
- om_gui.pt.HIDDENNOTES = [
- ('COURSE OPENED', '= = = = = '),
- ('TC: EXAM', 'CE')
- ]
-
- ui = recordTools(om_gui)
- ui.exec_()
- sys.exit(app.exec_())
diff --git a/src/openmolar/resources/demodump.sql b/src/openmolar/resources/demodump.sql
deleted file mode 100644
index 2e2479f..0000000
--- a/src/openmolar/resources/demodump.sql
+++ /dev/null
@@ -1,1306 +0,0 @@
--- MySQL dump 10.13 Distrib 5.1.41, for debian-linux-gnu (x86_64)
---
--- Host: localhost Database: openmolar_demo
--- ------------------------------------------------------
--- Server version 5.1.41-3ubuntu12.1
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `aday`
---
-
-DROP TABLE IF EXISTS `aday`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `aday` (
- `adate` date NOT NULL DEFAULT '0000-00-00',
- `apptix` smallint(6) NOT NULL DEFAULT '0',
- `start` smallint(6) DEFAULT NULL,
- `end` smallint(6) DEFAULT NULL,
- `maxtime` smallint(6) DEFAULT NULL,
- `flag` tinyint(4) DEFAULT NULL,
- `memo` char(30) DEFAULT NULL,
- `stn` tinyint(4) DEFAULT NULL,
- `ver` tinyint(4) DEFAULT NULL,
- PRIMARY KEY (`adate`,`apptix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `aday`
---
-
-LOCK TABLES `aday` WRITE;
-/*!40000 ALTER TABLE `aday` DISABLE KEYS */;
-INSERT INTO `aday` VALUES ('2010-05-01',4,0,1800,NULL,0,'',NULL,NULL),('2010-05-01',5,0,1800,NULL,0,'',NULL,NULL),('2010-05-01',6,0,1800,NULL,0,'',NULL,NULL),('2010-05-01',7,0,1800,NULL,0,'',NULL,NULL),('2010-05-02',4,0,1800,NULL,0,'',NULL,NULL),('2010-05-02',5,0,1800,NULL,0,'',NULL,NULL),('2010-05-02',6,0,1800,NULL,0,'',NULL,NULL),('2010-05-02',7,0,1800,NULL,0,'',NULL,NULL),('2010-05-03',0,830,1800,NULL,NULL,'DTS closed today',NULL,NULL),('2010-05-03',4,1300,1800,NULL,1,'',NULL,NULL),(' [...]
-/*!40000 ALTER TABLE `aday` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `apr`
---
-
-DROP TABLE IF EXISTS `apr`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `apr` (
- `serialno` int(11) NOT NULL DEFAULT '0',
- `aprix` tinyint(4) NOT NULL DEFAULT '0',
- `practix` smallint(6) DEFAULT NULL,
- `code0` char(8) DEFAULT NULL,
- `code1` char(8) DEFAULT NULL,
- `code2` char(8) DEFAULT NULL,
- `note` char(20) DEFAULT NULL,
- `adate` date DEFAULT NULL,
- `atime` smallint(6) DEFAULT NULL,
- `length` smallint(6) DEFAULT NULL,
- `flag0` tinyint(4) DEFAULT NULL,
- `flag1` tinyint(4) DEFAULT NULL,
- `flag2` tinyint(4) DEFAULT NULL,
- `flag3` tinyint(4) DEFAULT NULL,
- `flag4` tinyint(4) DEFAULT NULL,
- `datespec` char(10) DEFAULT NULL,
- PRIMARY KEY (`serialno`,`aprix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `apr`
---
-
-LOCK TABLES `apr` WRITE;
-/*!40000 ALTER TABLE `apr` DISABLE KEYS */;
-INSERT INTO `apr` VALUES (1,1,4,'EXAM','','','','2009-04-06',945,20,0,80,0,0,0,''),(1,2,4,'CR PREP','','','','2009-05-05',915,60,0,80,0,0,0,''),(1,3,4,'CR FIT','FILL','','',NULL,0,30,0,80,0,0,0,'+14'),(1,4,6,'SP','','','nw patient','2009-05-26',1200,30,1,80,0,0,0,''),(3,1,6,'SP','','','',NULL,NULL,30,1,80,0,0,0,''),(4,1,4,'EXAM','','','new patient','2009-07-01',1130,15,1,73,0,0,0,'');
-/*!40000 ALTER TABLE `apr` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `aslot`
---
-
-DROP TABLE IF EXISTS `aslot`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `aslot` (
- `adate` date DEFAULT NULL,
- `apptix` smallint(6) DEFAULT NULL,
- `start` smallint(6) DEFAULT NULL,
- `end` smallint(6) DEFAULT NULL,
- `name` char(30) DEFAULT NULL,
- `serialno` int(11) DEFAULT NULL,
- `code0` char(8) DEFAULT NULL,
- `code1` char(8) DEFAULT NULL,
- `code2` char(8) DEFAULT NULL,
- `note` char(20) DEFAULT NULL,
- `flag0` tinyint(4) DEFAULT NULL,
- `flag1` tinyint(4) DEFAULT NULL,
- `flag2` tinyint(4) DEFAULT NULL,
- `flag3` tinyint(4) DEFAULT NULL,
- `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- KEY `adate` (`adate`,`apptix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `aslot`
---
-
-LOCK TABLES `aslot` WRITE;
-/*!40000 ALTER TABLE `aslot` DISABLE KEYS */;
-INSERT INTO `aslot` VALUES ('2010-05-03',6,1300,1400,'LUNCH',0,'','','','',-128,0,0,0,'0000-00-00 00:00:00'),('2010-05-04',6,1300,1400,'LUNCH',0,'','','','',-128,0,0,0,'0000-00-00 00:00:00'),('2010-05-05',6,1300,1400,'LUNCH',0,'','','','',-128,0,0,0,'0000-00-00 00:00:00'),('2010-05-06',6,1300,1400,'LUNCH',0,'','','','',-128,0,0,0,'0000-00-00 00:00:00'),('2010-05-10',6,1300,1400,'LUNCH',0,'','','','',-128,0,0,0,'0000-00-00 00:00:00'),('2010-05-11',6,1300,1400,'LUNCH',0,'','','','',-128,0, [...]
-/*!40000 ALTER TABLE `aslot` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `bpe`
---
-
-DROP TABLE IF EXISTS `bpe`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `bpe` (
- `serialno` int(11) NOT NULL DEFAULT '0',
- `bpedate` date NOT NULL DEFAULT '0000-00-00',
- `bpe` char(6) DEFAULT NULL,
- PRIMARY KEY (`serialno`,`bpedate`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `bpe`
---
-
-LOCK TABLES `bpe` WRITE;
-/*!40000 ALTER TABLE `bpe` DISABLE KEYS */;
-INSERT INTO `bpe` VALUES (1,'2004-04-15','444344'),(1,'2009-05-07','_____3');
-/*!40000 ALTER TABLE `bpe` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `calendar`
---
-
-DROP TABLE IF EXISTS `calendar`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `calendar` (
- `adate` date NOT NULL,
- `memo` char(30) DEFAULT NULL,
- PRIMARY KEY (`adate`),
- KEY `adate` (`adate`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `calendar`
---
-
-LOCK TABLES `calendar` WRITE;
-/*!40000 ALTER TABLE `calendar` DISABLE KEYS */;
-INSERT INTO `calendar` VALUES ('2009-12-25','Christmas Day'),('2009-12-26','Boxing Day'),('2009-01-01','New Year\'s Day'),('2009-01-25','Burn\'s Night'),('2009-04-10','GoodFriday'),('2009-05-04','May Bank Holiday'),('2009-05-25','Spring Bank Holiday'),('2009-08-03','Summer Bank Holiday'),('2009-12-28','in lieu of Boxing Day'),('2010-12-26','Boxing Day'),('2010-12-25','Christmas Day'),('2010-01-01','New Year\'s Day'),('2010-01-04','in Lieu of January 2'),('2010-05-03','May Bank Holiday'), [...]
-/*!40000 ALTER TABLE `calendar` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `calldurr`
---
-
-DROP TABLE IF EXISTS `calldurr`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `calldurr` (
- `stn` tinyint(4) NOT NULL DEFAULT '0',
- `serialno` int(11) DEFAULT NULL,
- PRIMARY KEY (`stn`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `calldurr`
---
-
-LOCK TABLES `calldurr` WRITE;
-/*!40000 ALTER TABLE `calldurr` DISABLE KEYS */;
-/*!40000 ALTER TABLE `calldurr` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `cashbook`
---
-
-DROP TABLE IF EXISTS `cashbook`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `cashbook` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `cbdate` date DEFAULT NULL,
- `ref` char(10) DEFAULT NULL,
- `linkid` int(11) DEFAULT NULL,
- `descr` varchar(32) DEFAULT NULL,
- `code` tinyint(3) unsigned DEFAULT NULL,
- `dntid` smallint(6) DEFAULT NULL,
- `amt` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`),
- KEY `date` (`cbdate`),
- KEY `ref` (`ref`)
-) ENGINE=InnoDB AUTO_INCREMENT=112372 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `cashbook`
---
-
-LOCK TABLES `cashbook` WRITE;
-/*!40000 ALTER TABLE `cashbook` DISABLE KEYS */;
-INSERT INTO `cashbook` VALUES (37424,'1996-06-14','000001',0,'MOLAR O',1,2,1076),(40664,'1996-12-23','000001',0,'MOLAR O',1,2,416),(51621,'1998-10-07','000001',0,'MOLAR O',1,4,2108),(54730,'1999-06-28','000001',0,'MOLAR O',1,4,1064),(55284,'1999-08-05','000001',0,'MOLAR O',7,4,7300),(58957,'2000-04-28','000001',0,'MOLAR O',2,4,1175),(63432,'2001-03-23','000001',0,'MOLAR O',2,4,3150),(70944,'2002-07-01','000001',0,'MOLAR O',2,4,3300),(90356,'2005-03-08','000001',0,'MOLAR O',2,4,4200),(976 [...]
-/*!40000 ALTER TABLE `cashbook` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `cbcodes`
---
-
-DROP TABLE IF EXISTS `cbcodes`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `cbcodes` (
- `code` tinyint(3) unsigned DEFAULT NULL,
- `flag` tinyint(4) DEFAULT NULL,
- `descr` char(20) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `cbcodes`
---
-
-LOCK TABLES `cbcodes` WRITE;
-/*!40000 ALTER TABLE `cbcodes` DISABLE KEYS */;
-INSERT INTO `cbcodes` VALUES (0,2,'DPB'),(1,2,'NHS CASH'),(2,2,'PRIVATE CASH'),(3,2,'NHS CHEQUE'),(4,2,'PRIVATE CHEQUE'),(5,2,'NHS CREDIT CARD'),(6,2,'PRIVATE CREDIT CARD'),(7,2,'NHS SWITCH CARD'),(8,2,'PRIVATE SWITCH CARD'),(9,0,''),(10,0,''),(11,0,''),(12,0,''),(13,1,'HIGHLAND DENTAL PLAN'),(14,2,'SUNDRIES CASH'),(15,2,'SUNDRIES CHEQUE'),(16,2,'SUNDRIES SWITCH'),(17,2,'SUNDRIES CREDIT CARD'),(18,3,'SUNDRIES'),(19,0,''),(20,0,''),(21,3,'ANNUAL HDPS'),(22,0,''),(23,0,''),(24,3,'OTHER'),( [...]
-/*!40000 ALTER TABLE `cbcodes` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `claims`
---
-
-DROP TABLE IF EXISTS `claims`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `claims` (
- `courseno` int(11) NOT NULL DEFAULT '0',
- `serialno` int(11) NOT NULL DEFAULT '0',
- `dntix` smallint(6) DEFAULT '0',
- `proddate` date DEFAULT NULL,
- `startdate` date DEFAULT NULL,
- `cmpldate` date DEFAULT NULL,
- `regdate` date DEFAULT NULL,
- `authdate` date DEFAULT NULL,
- `dob` date DEFAULT NULL,
- `sname` varchar(30) DEFAULT NULL,
- `fname` varchar(30) DEFAULT NULL,
- `addr1` varchar(30) DEFAULT NULL,
- `addr2` varchar(30) DEFAULT NULL,
- `addr3` varchar(30) DEFAULT NULL,
- `pcde` varchar(30) DEFAULT NULL,
- `nhsno` varchar(30) DEFAULT NULL,
- `prevsname` varchar(30) DEFAULT NULL,
- `exempttext` varchar(50) DEFAULT NULL,
- `i0` int(11) DEFAULT '0',
- `i1` int(11) DEFAULT '0',
- `i2` int(11) DEFAULT '0',
- `i3` int(11) DEFAULT '0',
- `i4` int(11) DEFAULT '0',
- `f0` tinyint(3) unsigned DEFAULT '0',
- `f1` tinyint(3) unsigned DEFAULT '0',
- `f2` tinyint(3) unsigned DEFAULT '0',
- `f3` tinyint(3) unsigned DEFAULT '0',
- `f4` tinyint(3) unsigned DEFAULT '0',
- `f5` tinyint(3) unsigned DEFAULT '0',
- `f6` tinyint(3) unsigned DEFAULT '0',
- `f7` tinyint(3) unsigned DEFAULT '0',
- `f8` tinyint(3) unsigned DEFAULT '0',
- `f9` tinyint(3) unsigned DEFAULT '0',
- `submstatus` tinyint(4) DEFAULT '0',
- `submcount` tinyint(4) DEFAULT '0',
- `submno` int(11) DEFAULT '0',
- `claimdata` blob,
- `trtdata` blob,
- `archdate` date DEFAULT NULL,
- `town` varchar(30) DEFAULT NULL,
- `county` varchar(30) DEFAULT NULL,
- `regtype` tinyint(3) unsigned DEFAULT '0',
- PRIMARY KEY (`serialno`,`courseno`),
- KEY `dentist` (`dntix`),
- KEY `patient` (`sname`,`fname`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `claims`
---
-
-LOCK TABLES `claims` WRITE;
-/*!40000 ALTER TABLE `claims` DISABLE KEYS */;
-/*!40000 ALTER TABLE `claims` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `clinical_memos`
---
-
-DROP TABLE IF EXISTS `clinical_memos`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `clinical_memos` (
- `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `serialno` int(11) unsigned NOT NULL,
- `author` char(8) DEFAULT NULL,
- `datestamp` datetime NOT NULL,
- `hidden` tinyint(1) NOT NULL DEFAULT '0',
- `synopsis` text,
- PRIMARY KEY (`ix`),
- KEY `serialno` (`serialno`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `clinical_memos`
---
-
-LOCK TABLES `clinical_memos` WRITE;
-/*!40000 ALTER TABLE `clinical_memos` DISABLE KEYS */;
-/*!40000 ALTER TABLE `clinical_memos` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `currtrtmt`
---
-
-DROP TABLE IF EXISTS `currtrtmt`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `currtrtmt` (
- `serialno` int(11) NOT NULL,
- `courseno` int(11) NOT NULL,
- `xraypl` varchar(56) DEFAULT NULL,
- `periopl` varchar(56) DEFAULT NULL,
- `anaespl` varchar(56) DEFAULT NULL,
- `otherpl` varchar(56) DEFAULT NULL,
- `ndupl` varchar(56) DEFAULT NULL,
- `ndlpl` varchar(56) DEFAULT NULL,
- `odupl` varchar(56) DEFAULT NULL,
- `odlpl` varchar(56) DEFAULT NULL,
- `xraycmp` varchar(56) DEFAULT NULL,
- `periocmp` varchar(56) DEFAULT NULL,
- `anaescmp` varchar(56) DEFAULT NULL,
- `othercmp` varchar(56) DEFAULT NULL,
- `nducmp` varchar(56) DEFAULT NULL,
- `ndlcmp` varchar(56) DEFAULT NULL,
- `oducmp` varchar(56) DEFAULT NULL,
- `odlcmp` varchar(56) DEFAULT NULL,
- `ur8pl` varchar(34) DEFAULT NULL,
- `ur7pl` varchar(34) DEFAULT NULL,
- `ur6pl` varchar(34) DEFAULT NULL,
- `ur5pl` varchar(34) DEFAULT NULL,
- `ur4pl` varchar(34) DEFAULT NULL,
- `ur3pl` varchar(34) DEFAULT NULL,
- `ur2pl` varchar(34) DEFAULT NULL,
- `ur1pl` varchar(34) DEFAULT NULL,
- `ul1pl` varchar(34) DEFAULT NULL,
- `ul2pl` varchar(34) DEFAULT NULL,
- `ul3pl` varchar(34) DEFAULT NULL,
- `ul4pl` varchar(34) DEFAULT NULL,
- `ul5pl` varchar(34) DEFAULT NULL,
- `ul6pl` varchar(34) DEFAULT NULL,
- `ul7pl` varchar(34) DEFAULT NULL,
- `ul8pl` varchar(34) DEFAULT NULL,
- `ll8pl` varchar(34) DEFAULT NULL,
- `ll7pl` varchar(34) DEFAULT NULL,
- `ll6pl` varchar(34) DEFAULT NULL,
- `ll5pl` varchar(34) DEFAULT NULL,
- `ll4pl` varchar(34) DEFAULT NULL,
- `ll3pl` varchar(34) DEFAULT NULL,
- `ll2pl` varchar(34) DEFAULT NULL,
- `ll1pl` varchar(34) DEFAULT NULL,
- `lr1pl` varchar(34) DEFAULT NULL,
- `lr2pl` varchar(34) DEFAULT NULL,
- `lr3pl` varchar(34) DEFAULT NULL,
- `lr4pl` varchar(34) DEFAULT NULL,
- `lr5pl` varchar(34) DEFAULT NULL,
- `lr6pl` varchar(34) DEFAULT NULL,
- `lr7pl` varchar(34) DEFAULT NULL,
- `lr8pl` varchar(34) DEFAULT NULL,
- `ur8cmp` varchar(34) DEFAULT NULL,
- `ur7cmp` varchar(34) DEFAULT NULL,
- `ur6cmp` varchar(34) DEFAULT NULL,
- `ur5cmp` varchar(34) DEFAULT NULL,
- `ur4cmp` varchar(34) DEFAULT NULL,
- `ur3cmp` varchar(34) DEFAULT NULL,
- `ur2cmp` varchar(34) DEFAULT NULL,
- `ur1cmp` varchar(34) DEFAULT NULL,
- `ul1cmp` varchar(34) DEFAULT NULL,
- `ul2cmp` varchar(34) DEFAULT NULL,
- `ul3cmp` varchar(34) DEFAULT NULL,
- `ul4cmp` varchar(34) DEFAULT NULL,
- `ul5cmp` varchar(34) DEFAULT NULL,
- `ul6cmp` varchar(34) DEFAULT NULL,
- `ul7cmp` varchar(34) DEFAULT NULL,
- `ul8cmp` varchar(34) DEFAULT NULL,
- `ll8cmp` varchar(34) DEFAULT NULL,
- `ll7cmp` varchar(34) DEFAULT NULL,
- `ll6cmp` varchar(34) DEFAULT NULL,
- `ll5cmp` varchar(34) DEFAULT NULL,
- `ll4cmp` varchar(34) DEFAULT NULL,
- `ll3cmp` varchar(34) DEFAULT NULL,
- `ll2cmp` varchar(34) DEFAULT NULL,
- `ll1cmp` varchar(34) DEFAULT NULL,
- `lr1cmp` varchar(34) DEFAULT NULL,
- `lr2cmp` varchar(34) DEFAULT NULL,
- `lr3cmp` varchar(34) DEFAULT NULL,
- `lr4cmp` varchar(34) DEFAULT NULL,
- `lr5cmp` varchar(34) DEFAULT NULL,
- `lr6cmp` varchar(34) DEFAULT NULL,
- `lr7cmp` varchar(34) DEFAULT NULL,
- `lr8cmp` varchar(34) DEFAULT NULL,
- `examt` varchar(10) DEFAULT NULL,
- `examd` date DEFAULT NULL,
- `accd` date DEFAULT NULL,
- `cmpd` date DEFAULT NULL,
- `custompl` varchar(56) DEFAULT NULL,
- `customcmp` varchar(56) DEFAULT NULL,
- PRIMARY KEY (`serialno`,`courseno`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `currtrtmt`
---
-
-LOCK TABLES `currtrtmt` WRITE;
-/*!40000 ALTER TABLE `currtrtmt` DISABLE KEYS */;
-INSERT INTO `currtrtmt` VALUES (1,147660,'2S 2S ','SP','','','','','','','','','','','','','','','','CR,GO ','','','','P ','','','','MI ','','','','DO ','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','CE','2009-05-24','2009-04-06','2009-05-25','',''),(1,147670,'','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','' [...]
-/*!40000 ALTER TABLE `currtrtmt` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `daybook`
---
-
-DROP TABLE IF EXISTS `daybook`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `daybook` (
- `date` date DEFAULT NULL,
- `serialno` int(11) DEFAULT NULL,
- `coursetype` char(1) DEFAULT NULL,
- `dntid` smallint(6) DEFAULT NULL,
- `trtid` smallint(6) DEFAULT NULL,
- `diagn` varchar(56) DEFAULT NULL,
- `perio` varchar(56) DEFAULT NULL,
- `anaes` varchar(56) DEFAULT NULL,
- `misc` varchar(56) DEFAULT NULL,
- `ndu` varchar(56) DEFAULT NULL,
- `ndl` varchar(56) DEFAULT NULL,
- `odu` varchar(56) DEFAULT NULL,
- `odl` varchar(56) DEFAULT NULL,
- `other` varchar(56) DEFAULT NULL,
- `chart` blob,
- `feesa` int(11) DEFAULT NULL,
- `feesb` int(11) DEFAULT NULL,
- `feesc` int(11) DEFAULT NULL,
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- PRIMARY KEY (`id`),
- KEY `date` (`date`),
- KEY `serialno` (`serialno`)
-) ENGINE=InnoDB AUTO_INCREMENT=287212 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `daybook`
---
-
-LOCK TABLES `daybook` WRITE;
-/*!40000 ALTER TABLE `daybook` DISABLE KEYS */;
-INSERT INTO `daybook` VALUES ('1996-06-14',1,'N',2,2,'CE ','SP ','','','','','','','','\0',1345,1076,0,107466),('1996-12-23',1,'N',2,2,'CE ','','','','','','','','','\0',520,416,0,117803),('1997-11-07',1,'N',2,2,'CE ','SP ','','','','','','','','\0',1390,1112,0,135436),('1997-11-21',1,'N',2,2,'','','','','','','','','','UR4 DO,PR LR6 DO,PR \0',3190,-1112,0,136327),('1998-10-07',1,'N',4,4,'CE ','','','','','','','','','LL7 MODL,PR \0',2635,0,0,151382),('1999-06-28',1,'N',4,4,'CE 2S ',' [...]
-/*!40000 ALTER TABLE `daybook` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `docsimported`
---
-
-DROP TABLE IF EXISTS `docsimported`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `docsimported` (
- `ix` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
- `serialno` int(11) unsigned NOT NULL DEFAULT '0',
- `datatype` varchar(60) NOT NULL DEFAULT 'application/octet-stream',
- `name` varchar(120) NOT NULL DEFAULT '',
- `size` bigint(20) unsigned NOT NULL DEFAULT '1024',
- `filedate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
- `importime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- PRIMARY KEY (`ix`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `docsimported`
---
-
-LOCK TABLES `docsimported` WRITE;
-/*!40000 ALTER TABLE `docsimported` DISABLE KEYS */;
-/*!40000 ALTER TABLE `docsimported` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `docsimporteddata`
---
-
-DROP TABLE IF EXISTS `docsimporteddata`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `docsimporteddata` (
- `ix` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
- `masterid` mediumint(8) unsigned NOT NULL DEFAULT '0',
- `filedata` blob NOT NULL,
- PRIMARY KEY (`ix`),
- KEY `master_idx` (`masterid`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `docsimporteddata`
---
-
-LOCK TABLES `docsimporteddata` WRITE;
-/*!40000 ALTER TABLE `docsimporteddata` DISABLE KEYS */;
-/*!40000 ALTER TABLE `docsimporteddata` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `exemptions`
---
-
-DROP TABLE IF EXISTS `exemptions`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `exemptions` (
- `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `serialno` int(11) unsigned NOT NULL,
- `exemption` varchar(10) DEFAULT NULL,
- `exempttext` varchar(50) DEFAULT NULL,
- `datestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
- PRIMARY KEY (`ix`),
- KEY `serialno` (`serialno`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `exemptions`
---
-
-LOCK TABLES `exemptions` WRITE;
-/*!40000 ALTER TABLE `exemptions` DISABLE KEYS */;
-/*!40000 ALTER TABLE `exemptions` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `families`
---
-
-DROP TABLE IF EXISTS `families`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `families` (
- `familyno` int(11) NOT NULL,
- `head` int(11) DEFAULT NULL,
- PRIMARY KEY (`familyno`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `families`
---
-
-LOCK TABLES `families` WRITE;
-/*!40000 ALTER TABLE `families` DISABLE KEYS */;
-/*!40000 ALTER TABLE `families` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `feetable_key`
---
-
-DROP TABLE IF EXISTS `feetable_key`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `feetable_key` (
- `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `tablename` char(30) DEFAULT NULL,
- `categories` char(30) DEFAULT NULL,
- `description` char(60) DEFAULT NULL,
- `startdate` date DEFAULT NULL,
- `enddate` date DEFAULT NULL,
- `feecoltypes` tinytext,
- `in_use` tinyint(1) NOT NULL DEFAULT '1',
- `display_order` smallint(6) DEFAULT NULL,
- `data` mediumtext,
- PRIMARY KEY (`ix`)
-) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `feetable_key`
---
-
-LOCK TABLES `feetable_key` WRITE;
-/*!40000 ALTER TABLE `feetable_key` DISABLE KEYS */;
-INSERT INTO `feetable_key` VALUES (1,'feetable_scotNHS_08_Adult','N','Scottish NHS Adult feescale implemented April 2008','2008-04-01','2009-08-31','<?xml version=\"1.0\"?><columns><column type=\"fee\">fee</column><column type=\"ptfee\">pt_fee</column></columns>',1,5,'<?xml version=\"1.0\" ?><table><item><section>1</section><code>0101</code><oldcode>1a</oldcode><USERCODE>CE</USERCODE><description>clinical examination^</description><brief_description>clinical exam</brief_description><pl_c [...]
-/*!40000 ALTER TABLE `feetable_key` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `forum`
---
-
-DROP TABLE IF EXISTS `forum`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `forum` (
- `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `parent_ix` int(10) unsigned DEFAULT NULL,
- `inits` char(5) DEFAULT NULL,
- `fdate` datetime DEFAULT NULL,
- `topic` char(30) DEFAULT NULL,
- `comment` text NOT NULL,
- `open` tinyint(1) NOT NULL DEFAULT '1',
- `recipient` char(8) DEFAULT NULL,
- PRIMARY KEY (`ix`)
-) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `forum`
---
-
-LOCK TABLES `forum` WRITE;
-/*!40000 ALTER TABLE `forum` DISABLE KEYS */;
-INSERT INTO `forum` VALUES (1,NULL,'Anon','2009-06-26 13:01:32','What Are you working on?','can you tell us?',0,NULL),(2,NULL,'USER','2009-06-26 13:02:12','windows version','doesn\'t look as good as the linux version - can you fix this?',0,NULL),(3,NULL,'USER','2010-05-31 22:45:34','Example Forum Posts','This could be anything which needs to be aired. The forum has proved REALLY useful, espescially as many care workers are part-time.',1,'ALL'),(4,3,'Anon','2010-05-31 22:45:50','re. Examp [...]
-/*!40000 ALTER TABLE `forum` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `forumread`
---
-
-DROP TABLE IF EXISTS `forumread`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `forumread` (
- `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `id` int(10) unsigned NOT NULL,
- `op` char(8) DEFAULT NULL,
- `readdate` datetime NOT NULL,
- PRIMARY KEY (`ix`),
- KEY `id` (`id`)
-) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `forumread`
---
-
-LOCK TABLES `forumread` WRITE;
-/*!40000 ALTER TABLE `forumread` DISABLE KEYS */;
-INSERT INTO `forumread` VALUES (1,2,'USER','2010-05-31 22:43:56'),(2,3,'USER','2010-05-31 22:45:34'),(3,4,'USER','2010-05-31 22:45:50'),(4,4,'NW','2010-05-31 23:37:40'),(5,5,'NW','2010-05-31 23:39:03'),(6,5,'NW','2010-06-01 00:29:30');
-/*!40000 ALTER TABLE `forumread` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mednotes`
---
-
-DROP TABLE IF EXISTS `mednotes`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mednotes` (
- `serialno` int(11) NOT NULL,
- `drnm` varchar(60) DEFAULT NULL,
- `adrtel` varchar(60) DEFAULT NULL,
- `curmed` varchar(60) DEFAULT NULL,
- `allerg` varchar(60) DEFAULT NULL,
- `heart` varchar(60) DEFAULT NULL,
- `lungs` varchar(60) DEFAULT NULL,
- `liver` varchar(60) DEFAULT NULL,
- `kidney` varchar(60) DEFAULT NULL,
- `bleed` varchar(60) DEFAULT NULL,
- `anaes` varchar(60) DEFAULT NULL,
- `other` varchar(60) DEFAULT NULL,
- `oldmed` varchar(60) DEFAULT NULL,
- `alert` tinyint(1) NOT NULL DEFAULT '0',
- `chkdate` date DEFAULT NULL,
- PRIMARY KEY (`serialno`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mednotes`
---
-
-LOCK TABLES `mednotes` WRITE;
-/*!40000 ALTER TABLE `mednotes` DISABLE KEYS */;
-INSERT INTO `mednotes` VALUES (1,'new doctor again','dunno','non','med ok','heart','lungs','liver','bleeding','kidneys','ops','other','?',0,NULL),(3,'','','','','','','','','','','','',0,NULL);
-/*!40000 ALTER TABLE `mednotes` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mnhist`
---
-
-DROP TABLE IF EXISTS `mnhist`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mnhist` (
- `serialno` int(11) DEFAULT NULL,
- `chgdate` date DEFAULT NULL,
- `ix` tinyint(3) unsigned DEFAULT NULL,
- `note` varchar(60) DEFAULT NULL,
- KEY `sd` (`serialno`,`chgdate`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mnhist`
---
-
-LOCK TABLES `mnhist` WRITE;
-/*!40000 ALTER TABLE `mnhist` DISABLE KEYS */;
-INSERT INTO `mnhist` VALUES (1,'2009-05-05',140,'new doctor'),(1,'2009-05-05',141,''),(1,'2009-05-05',142,''),(1,'2009-05-05',143,''),(1,'2009-05-05',144,''),(1,'2009-05-05',145,''),(1,'2009-05-05',146,''),(1,'2009-05-05',147,''),(1,'2009-05-05',148,''),(1,'2009-05-05',149,''),(1,'2009-05-05',150,'');
-/*!40000 ALTER TABLE `mnhist` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `newdocsprinted`
---
-
-DROP TABLE IF EXISTS `newdocsprinted`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `newdocsprinted` (
- `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `serialno` int(11) DEFAULT NULL,
- `printdate` date DEFAULT NULL,
- `docname` char(20) DEFAULT NULL,
- `docversion` smallint(6) DEFAULT NULL,
- `data` blob,
- PRIMARY KEY (`ix`)
-) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `newdocsprinted`
---
-
-LOCK TABLES `newdocsprinted` WRITE;
-/*!40000 ALTER TABLE `newdocsprinted` DISABLE KEYS */;
-INSERT INTO `newdocsprinted` VALUES (1,1,'2009-06-01','Account toneA (pdf)',1,'%PDF-1.4\n1 0 obj\n<<\n/Title ()\n/Creator ()\n/Producer (Qt 4.4.3 (C) 1992-2008 Nokia Corporation and/or its subsidiary(-ies))\n/CreationDate (D:20090601213502)\n>>\nendobj\n2 0 obj\n<<\n/Type /Catalog\n/Pages 3 0 R\n>>\nendobj\n4 0 obj\n<<\n/Type /ExtGState\n/SA true\n/SM 0.02\n/ca 1.0\n/CA 1.0\n/AIS false\n/SMask /None>>\nendobj\n5 0 obj\n[/Pattern /DeviceRGB]\nendobj\n6 0 obj\n<<\n/Type /Page\n/Parent 3 0 [...]
-/*!40000 ALTER TABLE `newdocsprinted` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `newestimates`
---
-
-DROP TABLE IF EXISTS `newestimates`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `newestimates` (
- `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `serialno` int(11) NOT NULL,
- `courseno` int(10) unsigned DEFAULT NULL,
- `category` char(12) DEFAULT NULL,
- `type` char(20) DEFAULT NULL,
- `number` tinyint(4) DEFAULT NULL,
- `itemcode` char(4) DEFAULT NULL,
- `description` char(50) DEFAULT NULL,
- `fee` int(11) DEFAULT NULL,
- `ptfee` int(11) DEFAULT NULL,
- `csetype` char(5) DEFAULT NULL,
- `feescale` char(1) DEFAULT NULL,
- `dent` tinyint(1) DEFAULT NULL,
- `completed` tinyint(1) DEFAULT NULL,
- `carriedover` tinyint(1) DEFAULT NULL,
- `linked` tinyint(1) DEFAULT NULL,
- `modified_by` varchar(20) NOT NULL,
- `time_stamp` datetime NOT NULL,
- PRIMARY KEY (`ix`),
- KEY `serialno` (`serialno`),
- KEY `courseno` (`courseno`)
-) ENGINE=MyISAM AUTO_INCREMENT=23 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `newestimates`
---
-
-LOCK TABLES `newestimates` WRITE;
-/*!40000 ALTER TABLE `newestimates` DISABLE KEYS */;
-INSERT INTO `newestimates` VALUES (22,2,147669,'ul3','MI',1,'1420','composite filling* - ul3',8650,8650,'P','0',4,1,0,0,'NW','2010-05-31 23:58:01'),(3,1,147678,'exam','CE',1,'0101','clinical examination^',1950,1950,'P','A',4,0,0,NULL,'1_0to1_1script','2010-05-31 22:24:02'),(4,2,147669,'exam','CE',1,'0101','clinical examination^',1950,1950,'P','A',4,1,0,NULL,'1_0to1_1script','2010-05-31 22:24:02'),(5,3,147679,'exam','CE',1,'0101','clinical examination^',1950,1950,'P','A',5,1,0,NULL,'1_0to [...]
-/*!40000 ALTER TABLE `newestimates` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `newfeetable`
---
-
-DROP TABLE IF EXISTS `newfeetable`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `newfeetable` (
- `ix` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
- `section` smallint(6) DEFAULT NULL,
- `USERCODE` char(14) DEFAULT NULL,
- `code` char(8) DEFAULT NULL,
- `oldcode` char(12) DEFAULT NULL,
- `regulation` char(50) DEFAULT NULL,
- `max_per_course` char(25) DEFAULT NULL,
- `description` char(60) DEFAULT NULL,
- `description1` char(60) DEFAULT NULL,
- `NF08` int(11) DEFAULT NULL,
- `NF08_pt` int(11) DEFAULT NULL,
- `PFA` int(11) DEFAULT NULL,
- `NF09` int(11) DEFAULT NULL,
- `NF09_pt` int(11) DEFAULT NULL,
- PRIMARY KEY (`ix`)
-) ENGINE=MyISAM AUTO_INCREMENT=495 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `newfeetable`
---
-
-LOCK TABLES `newfeetable` WRITE;
-/*!40000 ALTER TABLE `newfeetable` DISABLE KEYS */;
-INSERT INTO `newfeetable` VALUES (1,1,'CE','0101','1a','','1','clinical examination^','clinical exam',800,0,1950,1950,0),(2,1,'ECE','0111','1b','','1','extensive clinical examination^','extensive clinical exam',1200,0,3850,4500,0),(3,1,'FCA','0121','1c','','1','full case assessment^','full case assessment',2500,0,6655,7500,0),(4,1,'CTS','0131','1d','','1','care and treatment summary^','care & treatment summary',395,316,0,0,0),(5,2,'S','0201','2a1','n=1:A,n=2:B,n=3:C,n>3:C+(n-3)*D,max=E', [...]
-/*!40000 ALTER TABLE `newfeetable` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `notes`
---
-
-DROP TABLE IF EXISTS `notes`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `notes` (
- `serialno` int(11) NOT NULL,
- `lineno` smallint(5) unsigned NOT NULL,
- `line` varchar(80) DEFAULT NULL,
- PRIMARY KEY (`serialno`,`lineno`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `notes`
---
-
-LOCK TABLES `notes` WRITE;
-/*!40000 ALTER TABLE `notes` DISABLE KEYS */;
-INSERT INTO `notes` VALUES (1,0,'ECM/CM``)'),(1,1,'pCE'),(1,2,'rˆTM —TM ¦TM ¤TM ´TM '),(1,3,'iSP '),(1,4,'d'),(1,5,'`4'),(1,6,'JM/JM``'),(1,7,'s'),(1,8,'a'),(1,9,'`'),(1,10,'JM/JM``'),(1,11,'w10.76 B'),(1,12,'`'),(1,13,'ECM/CM
`
`
;'),(1,14,'pCE'),(1,15,'
`
'),(1,16,'JM/JM
`
`
'),(1,17,'{'),(1,18,'w4.16 B'),(1,19,'a'),(1,20,'
`
'),(1,21,'ECM/CM
a
a7'),(1,22,'pCE'),(1,23,'iSP '),(1,24,'
a'),(1,25,'ECM/CM
a
a'),(1,26, [...]
-/*!40000 ALTER TABLE `notes` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `opid`
---
-
-DROP TABLE IF EXISTS `opid`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `opid` (
- `id` char(5) NOT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `opid`
---
-
-LOCK TABLES `opid` WRITE;
-/*!40000 ALTER TABLE `opid` DISABLE KEYS */;
-INSERT INTO `opid` VALUES ('BW'),('NW'),('REC'),('USER');
-/*!40000 ALTER TABLE `opid` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `patients`
---
-
-DROP TABLE IF EXISTS `patients`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `patients` (
- `serialno` int(11) NOT NULL,
- `pf0` tinyint(4) DEFAULT NULL,
- `pf1` tinyint(4) DEFAULT NULL,
- `pf2` tinyint(4) DEFAULT NULL,
- `pf3` tinyint(4) DEFAULT NULL,
- `pf4` tinyint(4) DEFAULT NULL,
- `pf5` tinyint(4) DEFAULT NULL,
- `pf6` tinyint(4) DEFAULT NULL,
- `pf7` tinyint(4) DEFAULT NULL,
- `pf8` tinyint(4) DEFAULT NULL,
- `pf9` tinyint(4) DEFAULT NULL,
- `pf10` tinyint(4) DEFAULT NULL,
- `pf11` tinyint(4) DEFAULT NULL,
- `pf12` tinyint(4) DEFAULT NULL,
- `pf14` tinyint(4) DEFAULT NULL,
- `pf15` tinyint(4) DEFAULT NULL,
- `pf16` tinyint(4) DEFAULT NULL,
- `pf17` tinyint(4) DEFAULT NULL,
- `pf18` tinyint(4) DEFAULT NULL,
- `pf19` tinyint(4) DEFAULT NULL,
- `money0` int(11) DEFAULT NULL,
- `money1` int(11) DEFAULT NULL,
- `money2` int(11) DEFAULT NULL,
- `money3` int(11) DEFAULT NULL,
- `money4` int(11) DEFAULT NULL,
- `money5` int(11) DEFAULT NULL,
- `money6` int(11) DEFAULT NULL,
- `money7` int(11) DEFAULT NULL,
- `money8` int(11) DEFAULT NULL,
- `money9` int(11) DEFAULT NULL,
- `money10` int(11) DEFAULT NULL,
- `pd0` date DEFAULT NULL,
- `pd1` date DEFAULT NULL,
- `pd2` date DEFAULT NULL,
- `pd3` date DEFAULT NULL,
- `pd4` date DEFAULT NULL,
- `pd5` date DEFAULT NULL,
- `pd6` date DEFAULT NULL,
- `pd7` date DEFAULT NULL,
- `pd8` date DEFAULT NULL,
- `pd9` date DEFAULT NULL,
- `pd10` date DEFAULT NULL,
- `pd11` date DEFAULT NULL,
- `pd12` date DEFAULT NULL,
- `pd13` date DEFAULT NULL,
- `pd14` date DEFAULT NULL,
- `sname` varchar(30) DEFAULT NULL,
- `fname` varchar(30) DEFAULT NULL,
- `title` varchar(30) DEFAULT NULL,
- `sex` char(1) DEFAULT NULL,
- `dob` date DEFAULT NULL,
- `addr1` varchar(30) DEFAULT NULL,
- `addr2` varchar(30) DEFAULT NULL,
- `addr3` varchar(30) DEFAULT NULL,
- `pcde` varchar(30) DEFAULT NULL,
- `tel1` varchar(30) DEFAULT NULL,
- `tel2` varchar(30) DEFAULT NULL,
- `occup` varchar(30) DEFAULT NULL,
- `nhsno` varchar(30) DEFAULT NULL,
- `cnfd` date DEFAULT NULL,
- `psn` varchar(30) DEFAULT NULL,
- `cset` varchar(10) DEFAULT NULL,
- `dnt1` smallint(6) DEFAULT NULL,
- `dnt2` smallint(6) DEFAULT NULL,
- `courseno0` int(11) DEFAULT NULL,
- `courseno1` int(11) DEFAULT NULL,
- `exempttext` varchar(50) DEFAULT NULL,
- `ur8st` varchar(34) DEFAULT NULL,
- `ur7st` varchar(34) DEFAULT NULL,
- `ur6st` varchar(34) DEFAULT NULL,
- `ur5st` varchar(34) DEFAULT NULL,
- `ur4st` varchar(34) DEFAULT NULL,
- `ur3st` varchar(34) DEFAULT NULL,
- `ur2st` varchar(34) DEFAULT NULL,
- `ur1st` varchar(34) DEFAULT NULL,
- `ul1st` varchar(34) DEFAULT NULL,
- `ul2st` varchar(34) DEFAULT NULL,
- `ul3st` varchar(34) DEFAULT NULL,
- `ul4st` varchar(34) DEFAULT NULL,
- `ul5st` varchar(34) DEFAULT NULL,
- `ul6st` varchar(34) DEFAULT NULL,
- `ul7st` varchar(34) DEFAULT NULL,
- `ul8st` varchar(34) DEFAULT NULL,
- `ll8st` varchar(34) DEFAULT NULL,
- `ll7st` varchar(34) DEFAULT NULL,
- `ll6st` varchar(34) DEFAULT NULL,
- `ll5st` varchar(34) DEFAULT NULL,
- `ll4st` varchar(34) DEFAULT NULL,
- `ll3st` varchar(34) DEFAULT NULL,
- `ll2st` varchar(34) DEFAULT NULL,
- `ll1st` varchar(34) DEFAULT NULL,
- `lr1st` varchar(34) DEFAULT NULL,
- `lr2st` varchar(34) DEFAULT NULL,
- `lr3st` varchar(34) DEFAULT NULL,
- `lr4st` varchar(34) DEFAULT NULL,
- `lr5st` varchar(34) DEFAULT NULL,
- `lr6st` varchar(34) DEFAULT NULL,
- `lr7st` varchar(34) DEFAULT NULL,
- `lr8st` varchar(34) DEFAULT NULL,
- `dent0` tinyint(4) DEFAULT NULL,
- `dent1` tinyint(4) DEFAULT NULL,
- `dent2` tinyint(4) DEFAULT NULL,
- `dent3` tinyint(4) DEFAULT NULL,
- `exmpt` varchar(10) DEFAULT NULL,
- `recd` date DEFAULT NULL,
- `dmask` char(7) DEFAULT NULL,
- `minstart` smallint(6) DEFAULT NULL,
- `maxend` smallint(6) DEFAULT NULL,
- `billdate` date DEFAULT NULL,
- `billct` tinyint(3) unsigned DEFAULT NULL,
- `billtype` char(1) DEFAULT NULL,
- `pf20` tinyint(4) DEFAULT NULL,
- `money11` int(11) DEFAULT NULL,
- `pf13` tinyint(4) DEFAULT NULL,
- `familyno` int(11) DEFAULT NULL,
- `memo` varchar(255) DEFAULT NULL,
- `town` varchar(30) DEFAULT NULL,
- `county` varchar(30) DEFAULT NULL,
- `mobile` varchar(30) DEFAULT NULL,
- `fax` varchar(30) DEFAULT NULL,
- `email1` varchar(50) DEFAULT NULL,
- `email2` varchar(50) DEFAULT NULL,
- `status` varchar(30) DEFAULT NULL,
- `source` varchar(30) DEFAULT NULL,
- `enrolled` date DEFAULT NULL,
- `archived` tinyint(4) DEFAULT '0',
- `initaccept` date DEFAULT NULL,
- `lastreaccept` date DEFAULT NULL,
- `lastclaim` date DEFAULT NULL,
- `expiry` date DEFAULT NULL,
- `cstatus` tinyint(3) unsigned DEFAULT NULL,
- `transfer` date DEFAULT NULL,
- `pstatus` tinyint(3) unsigned DEFAULT NULL,
- `courseno2` int(11) DEFAULT NULL,
- PRIMARY KEY (`serialno`),
- KEY `sname` (`sname`,`fname`),
- KEY `familyno` (`familyno`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `patients`
---
-
-LOCK TABLES `patients` WRITE;
-/*!40000 ALTER TABLE `patients` DISABLE KEYS */;
-INSERT INTO `patients` VALUES (1,1,1,0,0,0,3,0,0,0,0,0,65,0,0,0,1,2,0,0,0,0,0,0,0,40450,0,0,0,0,0,NULL,NULL,NULL,'1999-08-05','2009-05-25','2007-07-13',NULL,NULL,NULL,'2006-02-08','1999-06-28',NULL,NULL,NULL,NULL,'MOLAR','OPEN','MR','M','1969-12-09','1512, RUE DE LA SOLEIL','DAVIOT','','IV0 0XX','NO PHONE','','','',NULL,'','P',4,4,147678,147660,'','TM ','MOB,GL ','TM ','DO ','MODBP ','','P RT MI ','DIP PV RT P ','D ','M ','P,AM ','','','MODP MB,CO ','MODBP,CO ','TM ','TM ','CR,GO ','TM ' [...]
-/*!40000 ALTER TABLE `patients` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `perio`
---
-
-DROP TABLE IF EXISTS `perio`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `perio` (
- `serialno` int(11) NOT NULL DEFAULT '0',
- `chartdate` date NOT NULL DEFAULT '0000-00-00',
- `bpe` char(6) DEFAULT NULL,
- `chartdata` blob,
- `flag` tinyint(3) unsigned DEFAULT NULL,
- PRIMARY KEY (`serialno`,`chartdate`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `perio`
---
-
-LOCK TABLES `perio` WRITE;
-/*!40000 ALTER TABLE `perio` DISABLE KEYS */;
-/*!40000 ALTER TABLE `perio` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `phrasebook`
---
-
-DROP TABLE IF EXISTS `phrasebook`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `phrasebook` (
- `clinician_id` int(10) unsigned NOT NULL,
- `phrases` text,
- PRIMARY KEY (`clinician_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `phrasebook`
---
-
-LOCK TABLES `phrasebook` WRITE;
-/*!40000 ALTER TABLE `phrasebook` DISABLE KEYS */;
-INSERT INTO `phrasebook` VALUES (0,'<?xml version=\"1.0\" ?>\n<phrasebook>\n<section>\n <header>Anaesthetics</header>\n <phrase>No LA.</phrase>\n <phrase>Anaesthetic Used - Citanest</phrase>\n <phrase>Anaesthetic Used - Scandonest Plain</phrase>\n <phrase>Anaesthetic Used - Septonest + 1:100,000 Adrenaline (Gold)</phrase>\n <phrase>Anaesthetic Used - Septonest + 1:200,000 Adrenaline (Green)</phrase>\n <phrase>Anaesthetic Used - Lignocaine + 1:80,000 Adrenaline</phras [...]
-/*!40000 ALTER TABLE `phrasebook` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `plandata`
---
-
-DROP TABLE IF EXISTS `plandata`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `plandata` (
- `serialno` int(11) NOT NULL,
- `plantype` char(4) DEFAULT NULL,
- `band` char(1) DEFAULT NULL,
- `grosschg` int(11) DEFAULT NULL,
- `discount` int(11) DEFAULT NULL,
- `netchg` int(11) DEFAULT NULL,
- `catcode` char(1) DEFAULT NULL,
- `planjoin` date DEFAULT NULL,
- `regno` int(11) DEFAULT NULL,
- PRIMARY KEY (`serialno`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `plandata`
---
-
-LOCK TABLES `plandata` WRITE;
-/*!40000 ALTER TABLE `plandata` DISABLE KEYS */;
-INSERT INTO `plandata` VALUES (1,'HDP','C',1229,5,NULL,'3','1994-01-05',67),(2,'','B',978,5,NULL,'3','2009-06-21',68),(3,'','B',978,5,NULL,'2','2009-06-21',69);
-/*!40000 ALTER TABLE `plandata` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `practitioners`
---
-
-DROP TABLE IF EXISTS `practitioners`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `practitioners` (
- `id` smallint(6) NOT NULL DEFAULT '0',
- `inits` char(4) DEFAULT NULL,
- `name` varchar(30) DEFAULT NULL,
- `apptix` smallint(6) DEFAULT NULL,
- `formalname` varchar(30) DEFAULT NULL,
- `fpcno` varchar(20) DEFAULT NULL,
- `quals` varchar(30) DEFAULT NULL,
- `datefrom` date DEFAULT NULL,
- `dateto` date DEFAULT NULL,
- `flag0` tinyint(4) DEFAULT NULL,
- `flag1` tinyint(4) DEFAULT NULL,
- `flag2` tinyint(4) DEFAULT NULL,
- `flag3` tinyint(4) DEFAULT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `practitioners`
---
-
-LOCK TABLES `practitioners` WRITE;
-/*!40000 ALTER TABLE `practitioners` DISABLE KEYS */;
-INSERT INTO `practitioners` VALUES (4,'NW','Neil Wallace',4,'MR N.A. WALLACE','DEMO','BChD',NULL,NULL,1,1,1,1),(5,'BW','Bea Wallace',5,'MRS B.A. WALLACE','DEMO','B.Ch.D.',NULL,NULL,1,0,1,1),(6,'AH','Able Hygenist',6,'Ms Able Hygenist','DEMO','BSDHT',NULL,NULL,0,0,1,1);
-/*!40000 ALTER TABLE `practitioners` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `ptmemos`
---
-
-DROP TABLE IF EXISTS `ptmemos`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `ptmemos` (
- `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `serialno` int(11) DEFAULT NULL,
- `enabled` tinyint(1) DEFAULT NULL,
- `author` char(5) DEFAULT NULL,
- `type` char(5) DEFAULT NULL,
- `mdate` datetime DEFAULT NULL,
- `expiredate` date DEFAULT NULL,
- `message` char(200) DEFAULT NULL,
- `open` tinyint(1) NOT NULL DEFAULT '1',
- PRIMARY KEY (`ix`)
-) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `ptmemos`
---
-
-LOCK TABLES `ptmemos` WRITE;
-/*!40000 ALTER TABLE `ptmemos` DISABLE KEYS */;
-INSERT INTO `ptmemos` VALUES (10,3,NULL,'USER','all','2009-06-18 00:00:00','3000-01-01','fees outstanding.',1);
-/*!40000 ALTER TABLE `ptmemos` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `settings`
---
-
-DROP TABLE IF EXISTS `settings`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `settings` (
- `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `value` varchar(128) DEFAULT NULL,
- `data` text,
- `hostname` varchar(128) DEFAULT NULL,
- `station` char(20) DEFAULT NULL,
- `user` char(20) DEFAULT NULL,
- `modified_by` varchar(20) NOT NULL,
- `time_stamp` datetime NOT NULL,
- PRIMARY KEY (`ix`),
- KEY `value` (`value`)
-) ENGINE=MyISAM AUTO_INCREMENT=24 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `settings`
---
-
-LOCK TABLES `settings` WRITE;
-/*!40000 ALTER TABLE `settings` DISABLE KEYS */;
-INSERT INTO `settings` VALUES (1,'Schema_Version','1.1',NULL,NULL,NULL,'1_0 to 1_1 script','2010-05-31 22:24:02'),(3,'Schema_Version','1.2',NULL,NULL,NULL,'1_1 to 1_2 script','2010-05-31 22:24:02'),(5,'Schema_Version','1.3',NULL,NULL,NULL,'1_2 to 1_3 script','2010-05-31 22:24:03'),(8,'Schema_Version','1.4',NULL,NULL,NULL,'1_3 to 1_4 script','2010-05-31 22:24:04'),(10,'Schema_Version','1.5',NULL,NULL,NULL,'1_4 to 1_5 script','2010-05-31 22:24:04'),(12,'Schema_Version','1.6',NULL,NULL,NULL [...]
-/*!40000 ALTER TABLE `settings` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `tasks`
---
-
-DROP TABLE IF EXISTS `tasks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `tasks` (
- `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `op` char(8) DEFAULT NULL,
- `author` char(8) DEFAULT NULL,
- `type` char(8) DEFAULT NULL,
- `mdate` datetime NOT NULL,
- `due` datetime NOT NULL,
- `message` char(255) DEFAULT NULL,
- `completed` tinyint(1) NOT NULL DEFAULT '0',
- `visible` tinyint(1) NOT NULL DEFAULT '1',
- PRIMARY KEY (`ix`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `tasks`
---
-
-LOCK TABLES `tasks` WRITE;
-/*!40000 ALTER TABLE `tasks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `tasks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `userdata`
---
-
-DROP TABLE IF EXISTS `userdata`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `userdata` (
- `serialno` int(11) NOT NULL,
- `data` blob,
- PRIMARY KEY (`serialno`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `userdata`
---
-
-LOCK TABLES `userdata` WRITE;
-/*!40000 ALTER TABLE `userdata` DISABLE KEYS */;
-/*!40000 ALTER TABLE `userdata` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2010-06-01 0:31:09
diff --git a/src/openmolar/resources/referral_data.xml b/src/openmolar/resources/referral_data.xml
deleted file mode 100644
index 5accdec..0000000
--- a/src/openmolar/resources/referral_data.xml
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0"?>
-<referrals>
-<referral>
-<description>Oral Surgery - Raigmore</description>
-<surgeon_postal>Dr Adrian Farrow</surgeon_postal>
-<surgeon_greeting>Dr Farrow</surgeon_greeting>
-<address>
-<line>The Consultant</line>
-<line>Oral Surgery</line>
-<line>Raigmore Hospital</line>
-<line>Old Perth Road</line>
-<line>Inverness</line>
-<line>IV2 3JH.</line>
-</address>
-</referral>
-
-<referral>
-<description>Orthodontics - Raigmore</description>
-<surgeon_postal>Mr Adrian Hart</surgeon_postal>
-<surgeon_greeting>Mr Hart</surgeon_greeting>
-<address>
-<line>Consultant Orthodontist</line>
-<line>Department of Orthodontics</line>
-<line>Raigmore Hospital</line>
-<line>Old Perth Road</line>
-<line>Inverness</line>
-<line>IV2 3JH.</line>
-</address>
-</referral>
-
-<referral>
-<description>Restorative - Raigmore</description>
-<surgeon_postal>Dr M.A. Donachie</surgeon_postal>
-<surgeon_greeting>Dr Donachie</surgeon_greeting>
-<address>
-<line>Restorative Consultant</line>
-<line>Dental Department</line>
-<line>Raigmore Hospital</line>
-<line>Old Perth Road</line>
-<line>Inverness</line>
-<line>IV2 3JH.</line>
-</address>
-</referral>
-
-
-<referral>
-<description>Dr. Chris Buchanan - Highland Ortho</description>
-<surgeon_postal>Dr. Chris Buchanan</surgeon_postal>
-<surgeon_greeting>Dr. Buchanan</surgeon_greeting>
-<address>
-<line>Highland Orthodontics</line>
-<line>67 Kenneth Street</line>
-<line>Inverness</line>
-<line>IV3 5QF</line>
-</address>
-</referral>
-
-<referral>
-<description>Michael Gough</description>
-<surgeon_postal>Dr. Michael Gough</surgeon_postal>
-<surgeon_greeting>Michael</surgeon_greeting>
-<address>
-<line>Southside Dental Practice</line>
-<line>28 Southside Road</line>
-<line>Inverness</line>
-</address>
-</referral>
-
-<referral>
-<description>Inverness Dental Centre (GA kids..)</description>
-<surgeon_postal>The Community Dental Officer</surgeon_postal>
-<surgeon_greeting>Sir/Madam</surgeon_greeting>
-<address>
-<line>Inverness Dental Centre</line>
-<line>Centre For Health Science</line>
-<line>Old Perth Road</line>
-<line>Inverness</line>
-<line>IV2 3JH.</line>
-</address>
-</referral>
-
-<referral>
-<description>Special Care - RNI/New Craigs</description>
-<surgeon_postal>Dr. Rhona Brown</surgeon_postal>
-<surgeon_greeting>Dr. Brown</surgeon_greeting>
-<address>
-<line>Dental Department</line>
-<line>RNI Community Hospital</line>
-<line>Ness Walk</line>
-<line>Inverness</line>
-</address>
-</referral>
-
-<referral>
-<description>Oral Surgery, Dundee</description>
-<surgeon_postal>The Consultant Oral Surgeon</surgeon_postal>
-<surgeon_greeting>Sir/Madam</surgeon_greeting>
-<address>
-<line>Department of Oral Surgery</line>
-<line>Dundee Dental Hospital</line>
-<line>Park Place</line>
-<line>Dundee</line>
-</address>
-</referral>
-
-<referral>
-<description>Oral Surgery, Glasgow</description>
-<surgeon_postal>The Consultant Oral Surgeon</surgeon_postal>
-<surgeon_greeting>Sir/Madam</surgeon_greeting>
-<address>
-<line>Department of Oral Surgery</line>
-<line>Glasgow Dental Hospital</line>
-<line>378 Sauchiehall Street</line>
-<line>Glasgow</line>
-<line>G2 3JZ.</line>
-</address>
-</referral>
-
-<referral>
-<description>Oral Surgery, Edinburgh</description>
-<surgeon_postal>The Consultant Oral Surgeon</surgeon_postal>
-<surgeon_greeting>Sir/Madam</surgeon_greeting>
-<address>
-<line>Department of Oral Surgery</line>
-<line>Edinburgh Dental Institute</line>
-<line>The University of Edinburgh</line>
-<line>4th Floor, Lauriston Building</line>
-<line>Lauriston Place</line>
-<line>Edinburgh</line>
-<line>EH3 9HA</line>
-</address>
-
-</referral>
-
-</referrals>
-
diff --git a/src/openmolar/resources/schema.sql b/src/openmolar/resources/schema.sql
new file mode 100644
index 0000000..ffd354f
--- /dev/null
+++ b/src/openmolar/resources/schema.sql
@@ -0,0 +1,1619 @@
+-- MySQL dump 10.13 Distrib 5.5.37, for debian-linux-gnu (x86_64)
+--
+-- Host: localhost Database: openmolar_demo
+-- ------------------------------------------------------
+-- Server version 5.5.37-1
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `aday`
+--
+
+DROP TABLE IF EXISTS `aday`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `aday` (
+ `adate` date NOT NULL DEFAULT '0000-00-00',
+ `apptix` smallint(6) NOT NULL DEFAULT '0',
+ `start` smallint(6) DEFAULT NULL,
+ `end` smallint(6) DEFAULT NULL,
+ `maxtime` smallint(6) DEFAULT NULL,
+ `flag` tinyint(4) DEFAULT NULL,
+ `memo` char(30) DEFAULT NULL,
+ `stn` tinyint(4) DEFAULT NULL,
+ `ver` tinyint(4) DEFAULT NULL,
+ PRIMARY KEY (`adate`,`apptix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `aday`
+--
+
+LOCK TABLES `aday` WRITE;
+/*!40000 ALTER TABLE `aday` DISABLE KEYS */;
+/*!40000 ALTER TABLE `aday` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `appt_prefs`
+--
+
+DROP TABLE IF EXISTS `appt_prefs`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `appt_prefs` (
+ `serialno` int(11) NOT NULL DEFAULT '0',
+ `recall_active` tinyint(1) NOT NULL DEFAULT '1',
+ `recdent_period` int(11) DEFAULT NULL,
+ `recdent` date DEFAULT NULL,
+ `rechyg_period` int(11) DEFAULT NULL,
+ `rechyg` date DEFAULT NULL,
+ `recall_method` enum('post','sms','email','tel') DEFAULT NULL,
+ `sms_reminders` tinyint(1) NOT NULL DEFAULT '0',
+ `no_combined_appts` tinyint(1) NOT NULL DEFAULT '0',
+ `note` varchar(120) DEFAULT NULL,
+ PRIMARY KEY (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `appt_prefs`
+--
+
+LOCK TABLES `appt_prefs` WRITE;
+/*!40000 ALTER TABLE `appt_prefs` DISABLE KEYS */;
+/*!40000 ALTER TABLE `appt_prefs` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `apr`
+--
+
+DROP TABLE IF EXISTS `apr`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `apr` (
+ `serialno` int(11) NOT NULL DEFAULT '0',
+ `aprix` tinyint(4) NOT NULL DEFAULT '0',
+ `practix` smallint(6) DEFAULT NULL,
+ `code0` char(8) DEFAULT NULL,
+ `code1` char(8) DEFAULT NULL,
+ `code2` char(8) DEFAULT NULL,
+ `note` char(20) DEFAULT NULL,
+ `adate` date DEFAULT NULL,
+ `atime` smallint(6) DEFAULT NULL,
+ `length` smallint(6) DEFAULT NULL,
+ `flag0` tinyint(4) DEFAULT NULL,
+ `flag1` tinyint(4) DEFAULT NULL,
+ `flag2` tinyint(4) DEFAULT NULL,
+ `flag3` tinyint(4) DEFAULT NULL,
+ `flag4` tinyint(4) DEFAULT NULL,
+ `datespec` char(10) DEFAULT NULL,
+ PRIMARY KEY (`serialno`,`aprix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `apr`
+--
+
+LOCK TABLES `apr` WRITE;
+/*!40000 ALTER TABLE `apr` DISABLE KEYS */;
+/*!40000 ALTER TABLE `apr` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `aslot`
+--
+
+DROP TABLE IF EXISTS `aslot`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `aslot` (
+ `adate` date DEFAULT NULL,
+ `apptix` smallint(6) DEFAULT NULL,
+ `start` smallint(6) DEFAULT NULL,
+ `end` smallint(6) DEFAULT NULL,
+ `name` char(30) DEFAULT NULL,
+ `serialno` int(11) DEFAULT NULL,
+ `code0` char(8) DEFAULT NULL,
+ `code1` char(8) DEFAULT NULL,
+ `code2` char(8) DEFAULT NULL,
+ `note` char(20) DEFAULT NULL,
+ `flag0` tinyint(4) DEFAULT NULL,
+ `flag1` tinyint(4) DEFAULT NULL,
+ `flag2` tinyint(4) DEFAULT NULL,
+ `flag3` tinyint(4) DEFAULT NULL,
+ `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ KEY `adate` (`adate`,`apptix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `aslot`
+--
+
+LOCK TABLES `aslot` WRITE;
+/*!40000 ALTER TABLE `aslot` DISABLE KEYS */;
+/*!40000 ALTER TABLE `aslot` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `bpe`
+--
+
+DROP TABLE IF EXISTS `bpe`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `bpe` (
+ `serialno` int(11) NOT NULL DEFAULT '0',
+ `bpedate` date NOT NULL DEFAULT '0000-00-00',
+ `bpe` char(6) DEFAULT NULL,
+ PRIMARY KEY (`serialno`,`bpedate`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `bpe`
+--
+
+LOCK TABLES `bpe` WRITE;
+/*!40000 ALTER TABLE `bpe` DISABLE KEYS */;
+/*!40000 ALTER TABLE `bpe` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `calendar`
+--
+
+DROP TABLE IF EXISTS `calendar`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `calendar` (
+ `adate` date NOT NULL,
+ `memo` char(30) DEFAULT NULL,
+ PRIMARY KEY (`adate`),
+ KEY `adate` (`adate`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `calendar`
+--
+
+LOCK TABLES `calendar` WRITE;
+/*!40000 ALTER TABLE `calendar` DISABLE KEYS */;
+/*!40000 ALTER TABLE `calendar` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `calldurr`
+--
+
+DROP TABLE IF EXISTS `calldurr`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `calldurr` (
+ `stn` tinyint(4) NOT NULL DEFAULT '0',
+ `serialno` int(11) DEFAULT NULL,
+ PRIMARY KEY (`stn`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `calldurr`
+--
+
+LOCK TABLES `calldurr` WRITE;
+/*!40000 ALTER TABLE `calldurr` DISABLE KEYS */;
+/*!40000 ALTER TABLE `calldurr` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `cashbook`
+--
+
+DROP TABLE IF EXISTS `cashbook`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `cashbook` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `cbdate` date DEFAULT NULL,
+ `ref` char(10) DEFAULT NULL,
+ `linkid` int(11) DEFAULT NULL,
+ `descr` varchar(32) DEFAULT NULL,
+ `code` tinyint(3) unsigned DEFAULT NULL,
+ `dntid` smallint(6) DEFAULT NULL,
+ `amt` int(11) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `date` (`cbdate`),
+ KEY `ref` (`ref`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `cashbook`
+--
+
+LOCK TABLES `cashbook` WRITE;
+/*!40000 ALTER TABLE `cashbook` DISABLE KEYS */;
+/*!40000 ALTER TABLE `cashbook` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `cbcodes`
+--
+
+DROP TABLE IF EXISTS `cbcodes`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `cbcodes` (
+ `code` tinyint(3) unsigned DEFAULT NULL,
+ `flag` tinyint(4) DEFAULT NULL,
+ `descr` char(20) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `cbcodes`
+--
+
+LOCK TABLES `cbcodes` WRITE;
+/*!40000 ALTER TABLE `cbcodes` DISABLE KEYS */;
+INSERT INTO `cbcodes` VALUES (1,2,'NHS CASH'),(2,2,'PRIVATE CASH'),(3,2,'NHS CHEQUE'),(4,2,'PRIVATE CHEQUE'),(5,2,'NHS CARD'),(6,2,'PRIVATE CARD'),(9,2,'BANK TRANSFER'),(14,2,'SUNDRY CASH'),(15,2,'SUNDRY CHEQUE'),(17,2,'SUNDRY CARD'),(21,2,'ANNUAL HDP'),(24,2,'OTHER'),(125,2,'REFUND');
+/*!40000 ALTER TABLE `cbcodes` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `claims`
+--
+
+DROP TABLE IF EXISTS `claims`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `claims` (
+ `courseno` int(11) NOT NULL DEFAULT '0',
+ `serialno` int(11) NOT NULL DEFAULT '0',
+ `dntix` smallint(6) DEFAULT '0',
+ `proddate` date DEFAULT NULL,
+ `startdate` date DEFAULT NULL,
+ `cmpldate` date DEFAULT NULL,
+ `regdate` date DEFAULT NULL,
+ `authdate` date DEFAULT NULL,
+ `dob` date DEFAULT NULL,
+ `sname` varchar(30) DEFAULT NULL,
+ `fname` varchar(30) DEFAULT NULL,
+ `addr1` varchar(30) DEFAULT NULL,
+ `addr2` varchar(30) DEFAULT NULL,
+ `addr3` varchar(30) DEFAULT NULL,
+ `pcde` varchar(30) DEFAULT NULL,
+ `nhsno` varchar(30) DEFAULT NULL,
+ `prevsname` varchar(30) DEFAULT NULL,
+ `exempttext` varchar(50) DEFAULT NULL,
+ `i0` int(11) DEFAULT '0',
+ `i1` int(11) DEFAULT '0',
+ `i2` int(11) DEFAULT '0',
+ `i3` int(11) DEFAULT '0',
+ `i4` int(11) DEFAULT '0',
+ `f0` tinyint(3) unsigned DEFAULT '0',
+ `f1` tinyint(3) unsigned DEFAULT '0',
+ `f2` tinyint(3) unsigned DEFAULT '0',
+ `f3` tinyint(3) unsigned DEFAULT '0',
+ `f4` tinyint(3) unsigned DEFAULT '0',
+ `f5` tinyint(3) unsigned DEFAULT '0',
+ `f6` tinyint(3) unsigned DEFAULT '0',
+ `f7` tinyint(3) unsigned DEFAULT '0',
+ `f8` tinyint(3) unsigned DEFAULT '0',
+ `f9` tinyint(3) unsigned DEFAULT '0',
+ `submstatus` tinyint(4) DEFAULT '0',
+ `submcount` tinyint(4) DEFAULT '0',
+ `submno` int(11) DEFAULT '0',
+ `claimdata` blob,
+ `trtdata` blob,
+ `archdate` date DEFAULT NULL,
+ `town` varchar(30) DEFAULT NULL,
+ `county` varchar(30) DEFAULT NULL,
+ `regtype` tinyint(3) unsigned DEFAULT '0',
+ PRIMARY KEY (`serialno`,`courseno`),
+ KEY `dentist` (`dntix`),
+ KEY `patient` (`sname`,`fname`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `claims`
+--
+
+LOCK TABLES `claims` WRITE;
+/*!40000 ALTER TABLE `claims` DISABLE KEYS */;
+/*!40000 ALTER TABLE `claims` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `clinical_memos`
+--
+
+DROP TABLE IF EXISTS `clinical_memos`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `clinical_memos` (
+ `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `serialno` int(11) unsigned NOT NULL,
+ `author` char(8) DEFAULT NULL,
+ `datestamp` datetime NOT NULL,
+ `hidden` tinyint(1) NOT NULL DEFAULT '0',
+ `synopsis` text,
+ PRIMARY KEY (`ix`),
+ KEY `serialno` (`serialno`)
+) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `clinical_memos`
+--
+
+LOCK TABLES `clinical_memos` WRITE;
+/*!40000 ALTER TABLE `clinical_memos` DISABLE KEYS */;
+INSERT INTO `clinical_memos` VALUES (1,1,'REC','2014-06-10 20:28:10',0,'This patient is for demonstration purposes only. Any similarity to any person, alive or dead, is entirely unintentional.');
+/*!40000 ALTER TABLE `clinical_memos` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `clinician_dates`
+--
+
+DROP TABLE IF EXISTS `clinician_dates`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `clinician_dates` (
+ `clinician_ix` smallint(5) unsigned NOT NULL,
+ `start_date` date NOT NULL,
+ `end_date` date DEFAULT NULL,
+ `date_comments` varchar(255) DEFAULT NULL,
+ KEY `clinician_ix` (`clinician_ix`),
+ CONSTRAINT `clinician_dates_ibfk_1` FOREIGN KEY (`clinician_ix`) REFERENCES `clinicians` (`ix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `clinician_dates`
+--
+
+LOCK TABLES `clinician_dates` WRITE;
+/*!40000 ALTER TABLE `clinician_dates` DISABLE KEYS */;
+/*!40000 ALTER TABLE `clinician_dates` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `clinicians`
+--
+
+DROP TABLE IF EXISTS `clinicians`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `clinicians` (
+ `ix` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `initials` char(5) NOT NULL,
+ `name` varchar(64) NOT NULL,
+ `formal_name` varchar(128) DEFAULT NULL,
+ `qualifications` varchar(64) DEFAULT NULL,
+ `type` smallint(5) NOT NULL DEFAULT '1',
+ `speciality` varchar(64) DEFAULT NULL,
+ `data` varchar(255) DEFAULT NULL,
+ `comments` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`ix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `clinicians`
+--
+
+LOCK TABLES `clinicians` WRITE;
+/*!40000 ALTER TABLE `clinicians` DISABLE KEYS */;
+/*!40000 ALTER TABLE `clinicians` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `currtrtmt2`
+--
+
+DROP TABLE IF EXISTS `currtrtmt2`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `currtrtmt2` (
+ `courseno` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `serialno` int(11) DEFAULT NULL,
+ `examt` varchar(10) NOT NULL DEFAULT '',
+ `examd` date DEFAULT NULL,
+ `accd` date DEFAULT NULL,
+ `cmpd` date DEFAULT NULL,
+ `xraypl` varchar(56) NOT NULL DEFAULT '',
+ `periopl` varchar(56) NOT NULL DEFAULT '',
+ `anaespl` varchar(56) NOT NULL DEFAULT '',
+ `otherpl` varchar(56) NOT NULL DEFAULT '',
+ `ndupl` varchar(56) NOT NULL DEFAULT '',
+ `ndlpl` varchar(56) NOT NULL DEFAULT '',
+ `odupl` varchar(56) NOT NULL DEFAULT '',
+ `odlpl` varchar(56) NOT NULL DEFAULT '',
+ `custompl` varchar(56) NOT NULL DEFAULT '',
+ `ur8pl` varchar(34) NOT NULL DEFAULT '',
+ `ur7pl` varchar(34) NOT NULL DEFAULT '',
+ `ur6pl` varchar(34) NOT NULL DEFAULT '',
+ `ur5pl` varchar(34) NOT NULL DEFAULT '',
+ `ur4pl` varchar(34) NOT NULL DEFAULT '',
+ `ur3pl` varchar(34) NOT NULL DEFAULT '',
+ `ur2pl` varchar(34) NOT NULL DEFAULT '',
+ `ur1pl` varchar(34) NOT NULL DEFAULT '',
+ `ul1pl` varchar(34) NOT NULL DEFAULT '',
+ `ul2pl` varchar(34) NOT NULL DEFAULT '',
+ `ul3pl` varchar(34) NOT NULL DEFAULT '',
+ `ul4pl` varchar(34) NOT NULL DEFAULT '',
+ `ul5pl` varchar(34) NOT NULL DEFAULT '',
+ `ul6pl` varchar(34) NOT NULL DEFAULT '',
+ `ul7pl` varchar(34) NOT NULL DEFAULT '',
+ `ul8pl` varchar(34) NOT NULL DEFAULT '',
+ `ll8pl` varchar(34) NOT NULL DEFAULT '',
+ `ll7pl` varchar(34) NOT NULL DEFAULT '',
+ `ll6pl` varchar(34) NOT NULL DEFAULT '',
+ `ll5pl` varchar(34) NOT NULL DEFAULT '',
+ `ll4pl` varchar(34) NOT NULL DEFAULT '',
+ `ll3pl` varchar(34) NOT NULL DEFAULT '',
+ `ll2pl` varchar(34) NOT NULL DEFAULT '',
+ `ll1pl` varchar(34) NOT NULL DEFAULT '',
+ `lr1pl` varchar(34) NOT NULL DEFAULT '',
+ `lr2pl` varchar(34) NOT NULL DEFAULT '',
+ `lr3pl` varchar(34) NOT NULL DEFAULT '',
+ `lr4pl` varchar(34) NOT NULL DEFAULT '',
+ `lr5pl` varchar(34) NOT NULL DEFAULT '',
+ `lr6pl` varchar(34) NOT NULL DEFAULT '',
+ `lr7pl` varchar(34) NOT NULL DEFAULT '',
+ `lr8pl` varchar(34) NOT NULL DEFAULT '',
+ `ur8cmp` varchar(34) NOT NULL DEFAULT '',
+ `ur7cmp` varchar(34) NOT NULL DEFAULT '',
+ `ur6cmp` varchar(34) NOT NULL DEFAULT '',
+ `ur5cmp` varchar(34) NOT NULL DEFAULT '',
+ `ur4cmp` varchar(34) NOT NULL DEFAULT '',
+ `ur3cmp` varchar(34) NOT NULL DEFAULT '',
+ `ur2cmp` varchar(34) NOT NULL DEFAULT '',
+ `ur1cmp` varchar(34) NOT NULL DEFAULT '',
+ `ul1cmp` varchar(34) NOT NULL DEFAULT '',
+ `ul2cmp` varchar(34) NOT NULL DEFAULT '',
+ `ul3cmp` varchar(34) NOT NULL DEFAULT '',
+ `ul4cmp` varchar(34) NOT NULL DEFAULT '',
+ `ul5cmp` varchar(34) NOT NULL DEFAULT '',
+ `ul6cmp` varchar(34) NOT NULL DEFAULT '',
+ `ul7cmp` varchar(34) NOT NULL DEFAULT '',
+ `ul8cmp` varchar(34) NOT NULL DEFAULT '',
+ `ll8cmp` varchar(34) NOT NULL DEFAULT '',
+ `ll7cmp` varchar(34) NOT NULL DEFAULT '',
+ `ll6cmp` varchar(34) NOT NULL DEFAULT '',
+ `ll5cmp` varchar(34) NOT NULL DEFAULT '',
+ `ll4cmp` varchar(34) NOT NULL DEFAULT '',
+ `ll3cmp` varchar(34) NOT NULL DEFAULT '',
+ `ll2cmp` varchar(34) NOT NULL DEFAULT '',
+ `ll1cmp` varchar(34) NOT NULL DEFAULT '',
+ `lr1cmp` varchar(34) NOT NULL DEFAULT '',
+ `lr2cmp` varchar(34) NOT NULL DEFAULT '',
+ `lr3cmp` varchar(34) NOT NULL DEFAULT '',
+ `lr4cmp` varchar(34) NOT NULL DEFAULT '',
+ `lr5cmp` varchar(34) NOT NULL DEFAULT '',
+ `lr6cmp` varchar(34) NOT NULL DEFAULT '',
+ `lr7cmp` varchar(34) NOT NULL DEFAULT '',
+ `lr8cmp` varchar(34) NOT NULL DEFAULT '',
+ `xraycmp` varchar(56) NOT NULL DEFAULT '',
+ `periocmp` varchar(56) NOT NULL DEFAULT '',
+ `anaescmp` varchar(56) NOT NULL DEFAULT '',
+ `othercmp` varchar(56) NOT NULL DEFAULT '',
+ `nducmp` varchar(56) NOT NULL DEFAULT '',
+ `ndlcmp` varchar(56) NOT NULL DEFAULT '',
+ `oducmp` varchar(56) NOT NULL DEFAULT '',
+ `odlcmp` varchar(56) NOT NULL DEFAULT '',
+ `customcmp` varchar(56) NOT NULL DEFAULT '',
+ `ftr` tinyint(1) DEFAULT '0',
+ PRIMARY KEY (`courseno`),
+ KEY `serialno` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `currtrtmt2`
+--
+
+LOCK TABLES `currtrtmt2` WRITE;
+/*!40000 ALTER TABLE `currtrtmt2` DISABLE KEYS */;
+/*!40000 ALTER TABLE `currtrtmt2` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `daybook`
+--
+
+DROP TABLE IF EXISTS `daybook`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `daybook` (
+ `date` date DEFAULT NULL,
+ `serialno` int(11) DEFAULT NULL,
+ `coursetype` char(1) DEFAULT NULL,
+ `dntid` smallint(6) DEFAULT NULL,
+ `trtid` smallint(6) DEFAULT NULL,
+ `diagn` varchar(56) DEFAULT NULL,
+ `perio` varchar(56) DEFAULT NULL,
+ `anaes` varchar(56) DEFAULT NULL,
+ `misc` varchar(56) DEFAULT NULL,
+ `ndu` varchar(56) DEFAULT NULL,
+ `ndl` varchar(56) DEFAULT NULL,
+ `odu` varchar(56) DEFAULT NULL,
+ `odl` varchar(56) DEFAULT NULL,
+ `other` varchar(56) DEFAULT NULL,
+ `chart` blob,
+ `feesa` int(11) DEFAULT NULL,
+ `feesb` int(11) DEFAULT NULL,
+ `feesc` int(11) DEFAULT NULL,
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`id`),
+ KEY `date` (`date`),
+ KEY `serialno` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `daybook`
+--
+
+LOCK TABLES `daybook` WRITE;
+/*!40000 ALTER TABLE `daybook` DISABLE KEYS */;
+/*!40000 ALTER TABLE `daybook` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `daybook_link`
+--
+
+DROP TABLE IF EXISTS `daybook_link`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `daybook_link` (
+ `ix` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `daybook_id` int(11) DEFAULT NULL,
+ `tx_hash` char(40) NOT NULL,
+ PRIMARY KEY (`ix`),
+ KEY `daybook_id` (`daybook_id`),
+ KEY `daybook_id_index` (`tx_hash`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `daybook_link`
+--
+
+LOCK TABLES `daybook_link` WRITE;
+/*!40000 ALTER TABLE `daybook_link` DISABLE KEYS */;
+/*!40000 ALTER TABLE `daybook_link` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `diary_link`
+--
+
+DROP TABLE IF EXISTS `diary_link`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `diary_link` (
+ `clinician_ix` smallint(5) unsigned NOT NULL,
+ `apptix` smallint(5) unsigned NOT NULL,
+ KEY `clinician_ix` (`clinician_ix`),
+ CONSTRAINT `diary_link_ibfk_1` FOREIGN KEY (`clinician_ix`) REFERENCES `clinicians` (`ix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `diary_link`
+--
+
+LOCK TABLES `diary_link` WRITE;
+/*!40000 ALTER TABLE `diary_link` DISABLE KEYS */;
+/*!40000 ALTER TABLE `diary_link` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `docsimported`
+--
+
+DROP TABLE IF EXISTS `docsimported`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `docsimported` (
+ `ix` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `serialno` int(11) unsigned NOT NULL DEFAULT '0',
+ `datatype` varchar(60) NOT NULL DEFAULT 'application/octet-stream',
+ `name` varchar(120) NOT NULL DEFAULT '',
+ `size` bigint(20) unsigned NOT NULL DEFAULT '1024',
+ `filedate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `importime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`ix`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `docsimported`
+--
+
+LOCK TABLES `docsimported` WRITE;
+/*!40000 ALTER TABLE `docsimported` DISABLE KEYS */;
+/*!40000 ALTER TABLE `docsimported` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `docsimporteddata`
+--
+
+DROP TABLE IF EXISTS `docsimporteddata`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `docsimporteddata` (
+ `ix` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `masterid` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `filedata` blob NOT NULL,
+ PRIMARY KEY (`ix`),
+ KEY `master_idx` (`masterid`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `docsimporteddata`
+--
+
+LOCK TABLES `docsimporteddata` WRITE;
+/*!40000 ALTER TABLE `docsimporteddata` DISABLE KEYS */;
+/*!40000 ALTER TABLE `docsimporteddata` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `est_link2`
+--
+
+DROP TABLE IF EXISTS `est_link2`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `est_link2` (
+ `ix` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `est_id` int(11) DEFAULT NULL,
+ `tx_hash` char(40) NOT NULL,
+ `completed` tinyint(1) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ix`),
+ KEY `est_id` (`est_id`),
+ KEY `est_link2_hash_index` (`tx_hash`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `est_link2`
+--
+
+LOCK TABLES `est_link2` WRITE;
+/*!40000 ALTER TABLE `est_link2` DISABLE KEYS */;
+/*!40000 ALTER TABLE `est_link2` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `est_logger`
+--
+
+DROP TABLE IF EXISTS `est_logger`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `est_logger` (
+ `ix` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `courseno` int(11) unsigned NOT NULL,
+ `est_data` mediumtext NOT NULL,
+ `operator` varchar(16) NOT NULL,
+ `time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`ix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `est_logger`
+--
+
+LOCK TABLES `est_logger` WRITE;
+/*!40000 ALTER TABLE `est_logger` DISABLE KEYS */;
+/*!40000 ALTER TABLE `est_logger` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `exemptions`
+--
+
+DROP TABLE IF EXISTS `exemptions`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `exemptions` (
+ `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `serialno` int(11) unsigned NOT NULL,
+ `exemption` varchar(10) DEFAULT NULL,
+ `exempttext` varchar(50) DEFAULT NULL,
+ `datestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ PRIMARY KEY (`ix`),
+ KEY `serialno` (`serialno`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `exemptions`
+--
+
+LOCK TABLES `exemptions` WRITE;
+/*!40000 ALTER TABLE `exemptions` DISABLE KEYS */;
+/*!40000 ALTER TABLE `exemptions` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `families`
+--
+
+DROP TABLE IF EXISTS `families`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `families` (
+ `familyno` int(11) NOT NULL,
+ `head` int(11) DEFAULT NULL,
+ PRIMARY KEY (`familyno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `families`
+--
+
+LOCK TABLES `families` WRITE;
+/*!40000 ALTER TABLE `families` DISABLE KEYS */;
+/*!40000 ALTER TABLE `families` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `feescales`
+--
+
+DROP TABLE IF EXISTS `feescales`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `feescales` (
+ `ix` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `in_use` tinyint(1) NOT NULL DEFAULT '0',
+ `priority` int(8) DEFAULT NULL,
+ `comment` varchar(255) NOT NULL DEFAULT 'unnamed feescale',
+ `xml_data` mediumtext NOT NULL,
+ PRIMARY KEY (`ix`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `feescales`
+--
+
+LOCK TABLES `feescales` WRITE;
+/*!40000 ALTER TABLE `feescales` DISABLE KEYS */;
+INSERT INTO `feescales` VALUES (1,1,0,'example feescale','<?xml version=\"1.0\" ?><feescale>\n <version>0.1</version>\n <tablename>test_feescale</tablename>\n <feescale_description>Example Fee Scale</feescale_description>\n <category>P</category>\n <header id=\"1\">Diagnosis</header>\n <header id=\"2\">Preventive Care</header>\n <header id=\"3\">Periodontal Treatment</header>\n <header id=\"4\">Conservative Treatment</header>\n <header id=\"5\">Endodontic Treatment</header>\n <header id= [...]
+/*!40000 ALTER TABLE `feescales` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `feetable_key`
+--
+
+DROP TABLE IF EXISTS `feetable_key`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `feetable_key` (
+ `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `tablename` char(30) DEFAULT NULL,
+ `categories` char(30) DEFAULT NULL,
+ `description` char(60) DEFAULT NULL,
+ `startdate` date DEFAULT NULL,
+ `enddate` date DEFAULT NULL,
+ `feecoltypes` tinytext,
+ `in_use` tinyint(1) NOT NULL DEFAULT '1',
+ `display_order` smallint(6) DEFAULT NULL,
+ `data` mediumtext,
+ PRIMARY KEY (`ix`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `feetable_key`
+--
+
+LOCK TABLES `feetable_key` WRITE;
+/*!40000 ALTER TABLE `feetable_key` DISABLE KEYS */;
+/*!40000 ALTER TABLE `feetable_key` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `formatted_notes`
+--
+
+DROP TABLE IF EXISTS `formatted_notes`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `formatted_notes` (
+ `ix` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `serialno` int(11) DEFAULT NULL,
+ `ndate` date DEFAULT NULL,
+ `op1` varchar(8) DEFAULT NULL,
+ `op2` varchar(8) DEFAULT NULL,
+ `ntype` varchar(32) DEFAULT NULL,
+ `note` varchar(80) DEFAULT NULL,
+ `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ UNIQUE KEY `ix` (`ix`),
+ KEY `formatted_notes_serialno_index` (`serialno`)
+) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `formatted_notes`
+--
+
+LOCK TABLES `formatted_notes` WRITE;
+/*!40000 ALTER TABLE `formatted_notes` DISABLE KEYS */;
+INSERT INTO `formatted_notes` VALUES (1,1,'2014-06-10','REC',NULL,'opened','System date - 10/06/2014 20:26:37','2014-06-10 19:26:37'),(2,1,'2014-06-10','REC',NULL,'newNOTE','This example patient was added to the demo database today.\n','2014-06-10 19:26:37'),(3,1,'2014-06-10','REC',NULL,'closed','REC 10/06/2014 20:26:37','2014-06-10 19:26:37');
+/*!40000 ALTER TABLE `formatted_notes` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `forum`
+--
+
+DROP TABLE IF EXISTS `forum`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `forum` (
+ `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `parent_ix` int(10) unsigned DEFAULT NULL,
+ `inits` char(5) DEFAULT NULL,
+ `fdate` datetime DEFAULT NULL,
+ `topic` char(30) DEFAULT NULL,
+ `comment` text NOT NULL,
+ `open` tinyint(1) NOT NULL DEFAULT '1',
+ `recipient` char(8) DEFAULT NULL,
+ PRIMARY KEY (`ix`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `forum`
+--
+
+LOCK TABLES `forum` WRITE;
+/*!40000 ALTER TABLE `forum` DISABLE KEYS */;
+/*!40000 ALTER TABLE `forum` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `forumread`
+--
+
+DROP TABLE IF EXISTS `forumread`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `forumread` (
+ `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `id` int(10) unsigned NOT NULL,
+ `op` char(8) DEFAULT NULL,
+ `readdate` datetime NOT NULL,
+ PRIMARY KEY (`ix`),
+ KEY `id` (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `forumread`
+--
+
+LOCK TABLES `forumread` WRITE;
+/*!40000 ALTER TABLE `forumread` DISABLE KEYS */;
+/*!40000 ALTER TABLE `forumread` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `mednotes`
+--
+
+DROP TABLE IF EXISTS `mednotes`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `mednotes` (
+ `serialno` int(11) NOT NULL,
+ `drnm` varchar(60) DEFAULT NULL,
+ `adrtel` varchar(60) DEFAULT NULL,
+ `curmed` varchar(60) DEFAULT NULL,
+ `allerg` varchar(60) DEFAULT NULL,
+ `heart` varchar(60) DEFAULT NULL,
+ `lungs` varchar(60) DEFAULT NULL,
+ `liver` varchar(60) DEFAULT NULL,
+ `kidney` varchar(60) DEFAULT NULL,
+ `bleed` varchar(60) DEFAULT NULL,
+ `anaes` varchar(60) DEFAULT NULL,
+ `other` varchar(60) DEFAULT NULL,
+ `oldmed` varchar(60) DEFAULT NULL,
+ `alert` tinyint(1) NOT NULL DEFAULT '0',
+ `chkdate` date DEFAULT NULL,
+ PRIMARY KEY (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `mednotes`
+--
+
+LOCK TABLES `mednotes` WRITE;
+/*!40000 ALTER TABLE `mednotes` DISABLE KEYS */;
+/*!40000 ALTER TABLE `mednotes` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `mnhist`
+--
+
+DROP TABLE IF EXISTS `mnhist`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `mnhist` (
+ `serialno` int(11) DEFAULT NULL,
+ `chgdate` date DEFAULT NULL,
+ `ix` tinyint(3) unsigned DEFAULT NULL,
+ `note` varchar(60) DEFAULT NULL,
+ KEY `sd` (`serialno`,`chgdate`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `mnhist`
+--
+
+LOCK TABLES `mnhist` WRITE;
+/*!40000 ALTER TABLE `mnhist` DISABLE KEYS */;
+/*!40000 ALTER TABLE `mnhist` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `new_patients`
+--
+
+DROP TABLE IF EXISTS `new_patients`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `new_patients` (
+ `serialno` int(11) NOT NULL,
+ `sname` varchar(30) DEFAULT NULL,
+ `fname` varchar(30) DEFAULT NULL,
+ `title` varchar(30) DEFAULT NULL,
+ `sex` char(1) DEFAULT NULL,
+ `dob` date DEFAULT NULL,
+ `addr1` varchar(30) NOT NULL DEFAULT '',
+ `addr2` varchar(30) NOT NULL DEFAULT '',
+ `addr3` varchar(30) NOT NULL DEFAULT '',
+ `town` varchar(30) NOT NULL DEFAULT '',
+ `county` varchar(30) NOT NULL DEFAULT '',
+ `pcde` varchar(30) NOT NULL DEFAULT '',
+ `tel1` varchar(30) NOT NULL DEFAULT '',
+ `tel2` varchar(30) NOT NULL DEFAULT '',
+ `mobile` varchar(30) NOT NULL DEFAULT '',
+ `fax` varchar(30) NOT NULL DEFAULT '',
+ `email1` varchar(50) NOT NULL DEFAULT '',
+ `email2` varchar(50) NOT NULL DEFAULT '',
+ `occup` varchar(30) NOT NULL DEFAULT '',
+ `nhsno` varchar(30) NOT NULL DEFAULT '',
+ `cnfd` date DEFAULT NULL,
+ `cset` varchar(10) DEFAULT NULL,
+ `dnt1` smallint(6) DEFAULT NULL,
+ `dnt2` smallint(6) DEFAULT NULL,
+ `courseno0` int(11) DEFAULT NULL,
+ `billdate` date DEFAULT NULL,
+ `billct` tinyint(3) unsigned DEFAULT NULL,
+ `billtype` char(1) DEFAULT NULL,
+ `familyno` int(11) DEFAULT NULL,
+ `memo` varchar(255) NOT NULL DEFAULT '',
+ `status` varchar(30) NOT NULL DEFAULT '',
+ PRIMARY KEY (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `new_patients`
+--
+
+LOCK TABLES `new_patients` WRITE;
+/*!40000 ALTER TABLE `new_patients` DISABLE KEYS */;
+INSERT INTO `new_patients` VALUES (1,'PATIENT','EXAMPLE','MR','M','1969-12-09','19 UNION STREET','','','INVERNESS','SCOTLAND, UK','IV1 1PP','','','','','','','','',NULL,'P',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'','');
+/*!40000 ALTER TABLE `new_patients` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `newdocsprinted`
+--
+
+DROP TABLE IF EXISTS `newdocsprinted`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `newdocsprinted` (
+ `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `serialno` int(11) DEFAULT NULL,
+ `printdate` date DEFAULT NULL,
+ `docname` char(20) DEFAULT NULL,
+ `docversion` smallint(6) DEFAULT NULL,
+ `data` blob,
+ PRIMARY KEY (`ix`),
+ KEY `newdocsprinted_serialno_index` (`serialno`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `newdocsprinted`
+--
+
+LOCK TABLES `newdocsprinted` WRITE;
+/*!40000 ALTER TABLE `newdocsprinted` DISABLE KEYS */;
+/*!40000 ALTER TABLE `newdocsprinted` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `newestimates`
+--
+
+DROP TABLE IF EXISTS `newestimates`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `newestimates` (
+ `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `serialno` int(11) NOT NULL,
+ `courseno` int(10) unsigned DEFAULT NULL,
+ `category` char(12) DEFAULT NULL,
+ `type` char(20) DEFAULT NULL,
+ `number` tinyint(4) DEFAULT NULL,
+ `itemcode` char(5) DEFAULT NULL,
+ `description` char(50) DEFAULT NULL,
+ `fee` int(11) DEFAULT NULL,
+ `ptfee` int(11) DEFAULT NULL,
+ `csetype` char(5) DEFAULT NULL,
+ `feescale` char(1) DEFAULT NULL,
+ `dent` tinyint(1) DEFAULT NULL,
+ `completed` tinyint(1) DEFAULT NULL,
+ `carriedover` tinyint(1) DEFAULT NULL,
+ `linked` tinyint(1) DEFAULT NULL,
+ `modified_by` varchar(20) NOT NULL,
+ `time_stamp` datetime NOT NULL,
+ PRIMARY KEY (`ix`),
+ KEY `serialno` (`serialno`),
+ KEY `courseno` (`courseno`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `newestimates`
+--
+
+LOCK TABLES `newestimates` WRITE;
+/*!40000 ALTER TABLE `newestimates` DISABLE KEYS */;
+/*!40000 ALTER TABLE `newestimates` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `newfeetable`
+--
+
+DROP TABLE IF EXISTS `newfeetable`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `newfeetable` (
+ `ix` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `section` smallint(6) DEFAULT NULL,
+ `USERCODE` char(14) DEFAULT NULL,
+ `code` char(8) DEFAULT NULL,
+ `oldcode` char(12) DEFAULT NULL,
+ `regulation` char(50) DEFAULT NULL,
+ `max_per_course` char(25) DEFAULT NULL,
+ `description` char(60) DEFAULT NULL,
+ `description1` char(60) DEFAULT NULL,
+ `NF08` int(11) DEFAULT NULL,
+ `NF08_pt` int(11) DEFAULT NULL,
+ `PFA` int(11) DEFAULT NULL,
+ `NF09` int(11) DEFAULT NULL,
+ `NF09_pt` int(11) DEFAULT NULL,
+ PRIMARY KEY (`ix`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `newfeetable`
+--
+
+LOCK TABLES `newfeetable` WRITE;
+/*!40000 ALTER TABLE `newfeetable` DISABLE KEYS */;
+/*!40000 ALTER TABLE `newfeetable` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `notes`
+--
+
+DROP TABLE IF EXISTS `notes`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `notes` (
+ `serialno` int(11) NOT NULL,
+ `lineno` smallint(5) unsigned NOT NULL,
+ `line` varchar(80) DEFAULT NULL,
+ PRIMARY KEY (`serialno`,`lineno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `notes`
+--
+
+LOCK TABLES `notes` WRITE;
+/*!40000 ALTER TABLE `notes` DISABLE KEYS */;
+/*!40000 ALTER TABLE `notes` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `opid`
+--
+
+DROP TABLE IF EXISTS `opid`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `opid` (
+ `id` char(5) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `opid`
+--
+
+LOCK TABLES `opid` WRITE;
+/*!40000 ALTER TABLE `opid` DISABLE KEYS */;
+INSERT INTO `opid` VALUES ('REC'),('USER');
+/*!40000 ALTER TABLE `opid` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `patient_dates`
+--
+
+DROP TABLE IF EXISTS `patient_dates`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `patient_dates` (
+ `pt_sno` int(11) NOT NULL,
+ `pd0` date DEFAULT NULL,
+ `pd1` date DEFAULT NULL,
+ `pd2` date DEFAULT NULL,
+ `pd3` date DEFAULT NULL,
+ `pd4` date DEFAULT NULL,
+ `pd5` date DEFAULT NULL,
+ `pd6` date DEFAULT NULL,
+ `pd7` date DEFAULT NULL,
+ `pd8` date DEFAULT NULL,
+ `pd9` date DEFAULT NULL,
+ `pd10` date DEFAULT NULL,
+ `pd11` date DEFAULT NULL,
+ `pd12` date DEFAULT NULL,
+ `pd13` date DEFAULT NULL,
+ `pd14` date DEFAULT NULL,
+ UNIQUE KEY `pt_sno` (`pt_sno`),
+ CONSTRAINT `patient_dates_ibfk_1` FOREIGN KEY (`pt_sno`) REFERENCES `new_patients` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `patient_dates`
+--
+
+LOCK TABLES `patient_dates` WRITE;
+/*!40000 ALTER TABLE `patient_dates` DISABLE KEYS */;
+INSERT INTO `patient_dates` VALUES (1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+/*!40000 ALTER TABLE `patient_dates` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `patient_money`
+--
+
+DROP TABLE IF EXISTS `patient_money`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `patient_money` (
+ `pt_sno` int(11) NOT NULL,
+ `money0` int(11) NOT NULL DEFAULT '0',
+ `money1` int(11) NOT NULL DEFAULT '0',
+ `money2` int(11) NOT NULL DEFAULT '0',
+ `money3` int(11) NOT NULL DEFAULT '0',
+ `money4` int(11) NOT NULL DEFAULT '0',
+ `money5` int(11) NOT NULL DEFAULT '0',
+ `money6` int(11) NOT NULL DEFAULT '0',
+ `money7` int(11) NOT NULL DEFAULT '0',
+ `money8` int(11) NOT NULL DEFAULT '0',
+ `money9` int(11) NOT NULL DEFAULT '0',
+ `money10` int(11) NOT NULL DEFAULT '0',
+ `money11` int(11) NOT NULL DEFAULT '0',
+ UNIQUE KEY `pt_sno` (`pt_sno`),
+ CONSTRAINT `patient_money_ibfk_1` FOREIGN KEY (`pt_sno`) REFERENCES `new_patients` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `patient_money`
+--
+
+LOCK TABLES `patient_money` WRITE;
+/*!40000 ALTER TABLE `patient_money` DISABLE KEYS */;
+INSERT INTO `patient_money` VALUES (1,0,0,0,0,0,0,0,0,0,0,0,0);
+/*!40000 ALTER TABLE `patient_money` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `patient_nhs`
+--
+
+DROP TABLE IF EXISTS `patient_nhs`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `patient_nhs` (
+ `pt_sno` int(11) NOT NULL,
+ `initaccept` date DEFAULT NULL,
+ `lastreaccept` date DEFAULT NULL,
+ `lastclaim` date DEFAULT NULL,
+ `expiry` date DEFAULT NULL,
+ `cstatus` tinyint(3) unsigned DEFAULT NULL,
+ `transfer` date DEFAULT NULL,
+ `pstatus` tinyint(3) unsigned DEFAULT NULL,
+ UNIQUE KEY `pt_sno` (`pt_sno`),
+ CONSTRAINT `patient_nhs_ibfk_1` FOREIGN KEY (`pt_sno`) REFERENCES `new_patients` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `patient_nhs`
+--
+
+LOCK TABLES `patient_nhs` WRITE;
+/*!40000 ALTER TABLE `patient_nhs` DISABLE KEYS */;
+/*!40000 ALTER TABLE `patient_nhs` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `perio`
+--
+
+DROP TABLE IF EXISTS `perio`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `perio` (
+ `serialno` int(11) NOT NULL DEFAULT '0',
+ `chartdate` date NOT NULL DEFAULT '0000-00-00',
+ `bpe` char(6) DEFAULT NULL,
+ `chartdata` blob,
+ `flag` tinyint(3) unsigned DEFAULT NULL,
+ PRIMARY KEY (`serialno`,`chartdate`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `perio`
+--
+
+LOCK TABLES `perio` WRITE;
+/*!40000 ALTER TABLE `perio` DISABLE KEYS */;
+/*!40000 ALTER TABLE `perio` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `phrasebook`
+--
+
+DROP TABLE IF EXISTS `phrasebook`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `phrasebook` (
+ `clinician_id` int(10) unsigned NOT NULL,
+ `phrases` text,
+ PRIMARY KEY (`clinician_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `phrasebook`
+--
+
+LOCK TABLES `phrasebook` WRITE;
+/*!40000 ALTER TABLE `phrasebook` DISABLE KEYS */;
+/*!40000 ALTER TABLE `phrasebook` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `plandata`
+--
+
+DROP TABLE IF EXISTS `plandata`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `plandata` (
+ `serialno` int(11) NOT NULL,
+ `plantype` char(4) DEFAULT NULL,
+ `band` char(1) DEFAULT NULL,
+ `grosschg` int(11) DEFAULT NULL,
+ `discount` int(11) DEFAULT NULL,
+ `netchg` int(11) DEFAULT NULL,
+ `catcode` char(1) DEFAULT NULL,
+ `planjoin` date DEFAULT NULL,
+ `regno` int(11) DEFAULT NULL,
+ PRIMARY KEY (`serialno`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `plandata`
+--
+
+LOCK TABLES `plandata` WRITE;
+/*!40000 ALTER TABLE `plandata` DISABLE KEYS */;
+/*!40000 ALTER TABLE `plandata` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `previous_snames`
+--
+
+DROP TABLE IF EXISTS `previous_snames`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `previous_snames` (
+ `ix` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `serialno` int(11) DEFAULT NULL,
+ `psn` char(40) NOT NULL,
+ PRIMARY KEY (`ix`),
+ KEY `serialno` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `previous_snames`
+--
+
+LOCK TABLES `previous_snames` WRITE;
+/*!40000 ALTER TABLE `previous_snames` DISABLE KEYS */;
+/*!40000 ALTER TABLE `previous_snames` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `ptmemos`
+--
+
+DROP TABLE IF EXISTS `ptmemos`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ptmemos` (
+ `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `serialno` int(11) DEFAULT NULL,
+ `enabled` tinyint(1) DEFAULT NULL,
+ `author` char(5) DEFAULT NULL,
+ `type` char(5) DEFAULT NULL,
+ `mdate` datetime DEFAULT NULL,
+ `expiredate` date DEFAULT NULL,
+ `message` char(200) DEFAULT NULL,
+ `open` tinyint(1) NOT NULL DEFAULT '1',
+ PRIMARY KEY (`ix`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `ptmemos`
+--
+
+LOCK TABLES `ptmemos` WRITE;
+/*!40000 ALTER TABLE `ptmemos` DISABLE KEYS */;
+/*!40000 ALTER TABLE `ptmemos` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `referral_centres`
+--
+
+DROP TABLE IF EXISTS `referral_centres`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `referral_centres` (
+ `ix` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `description` char(64) NOT NULL DEFAULT 'referral',
+ `greeting` char(64) NOT NULL DEFAULT 'Dear Sir/Madam',
+ `addr1` char(64) NOT NULL DEFAULT '',
+ `addr2` char(64) NOT NULL DEFAULT '',
+ `addr3` char(64) NOT NULL DEFAULT '',
+ `addr4` char(64) NOT NULL DEFAULT '',
+ `addr5` char(64) NOT NULL DEFAULT '',
+ `addr6` char(64) NOT NULL DEFAULT '',
+ `addr7` char(64) NOT NULL DEFAULT '',
+ PRIMARY KEY (`ix`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `referral_centres`
+--
+
+LOCK TABLES `referral_centres` WRITE;
+/*!40000 ALTER TABLE `referral_centres` DISABLE KEYS */;
+/*!40000 ALTER TABLE `referral_centres` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `settings`
+--
+
+DROP TABLE IF EXISTS `settings`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `settings` (
+ `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `value` varchar(128) DEFAULT NULL,
+ `data` text,
+ `hostname` varchar(128) DEFAULT NULL,
+ `station` char(20) DEFAULT NULL,
+ `user` char(20) DEFAULT NULL,
+ `modified_by` varchar(20) NOT NULL,
+ `time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`ix`),
+ KEY `value` (`value`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `settings`
+--
+
+LOCK TABLES `settings` WRITE;
+/*!40000 ALTER TABLE `settings` DISABLE KEYS */;
+INSERT INTO `settings` VALUES (1,'wikiurl','http://openmolar.com/wiki',NULL,NULL,NULL,'neil at openmolar.com','2014-06-10 17:52:59'),(2,'Schema_Version','2.9',NULL,NULL,NULL,'neil at openmolar.com','2014-07-01 12:51:30');
+/*!40000 ALTER TABLE `settings` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `static_chart`
+--
+
+DROP TABLE IF EXISTS `static_chart`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `static_chart` (
+ `pt_sno` int(11) NOT NULL,
+ `dent0` tinyint(4) DEFAULT NULL,
+ `dent1` tinyint(4) DEFAULT NULL,
+ `dent2` tinyint(4) DEFAULT NULL,
+ `dent3` tinyint(4) DEFAULT NULL,
+ `ur1` varchar(34) NOT NULL DEFAULT '',
+ `ur2` varchar(34) NOT NULL DEFAULT '',
+ `ur3` varchar(34) NOT NULL DEFAULT '',
+ `ur4` varchar(34) NOT NULL DEFAULT '',
+ `ur5` varchar(34) NOT NULL DEFAULT '',
+ `ur6` varchar(34) NOT NULL DEFAULT '',
+ `ur7` varchar(34) NOT NULL DEFAULT '',
+ `ur8` varchar(34) NOT NULL DEFAULT '',
+ `ul1` varchar(34) NOT NULL DEFAULT '',
+ `ul2` varchar(34) NOT NULL DEFAULT '',
+ `ul3` varchar(34) NOT NULL DEFAULT '',
+ `ul4` varchar(34) NOT NULL DEFAULT '',
+ `ul5` varchar(34) NOT NULL DEFAULT '',
+ `ul6` varchar(34) NOT NULL DEFAULT '',
+ `ul7` varchar(34) NOT NULL DEFAULT '',
+ `ul8` varchar(34) NOT NULL DEFAULT '',
+ `lr1` varchar(34) NOT NULL DEFAULT '',
+ `lr2` varchar(34) NOT NULL DEFAULT '',
+ `lr3` varchar(34) NOT NULL DEFAULT '',
+ `lr4` varchar(34) NOT NULL DEFAULT '',
+ `lr5` varchar(34) NOT NULL DEFAULT '',
+ `lr6` varchar(34) NOT NULL DEFAULT '',
+ `lr7` varchar(34) NOT NULL DEFAULT '',
+ `lr8` varchar(34) NOT NULL DEFAULT '',
+ `ll1` varchar(34) NOT NULL DEFAULT '',
+ `ll2` varchar(34) NOT NULL DEFAULT '',
+ `ll3` varchar(34) NOT NULL DEFAULT '',
+ `ll4` varchar(34) NOT NULL DEFAULT '',
+ `ll5` varchar(34) NOT NULL DEFAULT '',
+ `ll6` varchar(34) NOT NULL DEFAULT '',
+ `ll7` varchar(34) NOT NULL DEFAULT '',
+ `ll8` varchar(34) NOT NULL DEFAULT '',
+ UNIQUE KEY `pt_sno` (`pt_sno`),
+ CONSTRAINT `static_chart_ibfk_1` FOREIGN KEY (`pt_sno`) REFERENCES `new_patients` (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `static_chart`
+--
+
+LOCK TABLES `static_chart` WRITE;
+/*!40000 ALTER TABLE `static_chart` DISABLE KEYS */;
+INSERT INTO `static_chart` VALUES (1,NULL,16,NULL,NULL,'PV ','CR,LAVA ','MI ','B,GL ','MOD ','MO,CO ','','UE ','IM/TIT IM/ABUT CR,V1 ','','','GI/MOD RT ','','','','UE ','','','','','OL,CO ','B ','FS ','UE ','','','','','','MOL,CO ','','UE ');
+/*!40000 ALTER TABLE `static_chart` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `tasks`
+--
+
+DROP TABLE IF EXISTS `tasks`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `tasks` (
+ `ix` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `op` char(8) DEFAULT NULL,
+ `author` char(8) DEFAULT NULL,
+ `type` char(8) DEFAULT NULL,
+ `mdate` datetime NOT NULL,
+ `due` datetime NOT NULL,
+ `message` char(255) DEFAULT NULL,
+ `completed` tinyint(1) NOT NULL DEFAULT '0',
+ `visible` tinyint(1) NOT NULL DEFAULT '1',
+ PRIMARY KEY (`ix`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `tasks`
+--
+
+LOCK TABLES `tasks` WRITE;
+/*!40000 ALTER TABLE `tasks` DISABLE KEYS */;
+/*!40000 ALTER TABLE `tasks` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `userdata`
+--
+
+DROP TABLE IF EXISTS `userdata`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `userdata` (
+ `serialno` int(11) NOT NULL,
+ `data` blob,
+ PRIMARY KEY (`serialno`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `userdata`
+--
+
+LOCK TABLES `userdata` WRITE;
+/*!40000 ALTER TABLE `userdata` DISABLE KEYS */;
+/*!40000 ALTER TABLE `userdata` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2014-07-01 13:52:09
diff --git a/src/openmolar/schema_upgrades/database_updater_thread.py b/src/openmolar/schema_upgrades/database_updater_thread.py
new file mode 100644
index 0000000..7d412a3
--- /dev/null
+++ b/src/openmolar/schema_upgrades/database_updater_thread.py
@@ -0,0 +1,152 @@
+#! /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 QtCore
+from openmolar import connect
+from openmolar.dbtools import schema_version
+
+LOGGER = logging.getLogger("openmolar")
+
+class UpdateError(Exception):
+ '''
+ A custom exception. If this is thrown the db will be rolled back
+ '''
+ pass
+
+class DatabaseUpdaterThread(QtCore.QThread):
+ '''
+ A class to update the openmolar database
+ '''
+ UpdateError = UpdateError
+ progress_signal = QtCore.pyqtSignal(object, object)
+ completed_signal = QtCore.pyqtSignal(object)
+
+ def __init__(self, parent=None):
+ super(DatabaseUpdaterThread, self).__init__(parent)
+ self.message = "upating database"
+ self.db = None
+ self.cursor = None
+
+ def run(self):
+ '''
+ function should be re-implemented
+ '''
+ raise self.update_error, \
+ "DatabaseUpdateThread.run must be re-implemented"
+
+ def completeSig(self, message):
+ '''
+ let the application know that the updater has finished
+ '''
+ self.completed_signal.emit(message)
+
+ def progressSig(self, val, message=""):
+ '''
+ emits a signal showhing how we are proceeding.
+ val is a number between 0 and 100
+ '''
+ if message != "":
+ self.message = message
+ self.progress_signal.emit(val, self.message)
+ self.process_events()
+
+ def process_events(self):
+ '''
+ if attached to a gui.. update the interface, else pass quietly
+ '''
+ try:
+ QtCore.QCoreApplication.instance().processEvents()
+ except AttributeError:
+ pass
+
+ def connect(self):
+ if self.db is None:
+ self.db = connect.connect()
+ self.db.autocommit(False)
+ self.cursor = self.db.cursor()
+
+ def rollback(self):
+ self.db.rollback()
+ self.db.close()
+ self.db=None
+
+ def commit(self):
+ self.db.commit()
+ self.db.close()
+ self.db=None
+
+ def update_schema_version(self, compatible_versions, message):
+ schema_version.update(compatible_versions, message)
+
+ def execute_statements(self, sql_strings):
+ '''
+ execute the above commands
+ NOTE - this function may fail depending on the mysql permissions
+ in place
+ '''
+ self.connect()
+ try:
+ i, commandNo = 0, len(sql_strings)
+ for sql_string in sql_strings:
+ try:
+ self.cursor.execute(sql_string)
+ except connect.GeneralError as exc:
+ if 1091 in exc.args:
+ LOGGER.warning(
+ "statement:'%s' threw column removal error - "
+ "continuing on assumption column is already "
+ "removed", sql_string.replace("\n", " "))
+ elif 1060 in exc.args:
+ LOGGER.warning(
+ "statement:'%s' threw column addition error - "
+ "continuing on assumption column is already "
+ "added", sql_string.replace("\n", " "))
+ elif 1061 in exc.args:
+ LOGGER.warning(
+ "statement:'%s' threw dupliacte key error - "
+ "continuing on assumption key is already "
+ "added", sql_string.replace("\n", " "))
+ else:
+ LOGGER.warning(
+ "FAILURE in executing sql statement \n%s",
+ sql_string)
+ raise exc
+ self.progressSig(2 + 70 * i / commandNo,
+ "%s..." % sql_string[:10])
+ except Exception:
+ LOGGER.exception("FAILURE in executing sql statements")
+ raise self.UpdateError("couldn't execute all statements!")
+
+ def force_stop(self):
+ LOGGER.warning("forcing DatabaseUpdaterThread stop")
+ if self.isRunning() and self.cursor is not None:
+ # by changing this attribute, execute statements
+ # should die and rollback after an attribute error.
+ self.cursor = None
+
+if __name__ == "__main__":
+ dbu = DatabaseUpdaterThread()
+ dbu.run()
diff --git a/src/openmolar/schema_upgrades/formatted_notes1_9.py b/src/openmolar/schema_upgrades/formatted_notes1_9.py
deleted file mode 100644
index e88d809..0000000
--- a/src/openmolar/schema_upgrades/formatted_notes1_9.py
+++ /dev/null
@@ -1,107 +0,0 @@
-#! /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
-
-try:
- from collections import OrderedDict
-except ImportError:
- # OrderedDict only came in python 2.7
- print "using openmolar.backports for OrderedDict"
- from openmolar.backports import OrderedDict
-
-
-def get_notes(sno):
- db = connect.connect()
- cursor = db.cursor()
- cursor.execute('''SELECT line from notes where serialno = %s
- order by lineno''', sno)
- results = cursor.fetchall()
- cursor.close()
-
- notes_dict = OrderedDict()
- ndate, op = "", ""
-
- # 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 != "":
- ndate = date2
- if operator != "":
- op = operator
-
- key = (ndate, op)
- if key in notes_dict:
- notes_dict[key].append((ntype, note))
- else:
- notes_dict[key] = [(ntype, note)]
-
- return notes_dict
-
-
-def transfer(sno):
- print "transferring notes for serialnos %s" % sno,
- notes_dict = get_notes(sno)
- query = '''insert into formatted_notes
- (serialno, ndate, op1 , op2 , ntype, note)
- values (%s, %s, %s, %s, %s, %s)'''
-
- values = []
- for key in notes_dict:
- date, ops = key
- op2 = None
- if "/" in ops:
- op1, op2 = ops.split("/")
- else:
- op1 = ops
-
- for ntype, note in notes_dict[key]:
- values.append((sno, date, op1, op2, ntype, note))
- if values:
- db = connect.connect()
- cursor = db.cursor()
- rows = cursor.executemany(query, values)
- 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()
- cursor.execute("select max(serialno) from notes")
- max_sno = cursor.fetchone()[0]
- cursor.close()
- db.close()
- return max_sno
-
-if __name__ == "__main__":
- max_sno = get_max_sno()
- print "modding notes up to maximum found", max_sno
- sno = 0
- while sno < max_sno:
- transfer(sno)
diff --git a/src/openmolar/schema_upgrades/schema1_0to1_1.py b/src/openmolar/schema_upgrades/schema1_0to1_1.py
index fd95d75..11831f5 100644
--- a/src/openmolar/schema_upgrades/schema1_0to1_1.py
+++ b/src/openmolar/schema_upgrades/schema1_0to1_1.py
@@ -29,10 +29,20 @@ The NewTable schema is contained in module variable NEW_TABLE_SQLSTRINGS
Incidentally - this script introduces the "settings table" in which the schema
variable is stored.
'''
-from PyQt4 import QtGui, QtCore
+import logging
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-NEW_TABLE_SQLSTRINGS = ['''
-CREATE TABLE IF NOT EXISTS newestimates (
+LOGGER = logging.getLogger("openmolar")
+
+SQLSTRINGS = [
+ 'DROP TABLE IF EXISTS newestimates',
+ 'DROP TABLE IF EXISTS settings',
+ 'DROP TABLE IF EXISTS calendar',
+ '''
+CREATE TABLE newestimates (
`ix` int(10) unsigned NOT NULL auto_increment ,
`serialno` int(11) NOT NULL ,
`courseno` int(10) unsigned ,
@@ -55,8 +65,8 @@ PRIMARY KEY (ix),
KEY (serialno),
KEY (courseno));
''',
- '''
-CREATE TABLE IF NOT EXISTS settings (
+ '''
+CREATE TABLE settings (
`ix` int(10) unsigned NOT NULL auto_increment ,
`value` varchar(128),
`data` text,
@@ -68,60 +78,30 @@ CREATE TABLE IF NOT EXISTS settings (
PRIMARY KEY (ix),
KEY (value));
''',
- '''
-CREATE TABLE IF NOT EXISTS calendar (
+ '''
+CREATE TABLE calendar (
`ix` int(10) unsigned NOT NULL auto_increment ,
`adate` DATE NOT NULL,
`memo` char(30),
PRIMARY KEY (ix),
KEY (adate));
'''
- ]
+]
-import sys
-from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
-'''this checks for names which have changed.'''
+SRC_QUERY = '''select serialno, courseno, type, number, itemcode,
+description, fee, ptfee, feescale, csetype, dent, completed,
+carriedover, linked from estimates'''
-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 createNewTables(self):
- '''
- creates the newEstimatesTable.
- NOTE - this function may fail depending on the mysql permissions in place
- '''
- try:
- db = connect.connect()
- cursor = db.cursor()
- for sql_strings in NEW_TABLE_SQLSTRINGS:
- cursor.execute(sql_strings)
- db.commit()
- return True
- except Exception as e:
- print e
- print "unable to execute createNewEstimates"
+class DatabaseUpdater(DatabaseUpdaterThread):
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,
- carriedover, linked from estimates''')
- rows = cursor.fetchall()
- cursor.close()
- db.close()
+ self.cursor.execute(SRC_QUERY)
+ rows = self.cursor.fetchall()
return rows
def convertData(self, rows):
@@ -154,7 +134,7 @@ class dbUpdater(QtCore.QThread):
if i % 100 == 0:
self.progressSig((i / progress_var) * 40 + 20)
if len(row) != len(newrow) - 1:
- print "Error converting ", row
+ LOGGER.error("Error converting %s", str(row))
sys.exit()
retlist.append(newrow)
return retlist
@@ -163,8 +143,6 @@ class dbUpdater(QtCore.QThread):
'''
insert new row types into the newestimates table
'''
- db = connect.connect()
- cursor = db.cursor()
progress_var = len(rows)
i = 0
query = '''insert into newestimates
@@ -174,54 +152,38 @@ class dbUpdater(QtCore.QThread):
%s, %s, %s, %s, %s, %s, %s, %s, %s, '1_0to1_1script', NOW())'''
for values in rows:
- cursor.execute(query, values)
+ self.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.
- val is a number between 0 and 100
- '''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
- 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"
+ LOGGER.info("running script to convert from schema 1.0 to 1.1")
try:
- if self.createNewTables():
- self.progressSig(10, "extracting estimates")
- 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 as e:
- print "Exception caught", e
- self.completeSig(str(e))
-
- return self.completed
+ self.connect()
+ #- execute the SQL commands
+ self.progressSig(10, _("creating new tables"))
+ self.execute_statements(SQLSTRINGS)
+ self.progressSig(15, "extracting estimates")
+ oldrows = self.getRowsFromOld()
+ self.progressSig(20, "converting data")
+ newRows = self.convertData(oldrows)
+ self.progressSig(40, "exporting into newestimates table")
+ self.insertRowsIntoNew(newRows)
+ self.progressSig(90, "updating stored schema version")
+ self.update_schema_version(("1.1",), "1_0 to 1_1 script")
+ self.progressSig(100)
+ self.commit()
+ self.completeSig(_("Successfully moved db to") + " 1.1")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_1to1_2.py b/src/openmolar/schema_upgrades/schema1_1to1_2.py
index 88194d3..4fbfbdd 100644
--- a/src/openmolar/schema_upgrades/schema1_1to1_2.py
+++ b/src/openmolar/schema_upgrades/schema1_1to1_2.py
@@ -23,17 +23,20 @@
# ############################################################################ #
'''
-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
-variable is stored.
+This module provides a function 'run' which will move data
+to schema 1_2
'''
-from PyQt4 import QtGui, QtCore
+
+import logging
+import sys
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
+
+LOGGER = logging.getLogger("openmolar")
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 ,
@@ -41,7 +44,8 @@ id int(10) unsigned NOT NULL ,
op char(8),
readdate DATETIME NOT NULL,
PRIMARY KEY (ix),
-KEY (id))''',
+KEY (id))
+''',
'''
CREATE TABLE if not exists tasks (
ix int(10) unsigned NOT NULL auto_increment,
@@ -53,108 +57,69 @@ due DATETIME NOT NULL,
message char(255),
completed bool NOT NULL default False,
visible bool NOT NULL default True,
-PRIMARY KEY (ix))''',
+PRIMARY KEY (ix))
+''',
]
-import sys
-from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
-
-
-def create_alter_tables():
- '''
- execute the above commands
- NOTE - this function may fail depending on the mysql permissions in place
- '''
- db = connect.connect()
- cursor = db.cursor()
- for sql_string in SQLSTRINGS:
- cursor.execute(sql_string)
- db.commit()
- return True
-
-
-def copy_OMforum_into_forum():
- '''
- I am scrapping the omforum table, put these posts into the forum
- '''
- db = connect.connect()
- 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()
-
- 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,
- open) values (%s, %s, %s, %s, %s, %s)'''
-
- for row in rows:
- if row[1]:
- parent_ix = row[1] + start_ix
- else:
- parent_ix = None
- values = (parent_ix, row[2], row[3], row[4], row[5], row[6])
- cursor.execute(query, values)
-
- db.commit()
+LOCK_QUERY = 'lock tables omforum read,forum write'
- cursor.execute("unlock tables")
- cursor.close()
+SOURCE_QUERY = '''select ix, parent_ix, inits, fdate, topic, comment, open
+from omforum order by ix'''
- db.close()
- return True
+FORUM_QUERY = '''insert into forum
+(parent_ix, inits, fdate, topic, comment, open)
+values (%s, %s, %s, %s, %s, %s)'''
+MAX_QUERY = 'select max(ix) from forum'
-class dbUpdater(QtCore.QThread):
- def __init__(self, parent=None):
- super(dbUpdater, self).__init__(parent)
- self.stopped = False
- self.path = None
- self.completed = False
+class DatabaseUpdater(DatabaseUpdaterThread):
- def progressSig(self, val, message):
+ def copy_OMforum_into_forum(self):
'''
- emits a signal showhing how we are proceeding.
- val is a number between 0 and 100
+ I am scrapping the omforum table, put these posts into the forum
'''
- self.emit(QtCore.SIGNAL("progress"), val, message)
-
- def completeSig(self, arg):
- self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+ self.cursor.execute(LOCK_QUERY)
+
+ self.cursor.execute(SOURCE_QUERY)
+ rows = self.cursor.fetchall()
+ self.cursor.execute(MAX_QUERY)
+ start_ix = self.cursor.fetchone()[0] + 1
+ LOGGER.debug("start_ix = %s", start_ix)
+
+ for row in rows:
+ if row[1]:
+ parent_ix = row[1] + start_ix
+ else:
+ parent_ix = None
+ values = (parent_ix, row[2], row[3], row[4], row[5], row[6])
+ self.cursor.execute(FORUM_QUERY, values)
+ self.cursor.execute("unlock tables")
def run(self):
- print "running script to convert from schema 1.1 to 1.2"
+ LOGGER.info("running script to convert from schema 1.1 to 1.2")
try:
+ self.connect()
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')
-
- 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 as e:
- print "Exception caught", e
- self.completeSig(str(e))
-
- return self.completed
+ self.execute_statements(SQLSTRINGS)
+ self.progressSig(50, 'created new table "forumread"')
+
+ self.copy_OMforum_into_forum()
+ self.progressSig(80, 'copied data from obsolete table OMforum')
+ self.update_schema_version(("1.2",), "1_1 to 1_2 script")
+
+ self.progressSig(100, _("updating stored schema version"))
+ self.commit()
+ self.completeSig(_("Successfully moved db to") + " 1.2")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_2to1_3.py b/src/openmolar/schema_upgrades/schema1_2to1_3.py
index 0a3625e..efcba49 100644
--- a/src/openmolar/schema_upgrades/schema1_2to1_3.py
+++ b/src/openmolar/schema_upgrades/schema1_2to1_3.py
@@ -23,19 +23,24 @@
# ############################################################################ #
'''
-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
+This module provides a function 'run' which will move data
+to schema 1_3
'''
+import logging
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
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 ,
@@ -47,88 +52,34 @@ PRIMARY KEY (ix),
KEY (serialno))''',
]
-import sys
-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
- NOTE - this function may fail depending on the mysql permissions in place
- '''
- db = connect.connect()
- db.autocommit(False)
- cursor = db.cursor()
- sucess = False
- try:
- i, commandNo = 0, len(SQLSTRINGS)
- for sql_string in SQLSTRINGS:
- cursor.execute(sql_string)
- self.progressSig(
- 10 + 70 * i / commandNo,
- sql_string[:20] + "...")
- sucess = True
- 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.
- val is a number between 0 and 100
- '''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
- def completeSig(self, arg):
- self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+class DatabaseUpdater(DatabaseUpdaterThread):
def run(self):
- print "running script to convert from schema 1.2 to 1.3"
+ LOGGER.info("running script to convert from schema 1.2 to 1.3")
try:
+ self.connect()
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")
-
- self.progressSig(100, _("updating stored schema version"))
- self.completed = True
- self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 1.3")
- else:
- localsettings.CLIENT_SCHEMA_VERSION = " 1.2"
- self.completeSig(_("couldn't create tables, rolled back to")
- + "1.2")
-
- except Exception as e:
- print "Exception caught", e
- self.completeSig(str(e))
-
- return self.completed
+ self.execute_statements(SQLSTRINGS)
+ self.progressSig(90, _('updating settings'))
+ LOGGER.debug("update database settings...")
+
+ # pass a tuple of compatible clients and the "user"
+ # who made these changes.
+ self.update_schema_version(("1.2", "1.3"), "1_2 to 1_3 script")
+
+ self.progressSig(100, _("updating stored schema version"))
+ self.commit()
+ self.completeSig(_("Successfully moved db to") + " 1.3")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_3to1_4.py b/src/openmolar/schema_upgrades/schema1_3to1_4.py
index fcfe989..5d283e1 100644
--- a/src/openmolar/schema_upgrades/schema1_3to1_4.py
+++ b/src/openmolar/schema_upgrades/schema1_3to1_4.py
@@ -23,19 +23,30 @@
# ############################################################################ #
'''
-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
+This module provides a function 'run' which will move data
+to schema 1_4
'''
+
+import logging
import sys
+
from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
SQLSTRINGS = [
+ 'DROP TABLE IF EXISTS feetable_key',
+ '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 docsimported',
'''
-CREATE TABLE if not exists feetable_key (
+CREATE TABLE feetable_key (
ix int(10) unsigned NOT NULL auto_increment ,
tablename char(30),
categories char(30),
@@ -53,11 +64,15 @@ 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>'
+'<?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 (
+CREATE TABLE feetable_scotNHS_08_Adult (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
code char(8),
@@ -71,19 +86,21 @@ pt_fee int(11),
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",
20080401, 20090831, 6,
-'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="ptfee">pt_fee</column></columns>'
+'<?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 (
+CREATE TABLE feetable_scotNHS_08_Child (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
code char(8),
@@ -97,18 +114,21 @@ pt_fee int(11),
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,
-'<?xml version="1.0"?><columns><column type="fee">fee</column><column type="ptfee">pt_fee</column></columns>'
+'<?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 (
+CREATE TABLE feetable_scotNHS_09_Adult (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
code char(8),
@@ -122,18 +142,21 @@ pt_fee int(11),
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",
"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>'
+'<?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 (
+CREATE TABLE feetable_scotNHS_09_Child (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
code char(8),
@@ -147,18 +170,20 @@ pt_fee int(11),
hide bool NOT NULL default False,
PRIMARY KEY (ix))
''',
-
'''
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>'
+'<?xml version="1.0"?>
+ <columns>
+ <column type="fee">fee</column>
+ <column type="ptfee">pt_fee</column>
+ </columns>'
)
-
''',
'''
-CREATE TABLE if not exists feetable_HDP (
+CREATE TABLE feetable_HDP (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
code char(8),
@@ -172,18 +197,22 @@ pt_fee int(11) NOT NULL default 0,
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",
"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>'
+'<?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 (
+CREATE TABLE feetable_Private_2009 (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
code char(8),
@@ -199,19 +228,22 @@ feeD int(11),
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",
"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>'
+'<?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 (
+CREATE TABLE feetable_Private_2010 (
ix int(10) unsigned NOT NULL auto_increment ,
section smallint(6),
code char(8),
@@ -227,9 +259,8 @@ feeD int(11),
hide bool NOT NULL default False,
PRIMARY KEY (ix))
''',
-
'''
-CREATE TABLE if not exists docsimported (
+CREATE TABLE docsimported (
ix int(10) unsigned NOT NULL auto_increment ,
serialno int(11) NOT NULL ,
importdate date ,
@@ -238,72 +269,28 @@ 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
-
+SRC_QUERY = '''select section, code, oldcode, USERCODE,
+regulation, description, description1, %s from newfeetable
+order by code, ix'''
-class dbUpdater(QtCore.QThread):
+DEST_QUERY = '''insert into %s (section, code, oldcode, USERCODE,
+regulation, description, brief_description, fee, pt_fee)
+values (%%s, %%s, %%s, %%s, %%s, %%s, %%s, %%s, %%s)'''.replace("\n", " ")
- def __init__(self, parent=None):
- super(dbUpdater, self).__init__(parent)
- self.stopped = False
- self.path = None
- self.completed = False
- self.MESSAGE = "upating database"
+LOCK_QUERY = 'lock tables newfeetable read, %s write'
- def progressSig(self, val, message=""):
- '''
- emits a signal showhing how we are proceeding.
- val is a number between 0 and 100
- '''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
- def create_alter_tables(self):
- '''
- execute the above commands
- NOTE - this function may fail depending on the mysql permissions
- in place
- '''
- db = connect.connect()
- db.autocommit(False)
- cursor = db.cursor()
- sucess = False
- try:
- i, commandNo = 0, len(SQLSTRINGS)
- for sql_string in SQLSTRINGS:
- cursor.execute(sql_string)
- self.progressSig(
- 10 + 70 * i / commandNo,
- sql_string[:20] + "...")
- sucess = True
- except Exception as e:
- print "FAILURE create_alter_tables", e
- db.rollback()
- if sucess:
- db.commit()
- db.autocommit(True)
- else:
- raise UpdateException("couldn't create tables!")
+class DatabaseUpdater(DatabaseUpdaterThread):
def transferData(self):
'''
move data into the new tables
'''
- db = connect.connect()
- cursor = db.cursor()
for table, vals in (
("feetable_scotNHS_08_Adult", "NF08, NF08_pt"),
("feetable_scotNHS_08_Child", "NF08, NF08_pt"),
@@ -311,46 +298,28 @@ class dbUpdater(QtCore.QThread):
("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()
+ ("feetable_HDP", "PFA")
+ ):
+ self.cursor.execute(LOCK_QUERY % table)
+ self.cursor.execute(SRC_QUERY % vals)
+ rows = self.cursor.fetchall()
- query = 'insert into %s' % table
- query += ''' (section, code, oldcode, USERCODE,
-regulation, description, brief_description, fee'''
+ query = DEST_QUERY % table
+ if not "," in vals:
+ query = query.replace(", pt_fee", "")
+ query = query.replace("%s,", "", 1)
- 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:
- 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)
+ values = [row for row in rows if "NHS" in table or row[7] != 0]
+ self.cursor.executemany(query, values)
+ self.cursor.execute("unlock tables")
def run(self):
- print "running script to convert from schema 1.3 to 1.4"
+ LOGGER.info("running script to convert from schema 1.3 to 1.4")
try:
+ self.connect()
#- execute the SQL commands
self.progressSig(10, _("creating new tables"))
- self.create_alter_tables()
+ self.execute_statements(SQLSTRINGS)
#- transfer data
self.progressSig(20,
@@ -363,28 +332,22 @@ regulation, description, brief_description, fee'''
# only 1.4 client will work now.
self.progressSig(90, _('updating settings'))
- print "update database settings..."
- schema_version.update(("1.4",), "1_3 to 1_4 script")
+ self.update_schema_version(("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 as e:
- localsettings.CLIENT_SCHEMA_VERSION = "1.3"
- self.completeSig(_("rolled back to") + " 1.3")
-
- except Exception as e:
- print "Exception caught", e
- self.completeSig(str(e))
-
- return self.completed
+ self.commit()
+ self.completeSig(_("Successfully moved db to") + " 1.4")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ LOGGER.setLevel(logging.DEBUG)
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_4to1_5.py b/src/openmolar/schema_upgrades/schema1_4to1_5.py
index 889e21a..3057314 100644
--- a/src/openmolar/schema_upgrades/schema1_4to1_5.py
+++ b/src/openmolar/schema_upgrades/schema1_4to1_5.py
@@ -29,19 +29,21 @@ 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 logging
import sys
+
from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
SQLSTRINGS = [
- '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 (
+'alter table clinical_memos add column synopsis text',
+'alter table calendar drop column ix',
+'alter table calendar add primary key(adate)',
+'DROP TABLE if exists exemptions',
+'''
+CREATE TABLE exemptions (
ix int(10) unsigned NOT NULL auto_increment ,
serialno int(11) unsigned NOT NULL ,
exemption varchar(10),
@@ -52,136 +54,54 @@ key (serialno))
'''
]
+SRC_QUERY = '''select serialno, exmpt, exempttext from patients
+where exmpt != "" or exempttext !=""'''
-class UpdateException(Exception):
-
- '''
- A custom exception. If this is thrown the db will be rolled back
- '''
- pass
+DEST_QUERY = '''insert into exemptions (serialno, exemption, exempttext)
+values (%s, %s, %s)'''
-class dbUpdater(QtCore.QThread):
+class DatabaseUpdater(DatabaseUpdaterThread):
- 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.
- val is a number between 0 and 100
- '''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
- def create_alter_tables(self):
- '''
- execute the above commands
- NOTE - this function may fail depending on the mysql permissions
- in place
- '''
- db = connect.connect()
- db.autocommit(False)
- cursor = db.cursor()
- sucess = False
- try:
- i, commandNo = 0, len(SQLSTRINGS)
- for sql_string in SQLSTRINGS:
- try:
- cursor.execute(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] + "...")
- sucess = True
- 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.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)
- values (%s, %s, %s)'''
-
- values = []
- for row in rows:
- if row[1] != "" or row[2] != "":
- 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)
+ self.cursor.execute('lock tables patients read, exemptions write')
+ self.cursor.execute(SRC_QUERY)
+ rows = self.cursor.fetchall()
+ self.cursor.executemany(DEST_QUERY, rows)
+ self.cursor.execute("unlock tables")
def run(self):
- print "running script to convert from schema 1.4 to 1.5"
+ LOGGER.info("running script to convert from schema 1.4 to 1.5")
try:
- #- execute the SQL commands
- self.progressSig(20, _("executing statements"))
- self.create_alter_tables()
+ self.connect()
+ self.progressSig(20, _("creating new tables"))
+ self.execute_statements(SQLSTRINGS)
#- transfer data between tables
self.progressSig(50, _('transfering data'))
- print "transfering data to new table, ...",
- if self.transferData():
- print "ok"
- else:
- print "FAILED!!!!!"
-
+ LOGGER.info("transfering data to new table, ..."),
+ self.transferData()
self.progressSig(90, _('updating settings'))
- print "update database settings..."
- schema_version.update(("1.5",), "1_4 to 1_5 script")
+ self.update_schema_version(("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 as e:
- localsettings.CLIENT_SCHEMA_VERSION = "1.4"
- self.completeSig(_("rolled back to") + " 1.4")
-
- except Exception as e:
- print "Exception caught", e
- self.completeSig(str(e))
-
- return self.completed
+ self.commit()
+ self.completeSig(_("Successfully moved db to")+ " 1.5")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_5to1_6.py b/src/openmolar/schema_upgrades/schema1_5to1_6.py
index 1ab0f28..14dfa1d 100644
--- a/src/openmolar/schema_upgrades/schema1_5to1_6.py
+++ b/src/openmolar/schema_upgrades/schema1_5to1_6.py
@@ -26,22 +26,20 @@
This module provides a function 'run' which will move data
to schema 1_6
'''
+import logging
import sys
+
from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
SQLSTRINGS = [
- '''
-alter table forum change comment comment text not null
-''',
- '''
-drop table docsimported
-''',
- '''
-CREATE TABLE if not exists docsimported (
+'drop table if exists docsimported',
+'drop table if exists docsimporteddata',
+'alter table forum change comment comment text not null',
+'''
+CREATE TABLE docsimported (
ix mediumint(8) unsigned NOT NULL auto_increment,
serialno int(11) unsigned NOT NULL default 0,
datatype varchar(60) NOT NULL default 'application/octet-stream',
@@ -52,7 +50,7 @@ importime timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (ix) )
''',
'''
-CREATE TABLE if not exists docsimporteddata (
+CREATE TABLE docsimporteddata (
ix mediumint(8) unsigned NOT NULL auto_increment,
masterid mediumint(8) unsigned NOT NULL default '0',
filedata blob NOT NULL,
@@ -90,7 +88,6 @@ TYPEDICT = {
'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')
@@ -98,159 +95,62 @@ TYPEDICT = {
}
-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.
- val is a number between 0 and 100
- '''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
- def create_alter_tables(self):
- '''
- execute the above commands
- NOTE - this function may fail depending on the mysql permissions
- in place
- '''
- db = connect.connect()
- db.autocommit(False)
- cursor = db.cursor()
- sucess = False
- try:
- i, commandNo = 0, len(SQLSTRINGS)
- for sql_string in SQLSTRINGS:
- try:
- cursor.execute(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] + "...")
- sucess = True
- 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!")
+class DatabaseUpdater(DatabaseUpdaterThread):
def addColumns(self):
'''
fee tables need a new column
'''
-
- db = connect.connect()
- cursor = db.cursor()
-
- cursor.execute('select tablename from feetable_key')
- rows = cursor.fetchall()
-
+ self.cursor.execute('select tablename from feetable_key')
+ rows = self.cursor.fetchall()
for row in rows:
- print "altering feetable", row[0]
+ LOGGER.info("altering feetable '%s'", 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
+ self.cursor.execute(query)
def insertValues(self):
'''
fee tables need a new column
'''
-
- db = connect.connect()
- cursor = db.cursor()
-
- cursor.execute('select tablename from feetable_key')
- rows = cursor.fetchall()
+ self.cursor.execute('select tablename from feetable_key')
+ rows = self.cursor.fetchall()
for row in rows:
- print "altering feetable", row[0]
+ LOGGER.info("updating codes in feetable '%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)
+ self.cursor.execute(query, values)
def run(self):
- print "running script to convert from schema 1.5 to 1.6"
+ LOGGER.info("running script to convert from schema 1.5 to 1.6")
try:
- #- execute the SQL commands
- self.progressSig(20, _("executing statements"))
- self.create_alter_tables()
+ self.connect()
+ self.progressSig(20, _("creating new tables"))
+ self.execute_statements(SQLSTRINGS)
#- transfer data between tables
self.progressSig(40, _('transfering data'))
-
- print "adding columns to the feetables table, ...",
- if self.addColumns():
- print "ok"
- else:
- print "FAILED!!!!!"
+ LOGGER.info("adding columns to the feetables table, ...")
+ self.addColumns()
self.progressSig(60, _('inserting values'))
-
- print "inserting values"
- if self.insertValues():
- print "ok"
- else:
- print "FAILED!!!!!"
-
+ LOGGER.info("inserting values")
+ self.insertValues()
self.progressSig(90, _('updating settings'))
- print "update database settings..."
-
- schema_version.update(("1.6",), "1_5 to 1_6 script")
+ self.update_schema_version(("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 as e:
- localsettings.CLIENT_SCHEMA_VERSION = "1.5"
- self.completeSig(_("rolled back to") + " 1.5")
-
- except Exception as e:
- print "Exception caught", e
- self.completeSig(str(e))
-
- return self.completed
+ self.commit()
+ self.completeSig(_("Successfully moved db to")+ " 1.6")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_6to1_7.py b/src/openmolar/schema_upgrades/schema1_6to1_7.py
index 403fbd4..47cd667 100644
--- a/src/openmolar/schema_upgrades/schema1_6to1_7.py
+++ b/src/openmolar/schema_upgrades/schema1_6to1_7.py
@@ -26,14 +26,17 @@
This module provides a function 'run' which will move data
to schema 1_7
'''
+import logging
import sys
import types
-from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
+from xml.dom import minidom
-from openmolar import connect
+from openmolar.settings import localsettings
+from openmolar.connect import params
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
+DATABASE_NAME = params.db_name
SQLSTRINGS = [
'''
@@ -184,232 +187,140 @@ REGEXDICT = {'2733': 'SR P', '0131': 'CTS', '1782': 'reg [ul]lr][1-8]CR,RC',
'0701': 'FS'}
-#
-# SOME FUNCTIONS SPECIFIC TO this update ##
-#
+TABLE_QUERY = 'select ix, tablename from feetable_key'
-from xml.dom import minidom
+COLUMN_QUERY = '''SELECT column_name FROM information_schema.columns WHERE table_name = %s AND table_schema = %s'''
+UPDATE_QUERY = "UPDATE feetable_key SET data = %s WHERE ix = %s"
-def getFeeDictForModification(table):
- '''
- a comprehensive dictionary formed from the entire table in the database
- '''
- 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)
- rows = cursor.fetchall()
- header = []
- for row in rows:
- header.append(row[0])
-
- 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
- col_names, rows = getFeeDictForModification(table)
- dom = minidom.Document()
- tab = dom.createElement("table")
- itemcodeIndex = col_names.index("code")
- currentItem = ""
+class DatabaseUpdater(DatabaseUpdaterThread):
- for row in rows:
- newNode = row[itemcodeIndex] != currentItem
- currentItem = row[itemcodeIndex]
- if newNode:
- item = dom.createElement("item")
-
- i = 0
- 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")))
-
- if col.startswith("fee") or col.startswith("pt_fee"):
- makeNode = False
- try:
- val = int(row[i])
- except ValueError:
- val = 0
- except TypeError:
- val = 0
- if col.startswith("fee"):
- fees.append(val)
- else:
- ptfees.append(val)
-
- if makeNode:
- if col == "USERCODE":
- colno = col_names.index("code")
- d = dom.createElement("USERCODE")
- val = REGEXDICT.get(row[colno], "")
- d.appendChild(dom.createTextNode(val))
- elif row[i]:
- d = dom.createElement(col)
- val = str(row[i])
- val = val.replace('\xc3\xbe', '3/4')
- d.appendChild(dom.createTextNode(val))
- item.appendChild(d)
- i += 1
-
- d = dom.createElement("fee")
- d.appendChild(dom.createTextNode(str(fees).strip("[]")))
- 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))
+ def convert_table_to_XML(self, table):
+ '''
+ convert the table to XML
+ called by schema upgrade script 1_6 to 1_7
+ '''
+ LOGGER.info("converting %s to xml", table)
+
+ # poll database for fee tables
+ self.cursor.execute(COLUMN_QUERY, (table, DATABASE_NAME))
+ rows = self.cursor.fetchall()
+ col_names = []
+ for row in rows:
+ col_names.append(row[0])
+
+ # now convert to xml
+ dom = minidom.Document()
+ tab = dom.createElement("table")
+ itemcodeIndex = col_names.index("code")
+ currentItem = ""
+
+ query = 'select * from %s' % table
+ self.cursor.execute(query) # , (table,))
+
+ for row in self.cursor.fetchall():
+ newNode = row[itemcodeIndex] != currentItem
+ currentItem = row[itemcodeIndex]
+ if newNode:
+ item = dom.createElement("item")
+
+ fees = []
+ ptfees = []
+ for i, col in enumerate(col_names):
+ 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:
+ val = int(row[i])
+ except ValueError:
+ val = 0
+ except TypeError:
+ val = 0
+ if col.startswith("fee"):
+ fees.append(val)
+ else:
+ ptfees.append(val)
+
+ if makeNode:
+ if col == "USERCODE":
+ colno = col_names.index("code")
+ d = dom.createElement("USERCODE")
+ val = REGEXDICT.get(row[colno], "")
+ d.appendChild(dom.createTextNode(val))
+ elif row[i]:
+ d = dom.createElement(col)
+ try:
+ val = unicode(row[i]).encode("ascii", "replace")
+ except UnicodeEncodeError:
+ LOGGER.exception("Unicode error from %s", row[i])
+ # val = val.replace('\xc3\xbe', '3/4')
+ d.appendChild(dom.createTextNode(val))
+ item.appendChild(d)
+
+ d = dom.createElement("fee")
+ d.appendChild(dom.createTextNode(str(fees).strip("[]")))
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):
+ 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)
- def __init__(self, parent=None):
- super(dbUpdater, self).__init__(parent)
- self.stopped = False
- self.path = None
- self.completed = False
- self.MESSAGE = "upating database"
+ tab.appendChild(item)
+ dom.appendChild(tab)
- def progressSig(self, val, message=""):
- '''
- emits a signal showhing how we are proceeding.
- val is a number between 0 and 100
- '''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
- def create_alter_tables(self):
- '''
- execute the above commands
- NOTE - this function may fail depending on the mysql permissions
- in place
- '''
- db = connect.connect()
- db.autocommit(False)
- cursor = db.cursor()
- sucess = False
- try:
- i, commandNo = 0, len(SQLSTRINGS)
- for sql_string in SQLSTRINGS:
- try:
- cursor.execute(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] + "...")
- sucess = True
- 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!")
+ result = dom.toxml()
+ dom.unlink()
+ return result
def insertValues(self):
'''
fee tables need a new column "Data" to replace the multiple tables
'''
-
- db = connect.connect()
- cursor = db.cursor()
-
- cursor.execute('select ix, tablename from feetable_key')
- rows = cursor.fetchall()
-
+ self.cursor.execute(TABLE_QUERY)
+ rows = self.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)
+ LOGGER.info("altering feetable %s", tablename)
+ values = (self.convert_table_to_XML(tablename), ix)
+ self.cursor.execute(UPDATE_QUERY, values)
def run(self):
- print "running script to convert from schema 1.6 to 1.7"
+ LOGGER.info("running script to convert from schema 1.6 to 1.7")
try:
+ self.connect()
#- execute the SQL commands
self.progressSig(20, _("executing statements"))
- self.create_alter_tables()
-
+ self.execute_statements(SQLSTRINGS)
#- transfer data between tables
self.progressSig(60, _('inserting values'))
-
- print "inserting values"
- if self.insertValues():
- print "ok"
- else:
- print "FAILED!!!!!"
-
+ self.insertValues()
self.progressSig(90, _('updating settings'))
- print "update database settings..."
-
- schema_version.update(("1.6", "1.7",), "1_6 to 1_7 script")
-
+ self.update_schema_version(("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 as e:
- localsettings.CLIENT_SCHEMA_VERSION = "1.6"
- self.completeSig(_("rolled back to") + " 1.6")
-
- return self.completed
+ self.commit()
+ self.completeSig(_("Successfully moved db to") + " 1.7")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_7to1_8.py b/src/openmolar/schema_upgrades/schema1_7to1_8.py
index 3fe7647..85ebfee 100644
--- a/src/openmolar/schema_upgrades/schema1_7to1_8.py
+++ b/src/openmolar/schema_upgrades/schema1_7to1_8.py
@@ -26,12 +26,13 @@
This module provides a function 'run' which will move data
to schema 1_8
'''
+import logging
import sys
+
from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
SQLSTRINGS = [
'''
@@ -94,122 +95,40 @@ EXAMPLE_PHRASEBOOK = '''<?xml version="1.0" ?>
</phrasebook>'''
-class UpdateException(Exception):
-
- '''
- A custom exception. If this is thrown the db will be rolled back
- '''
- pass
-
-
-class dbUpdater(QtCore.QThread):
+INSERT_QUERY = "insert into phrasebook values (%s, %s)"
- 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.
- val is a number between 0 and 100
- '''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
- def create_alter_tables(self):
- '''
- execute the above commands
- NOTE - this function may fail depending on the mysql permissions
- in place
- '''
- db = connect.connect()
- db.autocommit(False)
- cursor = db.cursor()
- sucess = False
- try:
- i, commandNo = 0, len(SQLSTRINGS)
- for sql_string in SQLSTRINGS:
- try:
- cursor.execute(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] + "...")
- sucess = True
- 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!")
+class DatabaseUpdater(DatabaseUpdaterThread):
def insertValues(self):
'''
insert the demo phrasebook
'''
-
- db = connect.connect()
- cursor = db.cursor()
-
- query = "insert into phrasebook values (%s, %s)"
values = (0, EXAMPLE_PHRASEBOOK)
- cursor.execute(query, values)
- db.commit()
-
- cursor.close()
- db.close()
- return True
-
- def completeSig(self, arg):
- self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+ self.cursor.execute(INSERT_QUERY, values)
def run(self):
- print "running script to convert from schema 1.7 to 1.8"
+ LOGGER.info("running script to convert from schema 1.7 to 1.8")
try:
- #- execute the SQL commands
- self.progressSig(20, _("executing statements"))
- self.create_alter_tables()
+ self.connect()
+ self.progressSig(20, _("creating new tables"))
+ self.execute_statements(SQLSTRINGS)
self.progressSig(60, _('inserting values'))
- print "inserting values"
- if self.insertValues():
- print "ok"
- else:
- print "FAILED!!!!!"
-
+ self.insertValues()
self.progressSig(90, _('updating settings'))
- print "update database settings..."
-
- schema_version.update(("1.8",), "1_7 to 1_8 script")
-
+ self.update_schema_version(("1.8",), "1_7 to 1_8 script")
self.progressSig(100, _("updating stored schema version"))
- self.completed = True
- self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 1.8")
-
- except UpdateException as e:
- localsettings.CLIENT_SCHEMA_VERSION = "1.7"
- self.completeSig(_("rolled back to") + " 1.7")
-
- except Exception as e:
- print "Exception caught", e
- self.completeSig(str(e))
-
- return self.completed
+ self.commit()
+ self.completeSig(_("Successfully moved db to")+ " 1.8")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_8to1_9.py b/src/openmolar/schema_upgrades/schema1_8to1_9.py
index f8c817f..b7df0e8 100644
--- a/src/openmolar/schema_upgrades/schema1_8to1_9.py
+++ b/src/openmolar/schema_upgrades/schema1_8to1_9.py
@@ -27,16 +27,25 @@ This module provides a function 'run' which will move data
to schema 1_9
'''
from __future__ import division
+
+import logging
import sys
+
+try:
+ from collections import OrderedDict
+except ImportError:
+ # OrderedDict only came in python 2.7
+ print "using openmolar.backports for OrderedDict"
+ from openmolar.backports import OrderedDict
+
from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
SQLSTRINGS = [
'''
-create table formatted_notes (ix serial, serialno int(11),
+CREATE TABLE IF NOT EXISTS 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());
''',
@@ -49,124 +58,105 @@ create index newdocsprinted_serialno_index on newdocsprinted(serialno);
]
-class UpdateException(Exception):
+class DatabaseUpdater(DatabaseUpdaterThread):
- '''
- A custom exception. If this is thrown the db will be rolled back
- '''
- pass
+ def __init__(self, *args, **kwargs):
+ DatabaseUpdaterThread.__init__(self, *args, **kwargs)
+ from openmolar.ptModules import notes
+ self.decipher_noteline = notes.decipher_noteline
+ def get_notes(self, sno):
+ self.cursor.execute('''SELECT line from notes where serialno = %s
+ order by lineno''', sno)
+ results = self.cursor.fetchall()
-class dbUpdater(QtCore.QThread):
+ notes_dict = OrderedDict()
+ ndate, op = "", ""
- def __init__(self, parent=None):
- super(dbUpdater, self).__init__(parent)
- self.stopped = False
- self.path = None
- self.completed = False
- self.MESSAGE = "upating database"
+ # a line is like ('\x01REC\x0c\x08m\x0c\x08m\n\x08',)
+ for line, in results:
+ line = line.encode("ascii", "replace")
+ ntype, note, operator, date2 = self.decipher_noteline(line)
+ if date2 != "":
+ ndate = date2
+ if operator != "":
+ op = operator
- def progressSig(self, val, message=""):
- '''
- emits a signal showing how we are proceeding.
- val is a number between 0 and 100
- '''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
+ key = (ndate, op)
+ if key in notes_dict:
+ notes_dict[key].append((ntype, note))
+ else:
+ notes_dict[key] = [(ntype, note)]
+
+ return notes_dict
+
+
+ def transfer(self, sno):
+ LOGGER.debug("transferring notes for serialnos %s", sno)
+ notes_dict = self.get_notes(sno)
+ query = '''insert into formatted_notes
+ (serialno, ndate, op1 , op2 , ntype, note)
+ values (%s, %s, %s, %s, %s, %s)'''
+
+ values = []
+ for key in notes_dict:
+ date, ops = key
+ op2 = None
+ if "/" in ops:
+ op1, op2 = ops.split("/")
+ else:
+ op1 = ops
+ for ntype, note in notes_dict[key]:
+ values.append((sno, date, op1, op2, ntype, note))
+ if values:
+ rows = self.cursor.executemany(query, values)
+ LOGGER.debug("%d rows of notes inserted", rows)
+
+ def get_max_sno(self):
+ self.cursor.execute("select max(serialno) from notes")
+ max_sno = self.cursor.fetchone()[0]
+ return max_sno
- def create_alter_tables(self):
- '''
- execute the above commands
- NOTE - this function may fail depending on the mysql permissions
- in place
- '''
- db = connect.connect()
- db.autocommit(False)
- cursor = db.cursor()
- sucess = False
- try:
- i, commandNo = 0, len(SQLSTRINGS)
- for sql_string in SQLSTRINGS:
- try:
- cursor.execute(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] + "...")
- sucess = True
- 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):
'''
this code is complex, so in a separate module for ease of maintenance
'''
- from openmolar.schema_upgrades import formatted_notes1_9
- max_sno = formatted_notes1_9.get_max_sno()
+ max_sno = self.get_max_sno()
sno = 0
- print "max_sno in notes = %s " % max_sno
+ LOGGER.info("max_sno in notes = %s ", max_sno)
while sno < max_sno:
sno += 1
- formatted_notes1_9.transfer(sno)
+ self.transfer(sno)
progress = int(sno / max_sno * 90) + 8
self.progressSig(progress, "%s %s" % (
_('converting note'), sno))
- QtGui.QApplication.instance().processEvents()
-
- 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.8 to 1.9"
+ LOGGER.info("running script to convert from schema 1.8 to 1.9")
try:
- #- execute the SQL commands
- self.progressSig(2, _("executing statements"))
- self.create_alter_tables()
+ self.connect()
+ self.progressSig(2, _("creating new tables and indexes"))
+ self.execute_statements(SQLSTRINGS)
self.progressSig(8, _('inserting values'))
- print "inserting values"
- if self.insertValues():
- print "ok"
- else:
- print "FAILED!!!!!"
-
+ self.insertValues()
self.progressSig(99, _('updating settings'))
- print "update database settings..."
-
- schema_version.update(("1.9",), "1_8 to 1_9 script")
+ self.update_schema_version(("1.9",), "1_8 to 1_9 script")
self.progressSig(100, _("updating stored schema version"))
- self.completed = True
- self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 1.9")
-
- except UpdateException as e:
- localsettings.CLIENT_SCHEMA_VERSION = "1.8"
- self.completeSig(_("rolled back to") + " 1.8")
-
- except Exception as e:
- print "Exception caught", e
- self.completeSig(str(e))
-
- return self.completed
+ self.commit()
+ self.completeSig(_("Successfully moved db to") + " 1.9")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema1_9to2_0.py b/src/openmolar/schema_upgrades/schema1_9to2_0.py
index 06afea3..e6cefae 100644
--- a/src/openmolar/schema_upgrades/schema1_9to2_0.py
+++ b/src/openmolar/schema_upgrades/schema1_9to2_0.py
@@ -27,15 +27,16 @@ This module provides a function 'run' which will move data
to schema 2_0
'''
from __future__ import division
+import logging
import sys
+
from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-from PyQt4 import QtGui, QtCore
+LOGGER = logging.getLogger("openmolar")
-SQLSTRINGS_1 = [
- '''
+SQLSTRINGS_1 = ['DROP table IF EXISTS appt_prefs',
+'''
create table appt_prefs (
serialno int(11),
recall_active bool not null default True,
@@ -78,71 +79,12 @@ 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
- self.path = None
- self.completed = False
- self.MESSAGE = "upating database"
-
- def progressSig(self, val, message=""):
- '''
- emits a signal showing how we are proceeding.
- val is a number between 0 and 100
- '''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
- def execute_statements(self, sql_strings):
- '''
- execute the above commands
- NOTE - this function may fail depending on the mysql permissions
- in place
- '''
- db = connect.connect()
- db.autocommit(False)
- cursor = db.cursor()
- sucess = False
- try:
- i, commandNo = 0, len(sql_strings)
- for sql_string in sql_strings:
- try:
- cursor.execute(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] + "...")
- sucess = True
- 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 completeSig(self, arg):
- self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+class DatabaseUpdater(DatabaseUpdaterThread):
def run(self):
- print "running script to convert from schema 1.9 to 2.0"
+ LOGGER.info("running script to convert from schema 1.9 to 2.0")
try:
+ self.connect()
#- execute the SQL commands
self.progressSig(10, _("creating new appt_prefs table"))
self.execute_statements(SQLSTRINGS_1)
@@ -151,28 +93,20 @@ class dbUpdater(QtCore.QThread):
self.progressSig(80, _('statements executed'))
self.progressSig(90, _('updating settings'))
- print "update database settings..."
-
- schema_version.update(("2.0",), "1_9 to 2_0 script")
+ self.update_schema_version(("2.0",), "1_9 to 2_0 script")
self.progressSig(100, _("updating stored schema version"))
- self.completed = True
- self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 2.0")
-
- except UpdateException as e:
- localsettings.CLIENT_SCHEMA_VERSION = "1.9"
- self.completeSig(_("rolled back to") + " 1.9")
-
- except Exception as e:
- print "Exception caught", e
- self.completeSig(str(e))
-
- return self.completed
+ self.commit()
+ self.completeSig(_("Successfully moved db to")+ " 2.0")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_0to2_1.py b/src/openmolar/schema_upgrades/schema2_0to2_1.py
index 663ced7..257d713 100644
--- a/src/openmolar/schema_upgrades/schema2_0to2_1.py
+++ b/src/openmolar/schema_upgrades/schema2_0to2_1.py
@@ -31,13 +31,11 @@ from __future__ import division
import logging
import sys
from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
-from PyQt4 import QtGui, QtCore
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-logging.basicConfig()
+LOGGER = logging.getLogger("openmolar")
SQLSTRINGS = [
'drop table if exists currtrtmt2',
@@ -202,8 +200,6 @@ xraycmp="" AND periocmp="" AND anaescmp="" AND othercmp="" AND nducmp=""
AND ndlcmp="" AND oducmp="" AND odlcmp="" AND customcmp=""
'''
-# don't use this one.. seems unnecessary.
-
CORRECTION_QUERY = '''
update patients join
(select serialno, max(courseno) cno from currtrtmt2 group by serialno) as t
@@ -212,71 +208,30 @@ where cno > courseno0
'''
-class UpdateException(Exception):
-
- '''
- A custom exception. If this is thrown the db will be rolled back
- '''
- pass
-
-
-class dbUpdater(QtCore.QThread):
+class DatabaseUpdater(DatabaseUpdaterThread):
- 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=""):
+ def transfer_data(self):
'''
- emits a signal showing how we are proceeding.
- val is a number between 0 and 100
+ function specific to this update.
'''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
- def execute_statements(self, sql_strings):
- '''
- execute the above commands
- NOTE - this function may fail depending on the mysql permissions
- in place
- '''
- db = connect.connect()
- db.autocommit(False)
- cursor = db.cursor()
- sucess = False
- try:
- i, commandNo = 0, len(sql_strings)
- for sql_string in sql_strings:
- try:
- cursor.execute(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] + "...")
- sucess = True
- 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 completeSig(self, arg):
- self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+ self.cursor.execute(SOURCE_QUERY)
+ rows = self.cursor.fetchall()
+ step = 1 / len(rows)
+ for i, row in enumerate(rows):
+ courseno = row[0]
+ serialno = row[1]
+ self.cursor.execute(DEST_QUERY, row[1:])
+ new_cno = self.db.insert_id()
+ self.cursor.execute(PATIENT_QUERY, (new_cno, serialno, courseno))
+ self.cursor.execute(ESTIMATES_QUERY, (new_cno, serialno, courseno))
+ if i % 100 == 0:
+ self.progressSig(80 * i / len(rows) + 10,
+ _("transfering data"))
def run(self):
- print "running script to convert from schema 2.0 to 2.1"
+ LOGGER.info("running script to convert from schema 2.0 to 2.1")
try:
+ self.connect()
#- execute the SQL commands
self.progressSig(5, _("creating currtrtmt2 table"))
self.execute_statements(SQLSTRINGS)
@@ -288,59 +243,22 @@ class dbUpdater(QtCore.QThread):
self.execute_statements([GARBAGE_QUERY, CORRECTION_QUERY])
self.progressSig(97, _('updating settings'))
- print "update database settings..."
+ LOGGER.info("updating stored database version in settings table")
- schema_version.update(("2.1",), "2_0 to 2_1 script")
+ self.update_schema_version(("2.1",), "2_0 to 2_1 script")
self.progressSig(100, _("updating stored schema version"))
- self.completed = True
- self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 2.1")
-
- except UpdateException as e:
- localsettings.CLIENT_SCHEMA_VERSION = "2.0"
- self.completeSig(_("rolled back to") + " 2.0")
-
- except Exception as e:
- print "Exception caught", e
- self.completeSig(str(e))
-
- return self.completed
-
- def transfer_data(self):
- '''
- function specific to this update.
- '''
- db = connect.connect()
- db.autocommit(False)
- try:
- cursor = db.cursor()
- cursor.execute(SOURCE_QUERY)
- rows = cursor.fetchall()
- cursor.close()
- cursor = db.cursor()
- step = 1 / len(rows)
- for i, row in enumerate(rows):
- courseno = row[0]
- serialno = row[1]
- cursor.execute(DEST_QUERY, row[1:])
- new_cno = db.insert_id()
- 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"))
- cursor.close()
- db.commit()
- db.close()
+ self.commit()
+ self.completeSig(_("Successfully moved db to") + " 2.1")
+ return True
except Exception as exc:
- logging.exception("error transfering data")
- db.rollback()
- raise UpdateException(exc)
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.error("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_1to2_2.py b/src/openmolar/schema_upgrades/schema2_1to2_2.py
index e28c0e8..7661642 100644
--- a/src/openmolar/schema_upgrades/schema2_1to2_2.py
+++ b/src/openmolar/schema_upgrades/schema2_1to2_2.py
@@ -32,18 +32,16 @@ import logging
import os
import sys
from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
-from PyQt4 import QtGui, QtCore
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-logging.basicConfig()
+LOGGER = logging.getLogger("openmolar")
SQLSTRINGS = [
'drop table if exists currtrtmt',
'drop table if exists est_link',
'drop table if exists feescales',
- 'drop table est_logger',
+ 'drop table if exists 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',
@@ -149,198 +147,107 @@ LOGGER_INSERT_QUERY = ('insert into est_logger '
'(courseno, est_data, operator) values (%s,%s, %s)')
-class UpdateException(Exception):
+class DatabaseUpdater(DatabaseUpdaterThread):
- '''
- 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=""):
+ def transfer_data(self):
'''
- emits a signal showing how we are proceeding.
- val is a number between 0 and 100
+ function specific to this update.
'''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
+ self.cursor.execute(SOURCE_QUERY)
+ rows = self.cursor.fetchall()
+ step = 1 / len(rows)
+ count, prev_courseno, prev_cat_type = 1, 0, ""
+ prev_hash = None
+ for i, row in enumerate(rows):
+ courseno, ix, category, type_, completed = row
+ cat_type = "%s%s" % (category, type_)
+ if courseno != prev_courseno:
+ count = 1
+ elif cat_type != prev_cat_type:
+ count = 1
+ else:
+ count += 1
+
+ prev_courseno = courseno
+ prev_cat_type = cat_type
+
+ tx_hash = hash("%s%s%s%s" % (courseno, category, count, type_))
+
+ if completed is None:
+ completed = False
+ values = (ix, tx_hash, completed)
+ self.cursor.execute(DEST_QUERY, values)
+ if i % 1000 == 0:
+ self.progressSig(50 * i / len(rows) + 10,
+ _("transfering data"))
+
+ self.cursor.execute(LOGGER_SELECT_QUERY)
+ rows = self.cursor.fetchall()
+ prev_courseno = None
+ est_log_text = ""
+ total, p_total = 0, 0
+ for i, (courseno, number, itemcode, description, csetype,
+ 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)
+
+ 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" % (
+ total, p_total)
+ values = (prev_courseno, est_log_text, "2_2script")
+ self.cursor.execute(LOGGER_INSERT_QUERY, values)
+ est_log_text = line_text
+ total, p_total = fee, ptfee
+
+ prev_courseno = courseno
+ if i % 1000 == 0:
+ self.progressSig(30 * i / len(rows) + 60,
+ _("transfering data"))
- def execute_statements(self, sql_strings):
- '''
- execute the above commands
- NOTE - this function may fail depending on the mysql permissions
- in place
- '''
- db = connect.connect()
- db.autocommit(False)
- cursor = db.cursor()
- sucess = False
- try:
- i, commandNo = 0, len(sql_strings)
- for sql_string in sql_strings:
- try:
- cursor.execute(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] + "...")
- sucess = True
- 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 completeSig(self, arg):
- self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+ def insert_feescales(self):
+ feescale_path = os.path.join(
+ localsettings.wkdir,
+ 'resources',
+ 'feescales',
+ 'example_feescale.xml'
+ )
+ f = open(feescale_path, "r")
+ data = f.read()
+ f.close()
+ self.cursor.execute(FEESCALE_QUERY, (data,))
def run(self):
- print "running script to convert from schema 2.1 to 2.2"
+ LOGGER.info("running script to convert from schema 2.1 to 2.2")
try:
+ self.connect()
#- execute the SQL commands
self.progressSig(5, _("creating tables"))
self.execute_statements(SQLSTRINGS)
-
self.progressSig(10, _("populating est_link table"))
self.transfer_data()
-
self.progressSig(95, _("populating feescales"))
self.insert_feescales()
-
self.progressSig(97, _('updating settings'))
- print "update database settings..."
-
- schema_version.update(("2.2",), "2_1 to 2_2 script")
-
+ LOGGER.info("updating stored database version in settings table")
+ self.update_schema_version(("2.2",), "2_1 to 2_2 script")
self.progressSig(100, _("updating stored schema version"))
- self.completed = True
- self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 2.2")
-
- except UpdateException as e:
- localsettings.CLIENT_SCHEMA_VERSION = "2.1"
- self.completeSig(_("rolled back to") + " 2.1")
-
- except Exception as e:
- print "Exception caught", e
- self.completeSig(str(e))
-
- return self.completed
-
- def transfer_data(self):
- '''
- function specific to this update.
- '''
- db = connect.connect()
- db.autocommit(False)
- try:
- cursor = db.cursor()
- cursor.execute(SOURCE_QUERY)
- rows = cursor.fetchall()
- cursor.close()
- cursor = db.cursor()
- step = 1 / len(rows)
- count, prev_courseno, prev_cat_type = 1, 0, ""
- prev_hash = None
- for i, row in enumerate(rows):
- courseno, ix, category, type_, completed = row
- cat_type = "%s%s" % (category, type_)
- if courseno != prev_courseno:
- count = 1
- elif cat_type != prev_cat_type:
- count = 1
- else:
- count += 1
-
- prev_courseno = courseno
- prev_cat_type = cat_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"))
-
- cursor.execute(LOGGER_SELECT_QUERY)
- rows = cursor.fetchall()
- prev_courseno = None
- est_log_text = ""
- total, p_total = 0, 0
- for i, (courseno, number, itemcode, description, csetype,
- 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)
-
- 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" % (
- total, p_total)
- values = (prev_courseno, est_log_text, "2_2script")
- cursor.execute(LOGGER_INSERT_QUERY, values)
- est_log_text = line_text
- total, p_total = fee, ptfee
-
- prev_courseno = courseno
- if i % 1000 == 0:
- self.progressSig(30 * i / len(rows) + 60,
- _("transfering data"))
-
- db.commit()
- db.close()
+ self.commit()
+ self.completeSig(_("Successfully moved db to")+ " 2.2")
+ return True
except Exception as exc:
- logging.exception("error transfering data")
- db.rollback()
- raise UpdateException(exc)
-
- def insert_feescales(self):
- feescale_path = os.path.join(localsettings.wkdir, 'resources',
- "feescales", "example_feescale.xml")
- db = connect.connect()
- db.autocommit(False)
- try:
- f = open(feescale_path, "r")
- data = f.read()
- f.close()
- cursor = db.cursor()
- cursor.execute(FEESCALE_QUERY, (data,))
- cursor.close()
- db.commit()
- db.close()
- except Exception as exc:
- logging.exception("error inserting test feescale")
- db.rollback()
- raise UpdateException(exc)
-
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_2to2_3.py b/src/openmolar/schema_upgrades/schema2_2to2_3.py
index a9e276d..1b9eb05 100644
--- a/src/openmolar/schema_upgrades/schema2_2to2_3.py
+++ b/src/openmolar/schema_upgrades/schema2_2to2_3.py
@@ -31,13 +31,11 @@ from __future__ import division
import logging
import os
import sys
-from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
-from PyQt4 import QtGui, QtCore
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-logging.basicConfig()
+LOGGER = logging.getLogger("openmolar")
SQLSTRINGS = [
'drop table if exists est_link2',
@@ -79,71 +77,45 @@ 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):
+class DatabaseUpdater(DatabaseUpdaterThread):
- 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 showing how we are proceeding.
- val is a number between 0 and 100
- '''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
- def execute_statements(self, sql_strings):
+ def transfer_data(self):
'''
- execute the above commands
- NOTE - this function may fail depending on the mysql permissions
- in place
+ function specific to this update.
'''
- db = connect.connect()
- db.autocommit(False)
- cursor = db.cursor()
- sucess = False
- try:
- i, commandNo = 0, len(sql_strings)
- for sql_string in sql_strings:
- try:
- cursor.execute(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] + "...")
- sucess = True
- 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 completeSig(self, arg):
- self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+ self.cursor.execute(SOURCE_QUERY)
+ rows = self.cursor.fetchall()
+ step = 1 / len(rows)
+ count, prev_courseno, prev_cat_type = 1, 0, ""
+ prev_hash = None
+ for i, row in enumerate(rows):
+ courseno, ix, category, type_, completed = row
+ cat_type = "%s%s" % (category, type_)
+ if courseno != prev_courseno:
+ count = 1
+ elif cat_type != prev_cat_type:
+ count = 1
+ else:
+ count += 1
+
+ prev_courseno = courseno
+ prev_cat_type = cat_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)
+ self.cursor.execute(DEST_QUERY, values)
+ if i % 1000 == 0:
+ self.progressSig(85 * i / len(rows) + 10,
+ _("transfering data"))
def run(self):
- print "running script to convert from schema 2.2 to 2.3"
+ LOGGER.info("running script to convert from schema 2.2 to 2.3")
try:
+ self.connect()
#- execute the SQL commands
self.progressSig(5, _("creating est_link2 table"))
self.execute_statements(SQLSTRINGS)
@@ -155,73 +127,23 @@ class dbUpdater(QtCore.QThread):
self.execute_statements(CLEANUPSTRINGS)
self.progressSig(97, _('updating settings'))
- print "update database settings..."
+ LOGGER.info("updating stored database version in settings table")
- schema_version.update(("2.3",), "2_2 to 2_3 script")
+ self.update_schema_version(("2.3",), "2_2 to 2_3 script")
self.progressSig(100, _("updating stored schema version"))
- self.completed = True
- self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 2.3")
-
- except UpdateException as e:
- localsettings.CLIENT_SCHEMA_VERSION = "2.2"
- self.completeSig(_("rolled back to") + " 2.2")
-
+ self.commit()
+ self.completeSig(_("Successfully moved db to")+ " 2.3")
+ return True
except Exception as exc:
- logging.exception("Exception caught")
- self.completeSig(str(exc))
-
- return self.completed
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
- def transfer_data(self):
- '''
- function specific to this update.
- '''
- db = connect.connect()
- db.autocommit(False)
- try:
- cursor = db.cursor()
- cursor.execute(SOURCE_QUERY)
- rows = cursor.fetchall()
- cursor.close()
- cursor = db.cursor()
- step = 1 / len(rows)
- count, prev_courseno, prev_cat_type = 1, 0, ""
- prev_hash = None
- for i, row in enumerate(rows):
- courseno, ix, category, type_, completed = row
- cat_type = "%s%s" % (category, type_)
- if courseno != prev_courseno:
- count = 1
- elif cat_type != prev_cat_type:
- count = 1
- else:
- count += 1
-
- prev_courseno = courseno
- prev_cat_type = cat_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"))
- db.commit()
- db.close()
- except Exception as exc:
- logging.exception("error transfering data")
- db.rollback()
- raise UpdateException(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_3to2_4.py b/src/openmolar/schema_upgrades/schema2_3to2_4.py
index 42b9a99..c83f095 100644
--- a/src/openmolar/schema_upgrades/schema2_3to2_4.py
+++ b/src/openmolar/schema_upgrades/schema2_3to2_4.py
@@ -31,13 +31,11 @@ from __future__ import division
import logging
import os
import sys
-from openmolar.settings import localsettings
-from openmolar.dbtools import schema_version
-from openmolar import connect
-from PyQt4 import QtGui, QtCore
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
-logging.basicConfig()
+LOGGER = logging.getLogger("openmolar")
SQLSTRINGS = [
'drop table if exists daybook_link',
@@ -60,110 +58,36 @@ CLEANUPSTRINGS = [
]
-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 showing how we are proceeding.
- val is a number between 0 and 100
- '''
- if message != "":
- self.MESSAGE = message
- self.emit(QtCore.SIGNAL("progress"), val, self.MESSAGE)
-
- def execute_statements(self, sql_strings):
- '''
- execute the above commands
- NOTE - this function may fail depending on the mysql permissions
- in place
- '''
- db = connect.connect()
- db.autocommit(False)
- cursor = db.cursor()
- sucess = False
- try:
- i, commandNo = 0, len(sql_strings)
- for sql_string in sql_strings:
- try:
- cursor.execute(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] + "...")
- sucess = True
- 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 completeSig(self, arg):
- self.emit(QtCore.SIGNAL("completed"), self.completed, arg)
+class DatabaseUpdater(DatabaseUpdaterThread):
def run(self):
- print "running script to convert from schema 2.3 to 2.4"
+ LOGGER.info("running script to convert from schema 2.3 to 2.4")
try:
+ self.connect()
#- execute the SQL commands
self.progressSig(50, _("creating est_link2 table"))
self.execute_statements(SQLSTRINGS)
- # self.progressSig(30, _("transferring data"))
- # self.transfer_data()
-
self.progressSig(95, _("executing cleanup statements"))
self.execute_statements(CLEANUPSTRINGS)
self.progressSig(97, _('updating settings'))
- print "update database settings..."
+ LOGGER.info("updating stored database version in settings table")
- schema_version.update(("2.4",), "2_3 to 2_4 script")
+ self.update_schema_version(("2.4",), "2_3 to 2_4 script")
self.progressSig(100, _("updating stored schema version"))
- self.completed = True
- self.completeSig(_("ALL DONE - sucessfully moved db to")
- + " 2.4")
-
- except UpdateException as e:
- localsettings.CLIENT_SCHEMA_VERSION = "2.3"
- self.completeSig(_("rolled back to") + " 2.3")
-
+ self.commit()
+ self.completeSig(_("Successfully moved db to")+ " 2.4")
+ return True
except Exception as exc:
- logging.exception("Exception caught")
- self.completeSig(str(exc))
-
- return self.completed
-
- def transfer_data(self):
- '''
- function specific to this update.
- '''
- pass
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
if __name__ == "__main__":
- dbu = dbUpdater()
+ dbu = DatabaseUpdater()
if dbu.run():
- print "ALL DONE, conversion sucessful"
+ LOGGER.info("ALL DONE, conversion successful")
else:
- print "conversion failed"
+ LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_4to2_5.py b/src/openmolar/schema_upgrades/schema2_4to2_5.py
new file mode 100644
index 0000000..f154d27
--- /dev/null
+++ b/src/openmolar/schema_upgrades/schema2_4to2_5.py
@@ -0,0 +1,132 @@
+#! /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 provides a function 'run' which will move data
+to schema 2_5
+'''
+from __future__ import division
+
+import logging
+import os
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
+
+LOGGER = logging.getLogger("openmolar")
+
+SQLSTRINGS = [
+ 'drop table if exists referral_centres',
+ 'drop table if exists previous_snames',
+ '''
+create table referral_centres (
+ ix int(11) unsigned not null auto_increment ,
+ description char(64) NOT NULL DEFAULT "referral",
+ greeting char(64) NOT NULL DEFAULT "Dear Sir/Madam",
+ addr1 char(64) NOT NULL DEFAULT "",
+ addr2 char(64) NOT NULL DEFAULT "",
+ addr3 char(64) NOT NULL DEFAULT "",
+ addr4 char(64) NOT NULL DEFAULT "",
+ addr5 char(64) NOT NULL DEFAULT "",
+ addr6 char(64) NOT NULL DEFAULT "",
+ addr7 char(64) NOT NULL DEFAULT "",
+PRIMARY KEY (ix)
+)''',
+'''
+INSERT INTO referral_centres
+(description, greeting, addr1, addr2, addr3, addr4, addr5, addr6)
+values ("Example Referral Centre", "Dear Sir/Madam", "The Head Clinician",
+"Orthodontic Department", "The Local Dental Hospital", "Any Street",
+"Any Town", "POST CODE")
+'''
+,
+ '''
+create table previous_snames (
+ ix int(11) unsigned not null auto_increment ,
+ serialno int(11),
+ psn char(40) NOT NULL,
+PRIMARY KEY (ix),
+INDEX (serialno)
+)''',
+'''
+UPDATE patients SET county="" WHERE COUNTY is NULL
+'''
+]
+
+#NOTE - if next statement fails, it is silently overlooked.
+CLEANUPSTRINGS = [
+ 'ALTER TABLE patients DROP COLUMN recd',
+]
+
+SOURCE_QUERY = \
+'SELECT serialno, psn FROM patients WHERE psn != "" AND psn IS NOT NULL'
+
+DEST_QUERY = \
+'INSERT INTO previous_snames (serialno, psn) VALUES (%s, %s)'
+
+class DatabaseUpdater(DatabaseUpdaterThread):
+
+ def transfer_data(self):
+ '''
+ function specific to this update.
+ '''
+ self.cursor.execute(SOURCE_QUERY)
+ rows = self.cursor.fetchall()
+ self.cursor.executemany(DEST_QUERY, rows)
+
+ def run(self):
+ LOGGER.info("running script to convert from schema 2.4 to 2.5")
+ try:
+ self.connect()
+ #- execute the SQL commands
+ self.progressSig(10, _("creating new tables"))
+ self.execute_statements(SQLSTRINGS)
+
+ self.progressSig(50, _("transferring data"))
+ self.transfer_data()
+
+ self.progressSig(95, _("executing cleanup statements"))
+ self.execute_statements(CLEANUPSTRINGS)
+
+ self.progressSig(97, _('updating settings'))
+ LOGGER.info("updating stored database version in settings table")
+
+ self.update_schema_version(("2.5",), "2_4 to 2_5 script")
+
+ self.progressSig(100, _("updating stored schema version"))
+ self.commit()
+ self.completeSig(_("Successfully moved db to")+ " 2.5")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
+
+if __name__ == "__main__":
+ dbu = DatabaseUpdater()
+ if dbu.run():
+ LOGGER.info("ALL DONE, conversion successful")
+ else:
+ LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_5to2_6.py b/src/openmolar/schema_upgrades/schema2_5to2_6.py
new file mode 100644
index 0000000..b2b189b
--- /dev/null
+++ b/src/openmolar/schema_upgrades/schema2_5to2_6.py
@@ -0,0 +1,91 @@
+#! /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 provides a function 'run' which will move data
+to schema 2_6
+'''
+from __future__ import division
+
+import logging
+import os
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
+
+LOGGER = logging.getLogger("openmolar")
+
+SQLSTRINGS = [
+ '''ALTER TABLE currtrtmt2 ADD COLUMN ftr bool DEFAULT false''',
+]
+
+# NOTE - if next statement fails, it is silently overlooked.
+CLEANUPSTRINGS = [
+ 'ALTER TABLE patients DROP COLUMN psn',
+]
+
+
+class DatabaseUpdater(DatabaseUpdaterThread):
+
+ def transfer_data(self):
+ '''
+ function specific to this update.
+ '''
+ pass
+
+ def run(self):
+ LOGGER.info("running script to convert from schema 2.5 to 2.6")
+ try:
+ self.connect()
+ #- execute the SQL commands
+ self.progressSig(10, _("creating new tables"))
+ self.execute_statements(SQLSTRINGS)
+
+ self.progressSig(50, _("transferring data"))
+ self.transfer_data()
+
+ self.progressSig(95, _("executing cleanup statements"))
+ self.execute_statements(CLEANUPSTRINGS)
+
+ self.progressSig(97, _('updating settings'))
+ LOGGER.info("updating stored database version in settings table")
+
+ self.update_schema_version(("2.6",), "2_5 to 2_6 script")
+
+ self.progressSig(100, _("updating stored schema version"))
+ self.commit()
+ self.completeSig(_("Successfully moved db to") + " 2.6")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
+
+if __name__ == "__main__":
+ dbu = DatabaseUpdater()
+ if dbu.run():
+ LOGGER.info("ALL DONE, conversion successful")
+ else:
+ LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_6to2_7.py b/src/openmolar/schema_upgrades/schema2_6to2_7.py
new file mode 100644
index 0000000..dffe6cf
--- /dev/null
+++ b/src/openmolar/schema_upgrades/schema2_6to2_7.py
@@ -0,0 +1,166 @@
+#! /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 provides a function 'run' which will move data
+to schema 2_7
+'''
+from __future__ import division
+
+import datetime
+import logging
+import os
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
+
+LOGGER = logging.getLogger("openmolar")
+
+SQLSTRINGS = [
+'DROP TABLE IF EXISTS clinician_dates',
+'DROP TABLE IF EXISTS diary_link',
+'DROP TABLE IF EXISTS clinicians',
+'''
+CREATE TABLE clinicians (
+ ix smallint(5) unsigned not null auto_increment,
+ initials CHAR(5) NOT NULL,
+ name VARCHAR(64) NOT NULL,
+ formal_name VARCHAR(128) ,
+ qualifications VARCHAR(64) ,
+ type smallint(5) NOT NULL default 1,
+ speciality VARCHAR(64),
+ data VARCHAR(255),
+ comments VARCHAR(255),
+ PRIMARY KEY (ix)
+)
+''',
+'''
+CREATE TABLE clinician_dates (
+ clinician_ix smallint(5) UNSIGNED NOT NULL,
+ start_date date NOT NULL,
+ end_date date,
+ date_comments VARCHAR(255),
+ FOREIGN KEY (clinician_ix) REFERENCES clinicians(ix)
+)
+''',
+'''
+CREATE TABLE diary_link (
+ clinician_ix smallint(5) unsigned not null,
+ apptix smallint(5) unsigned not null,
+ FOREIGN KEY (clinician_ix) REFERENCES clinicians(ix)
+)
+'''
+]
+
+# NOTE - if next statement fails, it is silently overlooked.
+CLEANUPSTRINGS = [
+]
+
+
+PRACTITIONERS_QUERY = "select id, inits, apptix from practitioners"
+DENTIST_DATA_QUERY = "select id,inits,name,formalname,fpcno,quals from practitioners where flag0=1"
+APPTIX_QUERY = "select apptix,inits from practitioners where flag3=1"
+ACTIVE_DENTS_QUERY = "select apptix, inits from practitioners where flag3=1 and flag0=1"
+ACTIVE_HYGS_QUERY = "select apptix, inits from practitioners where flag3=1 and flag0=0"
+
+SOURCE_QUERY = \
+'select id, inits, apptix, name, formalname, fpcno, quals, flag0, flag3 from practitioners WHERE inits IS NOT NULL'
+
+DEST_QUERY = \
+'INSERT INTO clinicians (ix, initials, name, formal_name, qualifications, type, speciality, data, comments) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)'
+
+GET_DATES_QUERY = 'select min(adate), max(adate) from aslot where apptix=%s'
+
+ACTIVE_QUERY = '''INSERT INTO clinician_dates
+(clinician_ix, start_date, end_date, date_comments)
+VALUES (%s, %s, %s, %s)'''
+
+DIARY_LINK_QUERY = 'INSERT INTO diary_link (clinician_ix, apptix) VALUES (%s, %s)'
+
+class DatabaseUpdater(DatabaseUpdaterThread):
+
+ def transfer_data(self):
+ '''
+ function specific to this update.
+ '''
+ self.cursor.execute(SOURCE_QUERY)
+ rows = self.cursor.fetchall()
+ for id, inits, apptix, name, formalname, fpcno, quals, flag0, flag3 in rows:
+ self.cursor.execute(DEST_QUERY,
+ (id,
+ inits,
+ name,
+ formalname,
+ quals,
+ 2 if flag0==0 else 1,
+ None,
+ "list_no=%s" % fpcno if fpcno else None,
+ "transferred from practitioners table by 2_7 script")
+ )
+ appt_book_ix = apptix if apptix!=0 else id
+ self.cursor.execute(GET_DATES_QUERY, (appt_book_ix,))
+ start_date, end_date = self.cursor.fetchone()
+ self.cursor.execute(ACTIVE_QUERY,
+ (id,
+ start_date,
+ None if flag3==1 else end_date,
+ "data generated by 2_7 script")
+ )
+ self.cursor.execute(DIARY_LINK_QUERY, (id, apptix))
+
+ def run(self):
+ LOGGER.info("running script to convert from schema 2.6 to 2.7")
+ try:
+ self.connect()
+ #- execute the SQL commands
+ self.progressSig(10, _("creating new tables"))
+ self.execute_statements(SQLSTRINGS)
+
+ self.progressSig(50, _("transferring data"))
+ self.transfer_data()
+
+ self.progressSig(95, _("executing cleanup statements"))
+ self.execute_statements(CLEANUPSTRINGS)
+
+ self.progressSig(97, _('updating settings'))
+ LOGGER.info("updating stored database version in settings table")
+
+ self.update_schema_version(("2.7",), "2_6 to 2_7 script")
+
+ self.progressSig(100, _("updating stored schema version"))
+ self.commit()
+ self.completeSig(_("Successfully moved db to") + " 2.7")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
+
+if __name__ == "__main__":
+ dbu = DatabaseUpdater()
+ if dbu.run():
+ LOGGER.info("ALL DONE, conversion successful")
+ else:
+ LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_7to2_8.py b/src/openmolar/schema_upgrades/schema2_7to2_8.py
new file mode 100644
index 0000000..a4df24e
--- /dev/null
+++ b/src/openmolar/schema_upgrades/schema2_7to2_8.py
@@ -0,0 +1,320 @@
+#! /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 provides a function 'run' which will move data
+to schema 2_8
+'''
+from __future__ import division
+
+import datetime
+import logging
+import os
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
+
+LOGGER = logging.getLogger("openmolar")
+
+SQLSTRINGS = [
+'DROP TABLE IF EXISTS static_chart',
+'DROP TABLE IF EXISTS patient_money',
+'DROP TABLE IF EXISTS patient_dates',
+'DROP TABLE IF EXISTS patient_nhs',
+'DROP TABLE IF EXISTS new_patients',
+'''
+CREATE TABLE new_patients (
+ serialno int(11) NOT NULL,
+ sname varchar(30),
+ fname varchar(30),
+ title varchar(30),
+ sex char(1),
+ dob date,
+ addr1 varchar(30) not null default "",
+ addr2 varchar(30) not null default "",
+ addr3 varchar(30) not null default "",
+ town varchar(30) not null default "",
+ county varchar(30) not null default "",
+ pcde varchar(30) not null default "",
+ tel1 varchar(30) not null default "",
+ tel2 varchar(30) not null default "",
+ mobile varchar(30) not null default "",
+ fax varchar(30) not null default "",
+ email1 varchar(50) not null default "",
+ email2 varchar(50) not null default "",
+ occup varchar(30) not null default "",
+ nhsno varchar(30) not null default "",
+ cnfd date,
+ cset varchar(10),
+ dnt1 smallint(6),
+ dnt2 smallint(6),
+ courseno0 int(11),
+ billdate date,
+ billct tinyint(3) unsigned,
+ billtype char(1),
+ familyno int(11),
+ memo varchar(255) not null default "",
+ status varchar(30) not null default "",
+ PRIMARY KEY (serialno)
+)
+''',
+'''
+CREATE TABLE patient_nhs (
+ pt_sno int(11) not null,
+ initaccept date,
+ lastreaccept date,
+ lastclaim date,
+ expiry date,
+ cstatus tinyint(3) unsigned,
+ transfer date,
+ pstatus tinyint(3) unsigned,
+FOREIGN KEY (pt_sno) REFERENCES new_patients(serialno)
+)
+''',
+
+'''
+CREATE TABLE static_chart (
+pt_sno int(11) not null,
+dent0 tinyint(4),
+dent1 tinyint(4),
+dent2 tinyint(4),
+dent3 tinyint(4),
+ur1 varchar(34) not null default "",
+ur2 varchar(34) not null default "",
+ur3 varchar(34) not null default "",
+ur4 varchar(34) not null default "",
+ur5 varchar(34) not null default "",
+ur6 varchar(34) not null default "",
+ur7 varchar(34) not null default "",
+ur8 varchar(34) not null default "",
+ul1 varchar(34) not null default "",
+ul2 varchar(34) not null default "",
+ul3 varchar(34) not null default "",
+ul4 varchar(34) not null default "",
+ul5 varchar(34) not null default "",
+ul6 varchar(34) not null default "",
+ul7 varchar(34) not null default "",
+ul8 varchar(34) not null default "",
+lr1 varchar(34) not null default "",
+lr2 varchar(34) not null default "",
+lr3 varchar(34) not null default "",
+lr4 varchar(34) not null default "",
+lr5 varchar(34) not null default "",
+lr6 varchar(34) not null default "",
+lr7 varchar(34) not null default "",
+lr8 varchar(34) not null default "",
+ll1 varchar(34) not null default "",
+ll2 varchar(34) not null default "",
+ll3 varchar(34) not null default "",
+ll4 varchar(34) not null default "",
+ll5 varchar(34) not null default "",
+ll6 varchar(34) not null default "",
+ll7 varchar(34) not null default "",
+ll8 varchar(34) not null default "",
+FOREIGN KEY (pt_sno) REFERENCES new_patients(serialno)
+)
+''',
+'''
+CREATE TABLE patient_money (
+pt_sno int(11) not null,
+money0 int(11) not null default 0,
+money1 int(11) not null default 0,
+money2 int(11) not null default 0,
+money3 int(11) not null default 0,
+money4 int(11) not null default 0,
+money5 int(11) not null default 0,
+money6 int(11) not null default 0,
+money7 int(11) not null default 0,
+money8 int(11) not null default 0,
+money9 int(11) not null default 0,
+money10 int(11) not null default 0,
+money11 int(11) not null default 0,
+FOREIGN KEY (pt_sno) REFERENCES new_patients(serialno)
+)
+''',
+'''
+CREATE TABLE patient_dates (
+ pt_sno int(11) not null,
+ pd0 date,
+ pd1 date,
+ pd2 date,
+ pd3 date,
+ pd4 date,
+ pd5 date,
+ pd6 date,
+ pd7 date,
+ pd8 date,
+ pd9 date,
+ pd10 date,
+ pd11 date,
+ pd12 date,
+ pd13 date,
+ pd14 date,
+FOREIGN KEY (pt_sno) REFERENCES new_patients(serialno)
+)
+'''
+]
+
+# NOTE - if next statement fails, it is silently overlooked.
+CLEANUPSTRINGS = [
+]
+
+
+SOURCE1_QUERY = '''
+select serialno, IFNULL(sname, ""), IFNULL(fname, ""), IFNULL(title, ""),
+IFNULL(sex, "") , dob , IFNULL(addr1, ""), IFNULL(addr2, ""), IFNULL(addr3, ""),
+IFNULL(town, ""), IFNULL(county, ""), IFNULL(pcde, ""), IFNULL(tel1, ""),
+IFNULL(tel2, ""), IFNULL(mobile, ""), IFNULL(fax, ""), IFNULL(email1, ""),
+IFNULL(email2, ""), IFNULL(occup, ""), IFNULL(nhsno, ""), cnfd, cset,dnt1, dnt2,
+courseno0, billdate, billct, billtype, familyno, IFNULL(memo,""),
+IFNULL(status,"") from patients'''
+
+DEST1_QUERY = '''
+INSERT INTO new_patients (serialno, sname, fname, title, sex , dob , addr1,
+addr2, addr3, town, county, pcde, tel1, tel2, mobile, fax, email1, email2,
+occup, nhsno, cnfd, cset, dnt1, dnt2, courseno0, billdate, billct, billtype,
+familyno, memo, status)
+VALUES (%s)''' % ", ".join(("%s",)*31)
+
+SOURCE2_QUERY = '''
+select serialno, dent0, dent1, dent2, dent3, IFNULL(ur1st, "") ,
+IFNULL(ur2st, "") , IFNULL(ur3st, "") , IFNULL(ur4st, "") , IFNULL(ur5st, "") ,
+IFNULL(ur6st, "") , IFNULL(ur7st, "") , IFNULL(ur8st, "") , IFNULL(ul1st, "") ,
+IFNULL(ul2st, "") , IFNULL(ul3st, "") , IFNULL(ul4st, "") , IFNULL(ul5st, "") ,
+IFNULL(ul6st, "") , IFNULL(ul7st, "") , IFNULL(ul8st, "") , IFNULL(lr1st, "") ,
+IFNULL(lr2st, "") , IFNULL(lr3st, "") , IFNULL(lr4st, "") , IFNULL(lr5st, "") ,
+IFNULL(lr6st, "") , IFNULL(lr7st, "") , IFNULL(lr8st, "") , IFNULL(ll1st, "") ,
+IFNULL(ll2st, "") , IFNULL(ll3st, "") , IFNULL(ll4st, "") , IFNULL(ll5st, "") ,
+IFNULL(ll6st, "") , IFNULL(ll7st, "") , IFNULL(ll8st, "") from patients'''
+
+DEST2_QUERY = '''
+INSERT INTO static_chart (pt_sno, dent0, dent1, dent2, dent3,
+ur1, ur2, ur3, ur4, ur5, ur6, ur7, ur8,
+ul1, ul2, ul3, ul4, ul5, ul6, ul7, ul8,
+lr1, lr2, lr3, lr4, lr5, lr6, lr7, lr8,
+ll1, ll2, ll3, ll4, ll5, ll6, ll7, ll8)
+VALUES (%s)''' % ", ".join(("%s",)*37)
+
+SOURCE3_QUERY = '''
+SELECT serialno, pd0, pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd8, pd9, pd10, pd11,
+pd12, pd13, pd14 FROM patients'''
+
+DEST3_QUERY = '''
+INSERT INTO patient_dates
+(pt_sno, pd0, pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd8, pd9, pd10, pd11,
+pd12, pd13, pd14) VALUES (%s)''' % ", ".join(("%s",)*16)
+
+SOURCE4_QUERY = '''
+SELECT serialno, IFNULL(money0, 0), IFNULL(money1, 0), IFNULL(money2, 0),
+IFNULL(money3, 0), IFNULL(money4, 0), IFNULL(money5, 0), IFNULL(money6, 0),
+IFNULL(money7, 0), IFNULL(money8, 0), IFNULL(money9, 0), IFNULL(money10, 0),
+IFNULL(money11, 0) FROM patients'''
+
+DEST4_QUERY = '''
+INSERT INTO patient_money
+(pt_sno, money0, money1, money2, money3, money4, money5, money6, money7,
+money8, money9, money10, money11) VALUES (%s)''' % ", ".join(("%s",)*13)
+
+SOURCE5_QUERY = '''
+SELECT serialno, initaccept, lastreaccept, lastclaim,
+expiry, cstatus, transfer, pstatus FROM patients
+WHERE initaccept IS NOT NULL AND lastreaccept IS NOT NULL AND
+lastclaim IS NOT NULL AND expiry IS NOT NULL AND cstatus IS NOT NULL AND
+transfer IS NOT NULL AND pstatus IS NOT NULL'''
+
+DEST5_QUERY = '''
+INSERT INTO patient_nhs (pt_sno, initaccept, lastreaccept, lastclaim,
+expiry, cstatus, transfer, pstatus) VALUES (%s)''' % ", ".join(("%s",)*8)
+
+
+class DatabaseUpdater(DatabaseUpdaterThread):
+
+ def transfer_data(self):
+ '''
+ function specific to this update.
+ '''
+ self.progressSig(15, _("pulling information from patient table"))
+ self.cursor.execute(SOURCE1_QUERY)
+ rows = self.cursor.fetchall()
+ self.progressSig(25, _("inserting information into new tables"))
+ self.cursor.executemany(DEST1_QUERY, rows)
+
+ self.progressSig(35, _("pulling information from patient table"))
+ self.cursor.execute(SOURCE2_QUERY)
+ rows = self.cursor.fetchall()
+ self.progressSig(50, _("inserting information into new tables"))
+ self.cursor.executemany(DEST2_QUERY, rows)
+
+ self.progressSig(55, _("pulling information from patient table"))
+ self.cursor.execute(SOURCE3_QUERY)
+ rows = self.cursor.fetchall()
+ self.progressSig(60, _("inserting information into new tables"))
+ self.cursor.executemany(DEST3_QUERY, rows)
+
+ self.progressSig(65, _("pulling information from patient table"))
+ self.cursor.execute(SOURCE4_QUERY)
+ rows = self.cursor.fetchall()
+ self.progressSig(70, _("inserting information into new tables"))
+ self.cursor.executemany(DEST4_QUERY, rows)
+
+ self.progressSig(75, _("pulling information from patient table"))
+ self.cursor.execute(SOURCE5_QUERY)
+ rows = self.cursor.fetchall()
+ self.progressSig(80, _("inserting information into new tables"))
+ self.cursor.executemany(DEST5_QUERY, rows)
+
+ def run(self):
+ LOGGER.info("running script to convert from schema 2.7 to 2.8")
+ try:
+ self.connect()
+ #- execute the SQL commands
+ self.progressSig(10, _("creating new tables"))
+ self.execute_statements(SQLSTRINGS)
+
+ self.transfer_data()
+
+ self.progressSig(95, _("executing cleanup statements"))
+ self.execute_statements(CLEANUPSTRINGS)
+
+ self.progressSig(97, _('updating settings'))
+ LOGGER.info("updating stored database version in settings table")
+
+ self.update_schema_version(("2.8",), "2_7 to 2_8 script")
+
+ self.progressSig(100, _("updating stored schema version"))
+ self.commit()
+ self.completeSig(_("Successfully moved db to") + " 2.8")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
+
+if __name__ == "__main__":
+ dbu = DatabaseUpdater()
+ if dbu.run():
+ LOGGER.info("ALL DONE, conversion successful")
+ else:
+ LOGGER.warning("conversion failed")
diff --git a/src/openmolar/schema_upgrades/schema2_8to2_9.py b/src/openmolar/schema_upgrades/schema2_8to2_9.py
new file mode 100644
index 0000000..376b240
--- /dev/null
+++ b/src/openmolar/schema_upgrades/schema2_8to2_9.py
@@ -0,0 +1,92 @@
+#! /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 provides a function 'run' which will move data
+to schema 2_9
+'''
+from __future__ import division
+
+import datetime
+import logging
+import os
+import sys
+
+from openmolar.settings import localsettings
+from openmolar.schema_upgrades.database_updater_thread import DatabaseUpdaterThread
+
+LOGGER = logging.getLogger("openmolar")
+
+SQLSTRINGS = [
+ 'alter table static_chart add unique(pt_sno)',
+ 'alter table patient_money add unique(pt_sno)',
+ 'alter table patient_dates add unique(pt_sno)',
+ 'alter table patient_nhs add unique(pt_sno)',
+]
+
+CLEANUPSTRINGS = [
+]
+
+
+class DatabaseUpdater(DatabaseUpdaterThread):
+
+ def transfer_data(self):
+ '''
+ function specific to this update.
+ '''
+ pass
+
+ def run(self):
+ LOGGER.info("running script to convert from schema 2.8 to 2.9")
+ try:
+ self.connect()
+ #- execute the SQL commands
+ self.progressSig(50, _("creating new tables"))
+ self.execute_statements(SQLSTRINGS)
+
+ self.transfer_data()
+
+ self.progressSig(75, _("executing cleanup statements"))
+ self.execute_statements(CLEANUPSTRINGS)
+
+ self.progressSig(97, _('updating settings'))
+ LOGGER.info("updating stored database version in settings table")
+
+ self.update_schema_version(("2.9",), "2_8 to 2_9 script")
+
+ self.progressSig(100, _("updating stored schema version"))
+ self.commit()
+ self.completeSig(_("Successfully moved db to") + " 2.9")
+ return True
+ except Exception as exc:
+ LOGGER.exception("error transfering data")
+ self.rollback()
+ raise self.UpdateError(exc)
+
+if __name__ == "__main__":
+ dbu = DatabaseUpdater()
+ if dbu.run():
+ LOGGER.info("ALL DONE, conversion successful")
+ else:
+ LOGGER.warning("conversion failed")
diff --git a/src/openmolar/settings/localsettings.py b/src/openmolar/settings/localsettings.py
index a8aa7c1..a79660b 100644
--- a/src/openmolar/settings/localsettings.py
+++ b/src/openmolar/settings/localsettings.py
@@ -39,22 +39,32 @@ from openmolar.settings.version import VERSION
LOGGER = logging.getLogger("openmolar")
-SUPERVISOR = '05b1f356646c24bf1765f6f1b65aea3bde7247e1'
+SALT = "OIHoIHyO"
+# default supervisor password is blank
+SUPERVISOR = "c1219df26de403348e211a314ff2fce58aa6e28d"
+
DBNAME = "default"
-# updated 28.11.2013
-CLIENT_SCHEMA_VERSION = "2.4"
+# updated 27.06.2014
+CLIENT_SCHEMA_VERSION = "2.9"
+
DB_SCHEMA_VERSION = "unknown"
ENCODING = locale.getpreferredencoding()
FEETABLES = None
WIKIURL = ""
+cashbookCodesDict = None
+
+IGNORE_SCHEMA_CHECK = False
+FORCE_FIRST_RUN = False
+
+PT_COUNT = 0
locale.setlocale(locale.LC_ALL, '')
try:
- s = _("translation tools are installed sucessfully")
+ s = _("translation tools are installed successfully")
LOGGER.debug(s)
except NameError:
LOGGER.error("installing gettext for translations")
@@ -73,21 +83,34 @@ def showVersion():
if LOGGER.level == logging.DEBUG:
showVersion()
-PRACTICE_NAME = "The Academy Dental Practice"
-
-APPOINTMENT_CARD_HEADER = \
- "%s, 19 Union Street\nInverness. tel 01463 232423" % PRACTICE_NAME
-
-
+PRACTICE_NAME = _("Example Dental Practice")
APPOINTMENT_CARD_FOOTER = _("Please try and give at least 24 hours notice") +\
"\n" + _("if you need to change an appointment.")
-CORRESPONDENCE_SIG = "The Academy Dental Practice"
-MH_HEADER = ("The Academy Dental Practice",
- _("Confidential Medical History Questionaire"))
-
-WINDOWS = False
+MESSAGE_TEMPLATE = '''
+<html>
+ <head>
+ <link rel="stylesheet" href="%s" type="text/css">
+ </head>
+ <body>
+ <div align="center">
+ <img src="%s" width="150", height="100", align="left" />
+ <img src="%s" width="150", height="100", align="right" />
+ <h1>%s</h1>
+ <ul><li class="about">%s %s</li></ul>
+ <br clear="all" />
+ <p>%s</p>
+ <p>%s</p>
+ </div>
+ </body>
+</html>
+'''
+LOCALSETTINGS_TEMPLATE = '''<?xml version="1.0" ?>
+<settings>
+ <version>1.0</version>
+</settings>
+'''
def determine_path():
@@ -113,24 +136,15 @@ chosenserver = 0
def setChosenServer(i):
global DBNAME, chosenserver
+ LOGGER.debug("chosen server number is set as %s", i)
chosenserver = i
try:
DBNAME = server_names[i]
- LOGGER.debug("DBNAME = %s" % DBNAME)
+ LOGGER.warning("User has chosen database '%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")
-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")
-resources_location = os.path.join(wkdir, "resources")
-resources_path = "file://" + resources_location
-
if "win" in sys.platform:
WINDOWS = True
LOGGER.info("Windows OS detected - modifying settings")
@@ -153,6 +167,7 @@ if "win" in sys.platform:
"://", ":///").replace(" ", "%20").replace("\\", "/")
else:
+ WINDOWS = False
if not "linux" in sys.platform:
LOGGER.warning(
"unknown system platform (mac?) - defaulting to linux settings")
@@ -164,6 +179,16 @@ LOGIN_CONF = os.path.join(localFileDirectory, "autologin.conf")
TEMP_PDF = os.path.join(localFileDirectory, "temp.pdf")
DOCS_DIRECTORY = os.path.join(localFileDirectory, "documents")
+appt_shortcut_file = os.path.join(wkdir, "resources",
+ "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")
+resources_location = os.path.join(wkdir, "resources")
+resources_path = "file://" + resources_location
+
+
if not os.path.exists(DOCS_DIRECTORY):
os.makedirs(DOCS_DIRECTORY)
@@ -255,7 +280,7 @@ allowed_logins = []
#-- this list is used for navigating back and forth through the list
recent_snos = []
-recent_sno_index = 0
+recent_sno_index = -1
last_family_no = 0
#-- update whenever a manual search is made
@@ -292,7 +317,7 @@ apptix_reverse = {}
#--(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)
+BOOKEND = datetime.date.today() + datetime.timedelta(days=183)
#--treatment codes..
@@ -332,12 +357,8 @@ surgeryno = -1
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")
+PRACTICE_ADDRESS = ("The Dental Practice", "My Street", "My Town", "POST CODE")
#-- this is updated whenever a patient record loads, for ease of address
#-- manipulation
@@ -361,6 +382,25 @@ def hash_func(message):
return hashlib.sha1(message).hexdigest()
+def pencify(input_):
+ '''
+ safely convert "0.29" to 29, or "1.50" to 150 etc..
+ in python int(0.29 * 100) is 28!
+ '''
+ m = re.match("(\d+)?\.?(\d)?(\d)?", input_)
+ if not m:
+ return 0
+ return int("%s%s%s" % (
+ "0" if m.groups()[0] is None else m.groups()[0],
+ "0" if m.groups()[1] is None else m.groups()[1],
+ "0" if m.groups()[2] is None else m.groups()[2])
+ )
+
+
+def decimalise(pence):
+ return "%d.%02d" % (pence // 100, pence % 100)
+
+
def convert_deciduous(tooth):
'''
if the tooth is a match for ulD or llE etc..
@@ -717,7 +757,7 @@ def autologin():
try:
PASSWORD = scp.get("login", "PASSWORD")
except ConfigParser.NoOptionError:
- PASSWORD = ""
+ pass
try:
USER1 = scp.get("login", "USER1")
except ConfigParser.NoOptionError:
@@ -727,8 +767,8 @@ def autologin():
except ConfigParser.NoOptionError:
pass
except ConfigParser.NoSectionError:
- LOGGER.exception("autologin")
- pass
+ LOGGER.info("no autologin")
+
return PASSWORD, USER1, USER2
@@ -756,9 +796,7 @@ def getLocalSettings():
#-- no file found..
#--so create a settings file.
f = open(localSets, "w")
- f.write('''<?xml version="1.0" ?>
- <settings><version>1.0</version></settings>
- ''')
+ f.write(LOCALSETTINGS_TEMPLATE)
f.close()
@@ -785,124 +823,67 @@ def updateLocalSettings(setting, value):
return True
-def initiateUsers(changedServer=False):
+def force_reconnect():
'''
- just grab user names. necessary because the db schema could be OOD here
+ user has changed server!
'''
- global allowed_logins
from openmolar import connect
-
- if changedServer and connect.mainconnection:
- print "closing connection"
+ if connect.mainconnection:
+ LOGGER.warning("closing connection to previously chosen database")
connect.mainconnection.close()
- reload(connect)
+ connect.params.reload()
+
- db = connect.connect()
- cursor = db.cursor()
- cursor.execute("select id from opid")
- # 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 initiateUsers(changed_server=False):
+ '''
+ just grab user names. necessary because the db schema could be OOD here
+ '''
+ global allowed_logins
+ LOGGER.debug(
+ "initiating allowed users changed_server = %s", changed_server)
+ from openmolar.dbtools.db_settings import SettingsFetcher
+ if changed_server:
+ force_reconnect()
+ settings_fetcher = SettingsFetcher()
+ allowed_logins = settings_fetcher.allowed_logins
-def initiate(changedServer=False, debug=False):
- # print "initiating settings"
+
+def initiate(changed_server=False):
+ LOGGER.debug("initiating settings from database")
global message, dentDict, ops, SUPERVISOR, \
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
+ apptix, apptix_reverse, BOOKEND, clinicianNo, clinicianInits, \
+ WIKIURL, cashbookCodesDict, PT_COUNT, PRACTICE_ADDRESS, PRACTICE_NAME
- if changedServer and connect.mainconnection:
- print "closing connection"
- connect.mainconnection.close()
- reload(connect)
+ from openmolar.dbtools import cashbook
+ from openmolar.dbtools.db_settings import SettingsFetcher
- data = db_settings.getData("bookend")
- if data:
- bookEndVals = data[-1][0].split(",")
- bookEnd = datetime.date(int(bookEndVals[0]), int(bookEndVals[1]),
- int(bookEndVals[2]))
+ if changed_server:
+ force_reconnect()
- data = db_settings.getData("supervisor_pword")
- if data:
- SUPERVISOR = data[0][0]
- else:
- LOGGER.warning("#" * 30)
- LOGGER.warning(
- "WARNING - no supervisor password is set, restting to default")
- LOGGER.warning("#" * 30)
- db_settings.updateData("supervisor_pword", SUPERVISOR,
- "not found reset")
+ settings_fetcher = SettingsFetcher()
+ settings_fetcher.fetch()
+ cashbookCodesDict = cashbook.CashBookCodesDict()
- db = connect.connect()
- cursor = db.cursor()
+ PT_COUNT = settings_fetcher.PT_COUNT
+ WIKIURL = settings_fetcher.wiki_url
+ BOOKEND = settings_fetcher.book_end
+ SUPERVISOR = settings_fetcher.supervisor_pword
- # set up four lists with key/value pairs reversedto make for easy
+ # set up four lists with key/value pairs reversed to make for easy
# referencing
- # 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] is not None:
- ops[practitioner[0]] = practitioner[1]
- ops_reverse[practitioner[1]] = practitioner[0]
- if practitioner[2] != 0:
- apptix_reverse[practitioner[2]] = practitioner[1]
- else:
- ops[0] = "NONE"
- ops_reverse["NONE"] = 0
+ ops = settings_fetcher.ops
+ ops_reverse = settings_fetcher.ops_reverse
+ apptix_reverse = settings_fetcher.apptix_reverse
+ dentDict = settings_fetcher.dentist_data
+ apptix = settings_fetcher.apptix_dict
+ activedents, activedent_ixs = settings_fetcher.active_dents
+ activehygs, activehyg_ixs = settings_fetcher.active_hygs
- try:
- # correspondence details for NHS forms
- query = ("select id,inits,name,formalname,fpcno,quals "
- "from practitioners where flag0=1")
-
- cursor.execute(query)
- practitioners = cursor.fetchall()
- dentDict = {}
- for practitioner in practitioners:
- dentDict[practitioner[0]] = practitioner[1:]
-
- # 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] 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
- ixs, activedents = [], []
- practitioners = cursor.fetchall()
- for ix, inits in practitioners:
- ixs.append(ix)
- activedents.append(inits)
- activedent_ixs = tuple(ixs)
-
- cursor.execute(
- "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:
- ixs.append(ix)
- activehygs.append(inits)
- activehyg_ixs = tuple(ixs)
-
- except Exception as exc:
- LOGGER.exception("error loading practitioners")
+ PRACTICE_NAME = settings_fetcher.practice_name
+ PRACTICE_ADDRESS = settings_fetcher.practice_address
#-- set the clinician if possible
u1 = operator.split("/")[0].strip(" ")
@@ -914,32 +895,28 @@ def initiate(changedServer=False, debug=False):
getLocalSettings()
- WIKIURL = db_settings.getWikiUrl()
-
- message = ('''<html><head>
-<link rel="stylesheet" href="%s" type="text/css">
-</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>
-<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>''')
-
- if debug:
- print "LOCALSETTINGS CALLED WITH DEBUG = TRUE"
- print "ops = ", ops
- print "ops_reverse = ", ops_reverse
- print "apptix = ", apptix
- print "apptix_reverse = ", apptix_reverse
- print "activedents =", activedents
- print "activehygs =", activehygs
- print "allowed logins =", allowed_logins
- print "stylesheet =", stylesheet
- print "referralfile = ", referralfile
+ message = MESSAGE_TEMPLATE % (stylesheet,
+ LOGOPATH,
+ LOGOPATH,
+ _("Welcome to OpenMolar!"),
+ _("Version"),
+ VERSION,
+ _(
+ "Your Data is Accessible, and the server reports no issues."),
+ _("Have a great day!")
+ )
+
+ LOGGER.debug("LOCALSETTINGS")
+ LOGGER.debug("ops = %s", ops)
+ LOGGER.debug("ops_reverse = %s", ops_reverse)
+ LOGGER.debug("apptix = %s", apptix)
+ LOGGER.debug("apptix_reverse = %s", apptix_reverse)
+ LOGGER.debug("activedents = %s", activedents)
+ LOGGER.debug("activehygs = %s", activehygs)
+ LOGGER.debug("allowed logins = %s", allowed_logins)
+ LOGGER.debug("stylesheet = %s", stylesheet)
+ LOGGER.debug("practice name - %s", PRACTICE_NAME)
+ LOGGER.debug("practice address - %s", PRACTICE_ADDRESS)
def loadFeeTables():
@@ -962,4 +939,5 @@ def _test():
if __name__ == "__main__":
LOGGER.setLevel(logging.DEBUG)
+ initiate()
_test()
diff --git a/src/openmolar/settings/version.py b/src/openmolar/settings/version.py
index d44015a..8597ae0 100644
--- a/src/openmolar/settings/version.py
+++ b/src/openmolar/settings/version.py
@@ -27,39 +27,7 @@ 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
-
-LOGGER = logging.getLogger("openmolar")
-
-LOGGER.warning("You are running a development version of OpenMolar!")
-
-try:
- import git
- repo = git.Repo(os.path.dirname(__file__))
- if repo.description == "openmolar1":
- try:
- 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 ---------------------------------- #
+VERSION = "0.6.0"
if __name__ == '__main__':
diff --git a/src/standalone_chart/lib_om_chart/__init__.py b/src/standalone_chart/lib_om_chart/__init__.py
deleted file mode 100644
index c701215..0000000
--- a/src/standalone_chart/lib_om_chart/__init__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#! /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
deleted file mode 100644
index 40df597..0000000
--- a/src/standalone_chart/lib_om_chart/chart_colours.py
+++ /dev/null
@@ -1,51 +0,0 @@
-#! /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
-GI_ = "#75d185"
-GOLD_ = "#ffff00"
-COMP_ = "#ffffff"
-PORC_ = "#ddffff"
-AMALGAM_ = "#666666"
-
-GI = QtGui.QColor(GI_)
-GOLD = QtGui.QColor(GOLD_)
-COMP = QtGui.QColor(COMP_)
-PORC = QtGui.QColor(PORC_)
-AMALGAM = QtGui.QColor(AMALGAM_)
-
-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
-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
deleted file mode 100644
index 88cd147..0000000
--- a/src/standalone_chart/lib_om_chart/chart_widget.py
+++ /dev/null
@@ -1,967 +0,0 @@
-#! /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/>. # #
-# # # #
-# ############################################################################ #
-
-'''
-has one class, a custom widget which inherits from QWidget
-'''
-
-from __future__ import division
-
-import logging
-import re
-import sys
-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))
-
- 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
- self.isPlanChart = False
- self.setMinimumSize(self.minimumSizeHint())
- self.showLeftRight = True
- self.showSelected = False
-
- def clear(self, keepSelection=False):
- '''
- clears all fillings etc from the chart
- '''
- #--clear individual teeth
- self.ur8, self.ur7, self.ur6, self.ur5, self.ur4, self.ur3, self.ur2, \
- self.ur1 = [], [], [], [], [], [], [], []
- self.ul8, self.ul7, self.ul6, self.ul5, self.ul4, self.ul3, self.ul2, \
- self.ul1 = [], [], [], [], [], [], [], []
- self.ll8, self.ll7, self.ll6, self.ll5, self.ll4, self.ll3, self.ll2, \
- self.ll1 = [], [], [], [], [], [], [], []
- self.lr8, self.lr7, self.lr6, self.lr5, self.lr4, self.lr3, self.lr2, \
- 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'
- }
-
- #-- select the ur8
- if keepSelection:
- logging.debug("keeping existing chart selection(s)")
- else:
- self.showSelected = False
- self.selected = [0, 0]
- self.multiSelection = []
- self.highlighted = [-1, -1]
- self.update()
-
- def sizeHint(self):
- '''
- set an arbitrary size
- '''
- return QtCore.QSize(500, 200)
-
- def minimumSizeHint(self):
- '''
- arbitrary minimum size
- '''
- return QtCore.QSize(300, 100)
-
- def setShowLeftRight(self, arg):
- '''
- a boolean for user preference whether to display right / left text
- on the widget
- '''
- self.showLeftRight = arg
-
- def setShowSelected(self, arg):
- '''
- a boolean as to whether to "select" a tooth
- by default the overview (summary) chart doesn't
- '''
- self.showSelected = arg
-
- def setToothProps(self, tooth, props):
- '''
- adds fillings and comments to a tooth
- '''
- if tooth in self.commentedTeeth:
- self.commentedTeeth.remove(tooth)
- if "!" in props:
- self.commentedTeeth.append(tooth)
-
- proplist = props.split(" ")
- self.__dict__[tooth] = []
- for prop in proplist:
- if prop != "":
- if not re.match("!.*", prop):
- prop = "%s " % prop.lower()
- else:
- prop = "%s " % prop
- self.__dict__[tooth].append(prop)
-
- def paintEvent(self, event=None):
- '''
- overrides 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
- #-- cell width
- xOffset = (self.width() - midline) / 16
- #-- cell height
- yOffset = self.height() / 2
- #--red pen
- if self.isEnabled():
- painter.setPen(QtGui.QPen(QtCore.Qt.red, 2))
- else:
- painter.setPen(QtGui.QPen(QtCore.Qt.gray, 2))
- sansFont = QtGui.QFont("Helvetica", 8)
- painter.setFont(sansFont)
- fm = QtGui.QFontMetrics(sansFont)
- leftpad = fm.width("Right ")
- rightpad = fm.width(" Left")
-
- #--big horizontal dissection of entire widget
- painter.drawLine(leftpad, self.height() / 2, self.width() - rightpad,
- self.height() / 2)
- #--vertical dissection of entire widget
- painter.drawLine(self.width() / 2, 0, self.width() / 2, self.height())
-
- for x in range(16):
- if x > 7:
- midx = midline
- 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)
-
- #-- draw a tooth (subroutine)
- self.tooth(painter, rect, tooth_notation)
- if [x, y] == self.highlighted:
- painter.setPen(QtGui.QPen(QtCore.Qt.cyan, 1))
- painter.setBrush(colours.TRANSPARENT)
- painter.drawRect(rect.adjusted(1, 1, -1, -1))
-
- if self.showSelected:
- #-- these conditions mean that the tooth needs to be
- #--highlighted draw a rectangle around the selected tooth,
- #--but don't overwrite the centre
-
- if [x, y] == self.selected:
- painter.setPen(QtGui.QPen(QtCore.Qt.darkBlue, 2))
- painter.setBrush(colours.TRANSPARENT)
- painter.drawRect(rect.adjusted(1, 1, -1, -1))
-
- elif [x, y] in self.multiSelection:
- painter.setPen(QtGui.QPen(QtCore.Qt.blue, 2))
- painter.setBrush(colours.TRANSPARENT)
- painter.drawRect(rect.adjusted(1, 1, -1, -1))
-
- if self.isEnabled():
- painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
- else:
- painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
-
- textRect = QtCore.QRectF(0, 0, self.width(), self.height())
-
- 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.AlignLeft |
- QtCore.Qt.AlignVCenter, (_("Right")))
-
- #--free the painter's saved state
- painter.restore()
-
- def tooth(self, painter, rect, ident):
- painter.save()
-
- #--get tooth props - ie fillings, plans etc....
- #--this will be a list of values eg ["MOD","RT"]
- props = self.__dict__[ident]
-
- isUpper = ident[0] == "u"
-
- #-- split tooth rectangle into a large graphic square...
- #-- and a smaller text square
- 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)
- textRect = rect.adjusted(0, 2 * thirdheight, 0, -2)
- else:
- toothRect = rect.adjusted(0, thirdheight, 0, -2)
- textRect = rect.adjusted(0, 2, 0, -2 * thirdheight)
-
- #--colours are grabbed from the separate colours module
- painter.setPen(colours.TOOTHLINES)
- painter.setBrush(colours.IVORY)
- toothid = self.chartgrid[ident]
-
- # 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
- if toothtext in ("A", "B", "C", "D", "E", "*"):
- # BABY TOOTH###########################
- #-- paint deciduous notation in RED
- painter.save()
- if self.isEnabled():
- painter.setPen(QtGui.QPen(QtCore.Qt.red, 1))
- else:
- painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
- painter.drawText(textRect, QtCore.Qt.AlignCenter, (toothtext))
- 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)
-
- else:
- #--adult tooth
- painter.save()
- if self.isEnabled():
- painter.setPen(QtGui.QPen(colours.CHARTTEXT, 1))
- else:
- painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
- painter.drawText(textRect, QtCore.Qt.AlignCenter, toothtext)
- painter.restore()
-
- #--more occlusal/incisal edge sizing
-
- if ident in self.commentedTeeth:
- #-- comments
- #-- commented teeth have a red exclamation mark on a yellow square
- painter.save()
- painter.setPen(QtGui.QPen(QtCore.Qt.yellow, 1))
- painter.setBrush(QtCore.Qt.yellow)
- comRect = textRect.adjusted(textRect.width() * .7, 0, 0, 0)
- painter.drawRect(comRect)
- sansFont = QtGui.QFont("Helvetica", 9)
- painter.setFont(sansFont)
- painter.setPen(QtGui.QPen(QtCore.Qt.red, 2))
- painter.drawText(comRect, QtCore.Qt.AlignCenter, "!")
- painter.restore()
- for prop in ("rt ", "ap ", "-m,1 ", "-m,2 ",
- "+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)
- 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())
- painter.restore()
-
- toothS = toothSurfaces(self, toothRect, toothid, self.isStaticChart)
- toothS.setProps(props)
- toothS.draw(self, painter)
- painter.restore()
-
-
-class toothSurfaces():
-
- '''
- draws the tooth surfaces
- '''
-
- def __init__(self, parent, rect, ident, isStatic=True):
- '''
- initiate using the following args
- parent (a Qwidget), rect (a Qrect), ident (eg. ur5),
- and optionally isStatic=True
- '''
- self.rect = rect
- self.parent = parent
- self.props = ""
- #--backtooth?
- self.backTooth = False
- self.toothtext = ident[2]
- if re.match("[DE45678*]", self.toothtext):
- self.backTooth = True
- self.isStatic = isStatic
-
- self.quadrant = ident[0:2]
- self.isUpper = ident[0] == "u"
-
- #--the occlusal surface (for backteeth)
- #--or incisal edge for front teeth..
- #-- is given a width here.
- #-- irw = inner rectangle width
- irw = self.rect.width() * 0.25
-
- if self.backTooth:
- irh = rect.height() * 0.25
- else:
- irh = rect.height() * 0.45
- self.innerRect = self.rect.adjusted(irw, irh, -irw, -irh)
-
- def setProps(self, props):
- self.props = props
-
- def draw(self, parent, painter=None):
- if painter is None:
- self.painter = QtGui.QPainter(parent)
- else:
- self.painter = painter
- for prop in self.props:
- prop = prop.strip(" ")
- 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
- if self.isUpper:
- self.rect = self.rect.adjusted(adj, 0, 0, 0)
- else:
- self.rect = self.rect.adjusted(0, 0, -adj, 0)
- #--remove the bracket
- #--necessary for condition in a few lines time
- prop = prop.strip("(")
-
- elif re.match(".*\)$", prop):
- #--other end of a bridge
- adj = self.rect.width() * 0.10
- if self.isUpper:
- self.rect = self.rect.adjusted(0, 0, -adj, 0)
- else:
- self.rect = self.rect.adjusted(adj, 0, 0, 0)
- prop = prop.strip(")")
-
- if "br/p" in prop:
- # bridge pontic found - shrink
- self.rect = self.rect.adjusted(0, self.rect.height() * 0.10, 0,
- -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())
-
- #-deciduos (ie. indeterminate) 6, 7, 8 are marked as "*"
- #--paint over these.
- if self.toothtext == "*":
- erase_color = parent.palette().background().color()
- self.painter.setPen(erase_color)
- self.painter.setBrush(erase_color)
- self.painter.drawRect(self.rect)
-
- #--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.
-
- if self.props != []:
- if self.backTooth:
- toothdimen = self.rect.width()
- ax = self.rect.topLeft().x() + toothdimen * 0.05
- bx = self.rect.topLeft().x() + toothdimen * 0.15
- cx = self.rect.topLeft().x() + toothdimen * 0.2
- dx = self.rect.topLeft().x() + toothdimen * 0.35
- ex = self.rect.topLeft().x() + toothdimen * 0.5
- fx = self.rect.topLeft().x() + toothdimen * 0.7
- gx = self.rect.topLeft().x() + toothdimen * 0.8
- hx = self.rect.topLeft().x() + toothdimen * 0.85
- ix = self.rect.topLeft().x() + toothdimen * 0.95
- toothdimen = self.rect.height()
- ay = self.rect.topLeft().y() + toothdimen * 0.05
- by = self.rect.topLeft().y() + toothdimen * 0.15
- cy = self.rect.topLeft().y() + toothdimen * 0.2
- dy = self.rect.topLeft().y() + toothdimen * 0.35
- ey = self.rect.topLeft().y() + toothdimen * 0.5
- fy = self.rect.topLeft().y() + toothdimen * 0.65
- gy = self.rect.topLeft().y() + toothdimen * 0.8
- hy = self.rect.topLeft().y() + toothdimen * 0.85
- iy = self.rect.topLeft().y() + toothdimen * 0.95
- else:
- #--front tooth - different patterns
- toothdimen = self.rect.width()
- ax = self.rect.topLeft().x() + toothdimen * 0.05
- bx = self.rect.topLeft().x() + toothdimen * 0.15
- cx = self.rect.topLeft().x() + toothdimen * 0.2
- dx = self.rect.topLeft().x() + toothdimen * 0.3
- ex = self.rect.topLeft().x() + toothdimen * 0.5
- fx = self.rect.topLeft().x() + toothdimen * 0.7
- gx = self.rect.topLeft().x() + toothdimen * 0.8
- hx = self.rect.topLeft().x() + toothdimen * 0.85
- ix = self.rect.topLeft().x() + toothdimen * 0.95
- toothdimen = self.rect.height()
- ay = self.rect.topLeft().y() + toothdimen * 0.05
- by = self.rect.topLeft().y() + toothdimen * 0.15
- cy = self.rect.topLeft().y() + toothdimen * 0.2
- dy = self.rect.topLeft().y() + toothdimen * 0.3
- ey = self.rect.topLeft().y() + toothdimen * 0.5
- fy = self.rect.topLeft().y() + toothdimen * 0.7
- gy = self.rect.topLeft().y() + toothdimen * 0.8
- hy = self.rect.topLeft().y() + toothdimen * 0.85
- iy = self.rect.topLeft().y() + toothdimen * 0.95
-
- for prop in self.props:
- prop = prop.strip(" ")
- material = ""
- self.painter.save()
-
- prop = prop.strip("#&")
- if prop == "pv":
- prop = "pv,pj"
- if re.match("!.*", prop):
- 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):
- #--bridge
- prop = prop[3:]
- if leading_bracket:
- prop = prop.replace(",", ",(")
- if "p," in prop:
- #--some gold crowns are cr/modbl,go
- prop = "PONTIC," + prop[2:]
- if "mr" in prop:
- prop = "p,mr"
- else:
- if "pi" in prop:
- #--porcelain inlays are pi/modp etc
- prop = prop[3:] + ",pi"
- if "cr" in prop:
- #--some gold crowns are cr/modbl,go
- prop = prop[3:]
- if "gi" in prop:
- prop = prop[3:] + ",go"
- if "gc" in prop:
- #-- code for gi treatment where exceptional
- #-- circumstances apply
- #-- "gc/mod".. so for drawing purposes
- #-- change this to "mod,gi"
- prop = prop[3:] + ",gl"
-
- 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 = ""
- if prop[:2] in ("ue", "pe", "oe", "rp"):
- if prop[:2] == "ue":
- erase_color = parent.palette().background().color()
- self.painter.setBrush(erase_color)
- else:
- self.painter.setBrush(QtCore.Qt.transparent)
- 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)
- else:
- self.painter.drawText(self.rect.adjusted(0,
- 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??
- prop = prop.replace(",pr", "")
-
- if "," in prop:
- #--get materal if present
- material = prop.split(",")[1]
- material = re.sub("[()]", "", material)
- prop = prop.split(",")[0]
- #--adjust for mirror imaging
- else:
- #--set default material
- if self.toothtext == "4":
- if prop in ("B", "P"):
- material = "co"
- else:
- material = "am"
- elif self.backTooth:
- material = "am"
- else:
- material = "co"
-
- if prop[:2] == "fs":
- material = "fs"
-
- if prop[:2] == "dr":
- material = "dr"
-
- #--put an outline around the filling
- self.painter.setPen(QtGui.QPen(colours.FILL_OUTLINE, 1))
-
- #--set filling color
- if material == "co":
- self.painter.setBrush(colours.COMP)
- elif material in ("pj", "ot", "pi", "a1", "v1", "v2", "opal",
- "opalite", "lava"):
- self.painter.setBrush(colours.PORC)
- elif material == "gl":
- self.painter.setBrush(colours.GI)
- elif material == "go":
- self.painter.setBrush(colours.GOLD)
- elif material == "am":
- self.painter.setBrush(colours.AMALGAM)
- elif material == "mr":
- self.painter.setBrush(colours.METAL)
- elif material == "dr":
- self.painter.setBrush(colours.DRESSING)
- elif material == "fs":
- self.painter.setPen(QtGui.QPen(colours.FISSURE, 1))
- self.painter.setBrush(colours.FISSURE)
- else:
- logging.debug("unhandled material colour %s %s %s" % (
- self.toothtext, prop, material))
-
- if self.quadrant[1] == "l" and prop != "dr":
- #-- left hand side - reverse fills
- #-- this loods a confusing merry dance...
- #-- capitalisation used to prevent changes being undone
- prop = prop.replace("m", "D")
- prop = prop.replace("d", "m")
- prop = prop.replace("D", "d")
- if self.quadrant[0] == "l":
- prop = prop.replace("b", "L")
- prop = prop.replace("l", "b")
- prop = prop.replace("L", "l")
- if prop[0:2] == "cr" or "PONTIC" in prop:
- if "PONTIC" in prop:
- crRect = self.rect
- else:
- 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.bottomLeft(),
- self.innerRect.bottomLeft())
-
- self.painter.drawLine(crRect.bottomRight(),
- self.innerRect.bottomRight())
-
- if self.backTooth:
- self.painter.drawText(self.rect, QtCore.Qt.AlignCenter,
- material)
- else:
- self.painter.drawText(self.rect.adjusted(0,
- 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.painter.drawText(self.rect.adjusted(0, 0, 0,
- -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.painter.drawText(self.rect.adjusted(0,
- self.rect.height(
- ) / 2, 0, 0),
- QtCore.Qt.AlignCenter, prop)
-
- prop = ""
-
- if prop == "ex":
- #-- draw a big red X
- self.painter.save()
-
- self.painter.setPen(QtGui.QPen(QtCore.Qt.red, 4))
- self.painter.drawLine(self.rect.topLeft(),
- self.rect.bottomRight())
-
- self.painter.drawLine(self.rect.topRight(),
- self.rect.bottomLeft())
-
- self.painter.restore()
-
- # IGNORE LIST
- if prop in ("px", "oe"):
- 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]))
- shapes.append(QtGui.QPolygon(
- [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])
- 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])
- 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])
- 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])
- 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])
- 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])
- 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])
- 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])
- 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])
- 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])
- 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])
- shapes.append(n)
- elif re.match("[ob]{2}", prop):
- n = QtGui.QPolygon([cx, ay, gx, ay, fx, cy, fx, fy,
- 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])
- 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])
- 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])
- 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])
- 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])
- shapes.append(n)
- elif re.match("[mo]{2}", prop):
- n = QtGui.QPolygon([dx, dy, gx, dy, ix, cy, ix, gy,
- 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])
- shapes.append(n)
-
- elif "o" in prop:
- n = QtGui.QPolygon([dx, dy, fx, dy, fx, fy, dx, fy])
- shapes.append(n)
- elif "m" in prop:
- n = QtGui.QPolygon([gx, dy, ix, by, ix, hy, gx, fy])
- shapes.append(n)
- elif "d" in prop:
- n = QtGui.QPolygon([ax, by, cx, dy, cx, fy, ax, hy])
- shapes.append(n)
- elif "p" in prop:
- n = QtGui.QPolygon([bx, iy, dx, gy, fx, gy, hx, iy])
- shapes.append(n)
- elif "b" in prop:
- n = QtGui.QPolygon([bx, ay, hx, ay, fx, cy, dx, cy])
- shapes.append(n)
- 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])
- 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])
- 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])
- shapes.append(n)
- elif re.match("[ib]{2}", prop):
- n = QtGui.QPolygon([cx, ay, gx, ay, fx, cy, fx, fy,
- 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])
- 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])
- 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])
- 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])
- 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])
- 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])
- 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(),
- ])
- 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])
- 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()])
- shapes.append(n)
- elif "m" in prop:
- shapes.append(QtGui.QPolygon(
- [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]))
- elif "p" in prop:
- shapes.append(QtGui.QPolygon([cx, hy, cx, gy, ex, fy,
- 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]))
- for shape in shapes:
- self.painter.drawPolygon(shape)
- # 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.draw(self)
-
- def image(self):
- '''
- returns a png image of the tooth
- '''
- myimage = QtGui.QPixmap.grabWidget(self)
-
- return myimage
-
-if __name__ == "__main__":
- from gettext import gettext as _
- 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'}
-
- 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")):
- 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
deleted file mode 100644
index 0d73bcc..0000000
--- a/src/standalone_chart/lib_om_chart/config.py
+++ /dev/null
@@ -1,83 +0,0 @@
-#! /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 has one purpose...
-read the config file
-'''
-
-import base64
-import ConfigParser
-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)
-
-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"
- }
-
- 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()
-
- parser.add_section('Database')
- parser.set('Database', 'host', host)
- parser.set('Database', 'port', port)
- parser.set('Database', 'db_name', db_name)
- parser.set('Database', 'user', user)
- parser.set('Database', 'password', base64.b64encode(passwd))
- parser.set('Database', 'ssl', ssl)
- parser.add_section('Surgery')
- parser.set('Surgery', 'number', surgery)
-
- # Writing our configuration file to 'example.cfg'
- if os.path.exists(CONF_FILE_LOC):
- os.remove(CONF_FILE_LOC)
- with open(CONF_FILE_LOC, 'wb') as configfile:
- parser.write(configfile)
-
-
-if __name__ == "__main__":
- logging.basicConfig(level=logging.DEBUG)
- print KWARGS
diff --git a/src/standalone_chart/lib_om_chart/config_dialog.py b/src/standalone_chart/lib_om_chart/config_dialog.py
deleted file mode 100644
index c08441a..0000000
--- a/src/standalone_chart/lib_om_chart/config_dialog.py
+++ /dev/null
@@ -1,155 +0,0 @@
-#! /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/>. # #
-# # # #
-# ############################################################################ #
-
-'''
-has one class, a dialog to write the config
-'''
-
-import logging
-import sys
-
-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>" % _(
- "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.password_le.setEchoMode(QtGui.QLineEdit.Password)
- self.surgery_sb = QtGui.QSpinBox()
-
- form_layout.addRow(_("host"), self.host_le)
- form_layout.addRow(_("port"), self.port_le)
- form_layout.addRow(_("database"), self.database_le)
- form_layout.addRow(_("user"), self.user_le)
- form_layout.addRow(_("password"), self.password_le)
- form_layout.addRow(_("Surgery number"), self.surgery_sb)
-
- 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.setCenterButtons(True)
-
- layout = QtGui.QVBoxLayout(self)
- layout.addWidget(label)
- layout.addWidget(frame)
- layout.addStretch()
- layout.addWidget(self.button_box)
-
- self.button_box.clicked.connect(self._clicked)
-
- def sizeHint(self):
- return QtCore.QSize(300, 400)
-
- def _clicked(self, but):
- role = self.button_box.buttonRole(but)
- if role == self.button_box.ApplyRole:
- self.accept()
- else:
- self.reject()
-
- @property
- def host(self):
- return unicode(self.host_le.text())
-
- @property
- def port(self):
- port, result = self.port_le.text().toInt()
- return port
-
- @property
- def user(self):
- return unicode(self.user_le.text())
-
- @property
- def password(self):
- return unicode(self.password_le.text())
-
- @property
- def db_name(self):
- return unicode(self.database_le.text())
-
- @property
- def surgery(self):
- return self.surgery_sb.value()
-
- @property
- def has_acceptable_values(self):
- return (
- 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
- while (result and not self.has_acceptable_values) or reconfigure:
- result = QtGui.QDialog.exec_(self)
- reconfigure = False
- return result
-
- def load_config(self):
- self.host_le.setText(config.KWARGS["host"])
- self.port_le.setText(str(config.KWARGS["port"]))
- self.database_le.setText(config.KWARGS["db"])
- self.user_le.setText(config.KWARGS["user"])
- self.password_le.setText(config.KWARGS["passwd"])
- self.surgery_sb.setValue(config.SURGERY_NO)
-
- def write_config(self):
- if self.has_acceptable_values:
- config.write_config(
- self.host,
- self.port,
- self.db_name,
- self.user,
- self.password,
- self.surgery)
- else:
- sys.exit("TERMINAL ERROR - Unable to write config file")
-
-if __name__ == "__main__":
- from gettext import gettext as _
- app = QtGui.QApplication([])
- dl = ConfigDialog()
- if dl.exec_():
- dl.write_config()
diff --git a/src/standalone_chart/lib_om_chart/connect.py b/src/standalone_chart/lib_om_chart/connect.py
deleted file mode 100644
index ddc43f4..0000000
--- a/src/standalone_chart/lib_om_chart/connect.py
+++ /dev/null
@@ -1,77 +0,0 @@
-#! /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 has one purpose... provide a connection to the mysqldatabase
-using 3rd party MySQLdb module
-'''
-
-import config
-import logging
-import sys
-import time
-import MySQLdb
-
-
-class Connection(object):
- _connection = None
-
- @property
- def is_configured(self):
- return config.KWARGS != {}
-
- def reload(self):
- '''
- config file has been written (after first run)
- '''
- reload(config)
-
- @property
- def connection(self):
- attempts = 0
- while not (self._connection and self._connection.open):
- logging.debug("New connection needed")
- logging.debug(
- "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)
- time.sleep(2)
- attempts += 1
- if attempts >= 10:
- raise exc
- # next line not necessary as read only application ??
- self._connection.commit()
- return self._connection
-
-if __name__ == "__main__":
- logging.basicConfig(level=logging.DEBUG)
- conn = Connection().connection
- print conn
diff --git a/src/standalone_chart/lib_om_chart/main_window.py b/src/standalone_chart/lib_om_chart/main_window.py
deleted file mode 100644
index 94743ac..0000000
--- a/src/standalone_chart/lib_om_chart/main_window.py
+++ /dev/null
@@ -1,421 +0,0 @@
-#! /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/>. # #
-# # # #
-# ############################################################################ #
-
-'''
-provides the BaseMainWindow class
-a basic re-implementation of QtGui.QMainWindow that can save state etc..
-'''
-import logging
-import sys
-import traceback
-
-from PyQt4 import QtGui, QtCore
-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.
- Provides about, about QT and license dialogs.
- '''
- log = logging.getLogger()
- _toolbars = []
-
- def __init__(self, parent=None):
-
- QtGui.QMainWindow.__init__(self, parent)
- Advisor.__init__(self, parent)
-
- sys.excepthook = self.excepthook
-
- self.setMinimumSize(300, 300)
-
- # setup menu and headers ####
-
- #: a pointer to the main toolbar
- self.main_toolbar = QtGui.QToolBar()
- self.main_toolbar.setObjectName("Main Toolbar")
- self.main_toolbar.toggleViewAction().setText(_("Toolbar"))
-
- #: a pointer to the :doc:`DockableMenuBar`
- menubar = DockableMenuBar(self)
-
- # add them to the app
- self.setMenuBar(menubar)
-
- self.addToolBar(QtCore.Qt.TopToolBarArea, self.main_toolbar)
-
- # setup a statusbar with a label ####
-
- #: a pointer to the QtGui.QStatusBar
- self.statusbar = QtGui.QStatusBar()
- self.setStatusBar(self.statusbar)
-
- #: a pointer to the label in the statusbar
- self.status_label = QtGui.QLabel()
- self.statusbar.addPermanentWidget(self.status_label)
-
- #: a pointer to the File menu
- self.menu_file = QtGui.QMenu(_("&File"), self)
- menubar.addMenu(self.menu_file)
-
- #: a pointer to the Edit menu
- self.menu_edit = QtGui.QMenu(_("&Edit"), self)
- menubar.addMenu(self.menu_edit)
-
- #: a pointer to the View menu of :attr:`menubar`
- self.menu_view = menubar.menu_view
-
- #: a pointer to the Help menu
- self.menu_help = QtGui.QMenu(_("&Help"), self)
- menubar.addMenu(self.menu_help)
-
- # file menu ####
-
- icon = QtGui.QIcon.fromTheme("application-exit")
-
- #: a pointer to the quit qaction
- self.action_quit = QtGui.QAction(icon, _("Quit"), self)
-
- self.menu_file.addSeparator()
- self.menu_file.addAction(self.action_quit)
-
- # edit menu ####
-
- icon = QtGui.QIcon.fromTheme("preferences-desktop")
- #: a pointer to the preferences qAction
- self.action_preferences = QtGui.QAction(icon, _("&Preferences"), self)
-
- self.menu_edit.addAction(self.action_preferences)
-
- # view menu ####
-
- #: a pointer to the show statusbar qaction
- self.action_show_statusbar = QtGui.QAction(_("Show Status&bar"), self)
- self.action_show_statusbar.setCheckable(True)
- self.action_show_statusbar.setChecked(True)
-
- 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.setCheckable(True)
- self.action_fullscreen.setShortcut("f11")
-
- self.menu_view.addSeparator()
- self.menu_view.addAction(self.action_show_statusbar)
- self.menu_view.addAction(self.action_fullscreen)
-
- # about menu ####
-
- icon = QtGui.QIcon.fromTheme("help-about")
- #: a pointer to the about qaction
- self.action_about = QtGui.QAction(icon, _("About"), self)
-
- #: a pointer to the about qt qaction
- self.action_about_qt = QtGui.QAction(icon, _("About Qt"), self)
-
- #: a pointer to the license qaction
- self.action_license = QtGui.QAction(icon, _("License"), self)
-
- icon = QtGui.QIcon.fromTheme("help", QtGui.QIcon("icons/help.png"))
-
- #: a pointer to the help qaction
- self.action_help = QtGui.QAction(icon, _("Help"), self)
-
- self.menu_help.addAction(self.action_about)
- self.menu_help.addAction(self.action_license)
- self.menu_help.addAction(self.action_about_qt)
- self.menu_help.addSeparator()
- self.menu_help.addAction(self.action_help)
-
- # toolbar ####
- # add selected menu items to the toolbar ####
-
- #:
- self.help_toolbar = QtGui.QToolBar()
- self.help_toolbar.setObjectName("help toolbar")
- self.help_toolbar.toggleViewAction().setText(_("Help Toolbar"))
- self.help_toolbar.addAction(self.action_help)
- self.addToolBar(self.help_toolbar)
-
- self.connect_default_signals()
-
- def connect_default_signals(self):
- '''
- this function connects the triggered signals from the default menu
- it should not need to be called, as it is called during the
- :func:`__init__`
- '''
- self.connect(self.action_quit, QtCore.SIGNAL("triggered()"),
- QtGui.QApplication.instance().closeAllWindows)
-
- self.action_preferences.triggered.connect(self.show_preferences_dialog)
-
- self.action_show_statusbar.triggered.connect(self.show_statusbar)
- self.action_fullscreen.triggered.connect(self.fullscreen)
-
- self.action_fullscreen.triggered.connect(self.fullscreen)
- self.action_about.triggered.connect(self.show_about)
- self.action_license.triggered.connect(self.show_license)
-
- self.connect(self.action_about_qt, QtCore.SIGNAL("triggered()"),
- QtGui.qApp, QtCore.SLOT("aboutQt()"))
-
- self.action_help.triggered.connect(self.show_help)
-
- def excepthook(self, exc_type, exc_val, tracebackobj):
- '''
- PyQt4 prints unhandled exceptions to stdout and carries on regardless
- I don't want this to happen.
- so sys.excepthook is passed to this
- '''
- message = ""
- 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)
-
- def resizeEvent(self, event):
- '''
- this function is overwritten so that the advisor popup can be
- put in the correct place
- '''
- QtGui.QMainWindow.resizeEvent(self, event)
- self.setBriefMessageLocation()
-
- def setBriefMessageLocation(self):
- '''
- make the Advisor sub class aware of the windows geometry.
- set it top right, and right_to_left
- '''
- widg = self.menuBar()
- brief_pos_x = (widg.pos().x() + widg.width())
- brief_pos_y = (widg.pos().y() + widg.height())
-
- brief_pos = QtCore.QPoint(brief_pos_x, brief_pos_y)
- self.setBriefMessagePosition(brief_pos, True)
-
- def addToolBar(self, *args):
- QtGui.QMainWindow.addToolBar(self, *args)
- if self.menuWidget():
- self.menuBar().update_toolbars()
-
- @property
- def toolbar_list(self):
- '''
- yield all toolbars of the application
- '''
- for child in self.children():
- if isinstance(child, QtGui.QToolBar):
- yield child
-
- def insertToolBar(self, *args):
- QtGui.QMainWindow.insertToolBar(self, *args)
- if self.menuWidget():
- self.menuBar().update_toolbars()
-
- def insertMenu_(self, menu):
- '''
- a convenience function that slots new actions in just before the
- "help" menu item on the menubar
- '''
- insertpoint = self.menu_help.menuAction()
- return self.menuBar().insertMenu(insertpoint, menu)
-
- def insertToolBarWidget(self, action, sep=False):
- '''
- a convenience function that slots new widgets in just before the
- "help" menu item on the main Toolbar.
- accepts either a QAction, or a widget.
- If option 2nd argument (sep) is True, a separator is also added.
- '''
- added = []
- insertpoint = self.action_help
- if sep:
- insertpoint = self.main_toolbar.insertSeparator(insertpoint)
- added.append(insertpoint)
- if isinstance(action, QtGui.QAction):
- added.append(self.main_toolbar.insertAction(insertpoint, action))
- else:
- added.append(self.main_toolbar.insertWidget(insertpoint, action))
- return added
-
- def loadSettings(self):
- '''
- load settings from QtCore.QSettings.
- '''
- settings = QtCore.QSettings()
- # Qt settings
- self.restoreGeometry(settings.value("geometry").toByteArray())
- self.restoreState(settings.value("windowState").toByteArray())
- statusbar_hidden = settings.value("statusbar_hidden").toBool()
- self.statusbar.setVisible(not statusbar_hidden)
- self.action_show_statusbar.setChecked(not self.statusbar.isHidden())
-
- font = settings.value("Font").toPyObject()
- if font:
- QtGui.QApplication.instance().setFont(font)
-
- toolbar_set = settings.value(
- "Toolbar", QtCore.Qt.ToolButtonTextUnderIcon).toInt()[0]
- for tb in self.toolbar_list:
- tb.setToolButtonStyle(toolbar_set)
-
- tiny_menu = settings.value("TinyMenu").toBool()
- if tiny_menu:
- self.menuBar().toggle_visability(True)
- self.menuBar().menu_toolbar.toggleViewAction().setChecked(True)
-
- def saveSettings(self):
- '''
- save settings from QtCore.QSettings
- '''
- settings = QtCore.QSettings()
- # Qt settings
- settings.setValue("geometry", self.saveGeometry())
- settings.setValue("windowState", self.saveState())
- settings.setValue("statusbar_hidden", self.statusbar.isHidden())
- settings.setValue("Font", self.font())
- 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()
- else:
- self.main_toolbar.hide()
-
- def show_statusbar(self):
- if self.action_show_statusbar.isChecked():
- self.statusbar.show()
- else:
- self.statusbar.hide()
-
- 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)
-
- def show_preferences_dialog(self):
- self.reimplement_needed('show_preferences_dialog')
-
- def show_about(self):
- self.reimplement_needed('show_about')
-
- def show_help(self):
- self.reimplement_needed('show_help')
-
- def show_license(self):
- '''
- attempts to read and show the license text
- from file COPYRIGHT.txt in the apps directory
- on failure, gives a simple message box with link.
- '''
- message = '''
- GPLv3 - see <a href='http://www.gnu.org/licenses/gpl.html'>
- http://www.gnu.org/licenses/gpl.html</a>'''
- try:
- f = open("../COPYING.txt")
- data = f.read()
- f.close()
-
- dl = QtGui.QDialog(self)
- dl.setWindowTitle(_("License"))
- dl.setFixedSize(400, 400)
-
- layout = QtGui.QVBoxLayout(dl)
-
- buttonBox = QtGui.QDialogButtonBox(dl)
- buttonBox.setOrientation(QtCore.Qt.Horizontal)
- buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok)
-
- te = QtGui.QTextBrowser()
- te.setText(data)
-
- label = QtGui.QLabel(message)
- label.setWordWrap(True)
-
- layout.addWidget(te)
- layout.addWidget(label)
- layout.addWidget(buttonBox)
-
- buttonBox.accepted.connect(dl.accept)
-
- dl.exec_()
- except IOError:
- QtGui.QMessageBox.information(self, _("License"), message)
-
- def fullscreen(self):
- if self.action_fullscreen.isChecked():
- self.setWindowState(QtCore.Qt.WindowFullScreen)
- else:
- self.setWindowState(QtCore.Qt.WindowNoState)
-
- def closeEvent(self, event=None):
- '''
- re-implement the close event of QtGui.QMainWindow, and check the user
- really meant to do this.
- '''
- if self.get_confirm(_("Quit Application?"), "yes", "no"):
- self.saveSettings()
- else:
- event.ignore()
-
- def get_confirm(self, message,
- accept="ok", reject="cancel", default="accept"):
- '''
- a convenience function to raise a dialog for confirmation of an action
- '''
- if accept == "ok":
- accept_but = QtGui.QMessageBox.Ok
- elif accept == "yes":
- accept_but = QtGui.QMessageBox.Yes
-
- if reject == "cancel":
- reject_but = QtGui.QMessageBox.Cancel
- elif reject == "no":
- reject_but = QtGui.QMessageBox.No
-
- 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
-
-
-if __name__ == "__main__":
- import gettext
- gettext.install("")
-
- app = QtGui.QApplication([])
- mw = BaseMainWindow()
- mw.main_toolbar.addAction(QtGui.QAction("Placeholder", mw))
- mw.show()
- app.exec_()
diff --git a/src/standalone_chart/lib_om_chart/patient.py b/src/standalone_chart/lib_om_chart/patient.py
deleted file mode 100644
index aed7351..0000000
--- a/src/standalone_chart/lib_om_chart/patient.py
+++ /dev/null
@@ -1,131 +0,0 @@
-#! /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 connect import Connection
-
-
-class PatientNotFoundException(Exception):
- pass
-
-
-def from_signed_byte(val):
- '''
- this returns a bit by bit representation of a signed byte -
- used for deciduous tooth
- '''
- if val is None:
- val = 0
- if val >= 0:
- base = (128, 64, 32, 16, 8, 4, 2, 1)
- bstring = ""
- for b in base:
- if val >= b:
- bstring += "1"
- val -= b
- else:
- bstring += "0"
- else:
- 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
- else:
- 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'
- )
- DECIDUOUS = (
- '***', '***', '***', 'ulE', 'ulD', 'ulC', 'ulB', 'ulA',
- 'urA', 'urB', 'urC', 'urD', 'urE', '***', '***', '***',
- '***', '***', '***', 'lrE', 'lrD', 'lrC', 'lrB', 'lrA',
- 'llA', 'llB', 'llC', 'llD', 'llE', '***', '***', '***'
- )
-
- connection = Connection()
-
- def __init__(self, sno):
- '''
- initiate the class with default variables, then load from database
- '''
- if sno <= 0:
- raise PatientNotFoundException
-
- self.serialno = sno
- db = self.connection.connection
- cursor = db.cursor()
- cursor.execute(self.query, (sno,))
- row = cursor.fetchone()
-
- if not row:
- raise PatientNotFoundException
-
- self.dent1, self.dent0, self.dent3, self.dent2 = row[:4]
- for i, field in enumerate(self.TOOTH_FIELDS):
- 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(", ")
-
- #@property
- def chartgrid(self):
- grid = ""
- chart_dict = {}
- 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
- else:
- chart_dict[tooth] = self.DECIDUOUS[i]
- return chart_dict
-
-if __name__ == "__main__":
- try:
- serialno = int(sys.argv[len(sys.argv) - 1])
- except:
- serialno = 11956
-
- pt = Patient(serialno)
- 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
deleted file mode 100644
index 9687ab3..0000000
--- a/src/standalone_chart/lib_om_chart/restorable_app.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#! /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 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)
- QtGui.QApplication.__init__(self, sys.argv)
- self.setOrganizationName(name)
- self.setApplicationName(name)
-
- def commitData(self, session):
- '''re-implement this method, called on quit'''
- pass
-
- def saveState(self, session):
- '''re-implement this method, called on run'''
- pass
-
-if __name__ == "__main__":
- app = RestorableApplication("test_organisation_name")
- app.closeAllWindows()
diff --git a/src/standalone_chart/om_chart.py b/src/standalone_chart/om_chart.py
deleted file mode 100755
index 86f55a0..0000000
--- a/src/standalone_chart/om_chart.py
+++ /dev/null
@@ -1,236 +0,0 @@
-#! /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 gettext
-import logging
-import os
-import sys
-import traceback
-
-from PyQt4 import QtCore, QtGui
-
-sys.path.insert(0, os.path.dirname(__file__))
-
-from lib_om_chart.restorable_app import RestorableApplication
-from lib_om_chart.chart_widget import ChartWidget
-from lib_om_chart.patient import Patient, PatientNotFoundException
-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)
-
- if not self.connection.is_configured:
- self.configure()
-
- self.setWindowTitle("Dental Chart Viewer")
- self.chart_widget = ChartWidget(self)
- self.setCentralWidget(self.chart_widget)
-
- menu_file = QtGui.QMenu(_("&File"), self)
- load_action = QtGui.QAction("&Load", self)
- quit_action = QtGui.QAction("&Quit", self)
- reload_action = QtGui.QAction("&Reload", self)
-
- reconfigure_action = QtGui.QAction("Re&configure", self)
-
- menu_file.addAction(load_action)
- menu_file.addAction(quit_action)
-
- self.menuBar().addMenu(menu_file)
- self.menuBar().addAction(reload_action)
- self.menuBar().addAction(reconfigure_action)
-
- load_action.triggered.connect(self.get_patient)
- reload_action.triggered.connect(self.reload_patient)
- reconfigure_action.triggered.connect(self.check_reconfigure)
- quit_action.triggered.connect(
- QtGui.QApplication.instance().closeAllWindows)
-
- self.timer = QtCore.QTimer()
- self.timer.setInterval(3000)
- self.timer.timeout.connect(self.check_record_in_use)
- self.timer.start()
-
- def sizeHint(self):
- return QtCore.QSize(800, 200)
-
- def loadSettings(self):
- '''
- load settings from QtCore.QSettings.
- '''
- settings = QtCore.QSettings()
- # Qt settings
- self.restoreGeometry(settings.value("geometry").toByteArray())
- self.restoreState(settings.value("windowState").toByteArray())
-
- def saveSettings(self):
- '''
- save settings from QtCore.QSettings
- '''
- settings = QtCore.QSettings()
- # 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
-
- if result:
- self.saveSettings()
- else:
- event.ignore()
-
- @property
- def max_sno(self):
- '''
- TODO - poll the database for this value.
- '''
- db = self.connection.connection
- cursor = db.cursor()
- cursor.execute("select max(serialno) from patients")
- row = cursor.fetchone()
- 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)
-
- if result:
- self.load_patient(sno)
-
- def load_patient(self, sno):
- '''
- load the data for patient with this serialno
- '''
- self.chart_widget.clear()
-
- QtGui.QApplication.instance().setOverrideCursor(
- 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
-
- for tooth in pt.TOOTH_FIELDS:
- static_text = pt.__dict__[tooth]
- if static_text:
- self.chart_widget.setToothProps(tooth, static_text)
-
- except PatientNotFoundException:
- self._message_box = QtGui.QMessageBox(self)
- 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()
- QtCore.QTimer.singleShot(1000, self._message_box.hide)
-
- self.chart_widget.update()
-
- QtGui.QApplication.instance().restoreOverrideCursor()
-
- def reload_patient(self):
- if self._loaded_serialno:
- self.load_patient(self._loaded_serialno)
- else:
- self.check_record_in_use()
-
- 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:
- self.reconfigure()
-
- def configure(self):
- self.reconfigure(reconfigure=False)
-
- def reconfigure(self, reconfigure=True):
- dl = ConfigDialog(self)
- if reconfigure:
- dl.load_config()
- if dl.exec_(True):
- dl.write_config()
- Patient.connection.reload()
-
- def excepthook(self, exc_type, exc_val, tracebackobj):
- '''
- PyQt4 prints unhandled exceptions to stdout and carries on regardless
- I don't want this to happen.
- so sys.excepthook is passed to this
- '''
- self.timer.stop()
- QtGui.QApplication.instance().restoreOverrideCursor()
- message = ""
- 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)
- self.timer.start()
-
- def check_record_in_use(self):
- if not SURGERY_NO:
- return
- logging.debug("checking record in use")
- db = self.connection.connection
- cursor = db.cursor()
- cursor.execute(
- "select serialno from calldurr where stn = %s", (SURGERY_NO,))
- row = cursor.fetchone()
- if row:
- serialno = row[0]
- if serialno and serialno != self._loaded_serialno:
- self.load_patient(serialno)
- self._loaded_serialno = serialno
- # self.setWindowState(
- # QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive)
- self.activateWindow()
-
-if __name__ == "__main__":
- gettext.install("openmolar")
- logging.basicConfig(level=logging.DEBUG)
- app = RestorableApplication("om_charter")
- mw = MainWindow()
- sys.excepthook = mw.excepthook
- mw.show()
- app.exec_()
diff --git a/src/tests/appt_drag_test.py b/src/tests/appt_drag_test.py
deleted file mode 100644
index 98eb266..0000000
--- a/src/tests/appt_drag_test.py
+++ /dev/null
@@ -1,151 +0,0 @@
-#! /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
-import sys
-
-from PyQt4 import QtGui, QtCore
-from openmolar.dbtools import appointments
-from openmolar.settings import localsettings
-
-from openmolar.qt4gui.appointment_gui_modules.draggable_list \
- import DraggableList
-from openmolar.qt4gui.appointment_gui_modules.list_models \
- import SimpleListModel, BlockListModel
-
-
-class _DragTestDialog(QtGui.QDialog):
-
- def __init__(self, parent=None):
- QtGui.QDialog.__init__(self, parent)
- self.setWindowTitle("Drag Drop Test")
- self.pt = duckPt()
-
- layout = QtGui.QGridLayout(self)
-
- self.model = SimpleListModel()
-
- appts = appointments.get_pts_appts(duckPt())
-
- self.model.set_appointments(appts, appts[1])
-
- self.appt_listView = DraggableList(True)
- self.appt_listView.setModel(self.model)
-
- self.block_model = BlockListModel()
- self.blockView = DraggableList(False)
- self.blockView.setModel(self.block_model)
-
- self.book = appointmentwidget.AppointmentWidget("1000", "1200", self)
- self.book.setDentist(1)
- self.book.setStartTime(1015)
- self.book.setEndTime(1145)
- for appoint in (
- (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"
-
- d2 = appointments.DentistDay(4)
- d2.start = 1015
- d2.end = 1145
-
- self.OVbook.dents = [d1, d2]
- self.OVbook.clear()
- self.OVbook.init_dicts()
-
- 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, 0o5),
- 4, 60)
-
- self.OVbook.addSlot(slot)
- self.OVbook.addSlot(slot2)
-
- appt = appointments.WeekViewAppointment()
- 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.length = 15
- emerg.reason = "emergency"
- self.OVbook.eTimes[1] = (emerg,)
- self.OVbook.setMinimumWidth(200)
-
- self.tw = QtGui.QTabWidget(self)
- 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.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
-
- from openmolar.dbtools import appointments
- from openmolar.settings import localsettings
- localsettings.initiate()
-
- def slot_catcher(arg):
- print arg
-
- class duckPt(object):
-
- def __init__(self):
- self.serialno = 11956
- self.title = "Mr"
- self.sname = "Neil"
- self.fname = "Wallace"
- self.cset = "P"
-
- 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