From 25bbac79219f49c920f26f0af0748cf275703c36 Mon Sep 17 00:00:00 2001 From: Jekmen1 Date: Wed, 20 Nov 2024 20:52:08 +0400 Subject: [PATCH 1/9] added my name to the inters list --- Chapter01_Contribution/interns/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Chapter01_Contribution/interns/readme.md b/Chapter01_Contribution/interns/readme.md index cd4fad8a..c469fc22 100644 --- a/Chapter01_Contribution/interns/readme.md +++ b/Chapter01_Contribution/interns/readme.md @@ -30,4 +30,4 @@ ### 2024 ზამთარი - +ჯეკო კობახიძე From afe467dd72ebc39dd4dc03ce7d2b38b31c08bab0 Mon Sep 17 00:00:00 2001 From: Jekmen1 <151436749+Jekmen1@users.noreply.github.com> Date: Sun, 24 Nov 2024 13:44:26 +0400 Subject: [PATCH 2/9] Update github.io link --- Chapter03_CSS/Projects/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Chapter03_CSS/Projects/README.md b/Chapter03_CSS/Projects/README.md index 76c1dc6b..a80a173d 100644 --- a/Chapter03_CSS/Projects/README.md +++ b/Chapter03_CSS/Projects/README.md @@ -38,7 +38,7 @@ - ვანო ინიაშვილი | [RateMovie](/Chapter03_CSS/Projects/2024/Vano_Iniashvili/) | [View](https://htmlpreview.github.io/?https://github.com/VanoIniashvili/UnilabPythonInternship/blob/master/Chapter03_CSS/Projects/2024/Vano_Iniashvili/index.html) - რომა გრიგალაშვილი | [Cheetah](/Chapter3_CSS/Projects/2024/roma_grigalashvili) | [[View]](https://htmlpreview.github.io/?https://github.com/R-Grigala/UnilabPythonInternship/blob/master/Chapter03_CSS/Projects/2024/roma_grigalashvili/index.html) - საბა დვალი | [Cheetah](/Chapter3_CSS/Projects/2024/Saba_Dvali) | [[View]](https://htmlpreview.github.io/?https://github.com/sabadvali4/UnilabPythonInternship/blob/master/Chapter03_CSS/Projects/2024/Saba_Dvali/index.html) -- ჯეკო კობახიძე | [Cheetah](/Chapter3_CSS/Projects/2024/jekokobakhidze) | [[View]](https://htmlpreview.github.io/?https://github.com/Jekmen1/UnilabPythonInternship/blob/master/Chapter03_CSS/Projects/2024/jekokobakhidze/index.html) +- ჯეკო კობახიძე | [Cheetah](/Chapter3_CSS/Projects/2024/jekokobakhidze) | [[View]](https://htmlpreview.github.io/?https://github.com/Jekmen1/UnilabPythonInternship/blob/upstream/Chapter03_CSS/Projects/2024/jekokobakhidze/index.html) ## ინსტრუქცია: From 05b61f408386b69c0bef4499a20cec3d621ea248 Mon Sep 17 00:00:00 2001 From: Jekmen1 <151436749+Jekmen1@users.noreply.github.com> Date: Sun, 24 Nov 2024 13:46:44 +0400 Subject: [PATCH 3/9] remove unneccessary symbols --- Chapter01_Contribution/interns/readme.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/Chapter01_Contribution/interns/readme.md b/Chapter01_Contribution/interns/readme.md index a1c8e843..7ed9bf2a 100644 --- a/Chapter01_Contribution/interns/readme.md +++ b/Chapter01_Contribution/interns/readme.md @@ -29,9 +29,7 @@ გვანცა მანთაშაშვილი ### 2024 ზამთარი -<<<<<<< HEAD -======= ნიკა ლომიაშვილი ირაკლი წურწუმია ჯეკო კობახიძე From 7a6a6b6f306ddb16e49f67589fc7d9f8514302ad Mon Sep 17 00:00:00 2001 From: Jekmen1 Date: Tue, 26 Nov 2024 17:08:46 +0400 Subject: [PATCH 4/9] nothing to change --- Chapter03_CSS/Projects/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Chapter03_CSS/Projects/README.md b/Chapter03_CSS/Projects/README.md index 76c1dc6b..ec3e67fd 100644 --- a/Chapter03_CSS/Projects/README.md +++ b/Chapter03_CSS/Projects/README.md @@ -38,7 +38,7 @@ - ვანო ინიაშვილი | [RateMovie](/Chapter03_CSS/Projects/2024/Vano_Iniashvili/) | [View](https://htmlpreview.github.io/?https://github.com/VanoIniashvili/UnilabPythonInternship/blob/master/Chapter03_CSS/Projects/2024/Vano_Iniashvili/index.html) - რომა გრიგალაშვილი | [Cheetah](/Chapter3_CSS/Projects/2024/roma_grigalashvili) | [[View]](https://htmlpreview.github.io/?https://github.com/R-Grigala/UnilabPythonInternship/blob/master/Chapter03_CSS/Projects/2024/roma_grigalashvili/index.html) - საბა დვალი | [Cheetah](/Chapter3_CSS/Projects/2024/Saba_Dvali) | [[View]](https://htmlpreview.github.io/?https://github.com/sabadvali4/UnilabPythonInternship/blob/master/Chapter03_CSS/Projects/2024/Saba_Dvali/index.html) -- ჯეკო კობახიძე | [Cheetah](/Chapter3_CSS/Projects/2024/jekokobakhidze) | [[View]](https://htmlpreview.github.io/?https://github.com/Jekmen1/UnilabPythonInternship/blob/master/Chapter03_CSS/Projects/2024/jekokobakhidze/index.html) +- ჯეკო კობახიძე | [Cheetah](/Chapter3_CSS/Projects/2024/jekokobakhidze) | [[View]](https://htmlpreview.github.io/?https://htmlpreview.github.io/?https://github.com/Jekmen1/UnilabPythonInternship/blob/upstream/Chapter03_CSS/Projects/2024/jekokobakhidze/index.html) ## ინსტრუქცია: From 459aa6477eaf8ed3c070707a4f95af4bbfc36d1d Mon Sep 17 00:00:00 2001 From: Jekmen1 Date: Fri, 29 Nov 2024 12:15:14 +0400 Subject: [PATCH 5/9] add flask project --- .../Projects/2024/jekokobakhidze/app.py | 19 +++++++ .../2024/jekokobakhidze/static/styles.css | 6 +++ .../2024/jekokobakhidze/templates/about.html | 8 +++ .../2024/jekokobakhidze/templates/base.html | 54 +++++++++++++++++++ .../jekokobakhidze/templates/contact.html | 9 ++++ .../2024/jekokobakhidze/templates/index.html | 9 ++++ 6 files changed, 105 insertions(+) create mode 100644 Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/app.py create mode 100644 Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/static/styles.css create mode 100644 Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/about.html create mode 100644 Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/base.html create mode 100644 Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/contact.html create mode 100644 Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/index.html diff --git a/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/app.py b/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/app.py new file mode 100644 index 00000000..297fdc7d --- /dev/null +++ b/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/app.py @@ -0,0 +1,19 @@ +from flask import Flask, render_template + +app = Flask(__name__) + +@app.route('/') +def home(): + data = {"title": "Home Page", "message": "Welcome to our Flask site!"} + return render_template('index.html', data=data) + +@app.route('/about') +def about(): + return render_template('about.html', title="About Us") + +@app.route('/contact') +def contact(): + return render_template('contact.html', title="Contact Us") + +if __name__ == '__main__': + app.run(debug=True) diff --git a/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/static/styles.css b/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/static/styles.css new file mode 100644 index 00000000..788527e0 --- /dev/null +++ b/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/static/styles.css @@ -0,0 +1,6 @@ +body { + background-color: #f8f9fa; +} +footer p { + margin: 0; +} diff --git a/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/about.html b/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/about.html new file mode 100644 index 00000000..1b5185c9 --- /dev/null +++ b/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/about.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} + +{% block content %} +
+

