diff --git a/Kostya Zinchuk/workshop3/WorkShop2 Flask.pdf b/Kostya Zinchuk/workshop3/WorkShop2 Flask.pdf new file mode 100644 index 0000000..76fbcd8 Binary files /dev/null and b/Kostya Zinchuk/workshop3/WorkShop2 Flask.pdf differ diff --git a/Kostya Zinchuk/workshop3/app.py b/Kostya Zinchuk/workshop3/app.py new file mode 100644 index 0000000..3149a5f --- /dev/null +++ b/Kostya Zinchuk/workshop3/app.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/Kostya Zinchuk/workshop3/distionaries.py b/Kostya Zinchuk/workshop3/distionaries.py new file mode 100644 index 0000000..996d3e4 --- /dev/null +++ b/Kostya Zinchuk/workshop3/distionaries.py @@ -0,0 +1,15 @@ +book_dict = { + "name": "Robinson Crusoe", + "url": "soon", + "create_time": "19.03.2020", + "author": "Daniel Defoe" +} + +user_dict = { + "fullname" : "Kostya Zinchuk", + "email" : "truvka90@gmail.com", + "registration": "01.01.2000", + "id": "1000000001", + "login" : "useradmin", + "book_amount": 4, +} diff --git a/Kostya Zinchuk/workshop3/templates/404.html b/Kostya Zinchuk/workshop3/templates/404.html new file mode 100644 index 0000000..407edac --- /dev/null +++ b/Kostya Zinchuk/workshop3/templates/404.html @@ -0,0 +1,10 @@ + + + + + 404 + + +

Page Or action is not found

+ + \ No newline at end of file diff --git a/Kostya Zinchuk/workshop3/templates/book.html b/Kostya Zinchuk/workshop3/templates/book.html new file mode 100644 index 0000000..1c935fd --- /dev/null +++ b/Kostya Zinchuk/workshop3/templates/book.html @@ -0,0 +1,25 @@ + + + + + Book + + +

Book info

+
+

Name + +

+

URL + +

+

Create time + +

+

Author + +

+
+ + + \ No newline at end of file diff --git a/Kostya Zinchuk/workshop3/templates/index.html b/Kostya Zinchuk/workshop3/templates/index.html new file mode 100644 index 0000000..abfb20d --- /dev/null +++ b/Kostya Zinchuk/workshop3/templates/index.html @@ -0,0 +1,13 @@ + + + + + Home + + +

Hello, try use in url some of command

+

/book

+

/user

+

/all

+ + \ No newline at end of file diff --git a/Kostya Zinchuk/workshop3/templates/show.html b/Kostya Zinchuk/workshop3/templates/show.html new file mode 100644 index 0000000..93c5432 --- /dev/null +++ b/Kostya Zinchuk/workshop3/templates/show.html @@ -0,0 +1,22 @@ + + + + + ALL + + + +

User info

+

{{ user['fullname'] }}

+

{{ user['email'] }}

+

{{ user['registration'] }}

+

{{ user['id'] }}

+

{{ user['login'] }}

+

{{ user['book_amount'] }}

+

Book info

+

{{ book['name'] }}

+

{{ book['url'] }}

+

{{ book['create_time'] }}

+

{{ book['author'] }}

+ + \ No newline at end of file diff --git a/Kostya Zinchuk/workshop3/templates/user.html b/Kostya Zinchuk/workshop3/templates/user.html new file mode 100644 index 0000000..9139d67 --- /dev/null +++ b/Kostya Zinchuk/workshop3/templates/user.html @@ -0,0 +1,31 @@ + + + + + User + + +

User info

+
+

Full name + +

+

email + +

+

Registration + +

+

ID + +

+

Login + +

+

Books in usage + +

