From 167fb71fa7672e76881fa19373c3d9f2f66ced45 Mon Sep 17 00:00:00 2001
From: MarynaHnidak <31821297+MarynaHnidak@users.noreply.github.com>
Date: Sat, 30 May 2020 11:13:25 +0300
Subject: [PATCH 1/3] Add files via upload
---
Workshop 3/404.html | 10 +++++++
Workshop 3/dish.html | 22 +++++++++++++++
Workshop 3/distionaries.py | 13 +++++++++
Workshop 3/index.html | 13 +++++++++
Workshop 3/main.py | 56 ++++++++++++++++++++++++++++++++++++++
Workshop 3/show.html | 20 ++++++++++++++
Workshop 3/user.html | 31 +++++++++++++++++++++
7 files changed, 165 insertions(+)
create mode 100644 Workshop 3/404.html
create mode 100644 Workshop 3/dish.html
create mode 100644 Workshop 3/distionaries.py
create mode 100644 Workshop 3/index.html
create mode 100644 Workshop 3/main.py
create mode 100644 Workshop 3/show.html
create mode 100644 Workshop 3/user.html
diff --git a/Workshop 3/404.html b/Workshop 3/404.html
new file mode 100644
index 0000000..0688409
--- /dev/null
+++ b/Workshop 3/404.html
@@ -0,0 +1,10 @@
+
+
+
+
+ 404
+
+
+Page Or action is not found
+
+
diff --git a/Workshop 3/dish.html b/Workshop 3/dish.html
new file mode 100644
index 0000000..8ae2750
--- /dev/null
+++ b/Workshop 3/dish.html
@@ -0,0 +1,22 @@
+
+
+
+
+ Dish
+
+
+ Dish info
+
+
+
+
diff --git a/Workshop 3/distionaries.py b/Workshop 3/distionaries.py
new file mode 100644
index 0000000..1478321
--- /dev/null
+++ b/Workshop 3/distionaries.py
@@ -0,0 +1,13 @@
+dishct = {
+ "name": "Caesar salsd
+ "ingrigients":"...."
+ "create_time": "15 minutes"
+}
+
+user_dict = {
+ "fullname" : "Maryna Hnidak
+ "email" : "catanddog3107@gmail.com
+ "registration": "01.01.2000",
+ "id": "1000000001",
+ "login" : "useradmin"
+}
diff --git a/Workshop 3/index.html b/Workshop 3/index.html
new file mode 100644
index 0000000..e850747
--- /dev/null
+++ b/Workshop 3/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ Home
+
+
+Hello, try use in url some of command
+/book
+/user
+/all
+
+
diff --git a/Workshop 3/main.py b/Workshop 3/main.py
new file mode 100644
index 0000000..3149a5f
--- /dev/null
+++ b/Workshop 3/main.py
@@ -0,0 +1,56 @@
+from flask import Flask, render_template,redirect, request, url_for
+from distionaries import user_dict, book_dict
+
+app = Flask(__name__)
+
+
+@app.route('/')
+def home():
+ return render_template('index.html')
+
+
+@app.route('//')
+def api_action(action):
+ if action == "book":
+ return render_template('book.html', book=book_dict)
+ elif action == "user":
+ return render_template('user.html', user=user_dict)
+ elif action == "all":
+ return render_template('show.html', book=book_dict, user=user_dict)
+ else:
+ return render_template('404.html')
+
+
+@app.route('/book', methods=['GET', 'POST'] )
+def api_book():
+ if request.method == "POST":
+ book_dict['name'] = request.form['name']
+ book_dict['url'] = request.form['url']
+ book_dict['create_time'] = request.form['create_time']
+ book_dict['author'] = request.form['author']
+ return redirect(url_for('api_action', action='all'))
+ else:
+ return redirect(url_for('api_action', action='book'))
+
+
+@app.route('/user', methods=['GET', 'POST'])
+def api_user():
+ if request.method == "POST":
+ user_dict['fullname'] = request.form['fname']
+ user_dict['email'] = request.form['email']
+ user_dict['registration'] = request.form['rgstr']
+ user_dict['id'] = request.form['id']
+ user_dict['login'] = request.form['login']
+ user_dict['book_amount'] = request.form['amount']
+ return redirect(url_for('api_action', action='all'))
+ else:
+ return redirect(url_for('api_action', action='user'))
+
+
+@app.errorhandler(404)
+def page404(error):
+ return render_template("404.html")
+
+
+if __name__ == '__main__':
+ app.run()
diff --git a/Workshop 3/show.html b/Workshop 3/show.html
new file mode 100644
index 0000000..7c9bbb0
--- /dev/null
+++ b/Workshop 3/show.html
@@ -0,0 +1,20 @@
+
+
+
+
+ ALL
+
+
+
+User info
+ {{ user['fullname'] }}
+ {{ user['email'] }}
+ {{ user['registration'] }}
+ {{ user['id'] }}
+ {{ user['login'] }}
+Dish info
+ {{ dish['name'] }}
+ {{ dish['ingridients'] }}
+ {{ dish['create_time'] }}
+
+
diff --git a/Workshop 3/user.html b/Workshop 3/user.html
new file mode 100644
index 0000000..4a03b79
--- /dev/null
+++ b/Workshop 3/user.html
@@ -0,0 +1,31 @@
+!DOCTYPE html>
+
+
+
+ User
+
+
+ User info
+
+
+
+
From c2f4fcff8c5482c8b523dc2e839e0728fe5df574 Mon Sep 17 00:00:00 2001
From: MarynaHnidak <31821297+MarynaHnidak@users.noreply.github.com>
Date: Sat, 30 May 2020 22:42:12 +0300
Subject: [PATCH 2/3] Add files via upload
---
Workshop4/DB_constraints.sql | 23 +++++
Workshop4/DB_triggers.sql | 168 +++++++++++++++++++++++++++++++++++
Workshop4/OracleDb.py | 72 +++++++++++++++
Workshop4/credentials.py | 20 +++++
Workshop4/model.py | 101 +++++++++++++++++++++
Workshop4/populate.py | 23 +++++
6 files changed, 407 insertions(+)
create mode 100644 Workshop4/DB_constraints.sql
create mode 100644 Workshop4/DB_triggers.sql
create mode 100644 Workshop4/OracleDb.py
create mode 100644 Workshop4/credentials.py
create mode 100644 Workshop4/model.py
create mode 100644 Workshop4/populate.py
diff --git a/Workshop4/DB_constraints.sql b/Workshop4/DB_constraints.sql
new file mode 100644
index 0000000..91b6550
--- /dev/null
+++ b/Workshop4/DB_constraints.sql
@@ -0,0 +1,23 @@
+/*
+ This block contains constraint creation,
+ such as FOREIGN KEYs, CHECKs etc.
+*/
+ALTER TABLE orders
+ADD CONSTRAINT check_orders_price
+CHECK (price > 0);
+
+ALTER TABLE comments
+ADD CONSTRAINT check_comment_rate
+CHECK (film_rate > 0);
+
+ALTER TABLE app_user
+ADD CONSTRAINT check_user_num
+CHECK (orders_num > 0);
+
+ALTER TABLE dish
+ADD CONSTRAINT check_dish_num
+CHECK (orders_num > 0);
+
+/*
+ ENDBLOCK
+*/
diff --git a/Workshop4/DB_triggers.sql b/Workshop4/DB_triggers.sql
new file mode 100644
index 0000000..d5fa14d
--- /dev/null
+++ b/Workshop4/DB_triggers.sql
@@ -0,0 +1,168 @@
+/*
+ This block dedicated to triggers
+*/
+/*
+ This sub-block contains group of triggers
+ that auto-generate ids for whole group of tables
+*/
+/*Comment table validation*/
+
+CREATE SEQUENCE pk1_seq
+ MINVALUE 1
+ START WITH 1
+ INCREMENT BY 1
+ CACHE 20;
+
+CREATE OR REPLACE TRIGGER pk_comment_id
+BEFORE INSERT ON comments
+FOR EACH ROW
+WHEN ( new.comment_id IS NULL )
+BEGIN
+ :new.comment_id := pk1_seq.nextval;
+END;
+/
+/*App_user table validation*/
+
+CREATE SEQUENCE pk2_seq
+ MINVALUE 1
+ START WITH 1
+ INCREMENT BY 1
+ CACHE 20;
+
+CREATE OR REPLACE TRIGGER user_id_trigg
+BEFORE INSERT ON app_user
+FOR EACH ROW
+WHEN ( new.user_id IS NULL )
+BEGIN
+ :new.user_id := pk2_seq.nextval;
+ IF :new.user_age < 0
+ THEN
+ raise_application_error(-20015,'User age is not valid!');
+ END IF;
+ IF :new.user_mail NOT LIKE '%@%.%'
+ THEN
+ raise_application_error(-20001,'User mail is not valid!');
+ END IF;
+ IF :new.user_phone NOT LIKE '+%'
+ THEN
+ raise_application_error(-20003,'User phone number is not valid!');
+ END IF;
+ IF (LENGTH(TRIM(:new.user_bank)) > 19 OR LENGTH(TRIM(:new.user_bank)) < 13)
+ THEN
+ raise_application_error(-20004,'User bank number is not valid!');
+ END IF;
+END;
+/
+
+
+/*Films table validation*/
+CREATE SEQUENCE pk6_seq
+ MINVALUE 1
+ START WITH 1
+ INCREMENT BY 1
+ CACHE 20;
+
+CREATE OR REPLACE TRIGGER pk_dish_id
+BEFORE INSERT ON dishes
+FOR EACH ROW
+WHEN ( new.dishes_id IS NULL )
+BEGIN
+ :new.dish_id := pk6_seq.nextval;
+END;
+/
+
+/*Snack table validation*/
+CREATE SEQUENCE pk7_seq
+ MINVALUE 1
+ START WITH 1
+ INCREMENT BY 1
+ CACHE 20;
+
+CREATE OR REPLACE TRIGGER pk_snack_id
+BEFORE INSERT ON snack
+FOR EACH ROW
+WHEN ( new.snack_id IS NULL )
+BEGIN
+ :new.snack_id := pk7_seq.nextval;
+END;
+/
+/*Orders table validation*/
+
+CREATE SEQUENCE pk3_seq
+ MINVALUE 1
+ START WITH 1
+ INCREMENT BY 1
+ CACHE 20;
+
+CREATE OR REPLACE TRIGGER order_trigg
+BEFORE INSERT ON orders
+FOR EACH ROW
+WHEN ( new.order_id IS NULL )
+BEGIN
+ /*Updating number of orders while insert*/
+ UPDATE app_user
+ SET orders_num = (SELECT orders_num
+ FROM app_user
+ WHERE user_id = :new.user_id) + 1
+ WHERE user_id = :new.user_id;
+ UPDATE dishes
+ SET orders_num = (SELECT orders_num
+ FROM dishes
+ WHERE dish_id = :new.dish_id) + 1
+ WHERE diah_id = :new.film_id;
+
+ IF :new.snack_id IS NOT NULL
+ THEN
+ UPDATE snack
+ SET orders_num = (SELECT orders_num
+ FROM snack
+ WHERE snack_id = :new.snack_id) + 1
+ WHERE snack_id = :new.snack_id;
+ END IF;
+ :new.order_id := pk3_seq.nextval;
+END;
+/
+
+/*Ticket table validation*/
+CREATE SEQUENCE pk4_seq
+ MINVALUE 1
+ START WITH 1
+ INCREMENT BY 1
+ CACHE 20;
+
+
+CREATE OR REPLACE TRIGGER us_age
+BEFORE INSERT ON orders
+FOR EACH ROW
+DECLARE
+ us_ag NUMBER(38,0);
+ v_age NUMBER(38,0);
+BEGIN
+ SELECT user_age INTO us_ag FROM app_user WHERE user_id = :new.user_id;
+ SELECT age_constraint INTO v_age FROM films WHERE film_id = :new.film_id;
+ IF (us_ag < v_age)
+ THEN raise_application_error(-20010,'User age is not valid');
+ END IF;
+END;
+/
+
+CREATE OR REPLACE TRIGGER user_age_apdate
+BEFORE UPDATE ON app_user
+FOR EACH ROW
+BEGIN
+ IF :old.user_age < :new.user_age
+ THEN
+ raise_application_error(-20011,'User age cant be changed');
+ END IF;
+END;
+/
+/*
+ END SUB-BLOCK
+*/
+
+/*
+ ANOUTHER SUB-BLOCKS IN PROGRESS
+*/
+/*
+ ENDBLOCK
+*/
diff --git a/Workshop4/OracleDb.py b/Workshop4/OracleDb.py
new file mode 100644
index 0000000..81d7ef5
--- /dev/null
+++ b/Workshop4/OracleDb.py
@@ -0,0 +1,72 @@
+import cx_Oracle
+import datetime
+from credentials import *
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+
+
+class OracleDb(object):
+ _instance = None
+
+ def __new__(cls):
+ if cls._instance is None:
+ cls._instance = object.__new__(cls)
+ try:
+ connection = cx_Oracle.connect(username, password, databaseName)
+ cursor = connection.cursor()
+
+ # execute a statement
+ cursor.execute('SELECT * FROM v$version')
+
+ # display the PostgreSQL database server version
+ db_version = cursor.fetchone()
+ print("New connection to {} created".format(db_version[0]))
+ oracle_connection_string = 'oracle+cx_oracle://{username}:{password}@{host}:{port}/{sid}'
+ engine = create_engine(oracle_connection_string.format(username="PMA_KM_20", password="oracle_2", sid="XE", host="localhost", port="1521", database="PMA_KM_20"))
+
+ Session = sessionmaker(bind=engine)
+ session = Session()
+
+ OracleDb._instance.sqlalchemy_session = session
+ OracleDb._instance.sqlalchemy_engine = engine
+ OracleDb._instance.connection = connection
+ OracleDb._instance.cursor = cursor
+
+ except Exception as error:
+ print('Error: connection not established {}'.format(error))
+
+ return cls._instance
+
+ def __init__(self):
+ oracle_connection_string = 'oracle+cx_oracle://{username}:{password}@{host}:{port}/{sid}'
+ engine = create_engine(oracle_connection_string.format(username=username, password=password, sid=service_name, host=ip, port=port, database=databaseName))
+
+ Session = sessionmaker(bind=engine)
+ session = Session()
+
+ self.sqlalchemy_session = session
+ self.sqlalchemy_engine = engine
+ self.connection = self._instance.connection
+ self.cursor = self._instance.cursor
+
+ def execute(self, query):
+ '''
+ Функція, що дозволяє робити
+ запити з бд
+ '''
+ try:
+ result = self.cursor.execute(query)
+ self.connection.commit()
+ except Exception as error:
+ print('error execting query "{}", error: {}'.format(query, error))
+ return None
+ else:
+ return result
+
+ def __del__(self):
+ self.sqlalchemy_session.close()
+
+
+if __name__ == "__main__":
+ # створюємо екземпляр класу ОраклДб
+ db = OracleDb()
diff --git a/Workshop4/credentials.py b/Workshop4/credentials.py
new file mode 100644
index 0000000..fce2d7c
--- /dev/null
+++ b/Workshop4/credentials.py
@@ -0,0 +1,20 @@
+import cx_Oracle
+
+username = 'PMA_KM_20'
+password = 'oracle_2'
+ip = 'localhost'
+port = 1521
+service_name = 'XE'
+dsn = cx_Oracle.makedsn(ip, port, service_name=service_name)
+databaseName = dsn
+
+DIALECT = 'oracle'
+SQL_DRIVER = 'cx_oracle'
+USERNAME = 'PMA_KM_20'
+PASSWORD = 'oracle_2'
+
+HOST = 'localhost'
+PORT = 1521
+SERVICE = 'orcl'
+
+ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE
diff --git a/Workshop4/model.py b/Workshop4/model.py
new file mode 100644
index 0000000..940c4aa
--- /dev/null
+++ b/Workshop4/model.py
@@ -0,0 +1,101 @@
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import Column, Integer, String, Date, DateTime, ForeignKey, Table, insert, select, and_
+from sqlalchemy.orm import relationship
+from OracleDb import *
+
+Base = declarative_base()
+db = OracleDb()
+
+
+class app_user(Base):
+ __tablename__ = 'app_user'
+ user_id = Column(Integer, primary_key=True)
+ user_name = Column(String(30), nullable=False)
+ user_age = Column(Integer, nullable=False)
+ user_phone = Column(String(30), unique=True)
+ user_mail = Column(String(30), unique=True)
+ user_bank = Column(Integer, unique=True)
+ orders_num = Column(Integer, nullable=False)
+
+ @classmethod
+ def add_member(self, name, age, phone, mail, bank, orders_num, new_id=None):
+ db = OracleDb()
+ session = db.sqlalchemy_session
+ new_user = app_user(user_id=new_id,
+ user_name=name,
+ user_age=age,
+ user_phone=phone,
+ user_mail=mail,
+ user_bank=bank,
+ orders_num=orders_num)
+ session.add(new_user)
+ session.commit()
+
+
+class orders(Base):
+ __tablename__ = 'orders'
+ order_id = Column(Integer, primary_key=True)
+ user_id = Column(Integer, ForeignKey('app_user.user_id'), nullable=False)
+ dish_id = Column(Integer, ForeignKey('dishes.dish_id'), nullable=False)
+ price = Column(Integer, nullable=False)
+
+ @classmethod
+ def add_member(self, dish_name, phone, new_id=None, price=None):
+ db = OracleDb()
+ session = db.sqlalchemy_session
+
+ ids = session.query(films).filter(dishes.dish_name == dish_name)
+ id_dish = [row.dish_id for row in ids][0]
+ idu = session.query(app_user).filter(app_user.user_phone == phone)
+ id_user = [row.user_id for row in idu][0]
+ new_order = orders(order_id=new_id,
+ user_id=id_user,
+ dish_id=id_dish,
+ price=(dish_price + snack_price)
+ )
+
+ session.add(new_order)
+ session.commit()
+
+
+class dish(Base):
+ __tablename__ = 'dishes'
+ dish_id = Column(Integer, primary_key=True)
+ dish_name = Column(String(30), nullable=False)
+ dish_description = Column(String(30), nullable=True)
+ dish_rate = Column(Integer, nullable=True)
+ orders_num = Column(Integer, nullable=False)
+
+ @classmethod
+ def add_member(self, name, orders_num, new_id=None, description=None, rate=None):
+ db = OracleDb()
+ session = db.sqlalchemy_session
+ new_dish = dishes(dish_id=new_id,
+ dish_name=name,
+ dish_description=description,
+ dish_rate=rate,
+ orders_num=orders_num)
+ session.add(new_film)
+ session.commit()
+
+
+class comments(Base):
+ __tablename__ = 'comments'
+ comment_id = Column(Integer, primary_key=True)
+ film = Column(String(30), nullable=False)
+ comment_text = Column(String(30), nullable=False)
+ film_rate = Column(Integer, nullable=True)
+
+ @classmethod
+ def add_member(self, film, text, new_id=None, rate=None):
+ db = OracleDb()
+ session = db.sqlalchemy_session
+ new_comment = comments(comment_id=new_id,
+ film=film,
+ comment_text=text,
+ film_rate=rate)
+ session.add(new_comment)
+ session.commit()
+
+
+Base.metadata.create_all(db.sqlalchemy_engine)
diff --git a/Workshop4/populate.py b/Workshop4/populate.py
new file mode 100644
index 0000000..722de79
--- /dev/null
+++ b/Workshop4/populate.py
@@ -0,0 +1,23 @@
+import datetime
+import time
+
+from model import *
+from OracleDb import OracleDb
+
+db = OracleDb()
+
+session = db.sqlalchemy_session
+'''
+new_comment = comments.add_member("Pulp Fiction", "Its great!")
+new_dish = dish.add_member('Florencia', '......', 4.5, 100)
+new_user = app_user.add_member(name='Scarab', age=18,
+ phone='+38095323232',
+ age='18',
+ mail='scarab@bdis.com',
+ bank='12234445543333',
+ orders_num=1)
+new_order = orders.add_member(dish_name='AAAAAA',
+ phone='+38095323232',
+
+'''
+session.commit()
From a54c42692e8f1ec87326c9b0b6b4a01afad32854 Mon Sep 17 00:00:00 2001
From: MarynaHnidak <31821297+MarynaHnidak@users.noreply.github.com>
Date: Sat, 30 May 2020 23:21:56 +0300
Subject: [PATCH 3/3] Add files via upload
---
Proect/DB_constraints.sql | 23 ++
Proect/DB_triggers.sql | 168 +++++++++++
Proect/OracleDb.py | 72 +++++
Proect/credentials.py | 20 ++
Proect/menu.py | 590 ++++++++++++++++++++++++++++++++++++++
Proect/model.py | 101 +++++++
Proect/populate.py | 23 ++
7 files changed, 997 insertions(+)
create mode 100644 Proect/DB_constraints.sql
create mode 100644 Proect/DB_triggers.sql
create mode 100644 Proect/OracleDb.py
create mode 100644 Proect/credentials.py
create mode 100644 Proect/menu.py
create mode 100644 Proect/model.py
create mode 100644 Proect/populate.py
diff --git a/Proect/DB_constraints.sql b/Proect/DB_constraints.sql
new file mode 100644
index 0000000..91b6550
--- /dev/null
+++ b/Proect/DB_constraints.sql
@@ -0,0 +1,23 @@
+/*
+ This block contains constraint creation,
+ such as FOREIGN KEYs, CHECKs etc.
+*/
+ALTER TABLE orders
+ADD CONSTRAINT check_orders_price
+CHECK (price > 0);
+
+ALTER TABLE comments
+ADD CONSTRAINT check_comment_rate
+CHECK (film_rate > 0);
+
+ALTER TABLE app_user
+ADD CONSTRAINT check_user_num
+CHECK (orders_num > 0);
+
+ALTER TABLE dish
+ADD CONSTRAINT check_dish_num
+CHECK (orders_num > 0);
+
+/*
+ ENDBLOCK
+*/
diff --git a/Proect/DB_triggers.sql b/Proect/DB_triggers.sql
new file mode 100644
index 0000000..d5fa14d
--- /dev/null
+++ b/Proect/DB_triggers.sql
@@ -0,0 +1,168 @@
+/*
+ This block dedicated to triggers
+*/
+/*
+ This sub-block contains group of triggers
+ that auto-generate ids for whole group of tables
+*/
+/*Comment table validation*/
+
+CREATE SEQUENCE pk1_seq
+ MINVALUE 1
+ START WITH 1
+ INCREMENT BY 1
+ CACHE 20;
+
+CREATE OR REPLACE TRIGGER pk_comment_id
+BEFORE INSERT ON comments
+FOR EACH ROW
+WHEN ( new.comment_id IS NULL )
+BEGIN
+ :new.comment_id := pk1_seq.nextval;
+END;
+/
+/*App_user table validation*/
+
+CREATE SEQUENCE pk2_seq
+ MINVALUE 1
+ START WITH 1
+ INCREMENT BY 1
+ CACHE 20;
+
+CREATE OR REPLACE TRIGGER user_id_trigg
+BEFORE INSERT ON app_user
+FOR EACH ROW
+WHEN ( new.user_id IS NULL )
+BEGIN
+ :new.user_id := pk2_seq.nextval;
+ IF :new.user_age < 0
+ THEN
+ raise_application_error(-20015,'User age is not valid!');
+ END IF;
+ IF :new.user_mail NOT LIKE '%@%.%'
+ THEN
+ raise_application_error(-20001,'User mail is not valid!');
+ END IF;
+ IF :new.user_phone NOT LIKE '+%'
+ THEN
+ raise_application_error(-20003,'User phone number is not valid!');
+ END IF;
+ IF (LENGTH(TRIM(:new.user_bank)) > 19 OR LENGTH(TRIM(:new.user_bank)) < 13)
+ THEN
+ raise_application_error(-20004,'User bank number is not valid!');
+ END IF;
+END;
+/
+
+
+/*Films table validation*/
+CREATE SEQUENCE pk6_seq
+ MINVALUE 1
+ START WITH 1
+ INCREMENT BY 1
+ CACHE 20;
+
+CREATE OR REPLACE TRIGGER pk_dish_id
+BEFORE INSERT ON dishes
+FOR EACH ROW
+WHEN ( new.dishes_id IS NULL )
+BEGIN
+ :new.dish_id := pk6_seq.nextval;
+END;
+/
+
+/*Snack table validation*/
+CREATE SEQUENCE pk7_seq
+ MINVALUE 1
+ START WITH 1
+ INCREMENT BY 1
+ CACHE 20;
+
+CREATE OR REPLACE TRIGGER pk_snack_id
+BEFORE INSERT ON snack
+FOR EACH ROW
+WHEN ( new.snack_id IS NULL )
+BEGIN
+ :new.snack_id := pk7_seq.nextval;
+END;
+/
+/*Orders table validation*/
+
+CREATE SEQUENCE pk3_seq
+ MINVALUE 1
+ START WITH 1
+ INCREMENT BY 1
+ CACHE 20;
+
+CREATE OR REPLACE TRIGGER order_trigg
+BEFORE INSERT ON orders
+FOR EACH ROW
+WHEN ( new.order_id IS NULL )
+BEGIN
+ /*Updating number of orders while insert*/
+ UPDATE app_user
+ SET orders_num = (SELECT orders_num
+ FROM app_user
+ WHERE user_id = :new.user_id) + 1
+ WHERE user_id = :new.user_id;
+ UPDATE dishes
+ SET orders_num = (SELECT orders_num
+ FROM dishes
+ WHERE dish_id = :new.dish_id) + 1
+ WHERE diah_id = :new.film_id;
+
+ IF :new.snack_id IS NOT NULL
+ THEN
+ UPDATE snack
+ SET orders_num = (SELECT orders_num
+ FROM snack
+ WHERE snack_id = :new.snack_id) + 1
+ WHERE snack_id = :new.snack_id;
+ END IF;
+ :new.order_id := pk3_seq.nextval;
+END;
+/
+
+/*Ticket table validation*/
+CREATE SEQUENCE pk4_seq
+ MINVALUE 1
+ START WITH 1
+ INCREMENT BY 1
+ CACHE 20;
+
+
+CREATE OR REPLACE TRIGGER us_age
+BEFORE INSERT ON orders
+FOR EACH ROW
+DECLARE
+ us_ag NUMBER(38,0);
+ v_age NUMBER(38,0);
+BEGIN
+ SELECT user_age INTO us_ag FROM app_user WHERE user_id = :new.user_id;
+ SELECT age_constraint INTO v_age FROM films WHERE film_id = :new.film_id;
+ IF (us_ag < v_age)
+ THEN raise_application_error(-20010,'User age is not valid');
+ END IF;
+END;
+/
+
+CREATE OR REPLACE TRIGGER user_age_apdate
+BEFORE UPDATE ON app_user
+FOR EACH ROW
+BEGIN
+ IF :old.user_age < :new.user_age
+ THEN
+ raise_application_error(-20011,'User age cant be changed');
+ END IF;
+END;
+/
+/*
+ END SUB-BLOCK
+*/
+
+/*
+ ANOUTHER SUB-BLOCKS IN PROGRESS
+*/
+/*
+ ENDBLOCK
+*/
diff --git a/Proect/OracleDb.py b/Proect/OracleDb.py
new file mode 100644
index 0000000..81d7ef5
--- /dev/null
+++ b/Proect/OracleDb.py
@@ -0,0 +1,72 @@
+import cx_Oracle
+import datetime
+from credentials import *
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+
+
+class OracleDb(object):
+ _instance = None
+
+ def __new__(cls):
+ if cls._instance is None:
+ cls._instance = object.__new__(cls)
+ try:
+ connection = cx_Oracle.connect(username, password, databaseName)
+ cursor = connection.cursor()
+
+ # execute a statement
+ cursor.execute('SELECT * FROM v$version')
+
+ # display the PostgreSQL database server version
+ db_version = cursor.fetchone()
+ print("New connection to {} created".format(db_version[0]))
+ oracle_connection_string = 'oracle+cx_oracle://{username}:{password}@{host}:{port}/{sid}'
+ engine = create_engine(oracle_connection_string.format(username="PMA_KM_20", password="oracle_2", sid="XE", host="localhost", port="1521", database="PMA_KM_20"))
+
+ Session = sessionmaker(bind=engine)
+ session = Session()
+
+ OracleDb._instance.sqlalchemy_session = session
+ OracleDb._instance.sqlalchemy_engine = engine
+ OracleDb._instance.connection = connection
+ OracleDb._instance.cursor = cursor
+
+ except Exception as error:
+ print('Error: connection not established {}'.format(error))
+
+ return cls._instance
+
+ def __init__(self):
+ oracle_connection_string = 'oracle+cx_oracle://{username}:{password}@{host}:{port}/{sid}'
+ engine = create_engine(oracle_connection_string.format(username=username, password=password, sid=service_name, host=ip, port=port, database=databaseName))
+
+ Session = sessionmaker(bind=engine)
+ session = Session()
+
+ self.sqlalchemy_session = session
+ self.sqlalchemy_engine = engine
+ self.connection = self._instance.connection
+ self.cursor = self._instance.cursor
+
+ def execute(self, query):
+ '''
+ Функція, що дозволяє робити
+ запити з бд
+ '''
+ try:
+ result = self.cursor.execute(query)
+ self.connection.commit()
+ except Exception as error:
+ print('error execting query "{}", error: {}'.format(query, error))
+ return None
+ else:
+ return result
+
+ def __del__(self):
+ self.sqlalchemy_session.close()
+
+
+if __name__ == "__main__":
+ # створюємо екземпляр класу ОраклДб
+ db = OracleDb()
diff --git a/Proect/credentials.py b/Proect/credentials.py
new file mode 100644
index 0000000..fce2d7c
--- /dev/null
+++ b/Proect/credentials.py
@@ -0,0 +1,20 @@
+import cx_Oracle
+
+username = 'PMA_KM_20'
+password = 'oracle_2'
+ip = 'localhost'
+port = 1521
+service_name = 'XE'
+dsn = cx_Oracle.makedsn(ip, port, service_name=service_name)
+databaseName = dsn
+
+DIALECT = 'oracle'
+SQL_DRIVER = 'cx_oracle'
+USERNAME = 'PMA_KM_20'
+PASSWORD = 'oracle_2'
+
+HOST = 'localhost'
+PORT = 1521
+SERVICE = 'orcl'
+
+ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE
diff --git a/Proect/menu.py b/Proect/menu.py
new file mode 100644
index 0000000..bdc7afe
--- /dev/null
+++ b/Proect/menu.py
@@ -0,0 +1,590 @@
+import telebot
+from telebot import types
+
+import config
+
+from model import *
+from user import User
+from order import Order
+from comment import Comment
+from OracleDb import OracleDb
+
+import re
+import datetime
+from datetime import date
+import pandas as pd
+import uuid
+import random
+
+
+bot = telebot.TeleBot(config.TOKEN)
+user = User()
+order = Order()
+comment = Comment()
+db = OracleDb()
+thres = db.execute('SELECT DISTINCT dish_name FROM menu')
+restaurant = [row[0] for row in res]
+mv = db.execute('SELECT DISTINCT dish_name FROM dishes')
+book = [row[0] for row in mv]
+times = ['{}:00'.format(10+i) for i in range(0, 12, 2)]
+sn = db.execute('SELECT snack_name FROM snack')
+snacks = [row[0] for row in sn]
+snacks.append('No thanks')
+
+@bot.message_handler(commands=['start'])
+def welcome(message):
+ msg = bot.send_message(message.chat.id, '''\
+Hi! Welcome to the chat! I am Kafe bot
+Let's complete a few registration steps
+to get started with lanche🎟🎟
+Enter your name👶🏻👧🏻
+''')
+ bot.register_next_step_handler(msg, process_name)
+
+
+@bot.message_handler(commands=['text'])
+def process_name(message):
+ try:
+ user.name = message.text
+ msg = bot.reply_to(message, 'How old are you?')
+ bot.register_next_step_handler(msg, process_age)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+@bot.message_handler(commands=['text'])
+def process_age(message):
+
+ try:
+ age = message.text
+ if not age.isdigit() or int(age) > 100 or int(age) < 0:
+ msg = bot.reply_to(message, 'Age should be a number. How old are you?')
+ bot.register_next_step_handler(msg, process_age)
+ else:
+ user.age = age
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Kyiv', 'Dnipro', 'Odessa', 'Other')
+ msg = bot.reply_to(message, 'What is your city?', reply_markup=markup)
+ bot.register_next_step_handler(msg, process_city)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+@bot.message_handler(commands=['text'])
+def process_city(message):
+ try:
+ city_list = ['Kyiv', 'Dnipro', 'Odessa']
+
+ if (city := message.text) in city_list:
+ user.city = city
+ hideBoard = types.ReplyKeyboardRemove()
+ msg = bot.reply_to(message, 'Now, enter your phone number📱')
+ bot.register_next_step_handler(msg, process_phone)
+ else:
+ bot.send_message(message.chat.id, 'Sorry, we are not support other cities.')
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Kyiv', 'Dnipro', 'Odessa', 'Other')
+ msg = bot.reply_to(message, 'Select one of the variants presented in buttons. What is your city?', reply_markup=markup)
+ bot.register_next_step_handler(msg, process_city)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+@bot.message_handler(commands=['text'])
+def process_phone(message):
+ try:
+ phone = message.text
+ rule = re.compile(r'^\+?3?8?(0\d{9})$')
+ if not re.search(rule, phone):
+ msg = bot.reply_to(message, 'Enter valid phone number📱')
+ bot.register_next_step_handler(msg, process_phone)
+ return
+
+ getter = db.execute("SELECT user_phone FROM app_user WHERE user_phone = {}".format(str(phone)))
+ a = [row[0] for row in getter]
+ if len(a) != 0:
+ if a[0] == phone:
+ bot.send_message(message.chat.id, 'This number is already used!')
+ msg = bot.reply_to(message, 'Enter valid phone number📱')
+ bot.register_next_step_handler(msg, process_phone)
+ return
+
+ user.phone = phone
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Student', 'Not student')
+ msg = bot.reply_to(message, 'And know, enter your status', reply_markup=markup)
+ bot.register_next_step_handler(msg, process_status)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+@bot.message_handler(commands=['text'])
+def process_status(message):
+ try:
+ sts = ['Student', 'Not student']
+ status = message.text
+ if status not in sts:
+ msg = bot.reply_to(message, 'Enter one of variants presented in buttons', reply_markup=markup)
+ bot.register_next_step_handler(msg, process_status)
+ return
+
+ user.status = status
+ msg = bot.reply_to(message, 'And know, enter your email📨')
+ bot.register_next_step_handler(msg, process_email)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+@bot.message_handler(commands=['text'])
+def process_email(message):
+ try:
+ email = message.text
+ rule = re.compile(r'^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$')
+ if not re.search(rule, email):
+ msg = bot.reply_to(message, 'Enter valid email📨')
+ bot.register_next_step_handler(msg, process_phone)
+ return
+
+ user.mail = email
+ msg = bot.reply_to(message, 'Enter bank card number💳, card lenght should be 16 symbols 🗿')
+ bot.register_next_step_handler(msg, process_bank)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+@bot.message_handler(commands=['text'])
+def process_bank(message):
+
+ try:
+ bank = message.text
+ gett = db.execute("SELECT user_bank FROM app_user WHERE user_bank = {}".format(int(bank)))
+ a = [row[0] for row in gett]
+ if len(a) != 0:
+ if a[0] == int(bank):
+ bot.send_message(message.chat.id, 'This number is already used!')
+ msg = bot.reply_to(message, 'Enter valid bank number💳')
+ bot.register_next_step_handler(msg, process_bank)
+ elif len(bank) != 16 or not bank.isdigit():
+ msg = bot.reply_to(message, 'Enter valid bank card number, card lenght should be 16 symbols 🗿')
+ bot.register_next_step_handler(msg, process_bank)
+ return
+ else:
+ user.bank = bank
+ msg = bot.send_message(message.chat.id, 'Nice to meet you ' + user.name)
+
+ new_member = app_user.add_member(name=str(user.name),
+ age=int(user.age),
+ phone=str(user.phone),
+ mail=str(user.mail),
+ bank=int(user.bank),
+ status=str(user.status),
+ city=str(user.city)
+ )
+
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Comments menu🗣', 'Buy dish 📽')
+ bot.send_message(message.chat.id, 'Select one variant to continue.', reply_markup=markup)
+ bot.register_next_step_handler(msg, before_main_block)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+@bot.message_handler(commands=['text'])
+def before_main_block(message):
+
+ try:
+ answer = message.text
+ if answer == 'Comments menu🗣':
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Show 3 random comments🗣', 'Write a comment👀')
+ msg = bot.send_message(message.chat.id, 'Choose one option 🗿', reply_markup=markup)
+ bot.register_next_step_handler(msg, process_comment)
+ elif answer == 'Buy dish📽':
+ markup = types.InlineKeyboardMarkup(row_width=1)
+ for i in theatres:
+ b1 = types.InlineKeyboardButton(i, callback_data=i)
+ markup.add(b1)
+
+ bot.send_message(message.chat.id, 'Cost of dish is equals to 5$🍿📽')
+ bot.send_message(message.chat.id, 'OK, choose one theatre presented in buttons🍿📽', reply_markup=markup)
+
+ else:
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Comments menu🗣', 'Buy dish📽')
+ msg = bot.reply_to(message, 'Select one of the variants presented in buttons🗿', reply_markup=markup)
+ bot.register_next_step_handler(msg, before_main_block)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+def process_comment(message):
+ try:
+ answer = message.text
+ if answer == 'Show 3 random comments🗣':
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ for i in movies:
+ markup.add(i)
+ msg = bot.send_message(message.chat.id, 'Choose movie to display comments 📱', reply_markup=markup)
+ bot.register_next_step_handler(msg, random_comments)
+ elif answer == 'Write a comment👀':
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ for i in movies:
+ markup.add(i)
+ msg = bot.send_message(message.chat.id, 'Choose movie to write a comment 📱', reply_markup=markup)
+ bot.register_next_step_handler(msg, comment_write)
+ else:
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Show 3 random comments🗣', 'Write a comment👀')
+ msg = bot.reply_to(message, 'Select one of the variants presented in buttons🗿', reply_markup=markup)
+ bot.register_next_step_handler(msg, before_main_block)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+def comment_write(message):
+
+ try:
+ if (movie := message.text) in movies:
+ comment.movie = movie
+ msg = bot.send_message(message.chat.id, 'Write a comment I am ready 🗿')
+ bot.register_next_step_handler(msg, new_comment)
+ else:
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ for i in movies:
+ markup.add(i)
+ msg = bot.send_message(message.chat.id, 'Choose movie to display comments 📱', reply_markup=markup)
+ bot.register_next_step_handler(msg, comment_write)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+def new_comment(message):
+
+ try:
+ if (co := message.text):
+ comment.comm = co
+ if len(co) > 30:
+ bot.send_message(message.chat.id, 'Your comment is too long!(max lenght is 30)')
+ msg = bot.send_message(message.chat.id, 'Enter new, I am listening!')
+ bot.register_next_step_handler(msg, new_comment)
+ return
+
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Сomments menu🗣', 'Buy dish')
+ new_comm = comments.add_member(dish=comment.dish,
+ text=comment.comm)
+ msg = bot.send_message(message.chat.id, 'I got it!', reply_markup=markup)
+ bot.register_next_step_handler(msg, before_main_block)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+def random_comments(message):
+
+ try:
+ if (mm := message.text) in movies:
+ m = db.execute("SELECT comment_text FROM comments WHERE dish = '{}'".format(str(mm)))
+ comms = [row[0] for row in m][:3]
+ for i in comms:
+ bot.send_message(message.chat.id, i)
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Comments menu🗣', 'Buy dish')
+ msg = bot.reply_to(message, 'Select one of the variants presented in buttons🗿', reply_markup=markup)
+ bot.register_next_step_handler(msg, before_main_block)
+ else:
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ for i in movies:
+ markup.add(i)
+ msg = bot.send_message(message.chat.id, 'Choose movie to display comments 📱', reply_markup=markup)
+ bot.register_next_step_handler(msg, random_comments)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+@bot.callback_query_handler(func=lambda call: True)
+def processor_of_queries(call):
+ try:
+ base = date.today()
+ dates = [str(base + datetime.timedelta(days=x)) for x in range(1, 6)]
+ thres = db.execute('SELECT DISTINCT restaurant_name FROM restaurant')
+ theatres = [row[0] for row in thres]
+ mv = db.execute('SELECT DISTINCT dish_name FROM dishes')
+ movies = [row[0] for row in mv]
+ times = ['{}:00'.format(10+i) for i in range(0, 12, 2)]
+ seats = ['{}'.format(i+1) for i in range(7)]
+ sn = db.execute('SELECT snack_name FROM snack')
+ snacks = [row[0] for row in sn]
+ snacks.append('No thanks')
+ if (theatre := call.data) in theatres:
+ bot.edit_message_text(chat_id=call.message.chat.id,
+ message_id=call.message.message_id,
+ text='Theatre was choosen!',
+ reply_markup=None)
+ order.theatre = theatre
+
+ markup = types.InlineKeyboardMarkup(row_width=1)
+ for i in movies:
+ b1 = types.InlineKeyboardButton(i, callback_data=i)
+ markup.add(b1)
+
+ bot.send_message(call.message.chat.id, 'OK, choose one movie presented in buttons🍿📽', reply_markup=markup)
+ elif (movie := call.data) in movies:
+
+ phone = user.phone
+ getter = db.execute("SELECT user_age FROM app_user WHERE user_phone = {}".format(str(phone)))
+ us_age = [row[0] for row in getter][0]
+ go_data2 = db.execute("SELECT age_limit FROM dishes WHERE dish_name = '{}'".format(str(movie)))
+ age_lim = [int(row[0]) for row in go_data2][0]
+
+ if us_age < age_lim:
+ bot.send_message(call.message.chat.id, 'You are too young buying that, choose other option')
+ return
+
+ bot.edit_message_text(chat_id=call.message.chat.id,
+ message_id=call.message.message_id,
+ text='Movie was choosen!',
+ reply_markup=None)
+ order.movie = movie
+
+ markup = types.InlineKeyboardMarkup(row_width=3)
+ for i in times:
+ b1 = types.InlineKeyboardButton(i, callback_data=i)
+ markup.add(b1)
+
+ bot.send_message(call.message.chat.id, 'OK, choose visit time🍿📽', reply_markup=markup)
+ elif (time := call.data) in times:
+ bot.edit_message_text(chat_id=call.message.chat.id,
+ message_id=call.message.message_id,
+ text='Time was choosen!',
+ reply_markup=None)
+ order.time = time
+
+ markup = types.InlineKeyboardMarkup(row_width=2)
+ for i in dates:
+ b1 = types.InlineKeyboardButton(i, callback_data=i)
+ markup.add(b1)
+
+ bot.send_message(call.message.chat.id, 'OK, choose visit date🍿📽', reply_markup=markup)
+ elif (date1 := call.data) in dates:
+ bot.edit_message_text(chat_id=call.message.chat.id,
+ message_id=call.message.message_id,
+ text='Date was choosen!',
+ reply_markup=None)
+ order.date = date1
+
+ go_data = db.execute(f" SELECT seat FROM orders INNER JOIN app_user ON orders.user_id = app_user.user_id WHERE datte = '{order.date}' AND time = '{order.time}' AND city ='{user.city}'")
+ taken_seats = [row[0] for row in go_data]
+
+ markup = types.InlineKeyboardMarkup(row_width=7)
+
+ for j in range(7):
+ group = []
+ for i in seats:
+ if '{}-{}'.format(i, j+1) in taken_seats:
+ group.append(types.InlineKeyboardButton('z', callback_data='z'))
+ else:
+ group.append(types.InlineKeyboardButton(str(i), callback_data='{}-{}'.format(i, j+1)))
+ markup.row(*group)
+
+ bot.send_message(call.message.chat.id, 'OK, choose your seat🍿📽(first row is closest to the screen)', reply_markup=markup)
+ elif (seat := call.data)[0] in seats:
+ bot.edit_message_text(chat_id=call.message.chat.id,
+ message_id=call.message.message_id,
+ text='Seat was choosen!',
+ reply_markup=None)
+ order.seat = seat
+ order.price = 5
+
+ markup = types.InlineKeyboardMarkup(row_width=1)
+ for i in snacks:
+ b1 = types.InlineKeyboardButton(i, callback_data=i)
+ markup.add(b1)
+
+ bot.send_message(call.message.chat.id, 'Cost of every snack is equals to 7$')
+ bot.send_message(call.message.chat.id, 'OK, choose snack(if you want)🍿📽', reply_markup=markup)
+ elif (snack := call.data) in snacks:
+ phone = user.phone
+ getter = db.execute("SELECT user_age FROM app_user WHERE user_phone = {}".format(str(phone)))
+ us_age = [row[0] for row in getter][0]
+ go_data2 = db.execute("SELECT age_limit FROM snack WHERE snack_name = '{}'".format(str(snack)))
+ age_lim = [int(row[0]) for row in go_data2]
+
+ if len(age_lim) > 0:
+ if us_age < age_lim[0]:
+ bot.send_message(call.message.chat.id, 'You are too young buying that, choose other option')
+ return
+
+ bot.edit_message_text(chat_id=call.message.chat.id,
+ message_id=call.message.message_id,
+ text='Snack was choosen!',
+ reply_markup=None)
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Pay💸', 'Cancel❌')
+ msg = bot.send_message(call.message.chat.id,
+ 'All data about your order is stored, now choose one of the options🤴',
+ reply_markup=markup)
+
+ if snack != 'No thanks':
+ order.snack = snack
+ order.price = order.price + 7
+ else:
+ order.snack = None
+
+ bot.register_next_step_handler(msg, process_final_step)
+ else:
+ if call.data == 'z':
+ bot.send_message(call.message.chat.id, 'This seat is already taken')
+ return
+ bot.send_message(call.message.chat.id, 'Select one of the variants presented in buttons🗿')
+
+ except Exception as e:
+ bot.send_message(call.message.chat.id, 'Something gone wrong! 🗿')
+
+
+def my_random_string(string_length=12):
+ """
+ Функція для створення секретного коду
+ """
+ random = str(uuid.uuid4())
+ random = random.upper()
+ random = random.replace("-","")
+ return random[0:string_length]
+
+
+@bot.message_handler(commands=['text'])
+def process_final_step(message):
+ try:
+ if message.text == 'Pay💸':
+ order.code = my_random_string()
+ bot.send_message(message.chat.id, 'Thank you for your order!')
+ msg = bot.send_message(message.chat.id, 'To continue, enter your phone number📱')
+ bot.register_next_step_handler(msg, verify_phone)
+ elif message.text == 'Cancel❌':
+ bot.send_message(message.chat.id, 'Thats a pity, but if you want you can order a new dish, or leave a comment.')
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Go to menu👣🍿')
+ msg = bot.send_message(message.chat.id,
+ 'Choose one of presented options🗿',
+ reply_markup=markup)
+ bot.register_next_step_handler(msg, final_control)
+ else:
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Pay💸', 'Cancel❌')
+ msg = bot.send_message(message.chat.id,
+ 'Choose one of presented options🗿',
+ reply_markup=markup)
+ bot.register_next_step_handler(msg, process_final_step)
+ except Exception as e:
+ bot.send_message(message.chat.id, 'Something gone wrong! 🗿')
+
+
+@bot.message_handler(commands=['text'])
+def verify_phone(message):
+ try:
+ phone = message.text
+ rule = re.compile(r'^\+?3?8?(0\d{9})$')
+ if not re.search(rule, phone):
+ msg = bot.reply_to(message, 'Enter valid phone number📱')
+ bot.register_next_step_handler(msg, verify_phone)
+ return
+
+ getter = db.execute("SELECT user_phone FROM app_user WHERE user_phone = '{}'".format(str(phone)))
+ a = [row[0] for row in getter]
+ getter2 = db.execute("SELECT status FROM app_user WHERE user_phone = '{}'".format(str(phone)))
+ b = [row[0] for row in getter2]
+ if len(a) == 0:
+ bot.send_message(message.chat.id, 'This number is not used!')
+ msg = bot.reply_to(message, 'Enter valid phone number📱')
+ bot.register_next_step_handler(msg, process_phone)
+ return
+ if b[0] == 'Student':
+ new_order = orders.add_member(dish=str(order.movie),
+ restaurant=str(order.restaurant),
+ phone=str(a[0]),
+ seat=str(order.seat),
+ date=str(order.date),
+ time=str(order.time),
+ price=int(order.price * 0.5),
+ city=str(user.city))
+ else:
+ new_order = orders.add_member(dish=str(order.movie),
+ restaurant=str(order.restaurant),
+ phone=str(a[0]),
+ seat=str(order.seat),
+ date=str(order.date),
+ time=str(order.time),
+ price=int(order.price),
+ city=str(user.city))
+ bot.send_message(message.chat.id, 'Your secret code is: {}'.format(order.code))
+ bot.send_message(message.chat.id, 'If you want you can buy a new
+ et or write a comment.')
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Go to menu👣🍿')
+ msg = bot.send_message(message.chat.id, 'Choose one of presented options🗿',
+ reply_markup=markup)
+ bot.register_next_step_handler(msg, final_control)
+ except Exception as e:
+ bot.reply_to(message, 'Something gone wrong! 🗿')
+
+
+@bot.message_handler(commands=['text'])
+def final_control(message):
+
+ try:
+ if message.text == 'Go to menu👣🍿':
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Comments menu🗣', 'Buy dish📽')
+ msg = bot.send_message(message.chat.id, 'Select one variant to continue.', reply_markup=markup)
+ bot.register_next_step_handler(msg, before_main_block)
+ else:
+ markup = types.ReplyKeyboardMarkup(one_time_keyboard=True,
+ resize_keyboard=True,
+ selective=True)
+ markup.add('Go to menu👣🍿')
+ msg = bot.send_message(message.chat.id,
+ 'Choose one button🗿',
+ reply_markup=markup)
+ bot.register_next_step_handler(msg, final_conrol)
+ except Exception as e:
+ bot.send_message(message.chat.id, 'Something gone wrong! 🗿')
+
+
+#bot.enable_save_next_step_handlers(delay=2)
+#bot.load_next_step_handlers()
+bot.polling()
diff --git a/Proect/model.py b/Proect/model.py
new file mode 100644
index 0000000..940c4aa
--- /dev/null
+++ b/Proect/model.py
@@ -0,0 +1,101 @@
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import Column, Integer, String, Date, DateTime, ForeignKey, Table, insert, select, and_
+from sqlalchemy.orm import relationship
+from OracleDb import *
+
+Base = declarative_base()
+db = OracleDb()
+
+
+class app_user(Base):
+ __tablename__ = 'app_user'
+ user_id = Column(Integer, primary_key=True)
+ user_name = Column(String(30), nullable=False)
+ user_age = Column(Integer, nullable=False)
+ user_phone = Column(String(30), unique=True)
+ user_mail = Column(String(30), unique=True)
+ user_bank = Column(Integer, unique=True)
+ orders_num = Column(Integer, nullable=False)
+
+ @classmethod
+ def add_member(self, name, age, phone, mail, bank, orders_num, new_id=None):
+ db = OracleDb()
+ session = db.sqlalchemy_session
+ new_user = app_user(user_id=new_id,
+ user_name=name,
+ user_age=age,
+ user_phone=phone,
+ user_mail=mail,
+ user_bank=bank,
+ orders_num=orders_num)
+ session.add(new_user)
+ session.commit()
+
+
+class orders(Base):
+ __tablename__ = 'orders'
+ order_id = Column(Integer, primary_key=True)
+ user_id = Column(Integer, ForeignKey('app_user.user_id'), nullable=False)
+ dish_id = Column(Integer, ForeignKey('dishes.dish_id'), nullable=False)
+ price = Column(Integer, nullable=False)
+
+ @classmethod
+ def add_member(self, dish_name, phone, new_id=None, price=None):
+ db = OracleDb()
+ session = db.sqlalchemy_session
+
+ ids = session.query(films).filter(dishes.dish_name == dish_name)
+ id_dish = [row.dish_id for row in ids][0]
+ idu = session.query(app_user).filter(app_user.user_phone == phone)
+ id_user = [row.user_id for row in idu][0]
+ new_order = orders(order_id=new_id,
+ user_id=id_user,
+ dish_id=id_dish,
+ price=(dish_price + snack_price)
+ )
+
+ session.add(new_order)
+ session.commit()
+
+
+class dish(Base):
+ __tablename__ = 'dishes'
+ dish_id = Column(Integer, primary_key=True)
+ dish_name = Column(String(30), nullable=False)
+ dish_description = Column(String(30), nullable=True)
+ dish_rate = Column(Integer, nullable=True)
+ orders_num = Column(Integer, nullable=False)
+
+ @classmethod
+ def add_member(self, name, orders_num, new_id=None, description=None, rate=None):
+ db = OracleDb()
+ session = db.sqlalchemy_session
+ new_dish = dishes(dish_id=new_id,
+ dish_name=name,
+ dish_description=description,
+ dish_rate=rate,
+ orders_num=orders_num)
+ session.add(new_film)
+ session.commit()
+
+
+class comments(Base):
+ __tablename__ = 'comments'
+ comment_id = Column(Integer, primary_key=True)
+ film = Column(String(30), nullable=False)
+ comment_text = Column(String(30), nullable=False)
+ film_rate = Column(Integer, nullable=True)
+
+ @classmethod
+ def add_member(self, film, text, new_id=None, rate=None):
+ db = OracleDb()
+ session = db.sqlalchemy_session
+ new_comment = comments(comment_id=new_id,
+ film=film,
+ comment_text=text,
+ film_rate=rate)
+ session.add(new_comment)
+ session.commit()
+
+
+Base.metadata.create_all(db.sqlalchemy_engine)
diff --git a/Proect/populate.py b/Proect/populate.py
new file mode 100644
index 0000000..722de79
--- /dev/null
+++ b/Proect/populate.py
@@ -0,0 +1,23 @@
+import datetime
+import time
+
+from model import *
+from OracleDb import OracleDb
+
+db = OracleDb()
+
+session = db.sqlalchemy_session
+'''
+new_comment = comments.add_member("Pulp Fiction", "Its great!")
+new_dish = dish.add_member('Florencia', '......', 4.5, 100)
+new_user = app_user.add_member(name='Scarab', age=18,
+ phone='+38095323232',
+ age='18',
+ mail='scarab@bdis.com',
+ bank='12234445543333',
+ orders_num=1)
+new_order = orders.add_member(dish_name='AAAAAA',
+ phone='+38095323232',
+
+'''
+session.commit()