{{ title }}

+

Welcome to UNILAB

+
+{% endblock %} diff --git a/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/base.html b/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/base.html new file mode 100644 index 00000000..a20d38a9 --- /dev/null +++ b/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/base.html @@ -0,0 +1,54 @@ + + + + + + {{ title if title else "Flask App" }} + + + + + + + +
+ +
+ +
+ {% block content %}{% endblock %} +
+ +
+

© 2024 Flask Project

+
+ + + + + diff --git a/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/contact.html b/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/contact.html new file mode 100644 index 00000000..e3a02d20 --- /dev/null +++ b/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/contact.html @@ -0,0 +1,9 @@ +{% extends 'base.html' %} + +{% block content %} +
+

{{ title }}

+

Feel free to reach us at contact@example.com.

+ Send an Email +
+{% endblock %} diff --git a/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/index.html b/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/index.html new file mode 100644 index 00000000..9e6e3e07 --- /dev/null +++ b/Chapter05_Flask_Templates/Projects/2024/jekokobakhidze/templates/index.html @@ -0,0 +1,9 @@ +{% extends 'base.html' %} + +{% block content %} +
+

{{ data.title }}

+

{{ data.message }}

+ Learn More +
+{% endblock %} From 02aa74d8e510fd069dccd54556c807d3522de94c Mon Sep 17 00:00:00 2001 From: Jekmen1 Date: Sun, 1 Dec 2024 17:30:08 +0400 Subject: [PATCH 6/9] add forms and validators to the flask project --- .../Projects/2024/jeko_kobakhidze/app.py | 28 +++++++++++++++++++ .../Projects/2024/jeko_kobakhidze/forms.py | 14 ++++++++++ .../2024/jeko_kobakhidze/static/styles.css | 7 +++++ .../2024/jeko_kobakhidze/templates/base.html | 16 +++++++++++ .../2024/jeko_kobakhidze/templates/home.html | 6 ++++ .../jeko_kobakhidze/templates/navbar.html | 13 +++++++++ .../jeko_kobakhidze/templates/register.html | 25 +++++++++++++++++ .../jeko_kobakhidze/templates/survey.html | 13 +++++++++ 8 files changed, 122 insertions(+) create mode 100644 Chapter06_Forms/Projects/2024/jeko_kobakhidze/app.py create mode 100644 Chapter06_Forms/Projects/2024/jeko_kobakhidze/forms.py create mode 100644 Chapter06_Forms/Projects/2024/jeko_kobakhidze/static/styles.css create mode 100644 Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/base.html create mode 100644 Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/home.html create mode 100644 Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/navbar.html create mode 100644 Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/register.html create mode 100644 Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/survey.html diff --git a/Chapter06_Forms/Projects/2024/jeko_kobakhidze/app.py b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/app.py new file mode 100644 index 00000000..70e0cb88 --- /dev/null +++ b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/app.py @@ -0,0 +1,28 @@ +from flask import Flask, render_template, redirect, url_for, flash +from forms import RegistrationForm, SurveyForm + +app = Flask(__name__) +app.config['SECRET_KEY'] = '1rm32fm3f3f' + +@app.route('/') +def home(): + return render_template('home.html') + +@app.route('/register', methods=['GET', 'POST']) +def register(): + form = RegistrationForm() + if form.validate_on_submit(): + flash(f'Account created for {form.username.data}!', 'success') + return redirect(url_for('home')) + return render_template('register.html', form=form) + +@app.route('/survey', methods=['GET', 'POST']) +def survey(): + form = SurveyForm() + if form.validate_on_submit(): + flash('Survey submitted successfully!', 'success') + return redirect(url_for('home')) + return render_template('survey.html', form=form) + +if __name__ == '__main__': + app.run(debug=True) diff --git a/Chapter06_Forms/Projects/2024/jeko_kobakhidze/forms.py b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/forms.py new file mode 100644 index 00000000..b7072d3b --- /dev/null +++ b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/forms.py @@ -0,0 +1,14 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, PasswordField, SubmitField, TextAreaField +from wtforms.validators import DataRequired, Length, Email, EqualTo + +class RegistrationForm(FlaskForm): + username = StringField('Username', validators=[DataRequired(), Length(min=3, max=20)]) + email = StringField('Email', validators=[DataRequired(), Email()]) + password = PasswordField('Password', validators=[DataRequired(), Length(min=6)]) + confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) + submit = SubmitField('Register') + +class SurveyForm(FlaskForm): + feedback = TextAreaField('Feedback', validators=[DataRequired(), Length(min=10)]) + submit = SubmitField('Submit') diff --git a/Chapter06_Forms/Projects/2024/jeko_kobakhidze/static/styles.css b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/static/styles.css new file mode 100644 index 00000000..b3ca6f9d --- /dev/null +++ b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/static/styles.css @@ -0,0 +1,7 @@ +body { + background-color: #f8f9fa; +} + +h1, h2 { + color: #343a40; +} diff --git a/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/base.html b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/base.html new file mode 100644 index 00000000..1cb6c5f0 --- /dev/null +++ b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/base.html @@ -0,0 +1,16 @@ + + + + + + {% block title %}Flask App{% endblock %} + + + + + {% include 'navbar.html' %} +
+ {% block content %}{% endblock %} +
+ + diff --git a/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/home.html b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/home.html new file mode 100644 index 00000000..2d95a7c4 --- /dev/null +++ b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/home.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} +{% block title %}Home{% endblock %} +{% block content %} +

