From 0bbefdcd82b05a06faacb8c9c612d5dc18e5c400 Mon Sep 17 00:00:00 2001 From: Venla R Date: Sun, 28 Apr 2024 17:59:25 +0300 Subject: [PATCH] Implement deletion of singular contact + its tests, update documentation --- dokumentaatio/changelog.md | 3 +++ .../image/screenshot-list-delete-all.png | Bin 0 -> 21716 bytes .../image/screenshot-list-delete-one.png | Bin 0 -> 22002 bytes .../image/screenshot-list-delete.png | Bin 20305 -> 0 bytes dokumentaatio/kayttoohje.md | 10 ++++++-- dokumentaatio/tuntikirjanpito.md | 3 ++- src/repositories/contact_repository.py | 5 ++-- src/services/contact_service.py | 17 ++++++++++--- .../repositories/contact_repository_test.py | 2 +- src/tests/services/contact_service_test.py | 21 ++++++++++++++++ src/ui/contacts_view.py | 23 +++++++++++++++--- src/ui/ui.py | 2 +- 12 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 dokumentaatio/image/screenshot-list-delete-all.png create mode 100644 dokumentaatio/image/screenshot-list-delete-one.png delete mode 100644 dokumentaatio/image/screenshot-list-delete.png diff --git a/dokumentaatio/changelog.md b/dokumentaatio/changelog.md index 93e70da..ceecae7 100644 --- a/dokumentaatio/changelog.md +++ b/dokumentaatio/changelog.md @@ -31,3 +31,6 @@ - Testattu että käyttäjän rekisteröityminen ja kirjautuminen toimii oikeilla tunnuksilla ja epäonnistuu liian lyhyillä, käytössä olevilla tai väärillä tunnuksilla - Testattu että kontaktien luominen, hakeminen ja poistaminen toimii odotetulla tavalla kirjautuneelle käyttäjälle +- Käyttäjä voi kirjautuneena ollessaan poistaa yksittäisen lisäämänsä yhteystiedon graafisen käyttöliittymän kautta +- Lisätty käyttöohjeet, docstring-dokumentaatio sekä laajempi arkkitehtuurikuvaus +- Parannettu koodin laatua ja luettavuutta diff --git a/dokumentaatio/image/screenshot-list-delete-all.png b/dokumentaatio/image/screenshot-list-delete-all.png new file mode 100644 index 0000000000000000000000000000000000000000..7655e0ae9875841d69af2a8c88460e1330ac683d GIT binary patch literal 21716 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 P0mrj0Ki2%m^*{e7Do#1( literal 0 HcmV?d00001 diff --git a/dokumentaatio/image/screenshot-list-delete.png b/dokumentaatio/image/screenshot-list-delete.png deleted file mode 100644 index 388be9d351a681c162674c367f1d0466d96eafda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20305 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 O0^lJR&eQ*#a`oT*SXz(( diff --git a/dokumentaatio/kayttoohje.md b/dokumentaatio/kayttoohje.md index 9e2aa15..20eaea9 100644 --- a/dokumentaatio/kayttoohje.md +++ b/dokumentaatio/kayttoohje.md @@ -44,6 +44,12 @@ Kirjautunut käyttäjä voi nähdä yhteystietojen listausnäkymän, jonka yllä Luomisnäkymässä käyttäjä voi syöttää uuden yhteystiedon etu- ja sukunimen, sähköpostiosoitteen, puhelinnumeron sekä roolin ja lopuksi painaa "Create"-painiketta luodakseen yhteystiedon ja lisätäkseen sen omaan yhteystietolistaansa. Tämän jälkeen käyttäjä siirtyy takaisin listausnäkymään, johon uusi yhteystieto on ilmestynyt. "Cancel"-painiketta painamalla käyttäjä siirtyy takaisin listausnäkymään luomatta uutta yhteystietoa. -![](./image/screenshot-list-delete.png) +![](./image/screenshot-list-delete-all.png) -Käyttäjä voi nähdä luomansa yhteystiedot listausnäkymässä. Käyttäjä voi poistaa kaikki luomansa yhteystiedot ja tyhjentää yhteystietolistansa painamalla "Delete all"-painiketta. Käyttäjä voi myös kirjautua ulos sovelluksesta painamalla "Log out"-painiketta, joka siirtää käyttäjän takaisin kirjautumisnäkymään. +Käyttäjä voi nähdä luomansa yhteystiedot listausnäkymässä. Käyttäjä voi poistaa kaikki luomansa yhteystiedot ja tyhjentää yhteystietolistansa painamalla "Delete all"-painiketta. + +![](./image/screenshot-list-delete-one.png) + +Käyttäjä voi poistaa yksittäisen yhteystiedon painamalla "X"-painiketta kyseisen yhteystiedon kohdalla. + +Käyttäjä voi myös kirjautua ulos sovelluksesta painamalla "Log out"-painiketta, joka siirtää käyttäjän takaisin kirjautumisnäkymään. diff --git a/dokumentaatio/tuntikirjanpito.md b/dokumentaatio/tuntikirjanpito.md index 58ce176..b70a290 100644 --- a/dokumentaatio/tuntikirjanpito.md +++ b/dokumentaatio/tuntikirjanpito.md @@ -13,4 +13,5 @@ | 23.4. | 4 | Kontaktilistan käyttöliittymän parannukset, kontaktien poiston toteutus, kontaktirepositorion testit, dokumentaatio | | 25.4. | 3 | UserServicen ja ContactServicen testien implementointi, user id:n tarkistamisen refaktorointi | | 26.4. | 3 | Käyttöohjeiden lisääminen, käyttöliittymäkoodin siistiminen, arkkitehtuurikuvaus, docstring-dokumentaatio | -| Yht | 27 | | +| 28.4. | 1 | Yksittäisen yhteystiedon poiston toteutus, testit ja dokumentaatio toiminnallisuudelle | +| Yht | 28 | | diff --git a/src/repositories/contact_repository.py b/src/repositories/contact_repository.py index 9c77bdf..cb6be19 100644 --- a/src/repositories/contact_repository.py +++ b/src/repositories/contact_repository.py @@ -76,16 +76,17 @@ def delete_all(self, user_id): cursor.execute("DELETE FROM contacts WHERE user = ?", (user_id, )) self._connection.commit() - def delete_one(self, contact_id): + def delete_one(self, user_id, contact_id): """Poistaa yhden kontaktin annetun id'n perusteella. Args: + user_id: käyttäjän id, jonka luoma kontakti poistetaan contact_id: poistettavan kontaktin id """ cursor = self._connection.cursor() cursor.execute( - "DELETE FROM contacts WHERE id = ?", (contact_id, )) + "DELETE FROM contacts WHERE id = ? AND user = ?", (contact_id, user_id, )) self._connection.commit() def create(self, contact): diff --git a/src/services/contact_service.py b/src/services/contact_service.py index f233768..794ca6d 100644 --- a/src/services/contact_service.py +++ b/src/services/contact_service.py @@ -83,15 +83,26 @@ def delete_all(self, user_id): Args: user_id käyttäjän id + """ - Returns: - Palauttaa listan Contact-olioita + if user_id is None: + raise NoUserError("No user is logged in.") + + self._contact_repository.delete_all(user_id) + + def delete_one(self, user_id, contact_id): + """Tarkistaa käyttäjän id'n ja kutsuu contact_repositoryn delete_one-metodia + poistaakseen yhden kontaktin annetun id'n perusteella. + Args: + user_id käyttäjän id + contact_id poistettavan käyttäjän id """ + if user_id is None: raise NoUserError("No user is logged in.") - self._contact_repository.delete_all(user_id) + self._contact_repository.delete_one(user_id, contact_id) contact_service = ContactService() diff --git a/src/tests/repositories/contact_repository_test.py b/src/tests/repositories/contact_repository_test.py index b1d8aad..6ede37a 100644 --- a/src/tests/repositories/contact_repository_test.py +++ b/src/tests/repositories/contact_repository_test.py @@ -57,6 +57,6 @@ def test_delete_all(self): def test_delete_one(self): contact_repository.create(self.contact_one) - contact_repository.delete_one(self.contact_one.id) + contact_repository.delete_one(self.user_one.id, self.contact_one.id) contact = contact_repository.find_one(self.contact_one.id) self.assertEqual(contact, None) diff --git a/src/tests/services/contact_service_test.py b/src/tests/services/contact_service_test.py index a401f06..352cee2 100644 --- a/src/tests/services/contact_service_test.py +++ b/src/tests/services/contact_service_test.py @@ -16,7 +16,9 @@ def __init__(self): self.contacts = [] def create(self, contact): + contact.id = uuid.uuid4().hex self.contacts.append(contact) + return contact def find_all(self, user_id): return [contact for contact in self.contacts if contact.user == user_id] @@ -25,6 +27,10 @@ def delete_all(self, user_id): self.contacts = [ contact for contact in self.contacts if contact.user != user_id] + def delete_one(self, user_id, contact_id): + self.contacts = [ + contact for contact in self.contacts if not (contact.user == user_id and contact.id == contact_id)] + class FakeUserRepository: def __init__(self, users=None): @@ -84,6 +90,17 @@ def test_delete_all(self): contacts = self.contact_service.get_contacts(user.id) self.assertEqual(len(contacts), 0) + def test_delete_one(self): + user = User('testusername', 'testpassword', '123') + contact = self.contact_service.create_contact( + 'Pekka', 'Pouta', 'pekka@pouta.fi', '123456789', 'Meteorologi', user.id) + + self.contact_service.delete_one(user.id, contact.id) + + contacts = self.contact_service.get_contacts(user.id) + self.assertEqual(len(contacts), 0) + print(len(contacts)) + def test_create_contact_without_user(self): with self.assertRaises(NoUserError): self.contact_service.create_contact( @@ -93,6 +110,10 @@ def test_delete_all_without_user(self): with self.assertRaises(NoUserError): self.contact_service.delete_all(None) + def test_delete_one_without_user(self): + with self.assertRaises(NoUserError): + self.contact_service.delete_one(None, "1") + def test_get_contacts_without_user(self): with self.assertRaises(NoUserError): self.contact_service.get_contacts(None) diff --git a/src/ui/contacts_view.py b/src/ui/contacts_view.py index a0340cb..a97d66d 100644 --- a/src/ui/contacts_view.py +++ b/src/ui/contacts_view.py @@ -9,14 +9,15 @@ class ContactCreationError(Exception): class ContactsView: - def __init__(self, root, handle_logout, handle_create, handle_delete): + def __init__(self, root, handle_logout, handle_create, handle_delete_all, handle_delete_one): self._root = root self._frame = None self._canvas = None self._scrollbar = None self._handle_logout = handle_logout self._handle_create = handle_create - self._handle_delete = handle_delete + self._handle_delete_all = handle_delete_all + self._handle_delete_one = handle_delete_one self._contacts = [] self._contact_form_frame = None self._contact_form_view = None @@ -35,7 +36,11 @@ def _logout_handler(self): def _delete_all_handler(self): contact_service.delete_all(self._user.id) - self._handle_delete() + self._handle_delete_all() + + def _delete_one_handler(self, contact_id): + contact_service.delete_one(self._user.id, contact_id) + self._handle_delete_one() def _initialize(self): self._frame = ttk.Frame(master=self._root) @@ -130,4 +135,16 @@ def _initialize_contact(self, contact): value_label.grid(row=row, column=column + 1, sticky="w", padx=padx_value) + delete_button = ttk.Button( + master=contact_frame, + text="X", + command=lambda: self._delete_one_handler(contact.id), + style="Red.TButton", + ) + delete_button.grid(row=0, column=5, sticky="ne") + + style = ttk.Style() + style.map("Red.TButton", background=[ + ('active', 'red'), ('!active', 'lightgrey')], ) + contact_frame.pack(fill=constants.X, expand=True, padx=10, pady=(5, 0)) diff --git a/src/ui/ui.py b/src/ui/ui.py index 47d2684..df8f4cb 100644 --- a/src/ui/ui.py +++ b/src/ui/ui.py @@ -49,7 +49,7 @@ def _show_register_view(self): def _show_contacts_view(self): self._hide_current_view() self._current_view = ContactsView( - self._root, self._show_login_view, self._show_contact_form_view, self._show_contacts_view) + self._root, self._show_login_view, self._show_contact_form_view, self._show_contacts_view, self._show_contacts_view) self._current_view.pack() def _show_contact_form_view(self):