diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 5a322708c404fa182ab96eb550615cdcb6d4358f..d5468aaea1e4996d32280b4ae64bb052e3040e28 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -54,6 +54,18 @@ <option value="E501" /> <option value="W29" /> <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> </list> </option> </inspection_tool> diff --git a/prosjekt/prosjektoppgave/__pycache__/archive_db.cpython-37.pyc b/prosjekt/prosjektoppgave/__pycache__/archive_db.cpython-37.pyc index 26821c41f6cab509930de863e4208dffc9acc285..6c35a4df47e783d630cb9f8c133bfe4592ee95eb 100644 Binary files a/prosjekt/prosjektoppgave/__pycache__/archive_db.cpython-37.pyc and b/prosjekt/prosjektoppgave/__pycache__/archive_db.cpython-37.pyc differ diff --git a/prosjekt/prosjektoppgave/__pycache__/archive_edit.cpython-37.pyc b/prosjekt/prosjektoppgave/__pycache__/archive_edit.cpython-37.pyc index 89c851cabed757b1ca6d53e10d164550717fc47c..04d58260c670d179765e9a5c08d971abad052ae8 100644 Binary files a/prosjekt/prosjektoppgave/__pycache__/archive_edit.cpython-37.pyc and b/prosjekt/prosjektoppgave/__pycache__/archive_edit.cpython-37.pyc differ diff --git a/prosjekt/prosjektoppgave/__pycache__/archive_statistics.cpython-37.pyc b/prosjekt/prosjektoppgave/__pycache__/archive_statistics.cpython-37.pyc index 8f3f332f0e1df9e9a77d9cad6f7ba583321c9495..0b829e60061092c9a653a463210a4d78a7e8475c 100644 Binary files a/prosjekt/prosjektoppgave/__pycache__/archive_statistics.cpython-37.pyc and b/prosjekt/prosjektoppgave/__pycache__/archive_statistics.cpython-37.pyc differ diff --git a/prosjekt/prosjektoppgave/archive_edit.py b/prosjekt/prosjektoppgave/archive_edit.py index bfd131ce2463aef7557e67de67742939b3f1ba8f..1c3af923f440d8a647e2d673a2fc520a6c2b4c5d 100644 --- a/prosjekt/prosjektoppgave/archive_edit.py +++ b/prosjekt/prosjektoppgave/archive_edit.py @@ -1,7 +1,7 @@ from tkinter import * from prosjekt.prosjektoppgave.archive_db import * -import datetime +from datetime import * import sys from tkinter import messagebox @@ -24,7 +24,7 @@ Endret dato, endret av, versjon def valider_dato(dato): date_format = '%d.%m.%Y' # dd.mm.yyyy, 25/8/2019 try: - date_obj = datetime.datetime.strptime(dato, date_format) + date_obj = datetime.strptime(dato, date_format).date() return dato except ValueError: messagebox.showerror("Error", "Dato skal være på formen: DD.MM.YYYY") diff --git a/prosjekt/prosjektoppgave/archive_main.py b/prosjekt/prosjektoppgave/archive_main.py index 030ed36ac89db42155c280349425c64440940a81..fc42afccc228ae218e19773160ce2ddcc8777ad1 100644 --- a/prosjekt/prosjektoppgave/archive_main.py +++ b/prosjekt/prosjektoppgave/archive_main.py @@ -56,8 +56,9 @@ def view_materiale_statistics(): Kaller funksjonen archive_db.get_materialet_counts som returnerer liste med gjenstander grupper etter materialet og antall Deretter kalles funkasjonen archive_statistics.show_bar_chart for å tegne grafen. """ - counts, materiale = archive_db.get_materialet_counts() - archive_statistics.show_bar_chart(materiale,counts,"Antall","Materialet" ) + materiale,counts = archive_db.get_materialet_counts() + + archive_statistics.show_histogram(counts,materiale,"Antall","Materialet" ) # Definerer aksjon for dobbeltklikk på en gjenstand i lista def edit_gjenstand(event): diff --git a/prosjekt/prosjektoppgave/archive_statistics.py b/prosjekt/prosjektoppgave/archive_statistics.py index 3ae8675153010c7f3152600cfa802a54838b4ea5..f824ecca0f5f527200c4d5bd83112baa6e165e2c 100644 --- a/prosjekt/prosjektoppgave/archive_statistics.py +++ b/prosjekt/prosjektoppgave/archive_statistics.py @@ -14,11 +14,20 @@ def show_bar_chart(counts, labels, ylabel, xlabel): m.show() # Lag et histogram hvor gitte verdier telles opp og puttes i bøtter (bins) basert på min, max og antall -def show_histogram(values, min, max, num_bins, ylabel, xlabel): +def show_histogram_tall(values, min, max, num_bins, ylabel, xlabel): bins = np.linspace(min, max, num_bins) plt.hist(values, bins) plt.show() + +def show_histogram(materialet, counts, ylabel, xlabel): + + plt.bar(materialet, height=materialet) + plt.xticks(materialet, counts) + plt.ylim(0,max(counts)) + plt.show() + + # Test-funksjoner #show_bar_chart([2, 16, 3, 1, 4.5], ["a", "b", "c", "d", "e"], "Antall", "Kategori") #show_histogram([10,41,72,45,51,52,51,54,56,81,43,42], 0, 100, 10, "Antall", "Alder") diff --git a/prosjekt/prosjektoppgave_Mal_v1.4.zip b/prosjekt/prosjektoppgave_Mal_v1.4.zip new file mode 100644 index 0000000000000000000000000000000000000000..39bd43bd460af9025abd5b9ac22ffdbb870255cb Binary files /dev/null and b/prosjekt/prosjektoppgave_Mal_v1.4.zip differ diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/.idea/inspectionProfiles/Project_Default.xml b/prosjekt/prosjektoppgave_Mal_v1.4/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000000000000000000000000000000000000..f1947482136354978801fbb2f75245879f35c861 --- /dev/null +++ b/prosjekt/prosjektoppgave_Mal_v1.4/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,65 @@ +<component name="InspectionProjectProfileManager"> + <profile version="1.0"> + <option name="myName" value="Project Default" /> + <inspection_tool class="PyPep8Inspection" enabled="true" level="WEAK WARNING" enabled_by_default="true"> + <option name="ignoredErrors"> + <list> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + <option value="W29" /> + <option value="E501" /> + </list> + </option> + </inspection_tool> + </profile> +</component> \ No newline at end of file diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/.idea/misc.xml b/prosjekt/prosjektoppgave_Mal_v1.4/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..83ddea00786a2c11c12d8943b49e27fbbca7f998 --- /dev/null +++ b/prosjekt/prosjektoppgave_Mal_v1.4/.idea/misc.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (LBAS2002_Prosjektoppgave_Mal_v1.0)" project-jdk-type="Python SDK" /> +</project> \ No newline at end of file diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/.idea/modules.xml b/prosjekt/prosjektoppgave_Mal_v1.4/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..b2b7362b6f732d090066d8f1ef96cdc54fed103c --- /dev/null +++ b/prosjekt/prosjektoppgave_Mal_v1.4/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/simple-python-gui-app-master.iml" filepath="$PROJECT_DIR$/.idea/simple-python-gui-app-master.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/.idea/simple-python-gui-app-master.iml b/prosjekt/prosjektoppgave_Mal_v1.4/.idea/simple-python-gui-app-master.iml new file mode 100644 index 0000000000000000000000000000000000000000..efd792bd616b5155468e70aaa76bfd3acd4fa219 --- /dev/null +++ b/prosjekt/prosjektoppgave_Mal_v1.4/.idea/simple-python-gui-app-master.iml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="PYTHON_MODULE" version="4"> + <component name="NewModuleRootManager"> + <content url="file://$MODULE_DIR$" /> + <orderEntry type="jdk" jdkName="Python 3.7 (LBAS2002_Prosjektoppgave_Mal_v1.0)" jdkType="Python SDK" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> + <component name="TestRunnerService"> + <option name="PROJECT_TEST_RUNNER" value="Unittests" /> + </component> +</module> \ No newline at end of file diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/.idea/workspace.xml b/prosjekt/prosjektoppgave_Mal_v1.4/.idea/workspace.xml new file mode 100644 index 0000000000000000000000000000000000000000..0476ce4a3308c0b69670496230d485ef38af67a5 --- /dev/null +++ b/prosjekt/prosjektoppgave_Mal_v1.4/.idea/workspace.xml @@ -0,0 +1,199 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ChangeListManager"> + <list default="true" id="9b9e68dd-cd4c-4c67-9408-4fb32e0bb4da" name="Default Changelist" comment="" /> + <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> + <option name="SHOW_DIALOG" value="false" /> + <option name="HIGHLIGHT_CONFLICTS" value="true" /> + <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> + <option name="LAST_RESOLUTION" value="IGNORE" /> + </component> + <component name="FUSProjectUsageTrigger"> + <session id="-117992187"> + <usages-collector id="statistics.lifecycle.project"> + <counts> + <entry key="project.closed" value="2" /> + <entry key="project.open.time.0" value="2" /> + <entry key="project.opened" value="2" /> + </counts> + </usages-collector> + <usages-collector id="statistics.file.extensions.open"> + <counts> + <entry key="py" value="1" /> + </counts> + </usages-collector> + <usages-collector id="statistics.file.types.open"> + <counts> + <entry key="Python" value="1" /> + </counts> + </usages-collector> + <usages-collector id="statistics.file.extensions.edit"> + <counts> + <entry key="py" value="6" /> + </counts> + </usages-collector> + <usages-collector id="statistics.file.types.edit"> + <counts> + <entry key="Python" value="6" /> + </counts> + </usages-collector> + </session> + </component> + <component name="FileEditorManager"> + <leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> + <file pinned="false" current-in-tab="true"> + <entry file="file://$PROJECT_DIR$/archive_db.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="153"> + <caret line="9" selection-start-line="9" selection-end-line="9" /> + <folding> + <element signature="e#0#14#0" expanded="true" /> + </folding> + </state> + </provider> + </entry> + </file> + </leaf> + </component> + <component name="IdeDocumentHistory"> + <option name="CHANGED_PATHS"> + <list> + <option value="$PROJECT_DIR$/archive_db.py" /> + </list> + </option> + </component> + <component name="ProjectFrameBounds"> + <option name="x" value="621" /> + <option name="y" value="169" /> + <option name="width" value="1530" /> + <option name="height" value="1217" /> + </component> + <component name="ProjectId" id="1SBkrPm8synUK4zFblNJjfBUBgg" /> + <component name="ProjectView"> + <navigator proportions="" version="1"> + <foldersAlwaysOnTop value="true" /> + </navigator> + <panes> + <pane id="Course" /> + <pane id="ProjectPane"> + <subPane> + <expand> + <path> + <item name="LBAS2002_Prosjektoppgave_Mal_v1.1" type="b2602c69:ProjectViewProjectNode" /> + <item name="LBAS2002_Prosjektoppgave_Mal_v1.1" type="462c0819:PsiDirectoryNode" /> + </path> + </expand> + <select /> + </subPane> + </pane> + </panes> + </component> + <component name="PropertiesComponent"> + <property name="last_opened_file_path" value="$PROJECT_DIR$" /> + <property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" /> + </component> + <component name="RunDashboard"> + <option name="ruleStates"> + <list> + <RuleState> + <option name="name" value="ConfigurationTypeDashboardGroupingRule" /> + </RuleState> + <RuleState> + <option name="name" value="StatusDashboardGroupingRule" /> + </RuleState> + </list> + </option> + </component> + <component name="RunManager" selected="Python.archive_db"> + <configuration name="archive_db" type="PythonConfigurationType" factoryName="Python" temporary="true"> + <module name="simple-python-gui-app-master" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/archive_db.py" /> + <option name="PARAMETERS" value="" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="archive_main" type="PythonConfigurationType" factoryName="Python" temporary="true"> + <module name="simple-python-gui-app-master" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/archive_main.py" /> + <option name="PARAMETERS" value="" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <list> + <item itemvalue="Python.archive_main" /> + <item itemvalue="Python.archive_db" /> + </list> + <recent_temporary> + <list> + <item itemvalue="Python.archive_db" /> + <item itemvalue="Python.archive_main" /> + </list> + </recent_temporary> + </component> + <component name="SvnConfiguration"> + <configuration /> + </component> + <component name="ToolWindowManager"> + <frame x="621" y="169" width="1530" height="1217" extended-state="0" /> + <editor active="true" /> + <layout> + <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.25" /> + <window_info id="Structure" order="1" weight="0.25" /> + <window_info anchor="bottom" id="Message" order="0" /> + <window_info anchor="bottom" id="Find" order="1" /> + <window_info anchor="bottom" id="Run" order="2" weight="0.32933578" /> + <window_info anchor="bottom" id="Debug" order="3" weight="0.4" /> + <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" /> + <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" /> + <window_info anchor="bottom" id="TODO" order="6" /> + <window_info anchor="bottom" id="Version Control" order="7" show_stripe_button="false" /> + <window_info anchor="bottom" id="Python Console" order="8" /> + <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" /> + <window_info anchor="right" id="Ant Build" order="1" weight="0.25" /> + <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" /> + </layout> + </component> + <component name="VcsContentAnnotationSettings"> + <option name="myLimit" value="2678400000" /> + </component> + <component name="editorHistoryManager"> + <entry file="file://$PROJECT_DIR$/archive_db.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="153"> + <caret line="9" selection-start-line="9" selection-end-line="9" /> + <folding> + <element signature="e#0#14#0" expanded="true" /> + </folding> + </state> + </provider> + </entry> + </component> +</project> \ No newline at end of file diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/__pycache__/archive_db.cpython-37.pyc b/prosjekt/prosjektoppgave_Mal_v1.4/__pycache__/archive_db.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c540c5de8adfe17c5747d532fde279036680acf Binary files /dev/null and b/prosjekt/prosjektoppgave_Mal_v1.4/__pycache__/archive_db.cpython-37.pyc differ diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/__pycache__/archive_edit.cpython-37.pyc b/prosjekt/prosjektoppgave_Mal_v1.4/__pycache__/archive_edit.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cdea7c42fbc5dc626d9ed472af91142f06eb1cb4 Binary files /dev/null and b/prosjekt/prosjektoppgave_Mal_v1.4/__pycache__/archive_edit.cpython-37.pyc differ diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/__pycache__/archive_statistics.cpython-37.pyc b/prosjekt/prosjektoppgave_Mal_v1.4/__pycache__/archive_statistics.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0e71cfc13b8fa7d275833ef3f2035f390909beb Binary files /dev/null and b/prosjekt/prosjektoppgave_Mal_v1.4/__pycache__/archive_statistics.cpython-37.pyc differ diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/archive_db.py b/prosjekt/prosjektoppgave_Mal_v1.4/archive_db.py new file mode 100644 index 0000000000000000000000000000000000000000..046466a55978d974dc14f800cff81eda7e0da53b --- /dev/null +++ b/prosjekt/prosjektoppgave_Mal_v1.4/archive_db.py @@ -0,0 +1,425 @@ +import pymysql +from tkinter import messagebox +import sys + + +""" +Skrevet av: Majid Rouhani +Opprettet: 11.09.2018 +Oppdatert: 15.10.2019 +Versjon: 1.2 + +Beskrivesle: +Denne modulen leser data fra databasen eller registrerer/oppdaterer gjenstander. +NB! Oppdater variablene user/password slik at de inneholder rett database tilgang. +----------------------------------------------------------------------------------------------------------- +Endret dato, endret av, versjon +<dato>, <navn>, <versjon> +----------------------------------------------------------------------------------------------------------- +""" + +host = "mysql.stud.iie.ntnu.no" +user = "" # Skriv inn brukernavnet ditt her +password = "" # Skriv inn passordet ditt her + + +def get_db_connection(): + if user=="": + messagebox.showerror("Error", "User/password for database kobling er ikke satt. Sjekk filen archive_db") + return False + else: + return pymysql.connect(host, user, password, user) + + +# Søk på gjenstander, gitt navn og/eller registreringsnummer +def search(name, regnr): + """ + :param name: navn på gjenstand. Denne kan være tom, dvs "" eller være hele/deler av navnet. Case-sensitive! + :param regnr: registreringsnummer på gjenstand. Denne kan være tom, dvs "" eller være hele/deler av registreringsnummeret. Case-sensitive! + :return: returnerer en 2-dimensjonal liste med søkeresultater + """ + db = get_db_connection() + + if not db: + sys.exit(0) + + cursor = db.cursor() + + # Logger inputdata til konsollet + print("search: name=" + name + ", regnr=" + regnr) + sql = "SELECT regnr,navn,regdato,regav FROM gjenstand WHERE navn LIKE '%"+name+"%' AND regnr LIKE '%"+regnr+"%'" + print(sql) + cursor.execute(sql) + + result = [] + for row in cursor: + gjenstand = [] + + #****************************************** + # Oppgave 4.2 + # Fullfør denne funksjonen slik at en 2-dimensjonal liste (result) returneres + #****************************************** + + db.close() + + # Logger antall rader funnet til konsollet + print("search: rowcount=" + str(len(result))) + + return result + +#Slett gjenstand +def delete_gjenstand(regnr): + """ + :param regnr: Registreriongsnr på gjenstand som skal slettes + :return: ingen returverdi. + + Funksjonen skal finne gjenstanden og slette denne. + 1. Finn kategori_id for denne gjenstanden (fra gjenstand-tabell) for det gitte registreringsnummeret + 2. Slett fra egenskaper-tabellen for det gitte registreringsnummeret + 3. Slett fra proveniens-tabellen for det gitte registreringsnummeret + 4. Slett fra kategori-tabellen for det gitte registreringsnummeret + 5. Slett fra gjentand-tabellen for det gitte registreringsnummeret + + Dersom sletting går bra, skriv en melding til skjermen. + """ + + #****************************************** + # Oppgave 4.3 + # Fullfør denne funksjonen + #****************************************** + + print("delete_gjenstand: "+regnr) + + +# Hent alle materialet og antall av hver som to lister +def get_materialet_counts(): + """ + Les antall gjenstander fra databasen gruppert på 'materialet' + Legg resultatet i to lister: materialet og counts + :return: counts (liste med tall), materialet (liste med gjenstands materialet) + """ + db = get_db_connection() + + if not db: + sys.exit(0) + + cursor = db.cursor() + cursor.execute("SELECT count(regnr),materiale FROM egenskaper group by materiale") + + materiale = [] + counts = [] + for row in cursor: + materiale.append(row[0]) + counts.append(row[1]) + + db.close() + + # Logger antall rader funnet til konsollet + print("get_materialet_counts: rowcount=" + str(len(materiale))) + + return counts, materiale + +# Hent all informasjon om en gjenstand basert på regnr +def hent_gjenstand(regnr): + """ + Henter all informasjon om en gjebstand for en gitt registreringsnr + :param regnr: Regnr er av typen string + :return: Returnerer resultatet i en 2-dimensjonal tabell. + Tabellen vil alltid inneholde en gjenstand da vi søker etter eksakt treff og regnr er primær-nøkkel + """ + db = get_db_connection() + + if not db: + sys.exit(0) + + cursor = db.cursor() + + cursor.execute(""" + SELECT giver,inndato,kommentar,mottattav,navn,plassering,regav,regdato,g.regnr,katnavn,fys_egenskap,maal,materiale,tilstand,produsent,prod_aar,siste_eier,tidl_eiere + FROM gjenstand g, + egenskaper e, + kategori k, + proveniens p + WHERE g.regnr = e.regnr + AND g.kategori_id = k.kategori_id + AND g.regnr = p.regnr + AND g.regnr = %s """, regnr) + + result = [] + for row in cursor: + print(row) + gjenstand = [] + for r in range(len(row)): + gjenstand.append(row[r]) + result.append(gjenstand) + + db.close() + + # Logger antall rader funnet til konsollet + print("search: rowcount=" + str(len(result))) + + return result + +#Get next kategori_id +def get_next_category_id(): + """ + Finn neste kategori_id for registrering av ny gjenstand. + :return: hente siste kategori_id fra basen og øk tallet med 1. Returner dette + """ + db = get_db_connection() + + if not db: + sys.exit(0) + + cursor = db.cursor() + cursor.execute("SELECT max(kategori_id) as kategori_id FROM kategori") + + kategoti_id = "" + + for row in cursor: + kategoti_id= str(row[0]) + + db.close() + + # Logger antall rader funnet til konsollet + print("kategoti_id: " + kategoti_id) + + if int(kategoti_id)==0: + next_kategoti_id=1 + else: + next_kategoti_id = int(kategoti_id)+1 + + return next_kategoti_id + +#Get next kategori_id +def get_category_id(katnavn): + """ + :return: hente siste kategori_id fra basen. Returner dette + """ + db = get_db_connection() + + if not db: + sys.exit(0) + + cursor = db.cursor() + cursor.execute("SELECT kategori_id FROM kategori WHERE katnavn='" + katnavn+"'") + + kategoti_id = "" + + for row in cursor: + kategoti_id= str(row[0]) + + db.close() + + # Logger antall rader funnet til konsollet + print("kategoti_id: " + kategoti_id) + + + return kategoti_id + + +def get_kategori(): + """ + Hent alle kategoriene formatert som dictionary + :return: kategori liste + """ + kategori_dic = {} + + db = get_db_connection() + + if not db: + sys.exit(0) + + cursor = db.cursor() + cursor.execute("SELECT kategori_id, katnavn FROM kategori") + + kategoti_id = "" + + for row in cursor: + kategori_dic.update({row[1]: row[0]}) + + db.close() + + return kategori_dic + +#Sjekk om regnr existerer i databasen +def regnr_exist(regnr,tabellnavn): + """ + Sjekk om regnnr existerer allerede i basen + :param regnr: type string + :return: boolean + """ + db = get_db_connection() + + if not db: + sys.exit(0) + + cursor = db.cursor() + sql = "SELECT count(regnr) as regnr_count FROM {0} WHERE regnr='{1}'".format(tabellnavn,regnr) + cursor.execute(sql) + + regnr_count = 0 + + for row in cursor: + regnr_count= row[0] + + db.close() + + # Logger antall rader funnet til konsollet + print("regnr_count: " + str(regnr_count)) + + if regnr_count==0: + return False + else: + return True + +#Sjekk om kategori_id existerer i basen +def kategori_exist(kategori_id): + """ + Sjekk om kategori_id existerer i databasen + :param kategori_id: int + :return: boolean + """ + db = get_db_connection() + + if not db: + sys.exit(0) + + cursor = db.cursor() + cursor.execute("SELECT count(kategori_id) as kategori_id_count FROM kategori WHERE kategori_id=%s",kategori_id) + + kategori_id_count = 0 + + for row in cursor: + kategori_id_count= row[0] + + db.close() + + # Logger antall rader funnet til konsollet + print("kategori_id_count: " + str(kategori_id_count)) + + if kategori_id_count==0: + return False + else: + return True + +#Lagre kategori info i basen +def save_cateogri_db(kategori_id, kategori): + """ + Lagre kategori info i databasen. + Dersom den finnes allerede, blir kategori oppdatert + Dersom den ikke finnes, blir den opprettet. + :param kategori_id: int + :param kategori: string + :return: + """ + #**************************************** + # Oppgave 4.1 + # Fullfør innholdet i denne funksjonen! + #**************************************** + + # Logger resultatet til konsollet + print("save_cateogri_db: rowcount=" + str(cursor.rowcount)) + +#Lagrer gjenstand i basen +def save_gjenstand_db(giver_val, + innlemmet_dato_val, + kategori_id, + kommentar_val, + mottatt_av_val, + navn_val, + plassering_val, + registrert_av_val, + registrerings_dato_val, + regnr): + """ + Lagre gjenstand info i databasen. + Dersom den finnes allerede, blir gjenstand oppdatert + Dersom den ikke finnes, blir den opprettet. + :param giver_val: string + :param innlemmet_dato_val: string + :param kategori_id: int + :param kommentar_val: string + :param mottatt_av_val: string + :param navn_val: string + :param plassering_val: string + :param registrert_av_val: string + :param registrerings_dato_val: string + :param regnr: string + :return: + """ + + #**************************************** + # Oppgave 4.1 + # Fullfør innholdet i denne funksjonen! + #**************************************** + + # Logger resultatet til konsollet + print("save_gjenstand_db: rowcount=" + str(cursor.rowcount)) + +#Lagre egenskaper til gjenstand +def save_egenskaper_db(fysiske_egenskaper_val, + maal_val, + materiale_val, + regnr, + tilstand_val): + """ + Lagre egenskaper til gjenstand i 'egenskper' tabellen + :param fysiske_egenskaper_val: string + :param maal_val: string + :param materiale_val: string + :param regnr: string + :param tilstand_val: string + :return: + """ + db = get_db_connection() + + if not db: + sys.exit(0) + + db.autocommit(True) + cursor = db.cursor() + + if regnr_exist(regnr,'egenskaper'): + cursor.execute("UPDATE egenskaper SET fys_egenskap=%s,maal=%s,materiale=%s,tilstand=%s WHERE regnr=%s", + (fysiske_egenskaper_val,maal_val,materiale_val,tilstand_val,regnr)) + else: + cursor.execute("INSERT INTO egenskaper (fys_egenskap,maal,materiale,regnr,tilstand) VALUES(%s,%s,%s,%s,%s)", + (fysiske_egenskaper_val,maal_val,materiale_val,regnr,tilstand_val)) + + db.close() + + # Logger resultatet til konsollet + print("save_egenskaper_db: rowcount=" + str(cursor.rowcount)) + +#Lagre proveniens til 'proveniens' tabellen +def save_proveniens_db(produsent_val,produksjonsaar_val,regnr,giver_siste_eier_val,tidligere_eiere_val): + """ + Lagre proveniens i 'proveniens' tabellen i databasen + :param produsent_val: string + :param produksjonsaar_val: string + :param regnr: string + :param giver_siste_eier_val: string + :param tidligere_eiere_val: string + :return: + """ + db = get_db_connection() + + if not db: + sys.exit(0) + + db.autocommit(True) + cursor = db.cursor() + + if regnr_exist(regnr,'proveniens'): + cursor.execute("UPDATE proveniens SET produsent=%s,prod_aar=%s,siste_eier=%s,tidl_eiere=%s WHERE regnr=%s", + (produsent_val,produksjonsaar_val,giver_siste_eier_val,tidligere_eiere_val,regnr)) + else: + cursor.execute("INSERT INTO proveniens (produsent,prod_aar,regnr,siste_eier,tidl_eiere) VALUES(%s,%s,%s,%s,%s)", + (produsent_val,produksjonsaar_val,regnr,giver_siste_eier_val,tidligere_eiere_val)) + + db.close() + + # Logger resultatet til konsollet + print("save_proveniens_db: rowcount=" + str(cursor.rowcount)) + diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/archive_edit.py b/prosjekt/prosjektoppgave_Mal_v1.4/archive_edit.py new file mode 100644 index 0000000000000000000000000000000000000000..1b8381301962e4a57cda4b2dcf116859e7907eff --- /dev/null +++ b/prosjekt/prosjektoppgave_Mal_v1.4/archive_edit.py @@ -0,0 +1,331 @@ +from tkinter import * +from prosjekt.prosjektoppgave_v13.archive_db import * + +""" +Skrevet av: Majid Rouhani +Opprettet: 11.09.2018 +Oppdatert: 05.10.2019 +Versjon: 1.1 + +Beskrivesle: +Denne modulen håndterer registrering/oppdatering av data. +Samler data fra skjermen og bruker db-funksjoner fra modulen archive_db for videre håndtering + +----------------------------------------------------------------------------------------------------------- +Endret dato, endret av, versjon +<dato>, <navn>, <versjon> +----------------------------------------------------------------------------------------------------------- +""" + +# Åpner eget vindu for å editere person +def open_edit(root, search, gjenstand_data=None): + """ + Åpner vindu for registrering av ny gjenstand eller oppdatering av eksisterende gjenstand. + :param root: referanse til hovedvinduet + :param search: søke kriteriet (string) + :param gjenstand_data: dersom data skal oppdateres (liste) + :return: + """ + + # Definerer aksjon for lagring + def save_egenskaper(): + """ + Lokal funksjon innhenting av egenskap data fra skjerm. + Videresender dataene til save_egenskaper_db for lagring + :return: + """ + registreringsnr_val = registreringsnr.get() + fysiske_egenskaper_val = fysiske_egenskaper.get() + maal_val = maal.get() + materiale_val = materiale.get() + tilstand_val = tilstand.get() + + save_egenskaper_db(fysiske_egenskaper_val, + maal_val, + materiale_val, + registreringsnr_val, + tilstand_val) + + + def save_proveniens(): + """ + Lokal funksjon innhenting av proveniens data fra skjerm. + Videresender dataene til save_proveniens_db for lagring + :return: + """ + registreringsnr_val = registreringsnr.get() + produsent_val = produsent.get() + produksjonsaar_val = produksjonsaar.get() + giver_siste_eier_val = giver_siste_eier.get() + tidligere_eiere_val = tidligere_eiere.get() + save_proveniens_db(produsent_val, + produksjonsaar_val, + registreringsnr_val, + giver_siste_eier_val, + tidligere_eiere_val) + + + def save_gjenstand(kategori_id): + """ + Lokal funksjon innhenting av gjenstand data fra skjerm. + Videresender dataene til save_gjenstand_db for lagring + + :param kategori_id: int + :return: + """ + registreringsnr_val=registreringsnr.get() + giver_val = giver.get() + innlemmet_dato_val = innlemmet_dato.get() + kommentar_val = "" + mottatt_av_val = mottatt_av.get() + plassering_val = plassering.get() + registrert_av_val = registrert_av.get() + registrerings_dato_val = registrerings_dato.get() + navn_val=betegnelse.get() + + save_gjenstand_db(giver_val, + innlemmet_dato_val, + kategori_id, + kommentar_val, + mottatt_av_val, + navn_val, + plassering_val, + registrert_av_val, + registrerings_dato_val, + registreringsnr_val) + + #Ikke i bruk + def save_category(): + """ + Lokal funksjon innhenting av kategori data fra skjerm. + Videresender dataene til save_cateogri_db for lagring + :return: int + """ + kategori_id=get_next_category_id() + kategori_val = kategori.get() + save_cateogri_db(kategori_id, + kategori_val) + return kategori_id + + #Lage all data + def save_data(): + """ + Hovedfunksjon for lagring av archive data. + Kalles videre save_category, save_gjenstand, save_egenskaper og save_proveniens + :return: + """ + #kategori_id = save_category() + kategori_id = get_category_id(kategori.get()) + + if registrerings_dato.get() == "": + messagebox.showerror("Error", "Registreringsnummer må oppgis") + exit(0) + + save_gjenstand(kategori_id) + save_egenskaper() + save_proveniens() + messagebox.showinfo("Registrering", "Registrering av ny gjenstand er fullført!") + window.destroy() + + # Definerer aksjon for sletting + def delete(): + print("delete " + registreringsnr.get()) # Kun logg + if messagebox.askokcancel("Slett", "Er du sikker på at du vil slette gjenstanden?", parent=window): + delete_gjenstand(registreringsnr.get()) + window.destroy() # Lukk dette vinduet + search() # Oppdater data i hovedvinduet på nytt siden vi har oppdatert innhold + + # Oppretter et nytt vindu for å editere personinfo + window = Toplevel(root) + window.geometry("600x550") + + # Add a title + window.title("Tussudal Bygdemuseum - Archieve") + + window.columnconfigure(0, weight=1) + window.columnconfigure(1, weight=2) + window.columnconfigure(2, weight=2) + + + # Logger inndata + print("open_edit: data=" + str(gjenstand_data)) + + registreringsnr = StringVar() + registrerings_dato = StringVar() + registrert_av = StringVar() + innlemmet_dato = StringVar() + betegnelse = StringVar() + kategori = StringVar() + mottatt_av = StringVar() + giver = StringVar() + plassering = StringVar() + materiale = StringVar() + maal = StringVar() + tilstand = StringVar() + fysiske_egenskaper = StringVar() + produsent = StringVar() + produksjonsaar = StringVar() + giver_siste_eier = StringVar() + tidligere_eiere = StringVar() + + # Hvis vi dobbeltklikket på listen fyller vi ut data'ene vi allerede har + if gjenstand_data: + print("Reading : "+str(gjenstand_data)) + gjenstand = hent_gjenstand(gjenstand_data[0]) + + if len(gjenstand)>0: + giver.set(gjenstand[0][0]) + innlemmet_dato.set(gjenstand[0][1]) + mottatt_av.set(gjenstand[0][3]) + betegnelse.set(gjenstand[0][4]) + plassering.set(gjenstand[0][5]) + registrert_av.set(gjenstand[0][6]) + registrerings_dato.set(gjenstand[0][7]) + registreringsnr.set(gjenstand[0][8]) + kategori.set(gjenstand[0][9]) + fysiske_egenskaper.set(gjenstand[0][10]) + maal.set(gjenstand[0][11]) + materiale.set(gjenstand[0][12]) + tilstand.set(gjenstand[0][13]) + produsent.set(gjenstand[0][14]) + produksjonsaar.set(gjenstand[0][15]) + giver_siste_eier.set(gjenstand[0][16]) + tidligere_eiere.set(gjenstand[0][17]) + + + # Oppretter widgets og plasserer dem i grid'en + l1=Label(window, text="Tussudal Bygdemuseum") + l1.grid(row=0,columnspan=2) + l1.config(font=("Courier", 22)) + + + r=1 + generelt_group = LabelFrame(window, text="Generelt", padx=5, pady=5, borderwidth=2) + generelt_group.grid(row=r,column=1,sticky=W) + + + #Show an image + #logo = PhotoImage(file="./bilder/tuddal_bygdemuseum.gif",width=200,height=200) + #w1 = Label(can1, image=logo).grid(row=0,column=1) + + #Registrerings dato + Label(generelt_group,text="Registreringsdato:",width=25).grid(row=r,column=0,sticky=W) + Entry(generelt_group,textvariable=registrerings_dato,width=35).grid(row=r,column=1) + + #Registrert av + r+=1 + Label(generelt_group,text="Registrert av:",width=25).grid(row=r,column=0,sticky=W) + Entry(generelt_group,textvariable=registrert_av,width=35).grid(row=r,column=1) + + #Innlemmet dato + r+=1 + Label(generelt_group,text="Innlemmet dato:",width=25).grid(row=r,column=0,sticky=W) + Entry(generelt_group,textvariable=innlemmet_dato,width=35).grid(row=r,column=1) + + + identifikasjon_group = LabelFrame(window, text="Identifikasjon", padx=5, pady=5) + identifikasjon_group.grid(row=r,column=1,sticky=W) + + #Identifikasjon + #r+=1 + #Label(win,text="Identifikasjon").grid(row=r,column=0,sticky=W) + + #Registreringsnr + r+=1 + Label(identifikasjon_group,text="Registreringsnummer:",width=25).grid(row=r,column=0,sticky=W) + Entry(identifikasjon_group,textvariable=registreringsnr,width=35).grid(row=r,column=1) + + #Betegnelse + r+=1 + Label(identifikasjon_group,text="Betegnelse:",width=25).grid(row=r,column=0,sticky=W) + Entry(identifikasjon_group,textvariable=betegnelse,width=35).grid(row=r,column=1) + + #Kategori + r+=1 + choices = get_kategori() + kategori.set(next(iter(choices.keys()))) + + Label(identifikasjon_group,text="Velg kategori:",width=25).grid(row=r,column=0,sticky=W) + #Entry(identifikasjon_group,textvariable=kategori,width=35).grid(row=r,column=1) + OptionMenu(identifikasjon_group, kategori, *choices).grid(row=r,column=1) + + #Mottatt av + r+=1 + Label(identifikasjon_group,text="Mottatt av:",width=25).grid(row=r,column=0,sticky=W) + Entry(identifikasjon_group,textvariable=mottatt_av,width=35).grid(row=r,column=1) + + #Giver + r+=1 + Label(identifikasjon_group,text="Giver:",width=25).grid(row=r,column=0,sticky=W) + Entry(identifikasjon_group,textvariable=giver,width=35).grid(row=r,column=1) + + #Plassering + r+=1 + Label(identifikasjon_group,text="Plassering:",width=25).grid(row=r,column=0,sticky=W) + Entry(identifikasjon_group,textvariable=plassering,width=35).grid(row=r,column=1) + + fysiske_egenskaper_group = LabelFrame(window, text="Fysiske egenskaper", padx=5, pady=5) + fysiske_egenskaper_group.grid(row=r,column=1,sticky=W) + + + #Fysiske egenskaper + #r+=1 + #Label(fysiske_egenskaper_group,text="Fysiske egenskaper").grid(row=r,column=0,sticky=W) + + #Materiale + r+=1 + Label(fysiske_egenskaper_group,text="Materiale:",width=25).grid(row=r,column=0,sticky=W) + Entry(fysiske_egenskaper_group,textvariable=materiale,width=35).grid(row=r,column=1) + + #Mål + r+=1 + Label(fysiske_egenskaper_group,text="Mål:",width=25).grid(row=r,column=0,sticky=W) + Entry(fysiske_egenskaper_group,textvariable=maal,width=35).grid(row=r,column=1) + + #Tilstand + r+=1 + Label(fysiske_egenskaper_group,text="Tilstand:",width=25).grid(row=r,column=0,sticky=W) + Entry(fysiske_egenskaper_group,textvariable=tilstand,width=35).grid(row=r,column=1) + + #Fysiske egenskaper + r+=1 + Label(fysiske_egenskaper_group,text="Fysiske egenskaper:",width=25).grid(row=r,column=0,sticky=W) + Entry(fysiske_egenskaper_group,textvariable=fysiske_egenskaper,width=35).grid(row=r,column=1) + + + proveniens_group = LabelFrame(window, text="Proveniens", padx=5, pady=5) + proveniens_group.grid(row=r,column=1,sticky=W) + + #Proveniens + #r+=1 + #Label(win,text="Proveniens").grid(row=r,column=0,sticky=W) + + #Produsent + r+=1 + Label(proveniens_group,text="Materiale:",width=25).grid(row=r,column=0,sticky=W) + Entry(proveniens_group,textvariable=produsent,width=35).grid(row=r,column=1) + + #Produksjonsår + r+=1 + Label(proveniens_group,text="Produksjonsår:",width=25).grid(row=r,column=0,sticky=W) + Entry(proveniens_group,textvariable=produksjonsaar,width=35).grid(row=r,column=1) + + #Tidligere eiere + r+=1 + Label(proveniens_group,text="Tidligere eiere:",width=25).grid(row=r,column=0,sticky=W) + Entry(proveniens_group,textvariable=tidligere_eiere,width=35).grid(row=r,column=1) + + #Fysiske Giver/Siste eier + r+=1 + Label(proveniens_group,text="Giver/Siste eier:",width=25).grid(row=r,column=0,sticky=W) + Entry(proveniens_group,textvariable=giver_siste_eier,width=35).grid(row=r,column=1) + + #Lagre data + r+=1 + button = Button(window, text='Lagre', width=25,command=save_data) + button.grid(row=r,column=1) + + # Legger til slette-knapp KUN hvis gjenstand data allerede eksisterer + if gjenstand_data: + delete_button = Button(window, text="Slett", command=delete) + delete_button.grid(row=r,column=0) diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/archive_main.py b/prosjekt/prosjektoppgave_Mal_v1.4/archive_main.py new file mode 100644 index 0000000000000000000000000000000000000000..89ca061da0ec72798ea6cbb95300f4a81ca3383a --- /dev/null +++ b/prosjekt/prosjektoppgave_Mal_v1.4/archive_main.py @@ -0,0 +1,118 @@ +from tkinter import * +import prosjekt.prosjektoppgave_v13.archive_edit as archive_edit +import prosjekt.prosjektoppgave_v13.archive_db as archive_db +import prosjekt.prosjektoppgave_v13.archive_statistics as archive_statistics + + +""" +Skrevet av: Majid Rouhani +Opprettet: 11.09.2018 +Oppdatert: 05.10.2019 +Versjon: 1.1 + +Beskrivesle: +Dette er forslag til en minimumsløsning for prosjektet i fag LBAS2002 Informatikk (2018 HØST). + +Programmet består av følgende moduler: +1) archive_main: Programmet startes ved å kjøre denne filen. +2) archive_db: Kommunikasjon mot databasen +3) archive_edit: Registrering/Redigering av data + +For å kunne kjøre programmet, må du oppdatere archive_db modulen med påloggingsinformasjon (user/password). + +----------------------------------------------------------------------------------------------------------- +Endret dato, endret av, versjon +<dato>, <navn>, <versjon> +----------------------------------------------------------------------------------------------------------- +""" + +# Global liste for søkeresultatet +result = [] + +# Definerer aksjon for arkivsøket +def search(): + """ + Søk i archive databasen + Funksjonen kaller archive_edit.search metoden som returnerer en 2-dimensjonal liste med søkeresultater. + (regnr,navn,regdato,regav) + Fyller deretter listen "result_listbox" med resultatet. + """ + result_listbox.delete(0, END) + result.clear() + db_result = archive_edit.search(name.get(), regnr.get()) + for element in db_result: + result.append(element) + result_listbox.insert(END, element[0]+", "+element[1]+", "+element[2]+", "+element[3]) + +# Definerer aksjon for menyvalget "Registrer Ny" +def new_archive(): + """" + Kaller funksjonen archive_edit.open_edit som åpner et vindu for å registrere ny gjenstand + """ + archive_edit.open_edit(root, search) + +# Definerer aksjon for menyvalget "Vis aldersdistribusjon" +def view_materiale_statistics(): + """ + Kaller funksjonen archive_db.get_materialet_counts som returnerer liste med gjenstander grupper etter materialet og antall + Deretter kalles funkasjonen archive_statistics.show_bar_chart for å tegne grafen. + """ + counts, materiale = archive_db.get_materialet_counts() + archive_statistics.show_histogram(materiale,counts,10,100,"Antall","Materialet" ) + +# Definerer aksjon for dobbeltklikk på en gjenstand i lista +def edit_gjenstand(event): + """ + Når bruker dobbel-klikker på en gjenstand i listen (søke-resultatet), sendes første kolonnen (regnr) i litsen som + parameter til funksjonen archive_edit.open_edit + Denne funksjonen slår opp i databasen og henter all data relatert til denne gjenstaden. + """ + archive_edit.open_edit(root, search, result[result_listbox.curselection()[0]]) + + +""" +****************************Hoved program**************************** +""" +# Opprett hovedvindu +root = Tk() + +# Oppretter en ledetekster +name_label = Label(root, text="Navn:") +regnr_label = Label(root, text="Regnr:") + +# Oppretter tekstfelter brukeren kan søke fra +name = StringVar() # Definerer en tekstvariabel for tekstfeltet +name_entry = Entry(root, textvariable=name) +regnr = StringVar() # Definerer en tekstvariabel for tekstfeltet +regnr_entry = Entry(root, textvariable=regnr) + +# Oppretter en knapp med teksten "Søk", som kaller funksjonen search() ved trykk +search_button = Button(root, text="Søk", command=search) + +# Oppretter listeboks med scrollbar for søkeresultat +scrollbar = Scrollbar(root, orient=VERTICAL) +result_listbox = Listbox(root, yscrollcommand=scrollbar.set) +scrollbar.config(command=result_listbox.yview) +result_listbox.bind('<Double-Button-1>', edit_gjenstand) + +# Plasserer widget'ene i vinduet i et rutenett (grid) +name_label.grid(column=0, row=0, padx=2, pady=2) +name_entry.grid(column=1, row=0, padx=2, pady=2) +regnr_label.grid(column=2, row=0, padx=2, pady=2) +regnr_entry.grid(column=3, row=0, padx=2, pady=2) +search_button.grid(column=4, row=0, columnspan=2, padx=2, pady=2) +result_listbox.grid(column=0, row=1, columnspan=5, rowspan=10, sticky=EW) +scrollbar.grid(column=5, row=1, rowspan=10, sticky=NS) + +# Lag meny +menubar = Menu(root) +gjenstandMenu = Menu(menubar, tearoff=0) +gjenstandMenu.add_command(label="Registrer ny", command=new_archive) +statisticsMenu = Menu(menubar, tearoff=0) +statisticsMenu.add_command(label="Se materiale distriobusjon", command=view_materiale_statistics) +menubar.add_cascade(label="Gjenstand", menu=gjenstandMenu) +menubar.add_cascade(label="Statistikk", menu=statisticsMenu) +root.config(menu=menubar) + +# Starter GUI'et +root.mainloop() diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/archive_statistics.py b/prosjekt/prosjektoppgave_Mal_v1.4/archive_statistics.py new file mode 100644 index 0000000000000000000000000000000000000000..d0a68914beb6d544b84c055933f80938cafaa5b0 --- /dev/null +++ b/prosjekt/prosjektoppgave_Mal_v1.4/archive_statistics.py @@ -0,0 +1,34 @@ +import matplotlib.pyplot as plt +#plt.use('TkAgg') # Fiks for Mac +import numpy as np + + +def show_histogram_tall(values, min, max, num_bins, ylabel, xlabel): + bins = np.linspace(min, max, num_bins) + plt.hist(values, bins) + plt.show() + + +def show_histogram1(materialet, counts, ylabel, xlabel): + + plt.bar(materialet, height=materialet) + plt.xticks(materialet, counts) + plt.show() + +def show_histogram2(materialet, counts, xlabel, ylabel, title): + + #y_pos = np.arange(len(materialet)) + y_pos = range(0,len(materialet)) + plt.bar(y_pos, height=counts) + + plt.title(title) + + plt.xlabel(xlabel) + plt.ylabel(ylabel) + plt.ylim(0,max(counts)+5) + + plt.xticks(y_pos, materialet) + plt.show() + +#Test +show_histogram2(['Tre','Jern','Plast','Glass','Ukategorisert'],[10,5,20,7,50],'Materialet','Antall','Kategori distribusjon') diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/docs/Moduler.pdf b/prosjekt/prosjektoppgave_Mal_v1.4/docs/Moduler.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b36995c22a3e7a078e162f2d1f30956ff6d584f2 Binary files /dev/null and b/prosjekt/prosjektoppgave_Mal_v1.4/docs/Moduler.pdf differ diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/docs/Prosjektoppgaver.docx b/prosjekt/prosjektoppgave_Mal_v1.4/docs/Prosjektoppgaver.docx new file mode 100644 index 0000000000000000000000000000000000000000..b798e8d6cee3fc10a68d916a05fa266e54b47690 Binary files /dev/null and b/prosjekt/prosjektoppgave_Mal_v1.4/docs/Prosjektoppgaver.docx differ diff --git a/prosjekt/prosjektoppgave_Mal_v1.4/docs/database_scripts.sql b/prosjekt/prosjektoppgave_Mal_v1.4/docs/database_scripts.sql new file mode 100644 index 0000000000000000000000000000000000000000..7b36fbdff53e2e13c5514762428a5ebb56c03652 --- /dev/null +++ b/prosjekt/prosjektoppgave_Mal_v1.4/docs/database_scripts.sql @@ -0,0 +1,82 @@ +/* +** prosjekt-script-mysql.txt +/* +** DROP TABLE-setninger som sletter gamle tabeller +*/ + +DROP TABLE IF EXISTS gjenstand; +DROP TABLE IF EXISTS egenskaper; +DROP TABLE IF EXISTS proveniens; +DROP TABLE IF EXISTS kategori; + +/* +** Oppretter tabeller med entitetsintegritet +*/ +CREATE TABLE gjenstand +( +regnr VARCHAR(10) NOT NULL, +navn VARCHAR(30), +kategori_id INT, +regdato VARCHAR(15), +regav VARCHAR(50), +inndato VARCHAR(15), +mottattav VARCHAR(50), +giver VARCHAR(300), +plassering VARCHAR(30), +kommentar VARCHAR(1000), +PRIMARY KEY(regnr) +)ENGINE=INNODB; + +CREATE TABLE egenskaper +( +regnr VARCHAR(10) NOT NULL, +materiale VARCHAR(30), +maal VARCHAR(30), +tilstand VARCHAR(15), +fys_egenskap VARCHAR(1000), +PRIMARY KEY(regnr) +)ENGINE=INNODB; + +CREATE TABLE proveniens +( +regnr VARCHAR(10) NOT NULL, +produsent VARCHAR(30), +prod_aar INT, +tidl_eiere VARCHAR(300), +siste_eier VARCHAR(50), +PRIMARY KEY(regnr) +)ENGINE=INNODB; + +CREATE TABLE kategori +( +kategori_id INT NOT NULL, +katnavn VARCHAR(30), +PRIMARY KEY(kategori_id) +)ENGINE=INNODB; + +/* +** Legger p� referanseintegritet (fremmedn�kler) +*/ +ALTER TABLE gjenstand + ADD FOREIGN KEY(kategori_id) REFERENCES kategori(kategori_id); + +ALTER TABLE egenskaper + ADD FOREIGN KEY(regnr) REFERENCES gjenstand(regnr); + +ALTER TABLE proveniens + ADD FOREIGN KEY(regnr) REFERENCES gjenstand(regnr); + + +/* +** Legger inn gyldige data i tabellene (eksempel) +*/ + +INSERT INTO kategori VALUES(1,'M�bel'); + +INSERT INTO gjenstand VALUES('TBM.4892','Kommode', 1, '03.04.2012','Museumsbestyrer Olav Nilsen', '29.04.2012','Museumsbestyrer Olav Nilsen', 'Gunnar Berg f.1952', 'M1.R2.P1.H1','Kommoden er laget av den kjente h�ndverkeren Mathias Guttormsen'); + +INSERT INTO egenskaper VALUES('TBM.4892','Tre Gran','L:103 cm, H:122 cm, D:42 cm','God','Rosemalt kommode'); + +INSERT INTO proveniens VALUES('TBM.4892','Mathias Guttormsen f.1798',1843,'Olaug J�rgensdatter Berg m.fl.','Gunnar Berg f.1952'); + + diff --git a/prosjekt/prosjektoppgave_v13/archive_db.py b/prosjekt/prosjektoppgave_v13/archive_db.py index 642c64cd603c950dc7f730ab3331bd381d8a63ff..046466a55978d974dc14f800cff81eda7e0da53b 100644 --- a/prosjekt/prosjektoppgave_v13/archive_db.py +++ b/prosjekt/prosjektoppgave_v13/archive_db.py @@ -19,8 +19,8 @@ Endret dato, endret av, versjon """ host = "mysql.stud.iie.ntnu.no" -user = "rouhani" # Skriv inn brukernavnet ditt her -password = "mPZSMTaw" # Skriv inn passordet ditt her +user = "" # Skriv inn brukernavnet ditt her +password = "" # Skriv inn passordet ditt her def get_db_connection(): diff --git a/prosjekt/prosjektoppgave_v13/archive_main.py b/prosjekt/prosjektoppgave_v13/archive_main.py index ed2d5ed230eae62860070a05018eba39872002a5..89ca061da0ec72798ea6cbb95300f4a81ca3383a 100644 --- a/prosjekt/prosjektoppgave_v13/archive_main.py +++ b/prosjekt/prosjektoppgave_v13/archive_main.py @@ -58,7 +58,7 @@ def view_materiale_statistics(): Deretter kalles funkasjonen archive_statistics.show_bar_chart for å tegne grafen. """ counts, materiale = archive_db.get_materialet_counts() - archive_statistics.show_bar_chart(materiale,counts,"Antall","Materialet" ) + archive_statistics.show_histogram(materiale,counts,10,100,"Antall","Materialet" ) # Definerer aksjon for dobbeltklikk på en gjenstand i lista def edit_gjenstand(event): diff --git a/prosjekt/prosjektoppgave_v13/archive_statistics.py b/prosjekt/prosjektoppgave_v13/archive_statistics.py index 4251024d55f3791dd8487debcb566ea6cded8998..1dcb86551606c30aa2631302a59ebfe64a21d1d0 100644 --- a/prosjekt/prosjektoppgave_v13/archive_statistics.py +++ b/prosjekt/prosjektoppgave_v13/archive_statistics.py @@ -1,26 +1,13 @@ -import matplotlib -matplotlib.use('TkAgg') # Fiks for Mac -#import matplotlib.pyplot as plt +import matplotlib.pyplot as plt +#plt.use('TkAgg') # Fiks for Mac import numpy as np -# Lag en "bar-chart" med gitte verdier på x-aksen, og antall for hver av dem -def show_bar_chart(counts, labels, ylabel, xlabel): - x = np.arange(len(counts)) - matplotlib.bar(x, height=counts) - matplotlib.xticks(x, labels) - matplotlib.ylabel(ylabel) - matplotlib.xlabel(xlabel) - matplotlib.show() - # Lag et histogram hvor gitte verdier telles opp og puttes i bøtter (bins) basert på min, max og antall def show_histogram(values, min, max, num_bins, ylabel, xlabel): bins = np.linspace(min, max, num_bins) - matplotlib.hist(values, bins) - matplotlib.ylabel(ylabel) - matplotlib.xlabel(xlabel) - matplotlib.show() + plt.hist(values, bins) + plt.show() # Test-funksjoner -#show_bar_chart([2, 16, 3, 1, 4.5], ["a", "b", "c", "d", "e"], "Antall", "Kategori") #show_histogram([10,41,72,45,51,52,51,54,56,81,43,42], 0, 100, 10, "Antall", "Alder") diff --git a/prosjekt/prosjektoppgave_v13/docs/~$osjektoppgaver.docx b/prosjekt/prosjektoppgave_v13/docs/~$osjektoppgaver.docx new file mode 100644 index 0000000000000000000000000000000000000000..b900969397734b240a5f98f594fe8cfd5a3c35e3 Binary files /dev/null and b/prosjekt/prosjektoppgave_v13/docs/~$osjektoppgaver.docx differ diff --git a/sandbox/histogram.py b/sandbox/histogram.py new file mode 100644 index 0000000000000000000000000000000000000000..90ee47e27caf26050a10e7b3c2fc659dfa2d7f8c --- /dev/null +++ b/sandbox/histogram.py @@ -0,0 +1,24 @@ +import numpy as np +import matplotlib.pyplot as plt + +# Fake dataset +height = [3, 12, 5, 18, 45] +bars = ('A', 'B', 'C', 'D', 'E') +y_pos = np.arange(len(bars)) + +# Create bars and choose color +plt.bar(y_pos, height) + +# Add title and axis names +plt.title('My title') +plt.xlabel('categories') +plt.ylabel('values') + +# Limits for the Y axis +plt.ylim(0,60) + +# Create names +plt.xticks(y_pos, bars) + +# Show graphic +plt.show()