Welcome to UNILAB!

+

This is the home page.

+{% endblock %} diff --git a/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/navbar.html b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/navbar.html new file mode 100644 index 00000000..33a7df26 --- /dev/null +++ b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/navbar.html @@ -0,0 +1,13 @@ + diff --git a/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/register.html b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/register.html new file mode 100644 index 00000000..3a8093d3 --- /dev/null +++ b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/register.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} +{% block title %}Register{% endblock %} +{% block content %} +

Register

+
+ {{ form.hidden_tag() }} +
+ {{ form.username.label }} + {{ form.username(class="form-control") }} +
+
+ {{ form.email.label }} + {{ form.email(class="form-control") }} +
+
+ {{ form.password.label }} + {{ form.password(class="form-control") }} +
+
+ {{ form.confirm_password.label }} + {{ form.confirm_password(class="form-control") }} +
+ {{ form.submit(class="btn btn-primary") }} +
+{% endblock %} diff --git a/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/survey.html b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/survey.html new file mode 100644 index 00000000..b3955b61 --- /dev/null +++ b/Chapter06_Forms/Projects/2024/jeko_kobakhidze/templates/survey.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% block title %}Survey{% endblock %} +{% block content %} +

Survey

+
+ {{ form.hidden_tag() }} +
+ {{ form.feedback.label }} + {{ form.feedback(class="form-control") }} +
+ {{ form.submit(class="btn btn-primary") }} +
+{% endblock %} From 52576221a50a219ce0e7791dc2814a525f5ee6b0 Mon Sep 17 00:00:00 2001 From: Jekmen1 Date: Sun, 8 Dec 2024 19:41:15 +0400 Subject: [PATCH 7/9] add flask project with database --- .../Projects/2024/jeko_kobakhidze/app.py | 34 +++++++ .../Projects/2024/jeko_kobakhidze/config.py | 8 ++ .../Projects/2024/jeko_kobakhidze/forms.py | 8 ++ .../Projects/2024/jeko_kobakhidze/models.py | 11 +++ .../2024/jeko_kobakhidze/static/styles.css | 84 ++++++++++++++++++ .../2024/jeko_kobakhidze/templates/index.html | 48 ++++++++++ .../Projects/2024/jeko_kobakhidze/test.db | Bin 0 -> 12288 bytes .../2024/roma_grigalashvili/db.sqlite | Bin 0 -> 8192 bytes 8 files changed, 193 insertions(+) create mode 100644 Chapter07_Database/Projects/2024/jeko_kobakhidze/app.py create mode 100644 Chapter07_Database/Projects/2024/jeko_kobakhidze/config.py create mode 100644 Chapter07_Database/Projects/2024/jeko_kobakhidze/forms.py create mode 100644 Chapter07_Database/Projects/2024/jeko_kobakhidze/models.py create mode 100644 Chapter07_Database/Projects/2024/jeko_kobakhidze/static/styles.css create mode 100644 Chapter07_Database/Projects/2024/jeko_kobakhidze/templates/index.html create mode 100644 Chapter07_Database/Projects/2024/jeko_kobakhidze/test.db create mode 100644 Chapter07_Database/Projects/2024/roma_grigalashvili/db.sqlite diff --git a/Chapter07_Database/Projects/2024/jeko_kobakhidze/app.py b/Chapter07_Database/Projects/2024/jeko_kobakhidze/app.py new file mode 100644 index 00000000..73f33d9a --- /dev/null +++ b/Chapter07_Database/Projects/2024/jeko_kobakhidze/app.py @@ -0,0 +1,34 @@ +from flask import Flask, render_template, redirect, url_for, flash +from models import db, User +from forms import RegistrationForm +from config import Config + +app = Flask(__name__) +app.config.from_object(Config) + +db.init_app(app) + +with app.app_context(): + db.create_all() + + +@app.route('/', methods=['GET', 'POST']) +def index(): + form = RegistrationForm() + if form.validate_on_submit(): + username = form.username.data + email = form.email.data + + new_user = User(username=username, email=email) + + db.session.add(new_user) + db.session.commit() + + flash(f"User {username} has been successfully registered!", 'success') + return redirect(url_for('index')) + users = User.query.all() + return render_template('index.html', form=form, users=users) + + +if __name__ == "__main__": + app.run(debug=True) diff --git a/Chapter07_Database/Projects/2024/jeko_kobakhidze/config.py b/Chapter07_Database/Projects/2024/jeko_kobakhidze/config.py new file mode 100644 index 00000000..edf07c04 --- /dev/null +++ b/Chapter07_Database/Projects/2024/jeko_kobakhidze/config.py @@ -0,0 +1,8 @@ +import os + +BASE_DIR = os.path.abspath(os.path.dirname(__file__)) + +class Config: + SECRET_KEY = 'grgrdhtbg343' + SQLALCHEMY_DATABASE_URI = f"sqlite:///{os.path.join(BASE_DIR, 'test.db')}" + SQLALCHEMY_TRACK_MODIFICATIONS = False diff --git a/Chapter07_Database/Projects/2024/jeko_kobakhidze/forms.py b/Chapter07_Database/Projects/2024/jeko_kobakhidze/forms.py new file mode 100644 index 00000000..23f096f2 --- /dev/null +++ b/Chapter07_Database/Projects/2024/jeko_kobakhidze/forms.py @@ -0,0 +1,8 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, SubmitField +from wtforms.validators import DataRequired, Email + +class RegistrationForm(FlaskForm): + username = StringField('Username', validators=[DataRequired()]) + email = StringField('Email', validators=[DataRequired(), Email()]) + submit = SubmitField('Register') diff --git a/Chapter07_Database/Projects/2024/jeko_kobakhidze/models.py b/Chapter07_Database/Projects/2024/jeko_kobakhidze/models.py new file mode 100644 index 00000000..87a43008 --- /dev/null +++ b/Chapter07_Database/Projects/2024/jeko_kobakhidze/models.py @@ -0,0 +1,11 @@ +from flask_sqlalchemy import SQLAlchemy + +db = SQLAlchemy() + +class User(db.Model): + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(80), nullable=False) + email = db.Column(db.String(120), unique=True, nullable=False) + + def __repr__(self): + return f'' diff --git a/Chapter07_Database/Projects/2024/jeko_kobakhidze/static/styles.css b/Chapter07_Database/Projects/2024/jeko_kobakhidze/static/styles.css new file mode 100644 index 00000000..336cf13f --- /dev/null +++ b/Chapter07_Database/Projects/2024/jeko_kobakhidze/static/styles.css @@ -0,0 +1,84 @@ + +body { + font-family: Arial, Helvetica, sans-serif; + background-color: #f4f4f9; + color: #333; + line-height: 1.6; + margin: 0; + padding: 0; +} + +.container { + max-width: 700px; + margin: 50px auto; + padding: 20px; + background: #fff; + border-radius: 10px; + box-shadow: 0 0 10px rgba(0,0,0,0.1); +} + +h1, h2 { + text-align: center; + color: #333; +} + +form { + display: flex; + flex-direction: column; +} + +form p { + margin-bottom: 15px; +} + +input[type="text"], input[type="email"] { + width: 100%; + padding: 10px; + margin-top: 5px; + border-radius: 5px; + border: 1px solid #ccc; + font-size: 16px; +} + +input[type="submit"] { + background-color: #007bff; + color: #fff; + padding: 10px; + font-size: 16px; + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s ease; +} + +input[type="submit"]:hover { + background-color: #0056b3; +} + +.flash-message { + background-color: #28a745; + color: #fff; + padding: 10px; + margin-bottom: 20px; + border-radius: 5px; + text-align: center; +} + +/* მომხმარებლის სია */ +ul { + list-style-type: none; + padding: 0; +} + +ul li { + background-color: #007bff; + color: #fff; + padding: 10px; + margin-bottom: 10px; + border-radius: 5px; + text-align: center; +} + +ul li:nth-child(odd) { + background-color: #0056b3; +} diff --git a/Chapter07_Database/Projects/2024/jeko_kobakhidze/templates/index.html b/Chapter07_Database/Projects/2024/jeko_kobakhidze/templates/index.html new file mode 100644 index 00000000..b322252b --- /dev/null +++ b/Chapter07_Database/Projects/2024/jeko_kobakhidze/templates/index.html @@ -0,0 +1,48 @@ + + + + + + Registration Form + + + + +
+

Register New User

+ + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for category, message in messages %} +
{{ message }}
+ {% endfor %} + {% endif %} + {% endwith %} + +
+ {{ form.hidden_tag() }} + +

