Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions HW11/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Install requirements

```shell
pip install -r requirements.txt
```

# Run app

```shell
python app.py
```
118 changes: 118 additions & 0 deletions HW11/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
from flask import Flask, render_template, request, redirect
import sqlite3

app = Flask(__name__)

class Person:
def __init__(self, name, byear):
self.name = name
self.byear = byear


class RoomType:
def __init__(self, id, name, rate):
self.id = id
self.name = name
self.rate = rate



class Guest(Person):
def __init__(self, name, byear, room_type_id, nights):
super().__init__(name, byear)
self.room_type_id = room_type_id
self.nights = nights

def calculate_total(self, rate):
return self.nights * rate


room_types = [
('Одномісний', 500),
('Двомісний', 800),
('Люкс', 1500)
]


def init_db():
with sqlite3.connect('database.db') as conn:
c = conn.cursor()
c.execute('''
CREATE TABLE IF NOT EXISTS room_types (
id INTEGER PRIMARY KEY,
name TEXT,
rate REAL
)
''')
c.execute('''
CREATE TABLE IF NOT EXISTS guests (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
byear TEXT,
room_type_id INTEGER,
nights INTEGER,
FOREIGN KEY(room_type_id) REFERENCES room_types(id)
)
''')
c.execute('SELECT COUNT(*) FROM room_types')
if c.fetchone()[0] == 0:
c.executemany('INSERT INTO room_types (name, rate) VALUES (?, ?)', room_types)
conn.commit()


@app.route('/')
def home():
return render_template('home.html')


@app.route('/register', methods=['GET', 'POST'])
def register():
conn = sqlite3.connect('database.db')
c = conn.cursor()
c.execute('SELECT * FROM room_types')
rooms = c.fetchall()

if request.method == 'POST':
name = request.form['name']
byear = request.form['byear']
room_type_id = int(request.form['room_type_id'])
nights = int(request.form['nights'])

guest = Guest(name, byear, room_type_id, nights)

c.execute('INSERT INTO guests (name, byear, room_type_id, nights) VALUES (?, ?, ?, ?)',
(guest.name, guest.byear, guest.room_type_id, guest.nights))
conn.commit()
return redirect('/guests')

return render_template('register.html', rooms=rooms)


@app.route('/guests')
def guests():
conn = sqlite3.connect('database.db')
c = conn.cursor()
c.execute('''
SELECT g.name, g.byear, r.name, r.rate, g.nights
FROM guests g
JOIN room_types r ON g.room_type_id = r.id
''')
data = c.fetchall()
guests = []
for name, byear, room_name, rate, nights in data:
person = Guest(name, byear, None, nights)
guests.append({
'name': name,
'byear': byear,
'room': room_name,
'rate': rate,
'nights': nights,
'total': person.calculate_total(rate)
})
return render_template('guests.html', guests=guests)


if __name__ == '__main__':
init_db()
app.run(port=8000)

Binary file added HW11/database.db
Binary file not shown.
7 changes: 7 additions & 0 deletions HW11/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
blinker==1.9.0
click==8.2.0
Flask==3.1.1
itsdangerous==2.2.0
Jinja2==3.1.6
MarkupSafe==3.0.2
Werkzeug==3.1.3
31 changes: 31 additions & 0 deletions HW11/templates/guests.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Список гостей</title>
</head>
<body>
<h1>Список гостей</h1>
<table border="1">
<tr>
<th>Прізвище</th>
<th>Рік нар.</th>
<th>Тип номера</th>
<th>Діб</th>
<th>Ціна за добу</th>
<th>Загальна плата</th>
</tr>
{% for guest in guests %}
<tr>
<td>{{ guest.name }}</td>
<td>{{ guest.byear }}</td>
<td>{{ guest.room }}</td>
<td>{{ guest.nights }}</td>
<td>{{ guest.rate }} грн</td>
<td>{{ guest.total }} грн</td>
</tr>
{% endfor %}
</table>
</body>
</html>

15 changes: 15 additions & 0 deletions HW11/templates/home.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Готель</title>
</head>
<body>
<h1>Готель</h1>
<nav>
<li><a href="/guests">Список гостей</a></li>
<li><a href="/register">Зареєструвати гостя</a></li>
</nav>
</body>
</html>
26 changes: 26 additions & 0 deletions HW11/templates/register.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Реєстрація гостя</title>
</head>
<body>
<h1>Реєстрація гостя</h1>
<form method="POST">
<label>Прізвище:</label><br>
<input type="text" name="name" required><br>
<label>Рік народження:</label><br>
<input type="text" name="byear" required><br>
<label>Тип номера:</label><br>
<select name="room_type_id">
{% for room in rooms %}
<option value="{{ room[0] }}">{{ room[1] }} ({{ room[2] }} грн/доба)</option>
{% endfor %}
</select><br>
<label>Кількість діб:</label><br>
<input type="number" name="nights" min="1" required><br><br>
<input type="submit" value="Зареєструвати">
</form>
</body>
</html>