+
+ + + \ No newline at end of file diff --git a/Kostya Zinchuk/workshop4/source/sql/MYDATABASE_XE.sql b/Kostya Zinchuk/workshop4/source/sql/MYDATABASE_XE.sql new file mode 100644 index 0000000..d5b722d --- /dev/null +++ b/Kostya Zinchuk/workshop4/source/sql/MYDATABASE_XE.sql @@ -0,0 +1,194 @@ +CREATE TABLE book ( + book_id NUMERIC(10) NOT NULL, + book_name VARCHAR2(50) NOT NULL, + author_name VARCHAR2(50) NOT NULL, + author_lastname VARCHAR2(50) NOT NULL, + book_url VARCHAR2(70) NOT NULL, + CONSTRAINT book_pk PRIMARY KEY ( book_id ), + CONSTRAINT check_id CHECK ( book_id > 0 ) +); + +CREATE TABLE l_user ( + user_name VARCHAR2(50), + user_lastname VARCHAR2(50), + email VARCHAR2(50) NOT NULL PRIMARY KEY, + registration DATE NOT NULL, + login VARCHAR2(20) NOT NULL UNIQUE, + password VARCHAR2(30) NOT NULL, + book_amount NUMERIC, + CONSTRAINT ba_ch CHECK ( book_amount >= 0 ) +); + +CREATE TABLE user_book ( + t_book_id NUMERIC(10) NOT NULL, + user_email VARCHAR2(50) NOT NULL, + CONSTRAINT ub_pk PRIMARY KEY ( t_book_id, + user_email ), + CONSTRAINT book_fk FOREIGN KEY ( t_book_id ) + REFERENCES book ( book_id ), + CONSTRAINT user_fk FOREIGN KEY ( user_email ) + REFERENCES l_user ( email ) +); + +CREATE OR REPLACE TRIGGER check_author_name BEFORE + UPDATE OF author_name ON book + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.author_name, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20001, 'Author name cant be with digits'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_author_name_insert BEFORE + INSERT ON book + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.author_name, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20002, 'Wrong Author name format. Can not be insert in book table'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_author_lastname BEFORE + UPDATE OF author_lastname ON book + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.author_lastname, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20003, 'Author lastname cant be with digits'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_author_lastname_insert BEFORE + INSERT ON book + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.author_lastname, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20004, 'Author lastname wrong format. Can not be insert'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_user_name BEFORE + UPDATE OF user_name ON l_user + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.user_name, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20005, 'User name cant be with digits'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_user_name_insert BEFORE + INSERT ON l_user + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.user_name, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20006, 'User name wrong format. Can not be insert'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_user_lastname BEFORE + UPDATE OF user_lastname ON l_user + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.user_lastname, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20007, 'User name cant be with digits'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_user_lastname_insert BEFORE + INSERT ON l_user + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.user_lastname, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20008, 'User lastname wrong format. Can not be insert'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_email BEFORE + UPDATE OF email ON l_user + FOR EACH ROW +BEGIN + IF :new.email NOT LIKE '%@%.%' THEN + raise_application_error(-20009, 'Email format is invalid'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_email_insert BEFORE + INSERT ON l_user + FOR EACH ROW +BEGIN + IF :new.email NOT LIKE '%@%.%' THEN + raise_application_error(-20009, 'Email format is invalid'); + END IF; +END; \ No newline at end of file diff --git a/Kostya Zinchuk/workshop4/source/sql/readme.txt b/Kostya Zinchuk/workshop4/source/sql/readme.txt new file mode 100644 index 0000000..4ac7149 --- /dev/null +++ b/Kostya Zinchuk/workshop4/source/sql/readme.txt @@ -0,0 +1 @@ +#toto list diff --git a/Kostya Zinchuk/workshop5/source/python/app.py b/Kostya Zinchuk/workshop5/source/python/app.py new file mode 100644 index 0000000..47936c4 --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/app.py @@ -0,0 +1,156 @@ +from flask import Flask, render_template,redirect, request, url_for, g +from distionaries import user_dict, book_dict +from sqlalch.db_conn import engine +from sqlalchemy.orm import sessionmaker +from sqlalch.forms import * +import datetime +import plotly.express as px +import pandas as pd +import json +import numpy as np +import plotly.graph_objs as go +import plotly + +Session = sessionmaker(bind=engine) +session = Session() + + +app = Flask(__name__) +user_log = False +user_name = '' + + +@app.route('/') +def home(): + return render_template('login.html') + + +@app.route('/form_login', methods=['GET','POST']) +def handle(): + if request.method == 'POST': + email = request.form['email'] + psw = request.form['password'] + global user_name + user_name = email + try: + view = session.query(User).filter_by(email=email, password=psw).all() + if view: + global user_log + user_log = True + return redirect(url_for('api_action', action='home')) + else: + return redirect(url_for('api_action', action='home')) + except: + return redirect(url_for('api_action', action='home')) + + +@app.route('/rgs', methods=['GET', 'POST']) +def registration(): + if request.method == 'POST': + name = request.form['name'] + last_name = request.form['last_name'] + email = request.form['email'] + login = request.form['login'] + psw = request.form['password'] + date = datetime.datetime.now() + new_user = User.add_user(name, last_name, email, date, login, psw, 1) + session.commit() + return redirect(url_for('api_action', action="login")) + return redirect(url_for('api_action', action="rgs")) + + +@app.route('/logout') +def logout(): + global user_log + user_log = False + return redirect(url_for('api_action', action="home")) + + +@app.route('/profile') +def profile(): + package = session.query(User).filter_by(email=user_name).first() + return render_template('user.html', info=package, login=user_log) + + +def plot(): + N = 40 + x = np.linspace(0, 1, N) + y = np.random.randn(N) + df = pd.DataFrame({'x': x, 'y': y}) # creating a sample dataframe + + data = [ + go.Bar( + x=df['x'], # assign x as the dataframe column 'x' + y=df['y'] + ) + ] + + graphJSON = json.dumps(data, cls=plotly.utils.PlotlyJSONEncoder) + + return graphJSON + + +def create_pie(): + a = session.query(User).filter_by(user_name='Kostya').all() + b = session.query(User).filter(User.user_name == 'zxc').all() + tmp_a = 0 + for _ in a: + tmp_a += 1 + tmp_b = 0 + for _ in b: + tmp_b += 1 + graph_values = [{ + 'labels': ["Kostya", "zxc"], + 'values': [tmp_a, tmp_b], + 'type' : 'pie', + 'insidetextfont': {'color': '#FFFFFF', + 'size': '12', + }, + 'textfont': {'color': '#FFFFFF', + 'size': '12', + }, + }] + layout = { + 'title': 'Different name among all users', + } + return graph_values, layout + + +@app.route('/graph1') +def graph1(): + values, layout = create_pie() + return render_template('graph1.html', graph_values = values, layout =layout, login=user_log) + + +@app.route('/graph2') +def graph2(): + bar = plot() + return render_template('graph2.html', plot=bar, login=user_log) + +@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 == "home": + return render_template('index.html', login=user_log) + elif action == "login": + return render_template('login.html') + elif action == "rgs": + return render_template('registration.html') + elif action == "graph1": + return render_template('graph1.html') + elif action == "graph2": + return render_template('graph2.html') + else: + return render_template('404.html') + + +@app.errorhandler(404) +def page404(error): + return render_template("404.html") + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/Kostya Zinchuk/workshop5/source/python/distionaries.py b/Kostya Zinchuk/workshop5/source/python/distionaries.py new file mode 100644 index 0000000..996d3e4 --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/distionaries.py @@ -0,0 +1,15 @@ +book_dict = { + "name": "Robinson Crusoe", + "url": "soon", + "create_time": "19.03.2020", + "author": "Daniel Defoe" +} + +user_dict = { + "fullname" : "Kostya Zinchuk", + "email" : "truvka90@gmail.com", + "registration": "01.01.2000", + "id": "1000000001", + "login" : "useradmin", + "book_amount": 4, +} diff --git a/Kostya Zinchuk/workshop5/source/python/readme.md b/Kostya Zinchuk/workshop5/source/python/readme.md new file mode 100644 index 0000000..d30563f --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/readme.md @@ -0,0 +1,15 @@ +connection to oracle +Username: MYDATABASE +password: oracle123 +host: localhost +port: 1521 +sid:xe + +python library: +-numpy +-pandas +-cx_Oracle +-json +-sqlalchemy +-plotly +-flask diff --git a/Kostya Zinchuk/workshop5/source/python/sqlalch/cheker.py b/Kostya Zinchuk/workshop5/source/python/sqlalch/cheker.py new file mode 100644 index 0000000..12ea1f9 --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/sqlalch/cheker.py @@ -0,0 +1,31 @@ +from datetime import datetime +import re + + +def book_check(b_id, a_name, a_lname): + if not isinstance(b_id, int): + return False + elif not a_name.isalpha(): + return False + elif not a_lname.isalpha(): + return False + else: + return True + + +def user_check(name, last_name, email, amount): + + if not name.isalpha() or not last_name.isalpha(): + return False + + elif not re.match(r"[^@]+@[^@]+\.[^@]+", email): + return False + elif not isinstance(amount, int): + return False + else: + return True + + + + + diff --git a/Kostya Zinchuk/workshop5/source/python/sqlalch/db_conn.py b/Kostya Zinchuk/workshop5/source/python/sqlalch/db_conn.py new file mode 100644 index 0000000..5b25ac1 --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/sqlalch/db_conn.py @@ -0,0 +1,10 @@ +from sqlalchemy.engine import create_engine + +DIALECT = 'oracle' +SQL_DRIVER = 'cx_oracle' +USERNAME = 'MYDATABASE' +PASSWORD = 'oracle123' +PATH = "localhost:1521/xe" + +ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + PATH +engine = create_engine(ENGINE_PATH_WIN_AUTH) diff --git a/Kostya Zinchuk/workshop5/source/python/sqlalch/forms.py b/Kostya Zinchuk/workshop5/source/python/sqlalch/forms.py new file mode 100644 index 0000000..db64b2c --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/sqlalch/forms.py @@ -0,0 +1,79 @@ +from sqlalchemy import Column, String, DateTime, Integer, MetaData, ForeignKey, CheckConstraint +from sqlalchemy_utils import EmailType +from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.declarative import declarative_base +from sqlalch.db_conn import engine +from sqlalch.cheker import book_check, re, user_check + + +meta = MetaData() +Base = declarative_base() + + +class Book(Base): + __tablename__ = 'book' + book_id = Column(Integer, primary_key=True, nullable=False) + book_name = Column(String(50), primary_key=False, nullable=False) + author_name = Column(String(50), primary_key=False, nullable=False) + author_lastname = Column(String(50), primary_key=False, nullable=False) + book_url = Column(String(70), primary_key=False, nullable=False) + CheckConstraint('book_id > 0', name='check_id') + + @classmethod + def add_book(cls, b_id, b_name, a_name, a_lname, b_url): + b_check = book_check(b_id, a_name, a_lname) + if not b_check: + print("data is incorrect") + return -1 + else: + Session = sessionmaker(bind=engine) + session = Session() + new_book = Book(book_id = b_id, book_name=b_name, author_name=a_name, author_lastname=a_lname, + book_url=b_url) + session.add(new_book) + session.commit() + + +class User(Base): + __tablename__='l_user' + user_name = Column(String(50), primary_key=False, nullable=True) + user_lastname = Column(String(50), primary_key=False, nullable=True) + email = Column(EmailType, primary_key=True, nullable=False) + registration = Column(DateTime, primary_key=False,nullable=False) + login = Column(String(20), primary_key=False, nullable=False) + password = Column(String(30), primary_key=False, nullable=False) + book_amount = Column(Integer, primary_key=False, nullable=True) + CheckConstraint('book_amount>=0', name='ba_ch') + + @classmethod + def add_user(cls, name, last_name,email, registration, login, psw, amount): + u_check = user_check(name, last_name, email, amount) + if not u_check: + print("data is incorrect") + return -1 + else: + Session = sessionmaker(bind=engine) + session = Session() + new_user = User(user_name=name, user_lastname=last_name, email=email, registration=registration, + login=login,password=psw,book_amount=amount) + session.add(new_user) + session.commit() + + +class UserBook(Base): + __tablename__ = 'user_book' + t_book_id = Column(Integer, ForeignKey('book.book_id'), primary_key=True, nullable=False) + user_email = Column(EmailType, ForeignKey('l_user.email'), primary_key=True, nullable=False) + CheckConstraint('t_book_id>0', name='t_book_check') + + @classmethod + def add_user_book(cls, b_id, u_email): + if not isinstance(b_id, int) or not re.match(r"[^@]+@[^@]+\.[^@]+", u_email): + print('Data is incorrect') + return -1 + else: + Session = sessionmaker(bind=engine) + session = Session() + new_user_book = UserBook(t_book_id=b_id, user_email=u_email) + session.add(new_user_book) + session.commit() diff --git a/Kostya Zinchuk/workshop5/source/python/sqlalch/populate.py b/Kostya Zinchuk/workshop5/source/python/sqlalch/populate.py new file mode 100644 index 0000000..e88f948 --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/sqlalch/populate.py @@ -0,0 +1,16 @@ +from datetime import date +from sqlalch.forms import Book, User, UserBook +from sqlalch.db_conn import engine +from sqlalchemy.orm import sessionmaker + +Session = sessionmaker(bind=engine) +session = Session() +new_book = Book.add_book(1, "For whom the Bell Tolls", "Ernest", +"Hemingway", +"https://briefly.ru/heminguej/po_kom_zvonit_kolokol/") +session.commit() +session = Session() +new_book_2 = Book.add_book(2, "Hotel", "Arthur", +"Heiley", +"https://www.goodreads.com/book/show/124920.Hotel") +session.commit() \ No newline at end of file diff --git a/Kostya Zinchuk/workshop5/source/python/templates/404.html b/Kostya Zinchuk/workshop5/source/python/templates/404.html new file mode 100644 index 0000000..407edac --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/templates/404.html @@ -0,0 +1,10 @@ + + + + + 404 + + +

Page Or action is not found

+ + \ No newline at end of file diff --git a/Kostya Zinchuk/workshop5/source/python/templates/base.html b/Kostya Zinchuk/workshop5/source/python/templates/base.html new file mode 100644 index 0000000..8b0e258 --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/templates/base.html @@ -0,0 +1,89 @@ + + + + + + OnLiBa + + + + + + + + +{% if login == True %} + +{% else %} + +{% endif %} + +{% block content %} +{% endblock %} + + + + + + \ No newline at end of file diff --git a/Kostya Zinchuk/workshop5/source/python/templates/book.html b/Kostya Zinchuk/workshop5/source/python/templates/book.html new file mode 100644 index 0000000..1c935fd --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/templates/book.html @@ -0,0 +1,25 @@ + + + + + Book + + +

Book info

+
+

Name + +

+

URL + +

+

Create time + +

+

Author + +

+
+ + + \ No newline at end of file diff --git a/Kostya Zinchuk/workshop5/source/python/templates/graph1.html b/Kostya Zinchuk/workshop5/source/python/templates/graph1.html new file mode 100644 index 0000000..88cf3d8 --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/templates/graph1.html @@ -0,0 +1,14 @@ +{% extends 'base.html' %} +{% block content %} +
+

hello

+
+ +
+ +
+{% endblock %} \ No newline at end of file diff --git a/Kostya Zinchuk/workshop5/source/python/templates/graph2.html b/Kostya Zinchuk/workshop5/source/python/templates/graph2.html new file mode 100644 index 0000000..ba33b52 --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/templates/graph2.html @@ -0,0 +1,11 @@ +{% extends 'base.html' %} +{% block content %} +
+
+ +
+
+{% endblock %} \ No newline at end of file diff --git a/Kostya Zinchuk/workshop5/source/python/templates/index.html b/Kostya Zinchuk/workshop5/source/python/templates/index.html new file mode 100644 index 0000000..77a9bab --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/templates/index.html @@ -0,0 +1,7 @@ +{% extends 'base.html' %} + +{% block content %} +{% if login %} + +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/Kostya Zinchuk/workshop5/source/python/templates/login.html b/Kostya Zinchuk/workshop5/source/python/templates/login.html new file mode 100644 index 0000000..d7501cb --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/templates/login.html @@ -0,0 +1,22 @@ +{% extends 'base.html' %} + +{% block content %} + + +{% endblock %} \ No newline at end of file diff --git a/Kostya Zinchuk/workshop5/source/python/templates/registration.html b/Kostya Zinchuk/workshop5/source/python/templates/registration.html new file mode 100644 index 0000000..ce73c54 --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/templates/registration.html @@ -0,0 +1,33 @@ +{% extends 'base.html' %} + +{% block content %} + +{% endblock %} \ No newline at end of file diff --git a/Kostya Zinchuk/workshop5/source/python/templates/user.html b/Kostya Zinchuk/workshop5/source/python/templates/user.html new file mode 100644 index 0000000..6434c2e --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/python/templates/user.html @@ -0,0 +1,28 @@ +{% extends 'base.html' %} + +{% block content %} + +{% endblock %} \ No newline at end of file diff --git a/Kostya Zinchuk/workshop5/source/sql/MYDATABASE_XE.sql b/Kostya Zinchuk/workshop5/source/sql/MYDATABASE_XE.sql new file mode 100644 index 0000000..d5b722d --- /dev/null +++ b/Kostya Zinchuk/workshop5/source/sql/MYDATABASE_XE.sql @@ -0,0 +1,194 @@ +CREATE TABLE book ( + book_id NUMERIC(10) NOT NULL, + book_name VARCHAR2(50) NOT NULL, + author_name VARCHAR2(50) NOT NULL, + author_lastname VARCHAR2(50) NOT NULL, + book_url VARCHAR2(70) NOT NULL, + CONSTRAINT book_pk PRIMARY KEY ( book_id ), + CONSTRAINT check_id CHECK ( book_id > 0 ) +); + +CREATE TABLE l_user ( + user_name VARCHAR2(50), + user_lastname VARCHAR2(50), + email VARCHAR2(50) NOT NULL PRIMARY KEY, + registration DATE NOT NULL, + login VARCHAR2(20) NOT NULL UNIQUE, + password VARCHAR2(30) NOT NULL, + book_amount NUMERIC, + CONSTRAINT ba_ch CHECK ( book_amount >= 0 ) +); + +CREATE TABLE user_book ( + t_book_id NUMERIC(10) NOT NULL, + user_email VARCHAR2(50) NOT NULL, + CONSTRAINT ub_pk PRIMARY KEY ( t_book_id, + user_email ), + CONSTRAINT book_fk FOREIGN KEY ( t_book_id ) + REFERENCES book ( book_id ), + CONSTRAINT user_fk FOREIGN KEY ( user_email ) + REFERENCES l_user ( email ) +); + +CREATE OR REPLACE TRIGGER check_author_name BEFORE + UPDATE OF author_name ON book + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.author_name, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20001, 'Author name cant be with digits'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_author_name_insert BEFORE + INSERT ON book + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.author_name, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20002, 'Wrong Author name format. Can not be insert in book table'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_author_lastname BEFORE + UPDATE OF author_lastname ON book + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.author_lastname, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20003, 'Author lastname cant be with digits'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_author_lastname_insert BEFORE + INSERT ON book + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.author_lastname, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20004, 'Author lastname wrong format. Can not be insert'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_user_name BEFORE + UPDATE OF user_name ON l_user + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.user_name, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20005, 'User name cant be with digits'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_user_name_insert BEFORE + INSERT ON l_user + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.user_name, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20006, 'User name wrong format. Can not be insert'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_user_lastname BEFORE + UPDATE OF user_lastname ON l_user + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.user_lastname, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20007, 'User name cant be with digits'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_user_lastname_insert BEFORE + INSERT ON l_user + FOR EACH ROW +DECLARE + tmp VARCHAR2(50); +BEGIN + SELECT + regexp_replace(:new.user_lastname, '[[:alpha:]]|_') + INTO tmp + FROM + dual; + + IF tmp IS NOT NULL THEN + raise_application_error(-20008, 'User lastname wrong format. Can not be insert'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_email BEFORE + UPDATE OF email ON l_user + FOR EACH ROW +BEGIN + IF :new.email NOT LIKE '%@%.%' THEN + raise_application_error(-20009, 'Email format is invalid'); + END IF; +END; +/ + +CREATE OR REPLACE TRIGGER check_email_insert BEFORE + INSERT ON l_user + FOR EACH ROW +BEGIN + IF :new.email NOT LIKE '%@%.%' THEN + raise_application_error(-20009, 'Email format is invalid'); + END IF; +END; \ No newline at end of file