+ {{ form.username.label }}
+ {{ form.username(class_="form-control") }} +

+ +

+ {{ form.email.label }}
+ {{ form.email(class_="form-control") }} +

+ +

{{ form.submit(class_="btn btn-primary") }}

+
+ +

Registered Users

+
    + {% for user in users %} +
  • {{ user.username }} ({{ user.email }})
  • + {% else %} +

    No users registered yet.

    + {% endfor %} +
+
+ + diff --git a/Chapter07_Database/Projects/2024/jeko_kobakhidze/test.db b/Chapter07_Database/Projects/2024/jeko_kobakhidze/test.db new file mode 100644 index 0000000000000000000000000000000000000000..3a9a01cdde1f1df31ef9be38d449dc1147c32959 GIT binary patch literal 12288 zcmeI$&q@M890%~3RVoFUAVea9=^(mLqIOZdxXDtIS#E3KNyZ#y)pf}~5Z&srdW0_Z z3SD}Jj_oW`6otn;e1GixW@mph%kJkkbJ?glGs%12#1%7sNHz(jq|7-XB(!LL7XpVeIcNBP34o*7n)pPDV6cDlNHXR}^yG)}5JKmY;|fB*y_009U<00Izz zz={bZwJ_N$iJq7SSAQUf-q7oaq0_yS<-R&g$Xt8wE)A2dVs9#fdHs=-&t?l><*5Hx v8haw_%})pjKmY;|fB*y_009U<00Izz00dTCU?)_ff1Ckm+o59Q_x=9|{&#W+ literal 0 HcmV?d00001 diff --git a/Chapter07_Database/Projects/2024/roma_grigalashvili/db.sqlite b/Chapter07_Database/Projects/2024/roma_grigalashvili/db.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..ff1496c3e54bbe531915ebef98f998ab90321a61 GIT binary patch literal 8192 zcmeI#&q@O^5C-t16r>9+-aHlNxC>VL#|JQ$prz}oaTR(h>o#IUySR{K5DBm(mBX-C*XJDQ^n>fwTvwc(ylmPo z#XB434hjMgfB*y_009U<00Izz00bbg6M?TDKRD`k`FGD|kFWauL$9nUmcBQ}N{Uoc zD$Zj`{*}U@Wfn9^Qh6a2CD$n>_i=noLCZ(xR)1Q05NdoWR5 Date: Sun, 8 Dec 2024 19:43:28 +0400 Subject: [PATCH 8/9] add flask project with database --- .../Projects/2024/jeko_kobakhidze/static/styles.css | 1 - 1 file changed, 1 deletion(-) diff --git a/Chapter07_Database/Projects/2024/jeko_kobakhidze/static/styles.css b/Chapter07_Database/Projects/2024/jeko_kobakhidze/static/styles.css index 336cf13f..fa6f9740 100644 --- a/Chapter07_Database/Projects/2024/jeko_kobakhidze/static/styles.css +++ b/Chapter07_Database/Projects/2024/jeko_kobakhidze/static/styles.css @@ -64,7 +64,6 @@ input[type="submit"]:hover { text-align: center; } -/* მომხმარებლის სია */ ul { list-style-type: none; padding: 0; From f8eb6e86a8e2211523aefff18d1e3c85920fb2f4 Mon Sep 17 00:00:00 2001 From: Jekmen1 Date: Thu, 12 Dec 2024 17:26:29 +0400 Subject: [PATCH 9/9] add flask project, with structuring --- .../Projects/2024/jeko_kobakhidze/app.py | 18 +++++++++++ .../2024/jeko_kobakhidze/src/__init__.py | 0 .../2024/jeko_kobakhidze/src/commands.py | 9 ++++++ .../2024/jeko_kobakhidze/src/config.py | 5 ++++ .../Projects/2024/jeko_kobakhidze/src/ext.py | 8 +++++ .../jeko_kobakhidze/src/models/__init__.py | 3 ++ .../2024/jeko_kobakhidze/src/models/base.py | 7 +++++ .../jeko_kobakhidze/src/models/product.py | 7 +++++ .../2024/jeko_kobakhidze/src/models/role.py | 5 ++++ .../2024/jeko_kobakhidze/src/models/user.py | 7 +++++ .../src/templates/auth/login.html | 15 ++++++++++ .../src/templates/auth/register.html | 17 +++++++++++ .../src/templates/main/home.html | 10 +++++++ .../src/templates/products/products.html | 14 +++++++++ .../jeko_kobakhidze/src/views/__init__.py | 0 .../jeko_kobakhidze/src/views/auth/forms.py | 15 ++++++++++ .../jeko_kobakhidze/src/views/auth/routes.py | 30 +++++++++++++++++++ .../jeko_kobakhidze/src/views/main/routes.py | 7 +++++ .../src/views/products/routes.py | 9 ++++++ 19 files changed, 186 insertions(+) create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/app.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/__init__.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/commands.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/config.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/ext.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/__init__.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/base.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/product.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/role.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/user.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/auth/login.html create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/auth/register.html create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/main/home.html create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/products/products.html create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/__init__.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/auth/forms.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/auth/routes.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/main/routes.py create mode 100644 Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/products/routes.py diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/app.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/app.py new file mode 100644 index 00000000..351eb2c9 --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/app.py @@ -0,0 +1,18 @@ +from flask import Flask +from src.ext import db +from src.config import Config +from src.views.auth.routes import auth_bp +from src.views.main.routes import main_bp +from src.views.products.routes import products_bp + +app = Flask(__name__) +app.config.from_object(Config) + +db.init_app(app) + +app.register_blueprint(auth_bp, url_prefix='/auth') +app.register_blueprint(main_bp, url_prefix='/') +app.register_blueprint(products_bp, url_prefix='/products') + +if __name__ == '__main__': + app.run(debug=True) diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/__init__.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/commands.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/commands.py new file mode 100644 index 00000000..e2f5b6e5 --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/commands.py @@ -0,0 +1,9 @@ +from src.models.product import Product +from src.ext import db +def seed_products(): + products = [ + Product(name="python course", description="you learn how to create web app", price=10), + Product(name="marketing", description="sfgsrge3", price=20.0), + ] + db.session.add_all(products) + db.session.commit() diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/config.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/config.py new file mode 100644 index 00000000..36cb9117 --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/config.py @@ -0,0 +1,5 @@ + +class Config: + SECRET_KEY = "kasnfoabven123e@" + SQLALCHEMY_DATABASE_URI = 'sqlite:///site.db' + SQLALCHEMY_TRACK_MODIFICATIONS = False \ No newline at end of file diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/ext.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/ext.py new file mode 100644 index 00000000..f83e29fa --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/ext.py @@ -0,0 +1,8 @@ +from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate +from flask_login import LoginManager + + +db = SQLAlchemy() +migrate = Migrate() +login_manager = LoginManager() diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/__init__.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/__init__.py new file mode 100644 index 00000000..f0b13d6f --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/__init__.py @@ -0,0 +1,3 @@ +from flask_sqlalchemy import SQLAlchemy + +db = SQLAlchemy() diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/base.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/base.py new file mode 100644 index 00000000..6fabebda --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/base.py @@ -0,0 +1,7 @@ +from src.ext import db + +class BaseModel(db.Model): + __abstract__ = True + id = db.Column(db.Integer, primary_key=True) + created_at = db.Column(db.DateTime, default=db.func.current_timestamp()) + updated_at = db.Column(db.DateTime, default=db.func.current_timestamp(), onupdate=db.func.current_timestamp()) diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/product.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/product.py new file mode 100644 index 00000000..6e6f14fb --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/product.py @@ -0,0 +1,7 @@ +from src.ext import db +from src.models.base import BaseModel + +class Product(BaseModel): + name = db.Column(db.String(150), nullable=False) + description = db.Column(db.Text, nullable=False) + price = db.Column(db.Float, nullable=False) diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/role.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/role.py new file mode 100644 index 00000000..484a9449 --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/role.py @@ -0,0 +1,5 @@ +from src.ext import db +from src.models.base import BaseModel + +class Role(BaseModel): + name = db.Column(db.String(50), unique=True, nullable=False) diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/user.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/user.py new file mode 100644 index 00000000..e0d1dfbb --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/models/user.py @@ -0,0 +1,7 @@ +from src.ext import db +from src.models.base import BaseModel + +class User(BaseModel): + username = db.Column(db.String(150), unique=True, nullable=False) + email = db.Column(db.String(150), unique=True, nullable=False) + password = db.Column(db.String(150), nullable=False) diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/auth/login.html b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/auth/login.html new file mode 100644 index 00000000..7d2bcb15 --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/auth/login.html @@ -0,0 +1,15 @@ + + + + Login + + +

Login

+
+ {{ form.hidden_tag() }} + {{ form.email.label }} {{ form.email() }} + {{ form.password.label }} {{ form.password() }} + {{ form.submit() }} +
+ + diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/auth/register.html b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/auth/register.html new file mode 100644 index 00000000..f2e1351d --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/auth/register.html @@ -0,0 +1,17 @@ + + + + Register + + +

Register

+
+ {{ form.hidden_tag() }} + {{ form.username.label }} {{ form.username() }} + {{ form.email.label }} {{ form.email() }} + {{ form.password.label }} {{ form.password() }} + {{ form.confirm_password.label }} {{ form.confirm_password() }} + {{ form.submit() }} +
+ + diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/main/home.html b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/main/home.html new file mode 100644 index 00000000..784bc0cb --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/main/home.html @@ -0,0 +1,10 @@ + + + + Home + + +

Welcome to the Home Page

+ View Products + + diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/products/products.html b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/products/products.html new file mode 100644 index 00000000..588a041a --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/templates/products/products.html @@ -0,0 +1,14 @@ + + + + Products + + +

Products

+
    + {% for product in products %} +
  • {{ product.name }} - {{ product.description }} - ${{ product.price }}
  • + {% endfor %} +
+ + diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/__init__.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/auth/forms.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/auth/forms.py new file mode 100644 index 00000000..48498ed3 --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/auth/forms.py @@ -0,0 +1,15 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, PasswordField, SubmitField +from wtforms.validators import DataRequired, Email, EqualTo + +class RegisterForm(FlaskForm): + username = StringField('Username', validators=[DataRequired()]) + email = StringField('Email', validators=[DataRequired(), Email()]) + password = PasswordField('Password', validators=[DataRequired()]) + confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) + submit = SubmitField('Register') + +class LoginForm(FlaskForm): + email = StringField('Email', validators=[DataRequired(), Email()]) + password = PasswordField('Password', validators=[DataRequired()]) + submit = SubmitField('Login') diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/auth/routes.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/auth/routes.py new file mode 100644 index 00000000..a40d6200 --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/auth/routes.py @@ -0,0 +1,30 @@ +from flask import Blueprint, render_template, redirect, url_for, flash +from werkzeug.security import generate_password_hash, check_password_hash +from src.models.user import User +from src.ext import db +from src.views.auth.forms import RegisterForm, LoginForm + +auth_bp = Blueprint('auth', __name__, template_folder='../../templates/auth') + +@auth_bp.route('/register', methods=['GET', 'POST']) +def register(): + form = RegisterForm() + if form.validate_on_submit(): + hashed_password = generate_password_hash(form.password.data, method='sha256') + new_user = User(username=form.username.data, email=form.email.data, password=hashed_password) + db.session.add(new_user) + db.session.commit() + flash('Registration successful!', 'success') + return redirect(url_for('auth.login')) + return render_template('register.html', form=form) + +@auth_bp.route('/login', methods=['GET', 'POST']) +def login(): + form = LoginForm() + if form.validate_on_submit(): + user = User.query.filter_by(email=form.email.data).first() + if user and check_password_hash(user.password.data, form.password.data): + flash('Login successful!', 'success') + return redirect(url_for('main.home')) + flash('Invalid credentials.', 'danger') + return render_template('login.html', form=form) diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/main/routes.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/main/routes.py new file mode 100644 index 00000000..72814f91 --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/main/routes.py @@ -0,0 +1,7 @@ +from flask import render_template, Blueprint + +main_bp = Blueprint('main', __name__, template_folder='../../templates/main') + +@main_bp.route('/') +def home(): + return render_template('home.html') diff --git a/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/products/routes.py b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/products/routes.py new file mode 100644 index 00000000..856c5d62 --- /dev/null +++ b/Chapter09_Structuring/Projects/2024/jeko_kobakhidze/src/views/products/routes.py @@ -0,0 +1,9 @@ +from flask import Blueprint, render_template +from src.models.product import Product + +products_bp = Blueprint('products', __name__, template_folder='../../templates/products') + +@products_bp.route('/') +def products(): + product_list = Product.query.all() + return render_template('products.html', products=product_list)