Настав час об'єднати наші попередні домашні завдання в одне в один функціональний проєкт.
Створенню класу 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