diff --git a/Hirianska_Viktoriia/workshop2/source/WorkShop 2 Flask.pdf b/Hirianska_Viktoriia/workshop2/source/WorkShop 2 Flask.pdf new file mode 100644 index 0000000..d2e2f69 Binary files /dev/null and b/Hirianska_Viktoriia/workshop2/source/WorkShop 2 Flask.pdf differ diff --git a/Hirianska_Viktoriia/workshop2/source/main.py b/Hirianska_Viktoriia/workshop2/source/main.py new file mode 100644 index 0000000..bd8c071 --- /dev/null +++ b/Hirianska_Viktoriia/workshop2/source/main.py @@ -0,0 +1,63 @@ +from flask import Flask, render_template, request, redirect, url_for + +app = Flask(__name__) + + + +@app.route('/api/', methods = [ 'GET']) +def apiget(action): + + + if action == "user": + return render_template("user.html",user=user_dictionary) + + elif action == "series": + return render_template("series.html", series=series_dictionary) + + elif action == "all": + return render_template("all.html", user=user_dictionary, series=series_dictionary) + + else: + return render_template("404.html", action_value=action) + + +@app.route('/api', methods=['POST']) +def apipost(): + + + if request.form["action"] == "user_update": + + user_dictionary["user_name"] = request.form["name"] + user_dictionary["user_surname"] = request.form["surname"] + user_dictionary["user_age"] = request.form["age"] + + return redirect(url_for('apiget', action="all")) + + + if request.form["action"] == "series_update": + + series_dictionary["series_title"] = request.form["title"] + series_dictionary["series_genre"] = request.form["genre"] + series_dictionary["series_year"] = request.form["year"] + series_dictionary["series_country"] = request.form["country"] + + return redirect(url_for('apiget', action="all")) + + + +if __name__ == '__main__': + + user_dictionary = { + "user_name": "Viktoriia", + "user_surname": "Hirianska", + "user_age": 19, + } + + series_dictionary = { + "series_title": "Friends", + "series_genre": "Sitcom", + "series_year": 1994, + "series_country": "United States" + } + + app.run() diff --git a/Hirianska_Viktoriia/workshop2/source/templates/404.html b/Hirianska_Viktoriia/workshop2/source/templates/404.html new file mode 100644 index 0000000..9193b75 --- /dev/null +++ b/Hirianska_Viktoriia/workshop2/source/templates/404.html @@ -0,0 +1,10 @@ + + + + + 404 page + + +

Not correct action value: {{action_value}}

+ + \ No newline at end of file diff --git a/Hirianska_Viktoriia/workshop2/source/templates/all.html b/Hirianska_Viktoriia/workshop2/source/templates/all.html new file mode 100644 index 0000000..c5228c6 --- /dev/null +++ b/Hirianska_Viktoriia/workshop2/source/templates/all.html @@ -0,0 +1,39 @@ + + + + + all + + + +

Series

+ + + + + + + + + + + + + +
Title{{series.get('series_title')}}
Genre{{series.get('series_genre')}}
Year{{series.get('series_year')}}
Country{{series.get('series_country')}}
+ +

User

+ + + + + + + + + + +
Name{{user.get('user_name')}}
Surname{{user.get('user_surname')}}
Age{{user.get('user_age')}}
+ + + diff --git a/Hirianska_Viktoriia/workshop2/source/templates/series.html b/Hirianska_Viktoriia/workshop2/source/templates/series.html new file mode 100644 index 0000000..d590cfe --- /dev/null +++ b/Hirianska_Viktoriia/workshop2/source/templates/series.html @@ -0,0 +1,19 @@ + + + + + series + + + +
+

Title

+

Genre

+

Year

+

Country

+
+ + + + + \ No newline at end of file diff --git a/Hirianska_Viktoriia/workshop2/source/templates/user.html b/Hirianska_Viktoriia/workshop2/source/templates/user.html new file mode 100644 index 0000000..0c76438 --- /dev/null +++ b/Hirianska_Viktoriia/workshop2/source/templates/user.html @@ -0,0 +1,18 @@ + + + + + user + + + +
+

Name

+

Surname

+

Age

+
+ + + + + \ No newline at end of file diff --git a/Hirianska_Viktoriia/workshop4/ORM_relations.sql b/Hirianska_Viktoriia/workshop4/ORM_relations.sql new file mode 100644 index 0000000..dc696d6 --- /dev/null +++ b/Hirianska_Viktoriia/workshop4/ORM_relations.sql @@ -0,0 +1,85 @@ +from sqlalchemy import Column, Integer, String, ForeignKey +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import relationship +from sqlalchemy.orm import sessionmaker +from sql_connection import engine +import json + +from sqlalchemy.util import symbol + +Base = declarative_base() + +class U_USER(Base): + + __tablename__ = 'user' + + id = Column(Integer, primary_key=True) + user_username = Column(String(50)) + + +class SERIES(Base): + + __tablename__ = 'series' + + id = Column(Integer, primary_key=True) + series_title = Column(String(128)) + series_genre = Column(String(128)) + series_year = Column(Integer) + series_country = Column(String(128)) + series_amountofseasons = Column(Integer) + series_duration = Column(Integer) + series_description = Column(String(512)) + + +class GRADE(Base): + + __tablename__ = 'grade' + + id = Column(Integer, primary_key=True) + grade_value = Column(Integer) + user_id = Column(Integer, ForeignKey("user.id")) + series_id = Column(Integer, ForeignKey("series.id")) + reviw = Column(String(200)) + + styles = relationship('U_USER', backref='grade', lazy=True) + styles_ = relationship('SERIES', backref='grade', lazy=True) + + + +Session = sessionmaker(bind = engine) +session = Session() + +series = open("C:/Users/Strawika/Desktop/workshop4/series.json",encoding="utf-8") +data_series = json.load(series) + +session.add_all([ + SERIES(id = data_series['series'][0]['id'], + series_title = data_series['series'][0]['series_title'], + series_genre = data_series['series'][0]['series_genre'], + series_year = data_series['series'][0]['series_year'], + series_country = data_series['series'][0]['series_country'], + series_amountofseasons = data_series['series'][0]['series_amountofseasons'], + series_duration=data_series['series'][0]['series_duration'], + series_description = data_series['series'][0]['series_description']), + + SERIES(id = data_series['series'][1]['id'], + series_title = data_series['series'][1]['series_title'], + series_genre = data_series['series'][1]['series_genre'], + series_year = data_series['series'][1]['series_year'], + series_country = data_series['series'][1]['series_country'], + series_amountofseasons = data_series['series'][1]['series_amountofseasons'], + series_duration = data_series['series'][1]['series_duration'], + series_description = data_series['series'][1]['series_description']), + + SERIES(id = data_series['series'][2]['id'], + series_title = data_series['series'][2]['series_title'], + series_genre = data_series['series'][2]['series_genre'], + series_year = data_series['series'][2]['series_year'], + series_country = data_series['series'][2]['series_country'], + series_amountofseasons = data_series['series'][2]['series_amountofseasons'], + series_duration = data_series['series'][2]['series_duration'], + series_description = data_series['series'][2]['series_description']), +] +) + +session.commit() \ No newline at end of file diff --git a/Hirianska_Viktoriia/workshop4/check.py b/Hirianska_Viktoriia/workshop4/check.py new file mode 100644 index 0000000..ac8e888 --- /dev/null +++ b/Hirianska_Viktoriia/workshop4/check.py @@ -0,0 +1,43 @@ +from sql_connection import engine +from ORM_relations import U_USER, SERIES, GRADE, Base +from sqlalchemy.sql import select, update, join +from sqlalchemy import and_, or_, between, asc, desc, update +from sqlalchemy.orm import sessionmaker + +Base.metadata.create_all(engine) +Session = sessionmaker(bind=engine) +session = Session() + +def check_user_exist(username): + + try: + if bool(session.query(U_USER.id).filter_by(id = '1').first()) is False: + + row = U_USER(id = '1',user_username = username) + session.add(row) + session.commit() + search_query = (session.query(U_USER).filter_by(id = '1').one()).user_username + + print('Hello,', search_query) + + else: + if bool(session.query(U_USER.user_username).filter_by(user_username = username).first()) is True: + print('User already exist') + + else: + id_value = session.query(U_USER.id).count() + row = U_USER(id=id_value+1, user_username=username) + session.add(row) + session.commit() + + except: + print('This user already exsist') + + +def grade(id,grade,values,id_user,series_id,text): + if grade > 10: + print('Max value is 10') + else: + row = grade(id=id, grade_value=values,user_id = id_user,series_id = series_id,reviw = text) + session.add(row) + session.commit() diff --git a/Hirianska_Viktoriia/workshop4/create_table.sql b/Hirianska_Viktoriia/workshop4/create_table.sql new file mode 100644 index 0000000..a80d2b3 --- /dev/null +++ b/Hirianska_Viktoriia/workshop4/create_table.sql @@ -0,0 +1,33 @@ +CREATE TABLE U_USER( + id NUMBER(3) NOT NULL, + user_username VARCHAR2(50) NOT NULL, + CONSTRAINT pk_id_user PRIMARY KEY (id), + CONSTRAINT username_unique UNIQUE (user_username) +); + +CREATE TABLE SERIES( + id NUMBER(3) NOT NULL, + series_title VARCHAR2(128) NOT NULL, + series_genre VARCHAR2(128) NOT NULL, + series_year NUMBER(4) NOT NULL, + series_country VARCHAR2(128) NOT NULL, + series_amountofseasons NUMBER(2) NOT NULL, + series_duration NUMBER(3) NOT NULL, + series_description VARCHAR2(512) NOT NULL, + CONSTRAINT pk_id_series PRIMARY KEY (id), + CONSTRAINT title_unique UNIQUE (series_title), + CONSTRAINT check_series_year CHECK(series_year<=2020), + CONSTRAINT check_series_years CHECK(series_year>=1985) +); + +CREATE TABLE GRADE( + id NUMBER(2) NOT NULL, + grade_value NUMBER(2), + user_id NUMBER(2) NOT NULL, + series_id NUMBER(2) NOT NULL, + reviw VARCHAR2(200) NOT NULL, + CONSTRAINT pk_id_grade PRIMARY KEY (id), + CONSTRAINT fk_id_user FOREIGN KEY(user_id) REFERENCES U_USER(id), + CONSTRAINT fk_id_series FOREIGN KEY(series_id) REFERENCES SERIES(id), + CONSTRAINT check_grade_value CHECK(grade_value<=10) +); \ No newline at end of file diff --git a/Hirianska_Viktoriia/workshop4/db_connection.py b/Hirianska_Viktoriia/workshop4/db_connection.py new file mode 100644 index 0000000..da6189f --- /dev/null +++ b/Hirianska_Viktoriia/workshop4/db_connection.py @@ -0,0 +1,13 @@ +from sqlalchemy.engine import create_engine + +DIALECT = 'oracle' +SQL_DRIVER = 'cx_oracle' +USERNAME = 'MYONLINEEDU' +PASSWORD = 'MYONLINEEDU' + +HOST = 'localhost' +PORT = 1521 +SERVICE = 'xe' + +ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE +engine = create_engine(ENGINE_PATH_WIN_AUTH) \ No newline at end of file diff --git a/Hirianska_Viktoriia/workshop4/series.json b/Hirianska_Viktoriia/workshop4/series.json new file mode 100644 index 0000000..ac29f74 --- /dev/null +++ b/Hirianska_Viktoriia/workshop4/series.json @@ -0,0 +1,33 @@ +{"series":[ + { + "id": "1", + "series_title": "Friends", + "series_genre": "Sitcom", + "series_year":"1994", + "series_country": "United States", + "series_amountofseasons": "10", + "series_duration": "22", + "series_description": "Friends is a 90's Comedy TV show, based in Manhattan, about 6 friends who go through just about every life experience imaginable together; love, marriage, divorce, children, heartbreaks, fights, new jobs and job losses and all sorts of drama." +}, +{ + "id": "2", + "series_title": "Game of Thrones", + "series_genre": "Fantasy", + "series_year": "2011", + "series_country": "United States", + "series_amountofseasons":"8", + "series_duration": "66", + "series_description": "Game of Thrones is an American fantasy drama television series created by David Benioff and D. B. Weiss for HBO. It is an adaptation of A Song of Ice and Fire, George R. R. Martin's series of fantasy novels, the first of which is A Game of Thrones." +}, +{ +"id": "3", + "series_title": "Breaking Bad", + "series_genre": "Crime drama", + "series_year": "2008", + "series_country": "United States", + "series_amountofseasons": "5", + "series_duration": "50", + "series_description": "For five seasons consisting of 62 episodes, the story of Walter White, a school teacher who was diagnosed with inoperable lung cancer, is shown. Together with his former apprentice Jesse Pinkman, he begins to manufacture and sell meth to ensure his family’s financial future." +} +] +} \ No newline at end of file diff --git a/Hirianska_Viktoriia/workshop5/config.py b/Hirianska_Viktoriia/workshop5/config.py new file mode 100644 index 0000000..627e860 --- /dev/null +++ b/Hirianska_Viktoriia/workshop5/config.py @@ -0,0 +1 @@ +TOKEN = '1245867811:AAGH1QJeO_zWGyTDPpKm2MhFKasxrYFult7' \ No newline at end of file diff --git a/Hirianska_Viktoriia/workshop5/main.py b/Hirianska_Viktoriia/workshop5/main.py new file mode 100644 index 0000000..f7d8253 --- /dev/null +++ b/Hirianska_Viktoriia/workshop5/main.py @@ -0,0 +1,146 @@ +import telebot +from pandas.io.json import json_normalize +import json +import requests +from flask import Flask +from flask import request +from flask import jsonify +from flask_sqlalchemy import SQLAlchemy +import os +import models + +app = Flask(__name__) + +db = SQLAlchemy(app) + +TOKEN = '1245867811:AAGH1QJeO_zWGyTDPpKm2MhFKasxrYFult7' +MAIN_URL = f'https://api.telegram.org/bot{TOKEN}' + +def find_series(film_features,page=1): + request = requests.get(f'{MAIN_URL}/getMe') + request = json.loads(request.text) + request = json_normalize(request['results']) + return request + +def checkin_search_id(series_id): + if series_id.data[-1]=='s': + try: + request = requests.get(f'https://api.telegram.org/bot/{series_id.data[0:-1]}') + return True + except: + return False + else: + return False + +def checkin_id(series_id): + if series_id.data[-1]=='l': + try: + request = requests.get(f'https://api.telegram.org/bot/{series_id.data[0:-1]}') + return True + except: + return False + else: + return False + +df_param = pd.DataFrame([[1,2,3,4]],columns=['id','genre','year','grade']) + +bot = telebot.TeleBot(token) + + +request = requests.get('https://api.telegram.org/bot{TOKEN}?api_key=my_key&language=en&page=1') +request = json.loads(request.text) +request = json_normalize(request['results']) +r = pd.DataFrame({'a':request['origin_language']=='en' ,'b':request['vote_count']>5000}) + +markup_start = telebot.types.ReplyKeyboardMarkup(True,None,True) +markup_start.row('Find series') +markup_series_option = telebot.types.ReplyKeyboardMarkup(True, None, True) +markup_series_option.row('Genre', 'Year', 'Grade') +markup_series_option.row('Back','Find series') + +series_option = {'user_id':0,'series_id':0,'series_title':0,'genre':0,'year':0,'grade':0} + +grades = [f'{i}-{i+1}' for i in range(10)] + +genres = requests.get('https://api.telegram.org/bot{TOKEN}/genre/list?api_key=my_key&language=en') +genres = json.loads(genres.text) +genres = json_normalize(genres['genres']) +iter = 0 + +@bot.message_handler(commands=['start']) +def welcome(message): + msg = bot.send_message(message.chat.id) + bot.register_next_step_handler(msg, process_name) + +@bot.message_handler(content_types=['text']) +def send_info(message): + print(message) + if message.text.lower() == 'find series': + bot.send_message(message.chat.id, "Choose series options", reply_markup=markup_series_option) + elif message.text.lower() == 'genre': + key_genre = telebot.types.InlineKeyboardMarkup() + for genre in genres['name']: + key = telebot.types.InlineKeyboardButton(text=genre, callback_data=genre) + key_genre.add(key) + bot.send_message(message.from_user.id, text='Choose genre of the series', reply_markup=key_genre) + elif message.text.lower() == 'back': + bot.send_message(message.chat.id, text='You can find series', reply_markup=markup_start) + elif message.text.lower() == 'year': + bot.send_message(message.chat.id, text='Choose year of the series release you want', reply_markup=markup_series_option) + elif message.text.lower() == 'grade': + key_grade = telebot.types.InlineKeyboardMarkup() + for i in range(10): + key = telebot.types.InlineKeyboardButton(text=f'{i}-{i+1}', callback_data=f'{i}-{i+1}') + key_grade.add(key) + bot.send_message(message.from_user.id, text='Choose rating of the series you want', reply_markup=key_grade) + elif message.text.lower() == 'find series': + try: + findin_series = search(df_of_param[df_of_param['id']==message.from_user.id]) + key_series = telebot.types.InlineKeyboardMarkup() + try: + for title,id in np.array([findin_series['title'],findin_series['id']]).T: + key = telebot.types.InlineKeyboardButton(text=f"{title}", callback_data=f"{id}s") + key_series.add(key) + bot.send_message(message.from_user.id, text='Series:',reply_markup=key_series) + except KeyError: + bot.send_message(message.from_user.id, text='There is no series with these options',reply_markup=markup_series_option) + except IndexError: + bot.send_message(message.from_user.id, text='Choose all options of the series',reply_markup=markup_series_option) + else: + bot.send_message(message.chat.id, 'Try some another commands', reply_markup=keyboard_start) + +@bot.callback_query_handler(func=lambda call: call.data in list(genres['gname'])) +def wrire_genre(call): + global user_genre + user_genre = call.data + bot.send_message(call.from_user.id, text='You chose this genre: {}. You can try other options too'.format(call.data)) + df_param['genre'][df_param['id']==call.from_user.id] = int(genres[genres['gname']==call.data]['id']) + series_option['genre'] = int(genres[genres['gname']==call.data]['id']) + print(df_param) + +@bot.callback_query_handler(func=lambda call: call.data in genres) +def write_grade(call): + user_gade = call.data + bot.send_message(call.from_user.id, text=f'You chose this rating: {user_rating}. You can try other options too') + df_param['grade'][df_param['id']==call.from_user.id] = user_rating + if (pd.isna(df_param[df_param['id'] == call.from_user.id]['genre'])[0]) or (pd.isna(df_param[df_of_param['id'] == call.from_user.id]['year'])[0]) or (pd.isna(df_of_param[df_of_param['id'] == call.from_user.id]['grade'])[0]): + bot.send_message(call.from_user.id, text='Choose other options of the series'.format(call.data)) + else: + bot.send_message(call.from_user.id, text='Now you can find series or go back'.format(call.data)) + +@bot.callback_query_handler(func=checkin_search_id) +def out_film(call): + call.data = call.data[0:-1] + keyback = telebot.types.ReplyKeyboardMarkup(True, None, True) + keyback.row('Back') + series = requests.get(f'https://api.telegram.org/bot/series{call.data}?api_key=my_key&language=en-US') + series = json.loads(series.text) + series_option['user_id'] = call.from_user.id + series_option['series_id'] = series['id'] + series_option['series_title'] = series["title"] + series_option['year'] = series['year'] + series_option['grade'] = film["grade"] + bot.send_message(call.from_user.id, text=f'{film["series"]}\nhttps://api.telegram.org/bot/series{call.data}/',reply_markup=keyback) + +if __name__ == '__main__': + bot.polling() \ No newline at end of file diff --git a/Hirianska_Viktoriia/workshop5/migrate.py b/Hirianska_Viktoriia/workshop5/migrate.py new file mode 100644 index 0000000..53fc245 --- /dev/null +++ b/Hirianska_Viktoriia/workshop5/migrate.py @@ -0,0 +1,11 @@ +from flask_script import Manager +from flask_migrate import Migrate, MigrateCommand +from app import app, db + +migrate = Migrate(app, db,extend_existing=True) +manager = Manager(app) + +manager.add_command('db', MigrateCommand) + +if __name__ == '__main__': + manager.run() \ No newline at end of file diff --git a/Hirianska_Viktoriia/workshop5/model.py b/Hirianska_Viktoriia/workshop5/model.py new file mode 100644 index 0000000..710b30a --- /dev/null +++ b/Hirianska_Viktoriia/workshop5/model.py @@ -0,0 +1,38 @@ +from main import db + + +class app_user(db.Model): + __tablename__ = 'app_user' + user_id =db.Column(db.Integer,primary_key=True) + user_name =db.Column(db.String(50), nullable=False) + user_surname =db.Column(db.String(50), nullable=False) + @classmethod + def add_member(self, name, surname, status, new_id=None): + db = OracleDb() + session = db.sqlalchemy_session + new_member = app_user(user_id=new_id, + user_name=name, + user_surname=surname + session.member(new_user) + session.commit() + +class series(db.Model): + __tablename__ = 'series' + series_id = db.Column(db.Integer, primary_key=True) + series_title = db.Column(db.String(30), nullable=False) + series_genre = db.Column(db.String(30), nullable=False) + series_year = db.Column(db.String(30), nullable=False) + series_grade = db.Column(db.String(30), nullable=False) + @classmethod + def add_series(self, title, genre, year, grade, new_id=None): + db = OracleDb() + session = db.sqlalchemy_session + new_series = series(series_id=new_id, + series_title=title, + series_genre=genre, + series_year=year, + series_grade=grade + ) + session.add(new_series) + session.commit() + \ No newline at end of file