Ejemplo n.º 1
0
    def create_base(self) -> None:
        """
        Созадние базы данных и её использование

        :return: Эта функция ничего не возвращает
        """
        dialog = Login()
        if dialog.exec_() == QDialog.Accepted:
            date = datetime.datetime.now().strftime("%d-%m-%Y_%H-%M-%S-%f")
            temp_base_path = os.path.abspath(
                f'../temp/temp_base_{date}.sqlite')
            with open(temp_base_path, mode='w') as _:
                with get_base(temp_base_path, True) as base:
                    db_create(base)
            self.path_base_file = os.path.abspath(
                QFileDialog.getSaveFileName(
                    self,
                    caption='Сохранить базу',
                    directory='../bases',
                    filter='SQLite (*.sqlite);;Все файлы (*)')[0])
            if self.path_base_file:
                shutil.copy2(temp_base_path, self.path_base_file)
                self._init_cinemas('Администратор')
            os.remove(temp_base_path)
        dialog.deleteLater()
Ejemplo n.º 2
0
    def reservations(self) -> None:
        """
        Покупка и печать билетов.
        Отмена забронированного места.

        :return: Эта функция ничего не возвращает
        """
        take_place_base = set(
            get_data_base(
                self.path_base_file,
                "SELECT p.row, p.place FROM Places p WHERE p.session_id = ?",
                (self.session_id, )))
        deleted = take_place_base - self.placement.take_place
        added = self.placement.take_place - take_place_base
        with get_base(self.path_base_file, True) as base:
            if deleted:
                for row, place in deleted:
                    base.execute(
                        """DELETE FROM Places WHERE row = ? AND place = ? AND session_id = ?""",
                        (row, place, self.session_id))
            if added:
                for row, place in added:
                    base.execute(
                        """INSERT INTO Places (row, place, session_id) VALUES (?, ?, ?)""",
                        (row, place, self.session_id))
                    th = Thread(target=ticket,
                                args=(row, place, self.title_hall, self.price,
                                      self.date))
                    th.start()
Ejemplo n.º 3
0
    def delete(self, id_: int) -> None:
        """
        Каскадное удаление из базы данных.

        :param id_: номер удаляемого объекта
        :return: Эта функция ничего не возвращает
        """
        valid = QMessageBox.question(
            self, 'Удаление',
            "Действительно удалить элемент и всё что с ним связано?!",
            QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if valid == QMessageBox.Yes:
            valid = QMessageBox.question(
                self, 'Удаление ЛИ!?',
                "ВЫ УВЕРЕНЫ, ЧТО НУЖНО УДАЛИТЬ ЭЛЕМЕНТ?!!",
                QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
            if valid == QMessageBox.Yes:
                with get_base(self.path_base_file, True) as base:
                    base.execute(
                        """DELETE FROM Places WHERE session_id in 
                    (SELECT s.id FROM Sessions s, Halls h WHERE s.hall_id = ?)""",
                        (id_, ))
                    base.execute("""DELETE FROM Sessions WHERE hall_id = ?""",
                                 (id_, ))
                    base.execute("""DELETE FROM Halls WHERE id = ?""", (id_, ))
                self.update_()
Ejemplo n.º 4
0
    def edit(self, id_: int) -> None:
        """
        Изменение сессии

        :param id_: номер изменяемого объекта
        :return: Эта функция ничего не возвращает
        """
        dialog = FormSession(
            'Изменение сеанса',
            *get_data_base(
                self.path_base_file,
                """SELECT title, date, time, duration FROM Sessions WHERE id = ?""",
                (id_, ))[0])
        if dialog.exec_() == QDialog.Accepted:
            with get_base(self.path_base_file, True) as base:
                base.execute(
                    """
                UPDATE Sessions SET title = ?, date = ?, time = ?, duration = ?, price = ? WHERE id = ?""",
                    (dialog.title.text(),
                     dialog.date.dateTime().toString('dd.MM.yyyy'),
                     dialog.time.dateTime().toString('HH:mm'),
                     dialog.duration.dateTime().toString('HH:mm'),
                     dialog.price.value(), id_))
            self.update_()
        dialog.deleteLater()
Ejemplo n.º 5
0
    def new_hall(self) -> None:
        """
        Добавление в базу данных нового зала с проверкой на название
        (Не может быть несколько залов с одинаковым названием)

        :return: Эта функция ничего не возвращает
        """
        dialog = FormHall('Добавление зала')
        if dialog.exec_() == QDialog.Accepted:
            with get_base(self.path_base_file, True) as base:
                count = int(
                    get_data_base(
                        self.path_base_file,
                        """SELECT COUNT(*) FROM Halls WHERE title = ? AND id = ?""",
                        (dialog.title.text(), self.cinema_id))[0][0])
                if count == 0:
                    base.execute(
                        """INSERT INTO Halls (id, title, cinema_id, rows, places_row) 
                                    VALUES ((SELECT id FROM Halls ORDER BY id DESC LIMIT 1) + 1, ?, ?, ?, ?);
                                    """,
                        (dialog.title.text(), self.cinema_id,
                         dialog.rows.value(), dialog.places_row.value()))
                else:
                    error_message = Message(
                        title_window='Ошибка!',
                        text=f'Зал с таким названием уже есть!',
                        informative_text='Введите другое название.')
                    error_message.exec()
                    self.new_hall()
            self.update_()
        dialog.deleteLater()
Ejemplo n.º 6
0
    def new_cinema(self) -> None:
        """
        Добавление в базу данных нового кинотеатра с проверкой на название
        (Не может быть несколько кинотеатров с одинаковым названием)

        :return: Эта функция ничего не возвращает
        """
        dialog = FormCinema('Добавление кинотеатра')
        if dialog.exec_() == QDialog.Accepted:
            with get_base(self.path_base_file, True) as base:
                count = int(
                    get_data_base(
                        self.path_base_file,
                        """SELECT COUNT(*) FROM Cinemas WHERE title = ?""",
                        (dialog.title.text(), ))[0][0])
                if count == 0:
                    base.execute(
                        """
                    INSERT INTO Cinemas (id, title) VALUES ((SELECT id FROM Cinemas ORDER BY id DESC LIMIT 1) + 1, ?);
                    """, (dialog.title.text(), ))
                else:
                    error_message = Message(
                        title_window='Ошибка!',
                        text=f'Кинотеатр с таким названием уже есть!',
                        informative_text='Введите другое название.')
                    error_message.exec()
                    self.new_cinema()
            self.update_()
        dialog.deleteLater()
Ejemplo n.º 7
0
    def new_session(self) -> None:
        """
        Добавление в базу данных нового сеанса с проверкой на валидность времени
        (Сеансы в одном зале не могут идти одновременно)
        В настройках указано время на уборку зала. Это время тоже учитывается.
        По умолчанию 30 минут.

        :return: Эта функция ничего не возвращает
        """
        dialog = FormSession('Добавление сеанса')
        if dialog.exec_() == QDialog.Accepted:
            with get_base(self.path_base_file, True) as base:
                date_inp = dialog.date.dateTime().toString('dd.MM.yyyy')
                time_inp = dialog.time.dateTime().toString('HH:mm')
                duration_inp = dialog.duration.dateTime().toString('HH:mm')
                #
                inp_start = datetime.datetime(
                    *reversed(list(map(int, date_inp.split('.')))),
                    *list(map(int, time_inp.split(':'))))
                # Время сеанса с учётом уборки в зале
                h, m = map(int, duration_inp.split(':'))
                inp_finish = inp_start + datetime.timedelta(
                    hours=h, minutes=m + time_restart_session)
                #
                list_time = get_data_base(
                    self.path_base_file,
                    f"""SELECT date, time, duration FROM Sessions WHERE hall_id = ?""",
                    (self.hall_id, ))
                for date, time, duration in list_time:
                    h, m = map(int, duration.split(':'))
                    start = datetime.datetime(
                        *reversed(list(map(int, date.split('.')))),
                        *list(map(int, time.split(':'))))
                    finish = start + datetime.timedelta(hours=h, minutes=m)
                    if start <= inp_start <= finish or start <= inp_finish <= finish:
                        error_message = Message(
                            title_window='Ошибка!',
                            text=f'Сеанс пересекается с другим сеансом!')
                        error_message.exec()
                        self.new_session()
                        return
                base.execute(
                    """
                                INSERT INTO Sessions (id, title, hall_id, date, time, duration, price)
                                VALUES ((SELECT id FROM Sessions ORDER BY id DESC LIMIT 1) + 1, ?, ?, ?, ?, ?, ?);
                                """,
                    (dialog.title.text(), self.hall_id, date_inp, time_inp,
                     duration_inp, dialog.price.value()))
            self.update_()
        dialog.deleteLater()
Ejemplo n.º 8
0
    def edit(self, id_: int) -> None:
        """
        Изменение кинотеатра

        :param id_: номер изменяемого объекта
        :return: Эта функция ничего не возвращает
        """
        dialog = FormCinema(
            'Изменение кинотеатра',
            get_data_base(self.path_base_file,
                          """SELECT title FROM Cinemas WHERE id = ?""",
                          (id_, ))[0][0])
        if dialog.exec_() == QDialog.Accepted:
            with get_base(self.path_base_file, True) as base:
                base.execute("""UPDATE Cinemas SET title = ? WHERE id = ?""",
                             (dialog.title.text(), id_))
            self.update_()
        dialog.deleteLater()
Ejemplo n.º 9
0
    def edit(self, id_: int) -> None:
        """
        Изменение зала

        :param id_: номер изменяемого объекта
        :return: Эта функция ничего не возвращает
        """
        dialog = FormHall(
            'Изменение зала',
            *get_data_base(
                self.path_base_file,
                """SELECT title, rows, places_row FROM Halls WHERE id = ?""",
                (id_, ))[0])
        if dialog.exec_() == QDialog.Accepted:
            with get_base(self.path_base_file, True) as base:
                base.execute(
                    """UPDATE Halls SET title = ?, rows = ?, places_row = ? WHERE id = ?""",
                    (dialog.title.text(), dialog.rows.value(),
                     dialog.places_row.value(), id_))
            self.update_()
        dialog.deleteLater()