Advertisement
Korotkodul

person

Sep 27th, 2024 (edited)
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.83 KB | None | 0 0
  1. from dataclasses import dataclass, asdict
  2. from uuid import (
  3.     UUID,
  4.     uuid4,
  5. )
  6.  
  7.  
  8.  
  9. @dataclass
  10. class Person:
  11.     """
  12.    Информация о пользователе.
  13.  
  14.    Attrs:
  15.        login: логин пользователя.
  16.        password: пароль пользователя.
  17.        username: имя пользователя.
  18.        metadata: дополнительные сведения о пользователе.
  19.    """
  20.  
  21.     login: str = ""
  22.     password: str = ""
  23.     username: str = ""
  24.     metadata: str = ""
  25.  
  26.  
  27.  
  28. class PersonDB:
  29.     _database: dict[UUID, Person]
  30.     _login_registry: set[str]
  31.     _min_password_len = 10
  32.  
  33.     def __init__(self) -> None:
  34.         """Инициализирует базу данных."""
  35.         # ваш код
  36.         self._database = {}
  37.         self._login_registry = set()
  38.  
  39.     def _check_password(self, password):
  40.         """
  41.        Пароль считается надежным, если
  42. пароль содержит хотя бы одну букву английского алфавита в верхнем регистре;
  43. пароль содержит хотя бы одну букву английского алфавита в нижнем регистре;
  44. пароль содержит хотя бы одну цифру от 0 до 9;
  45. пароль состоит не менее чем из 10 символов;
  46. пароль не содержит никаких символов, кроме разрешенных.
  47.        """
  48.         alph_lower = 'abcdefghijklmnopqrstuvwxyz'
  49.         alph_upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  50.         num = '0123456789'
  51.         if len(password) < self._min_password_len:
  52.             return False
  53.         contains_alph_lower = False
  54.         contains_alph_upper = False
  55.         contains_num = False
  56.         for l in password:
  57.             if l in alph_lower:
  58.                 contains_alph_lower = True
  59.             elif l in alph_upper:
  60.                 contains_alph_upper = True
  61.             elif l in num:
  62.                 contains_num = True
  63.             else:
  64.                 return False
  65.         return contains_alph_lower and contains_alph_upper and contains_num
  66.  
  67.     def _check_login(self, login):
  68.         """
  69.         Логин должен быть уникальным и содержать только английские буквы в верхнем и нижнем регистре, а также цифры от 0 до 9. Логин не может быть пустой строкой.
  70.        """
  71.         #print("login is", login)
  72.         return login != '' and login.isalnum()
  73.  
  74.     def _check_login_and_password(self, login, password):
  75.         #print("checking login and password")
  76.         #print("login is", login)
  77.         #print("password is", password)
  78.         login_is_ok = self._check_login(login)
  79.         if not login_is_ok:
  80.             raise ValueError("incorrect login")
  81.         if login in self._login_registry:
  82.             raise ValueError("such login already exists")
  83.         password_is_ok = self._check_password(password)
  84.         if not password_is_ok:
  85.             raise ValueError("incorrect password")
  86.  
  87.     def create_person(self, person: Person) -> UUID:
  88.         """
  89.        Создает новую запись о пользователе в базе данных.
  90.  
  91.        Args:
  92.            person: данные о пользователе, которые будут помещены в БД.
  93.  
  94.        Returns:
  95.            UUID - идентификатор, который будет связан с созданной записью.
  96.  
  97.        Raises:
  98.            ValueError, если логин или пароль не удовлетворяют требованиям.
  99.        """
  100.         #print("creating person")
  101.         #print(person)
  102.         self._check_login_and_password(person.login, person.password)
  103.         id = uuid4()
  104.         if id in self._database:
  105.             raise Exception("such id already exists")
  106.         self._login_registry.add(person.login)
  107.         self._database[id] = person
  108.         #print("creating")
  109.         #print("id is", id)
  110.         return id
  111.         # ваш код
  112.    
  113.     def read_person_info(self, person_id: UUID) -> Person:
  114.         """
  115.        Читает актуальные данные пользователя из базы данных.
  116.  
  117.        Args:
  118.            person_id: идентификатор пользователя в формате UUID.
  119.  
  120.        Returns:
  121.            Данные о пользователе, упакованные в структуру Person.
  122.  
  123.        Raises:
  124.            KeyError, если в базе данных нет пользователя с person_id.
  125.        """
  126.         if person_id not in self._database:
  127.             raise KeyError("no person with such id")
  128.         return self._database[person_id]
  129.    
  130.     def update_person_info(self, person_id: UUID, person_info_new: Person) -> None:
  131.         """
  132.        Обновляет данные о пользователе.
  133.  
  134.        Args:
  135.            person_id: идентификатор пользователя в формате UUID.
  136.            person_info_new: модель со значениями на обновление. Будут обновлены
  137.                только те поля, чье значение отличается от пустой строки '',
  138.                остальные поля будут оставлены без изменений.
  139.  
  140.        Raises:
  141.            ValueError, если при обновлении логина или пароля логин или пароль
  142.                не прошли этап валидации.
  143.            KeyError, если в базе данных нет пользователя с person_id.
  144.        """
  145.         if person_id not in self._database:
  146.             raise KeyError("no person with such id")
  147.         self._check_login_and_password(person_info_new.login, person_info_new.password)
  148.         """
  149.        параметр откуда взять?
  150.                for par in asdict(person_info_new):
  151.            if par != '':
  152.                self._database[person_id] = person_info_new.
  153.        """
  154.         """
  155.        login: str = ""
  156.    password: str = ""
  157.    username: str = ""
  158.    metadata: str = ""
  159.        """
  160.         if person_info_new.login != '':
  161.             self._login_registry.remove(self._database[person_id].login)
  162.             self._database[person_id] = person_info_new.login
  163.             self._login_registry.add(person_info_new.login)
  164.         if person_info_new.password != '':
  165.             self._database[person_id] = person_info_new.password
  166.         if person_info_new.username != '':
  167.             self._database[person_id] = person_info_new.username
  168.         if person_info_new.metadata != '':
  169.             self._database[person_id] = person_info_new.metadata
  170.  
  171.  
  172.    
  173.     def delete_person(self, person_id: UUID) -> None:
  174.         """
  175.        Удаляет запись о пользователе.
  176.  
  177.        Args:
  178.            person_id: идентификатор пользователя в формате UUID.
  179.  
  180.        Raises:
  181.            KeyError, если в базе данных нет пользователя с person_id.
  182.        """
  183.         if person_id not in self._database:
  184.             raise KeyError("no person with such id")
  185.         self._database.pop(person_id)
  186.  
  187.  
  188. """
  189. p = Person('ninja', 'aA0123456789', 'Eminem', 'This ninja is Eminem')
  190. db = PersonDB()
  191. check_id = db.create_person(p)
  192. p2 = Person('ninja2', 'aA6123456789', 'Taylor Swift', 'This ninja is Taylor Swift')
  193. check_id2 = db.create_person(p2)
  194. #print("check id is", check_id)
  195. #print(db._database)
  196. print(db.read_person_info(check_id))
  197. print(db.read_person_info(check_id2))
  198. #print(asdict(db))
  199. print(db._login_registry)
  200. print(db._database)
  201. """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement