Настав час об'єднати наші попередні домашні завдання в одне в один функціональний проєкт.
Створенню класу Birthday
з можливістю додавання поля для дня народження до контакту
Підтримці нового списку команд, включаючи обробку додавання та показу дня народження для контактів.
Коректному закриттю програми після виконання команди close
або exit
Розмістіть файли з розв'язанням у репозиторії goit-pycore-hw-07
, та прикріпіть лінки до них у відповідь на домашнє завдання.
Прикріпіть файл репозиторію у форматi zip
у відповідь на домашнє завдання.
По перше додамо додатковий функціонал до класів з попередньої домашньої роботи:
- Додайте поле birthday для дня народження в клас
Record
. Це поле має бути класуBirthday
. Це поле не обов'язкове, але може бути тільки одне.
class Birthday(Field):
def **init**(self, value):
try: # Додайте перевірку коректності даних # та перетворіть рядок на об'єкт datetime
except ValueError:
raise ValueError("Invalid date format. Use DD.MM.YYYY")
class Record:
def **init**(self, name):
self.name = Name(name)
self.phones = []
self.birthday = None
- Додайте функціонал роботи з
Birthday
у класRecord
, а саме функціюadd_birthday
, яка додає день народження до контакту. - Додайте функціонал перевірки на правильність наведених значень для полів
Phone
,Birthday
. - Додайте та адаптуйте до класу
AddressBook
нашу функцію з четвертого домашнього завдання, тиждень 3,get_upcoming_birthdays
, яка для контактів адресної книги повертає список користувачів, яких потрібно привітати по днях на наступному тижні.
Тепер ваш бот повинен працювати саме з функціоналом класу AddressBook
. Це значить, що замість словника contacts ми використовуємо book = AddressBook()
Для реалізації нового функціоналу також додайте функції обробники з наступними командами:
add-birthday
- додаємо до контакту день народження в форматіDD.MM.YYYY
show-birthday
- показуємо день народження контактуbirthdays
- повертає список користувачів, яких потрібно привітати по днях на наступному тижні
@input_error
def add_birthday(args, book): # реалізація
@input_error
def show_birthday(args, book): # реалізація
@input_error
def birthdays(args, book): # реалізація
Тож в фіналі наш бот повинен підтримувати наступний список команд:
add [ім'я] [телефон]
: Додати або новий контакт з іменем та телефонним номером, або телефонний номер к контакту який вже існує.change [ім'я] [старий телефон] [новий телефон]
: Змінити телефонний номер для вказаного контакту.phone [ім'я]
: Показати телефонні номери для вказаного контакту.all
: Показати всі контакти в адресній книзі.add-birthday [ім'я] [дата народження]
: Додати дату народження для вказаного контакту.show-birthday [ім'я]
: Показати дату народження для вказаного контакту.birthdays
: Показати дні народження, які відбудуться протягом наступного тижня.hello
: Отримати вітання від бота.close або exit
: Закрити програму.
def main():
book = AddressBook()
print("Welcome to the assistant bot!")
while True:
user_input = input("Enter a command: ")
command, \*args = parse_input(user_input)
if command in ["close", "exit"]:
print("Good bye!")
break
elif command == "hello":
print("How can I help you?")
elif command == "add":
# реалізація
elif command == "change":
# реалізація
elif command == "phone":
# реалізація
elif command == "all":
# реалізація
elif command == "add-birthday":
# реалізація
elif command == "show-birthday":
# реалізація
elif command == "birthdays":
# реалізація
else:
print("Invalid command.")
Для прикладу розглянемо реалізацію команди add [ім'я] [телефон]
. В функції main
ми повинні додати обробку цієї команди, в відповідне місце:
elif command == "add":
print(add_contact(args, book))
Сама реалізація функції add_contact
може виглядати наступним чином:
@input\*error
def add_contact(args, book: AddressBook):
name, phone, \*\* = args
record = book.find(name)
message = "Contact updated."
if record is None:
record = Record(name)
book.add_record(record)
message = "Contact added."
if phone:
record.add_phone(phone)
return message
Наша функція add_contact
має два призначення - додавання нового контакту або оновлення телефону для контакту, що вже існує в адресній книзі.
Параметри функції це список аргументів args
та сама адресна книга book
.
- Спочатку функція розпаковує список
args
, отримуючи ім'яname
і телефон phone з перших двох елементів списку. Решта аргументів ігнорується завдяки використанню *_. Далі методfind
об'єктаbook
виконує пошук запису з іменемname
. Якщо запис з таким іменем існує, метод повертає цей запис, інакше повертаєтьсяNone
. - Якщо запис не знайдено, то це новий контакт і функція створює новий об'єкт Record з іменем
name
і додає його доbook
викликом методуadd_record
. Після додавання нового запису змінній message присвоюється повідомлення"Contact added."
успішності операції. - Далі незалежно від того, чи був запис знайдений або створений новий, до цього запису додається телефонний номер за допомогою методу
add_phone
, якщо він був наданий. На завершення функція повертає повідомлення про результат своєї роботи:"Contact updated."
, якщо контакт був оновлений, або"Contact added."
, якщо контакт був доданий. Для перехоплення помилок вводу та виведення відповідного повідомлення про помилку використовуємо декоратор@input_error
.
-
Реалізувати всі вказані команди до бота
-
Всі дані повинні виводитися у зрозумілому та зручному для користувача форматі
-
Всі помилки, такі як неправильний ввід чи відсутність контакту, повинні оброблятися інформативно з відповідним повідомленням для користувача
-
Валідація даних:
- Дата народження має бути у форматі
DD.MM.YYYY
. - Телефонний номер має складатися з
10
цифр.
- Програма повинна закриватися коректно після виконання команд
close
абоexit