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
16 changes: 8 additions & 8 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
language: python
python:
- 3.8
- 3.8
services:
- postgresql
- postgresql
install:
- psql -c 'create database django_db owner postgres;' -U postgres
- pip install -r requirements.txt
- psql -c 'create database django_db owner postgres;' -U postgres
- pip install -r requirements.txt
script:
- python manage.py migrate
- python manage.py test shop/tests/
- python manage.py migrate
- python manage.py test shop/tests/
deploy:
provider: heroku
api_key:
secure: mPaaMYOJ0x4W68w/MNgTMD0UgbUJL1dDSSNy/FdHjK3CygqbUhRjC0u0tT6YRJOnPY5wmv8SYvhHgo9vGnTfM5f2zSX+N/BchCD/39GbxgAfrJ2wo3KTiF8zlihs7+l7FInriWPe6lkogJD7APNkIsT24jxvrNgcKkHvGsG/stZXK4Fq/5GNRqzOHsjoqNgUIS1+8w8qWDIEb8jF24155aqiE9lTwzD1jY9tpREB4iIvTlPldM+A29mzipNxPaz0QsR5dHLzkGXK5VsWlAsyfRnnRYbqhaB4cBrX0TBBkUcSLC0Y3n2hDiKXkbRW1xD+Ho1mJZEGXXZAeJDcG2E05V+6sAEWGHqlv+ez380j8qgl2WT/XAMiAD45au9JjX5QUtJRpFTQCAnsEICeT3ekIXdRwo/i2af/L9pEUD9i48E9XY0v7yPVWGRZ/5v8j+1zPo1lLI/Wnebj0HIKku6uto+rRD7esYt7SN9JV0b6wfBX+zyl68SghBJS2qRaZnq62e4Wq38nka+PDN0z6PQhP4oxp6S8L+faPN1jCOisinhuWbVLZKTWxRJEL3/lt1LyyiTCTq1WBFbF0nDzXERfs+j8i+ZjtLZDGaNEdkCjldpkg4FL+LK6E15SF77g9hkfDx1XAdGoN7W9VW8Mrc+XQhs0L0RXpv1TFhX4JKup6Eg=
app: webapp-ivanov-shop
secure: MJLW4SX/BsuezTNmljZGWLgay+v1gdSpp1JbEu01txgPkh7WJ2lopA+A7q9kLCSx87j6lDBFld2bYv4zDW04NJ9Z4pk6fhIHjJCJwWJKDt+2za6kybq2yNwGxKaLbPWy0LNCYQNtt0n6XkMLrznjmYOhkIE/+GG5arCO4wzH4hjsxOYpPvEEu5Lh8FVjun+6/Lak3DGbs4CufxrvwFwAEDjavKPPv3v1yD/qFahY3YVPoeimjDbrRPC+9OisgWPYAkHeDiyfEVH8PHw802WgG6elrSrl00A8vUgS5rRK1cCvh5EL+B8KkifuCWq8sprYLiI1+T87iV0DpuyFH6lFg2oOoOsSVd69WpvyGdHkQE/mjXWhv0UuFfmoY6bhniKvGQCv55/Bw3O3VGcUYOt2Ys4AxDXGgUBZUelGn8QUEhp2ET0ih5HiwQmHnEU1YNYAOTkMnQbu1+w5KtkfVYX381lZ277pSI21Egqz+NuMfrhOlbtYqTrt4z14mdJYwDVmI6dQel1NkJ5O9Mzmo8f1IVlfgLGSDUENuWp1m9nXqju6o4Zk2gDJeKSzW9VyjK/BK9rVG+eu7CW5IjjNSR7nskk2zQKbo6mmG9+1fSyKll2c4JuDOY1PnxdoRp9NLnRPMZrmKmCZqb8iR6/DMvsKQkfslhCTQ6PNkca0/PKC+p4=
app: krivabokov-app
run: python manage.py loaddata products.yaml && python manage.py migrate
on: master
44 changes: 43 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,44 @@
[![Build Status](https://app.travis-ci.com/kpdvstu/PTLab2.svg?branch=master)](https://app.travis-ci.com/kpdvstu/PTLab2)
[![Build Status](https://app.travis-ci.com/Krivabokov/PTLab2.svg?branch=master)](https://app.travis-ci.com/Krivabokov/PTLab2)
# Лабораторная 2 по дисциплине "Технологии программирования"

### Изучение фреймворка MVC

# Цели работы:
1. Познакомиться c моделью MVC, ее сущностью и основными фреймворками на ее основе.
2. Разобраться с сущностями «модель», «контроллер», «представление», их функциональным
назначением.
3. Получить навыки разработки веб-приложений с использованием MVC-фреймворков, написания
модульных тестов к ним и интеграции приложений в конвейер CI / CD;
4. Получить навыки управления автоматизированным тестированием и разворачиванием
программного обеспечения, расположенного в системе Git, с помощью инструмента Travis CI.

# Постановка задачи:
В работе используется учебный проект, представляющий собой простейший пример интернетмагазина,
реализованного с использованием модели MVC с помощью фреймворка Django на языке
Python.

Необходимо доработать проект магазина, добавив в него новую функциональность и информацию в базу
данных в соответствии с типом магазина. Составить модульные тесты к проекту, постарайтесь покрыть тестами
максимально возможный объем кода.

Тип магазина:

Магазин предметов роскоши

Функциональность приложения:

В магазине имеется определенное количество товара каждого
вида. После покупки количество товара уменьшается. Если товар
закончился, его покупка должна быть невозможной.

# Используемые языки / библиотеки / технологии
Языки: Python

Библиотеки: django, os, sys, datetime

Технологии: Git, Travis CI

# Выводы по работе
В данной работе я познакомился c моделью MVC. Получил навыки веб-приложений с использованием MVC-фреймворков, написания
модульных тестов к ним. управления автоматизированным тестированием и разворачиванием
программного обеспечения, расположенного в системе Git, с помощью инструмента Travis CI.
27 changes: 21 additions & 6 deletions shop/fixtures/products.yaml
Original file line number Diff line number Diff line change
@@ -1,15 +1,30 @@
- model: shop.product
pk: 1
fields:
name: Стол
price: 2000
name: Дерево с кулонами (фарфор, бронза)
price: 120000
quantity: 3
- model: shop.product
pk: 2
fields:
name: Стул
price: 1000
name: Композиция "Охота с лодки" (агат, серебро)
price: 380000
quantity: 1
- model: shop.product
pk: 3
fields:
name: Табурет
price: 500
name: Напольные часы "Полководцы" №1
price: 900000
quantity: 1
- model: shop.product
pk: 4
fields:
name: Часы напольные "Охота" №1
price: 850000
quantity: 5
- model: shop.product
pk: 5
fields:
name: 10 томов "Великие правители Востока"
price: 4900000
quantity: 1
2 changes: 1 addition & 1 deletion shop/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by Django 3.2.8 on 2021-10-06 17:32
# Generated by Django 4.1.3 on 2022-12-09 13:19

from django.db import migrations, models
import django.db.models.deletion
Expand Down
3 changes: 2 additions & 1 deletion shop/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
class Product(models.Model):
name = models.CharField(max_length=200)
price = models.PositiveIntegerField()
quantity = models.IntegerField()

class Purchase(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
person = models.CharField(max_length=200)
address = models.CharField(max_length=200)
date = models.DateTimeField(auto_now_add=True)
date = models.DateTimeField(auto_now_add=True)
113 changes: 99 additions & 14 deletions shop/templates/shop/index.html
Original file line number Diff line number Diff line change
@@ -1,26 +1,111 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width" />
<link href="https://fonts.googleapis.com/css?family=Kaushan+Script:regular" rel="stylesheet" />
<title>Товары</title>
<style type="text/css">
.header__logo {
font-size: 150%;
font-family: 'Kaushan Script', cursive;
font-weight: 700;
color: #336;
}
body {
margin: 0;
font-family: 'Montserrat', sans-serif;
font-size: 20px;
line-height: 1.6;
color: #333;
}
.container {
width: 100%;
max-width: 1200px;
margin: 0 auto;
}
.header_inner {
width: 100%;
max-width: 880px;
margin: 40px auto 0;
text-align: center;
}
.table_inner {
width: 100%;
max-width: 880px;
margin: 0 auto;
}
.headings {
font-size: 120%;
font-weight: 700;
}
table {
border-collapse: collapse;
}
td {
border: 2px solid grey;
padding: 10px 15px;
}

.buy {
font-size: 22px;
text-transform: uppercase;
text-decoration: none;
transition: color .2s linear;
display: inline-block;
position: relative;
color: inherit;
}
.buy:after {
content: "";
display: block;
width: 100%;
height: 3px;
opacity: 0;
background-color: #336;
position: absolute;
top: 100%;
left: 0;
z-index: 1;
transition: opacity .2s linear;
}
.buy:hover {
font-weight: 500;
color: #336;
}
.buy:hover:after,
.buy.active:after {
opacity: 1;
}
</style>
</head>
<body>
<header class="header">
<div class="container">
<div class="header_inner">
<h3 class="header__logo">Предметы роскоши</h3>
</div>
</div>
</header>
<div>
<h3>Список</h3>
<table>
<tr>
<td><p>Наименование</p></td>
<td><p>Цена</p></td>
<td></td>
</tr>
{% for p in products %}
<tr>
<td><p>{{ p.name }}</p></td>
<td><p>{{ p.price }}</p></td>
<td><p><a href="/buy/{{ p.id }}">Купить</a></p></td>
<div class="container">
<table class="table_inner">
<tr class="headings">
<td><p>Наименование</p></td>
<td><p>Цена</p></td>
<td><p>Количество</p></td>
<td></td>
</tr>
{% endfor %}
</table>
{% for p in products %}
<tr>
<td><p>{{ p.name }}</p></td>
<td><p>{{ p.price }}</p></td>
<td><p align="center">{{ p.quantity }}</p></td>
<td><p><a class="buy" href="/buy/{{ p.id }}">Купить</a></p></td>
</tr>
{% endfor %}
</table>
</div>
</div>
</body>
</html>
115 changes: 98 additions & 17 deletions shop/templates/shop/purchase_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,107 @@
<head>
<meta name="viewport" content="width=device-width" />
<title>Покупка</title>
<style type="text/css">
html, body {
height: 100%;
}
html {
display: table;
margin: auto;
}
.header__logo {
font-size: 150%;
font-family: 'Kaushan Script', cursive;
font-weight: 700;
color: #336;
}
body {
display: table-cell;
vertical-align: middle;
margin: 0;
padding: 0 0 200px;
font-family: 'Montserrat', sans-serif;
font-size: 20px;
line-height: 1.6;
color: #333;
}
.container {
width: 100%;
max-width: 1200px;
margin: 0 auto;
}
.header_inner {
width: 100%;
max-width: 880px;
margin: 0 auto;
text-align: center;
}
.form_inner {
width: 100%;
max-width: 880px;
margin: 0 auto;
}
.finner {
width: 100%;
max-width: 550px;
margin: 0 auto;
}
.button {
margin: 0;
padding: 8px 24px;
display: inline-block;
vertical-align: baseline;
font-size: 14px;
font-weight: 500;
letter-spacing: 1px;
text-decoration: none;
text-transform: uppercase;
color: #0b0c23;
background-color: #f9dd79;
box-shadow: 0 4px 16px rgba(249, 221, 121, 0.4);
border-radius: 24px;
transition: background-color 100ms, box-shadow 100ms;
}

.button:focus,
.button:hover {
background-color: #f9e7a8;
box-shadow: 0 4px 32px rgba(249, 221, 121, 0.6);
}

.button:active {
background-color: #b69e4b;
box-shadow: none;
}
</style>
</head>
<body>
<header class="header">
<div class="container">
<div class="header_inner">
<h3 class="header__logo">Покупка</h3>
</div>
</div>
</header>
<div>
<h3>Покупка</h3>
<form method="post">{% csrf_token %}
<input type="hidden" value="{{ view.kwargs.product_id }}" name="product" />
<table>
<tr>
<td><p>Введите свое имя </p></td>
<td><input type="text" name="person" /> </td>
</tr>
<tr>
<td><p>Введите адрес доставки:</p></td>
<td>
<input type="text" name="address" />
</td>
</tr>
<tr><td><input type="submit" value="Отправить" /> </td><td></td></tr>
</table>
</form>
<div class="container">
<form method="post" class="form_inner">{% csrf_token %}
<input type="hidden" value="{{ view.kwargs.product_id }}" name="product" />
<table class="finner">
<tr>
<td><p>Введите свое имя </p></td>
<td><input type="text" name="person" /> </td>
</tr>
<tr>
<td><p>Введите адрес доставки:</p></td>
<td>
<input type="text" name="address" />
</td>
</tr>
<tr><td><input class="button" type="submit" value="Отправить" /> </td><td></td></tr>
</table>
</form>
</div>
</div>
</body>
</html>
Loading