Skip to content

Commit

Permalink
Implement deletion of singular contact + its tests, update documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
ranven committed Apr 28, 2024
1 parent 82e90d6 commit 0bbefdc
Show file tree
Hide file tree
Showing 12 changed files with 73 additions and 13 deletions.
3 changes: 3 additions & 0 deletions dokumentaatio/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed dokumentaatio/image/screenshot-list-delete.png
Binary file not shown.
10 changes: 8 additions & 2 deletions dokumentaatio/kayttoohje.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
3 changes: 2 additions & 1 deletion dokumentaatio/tuntikirjanpito.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 | |
5 changes: 3 additions & 2 deletions src/repositories/contact_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
17 changes: 14 additions & 3 deletions src/services/contact_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
2 changes: 1 addition & 1 deletion src/tests/repositories/contact_repository_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
21 changes: 21 additions & 0 deletions src/tests/services/contact_service_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -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):
Expand Down Expand Up @@ -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', '[email protected]', '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(
Expand All @@ -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)
23 changes: 20 additions & 3 deletions src/ui/contacts_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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))
2 changes: 1 addition & 1 deletion src/ui/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down

0 comments on commit 0bbefdc

Please sign in to comment.