Skip to content
This repository was archived by the owner on Feb 17, 2023. It is now read-only.

Commit af1433b

Browse files
authored
Merge pull request #9 from W-A-L-L-3/develop
v1.1.0
2 parents 1fca1e9 + 203529a commit af1433b

16 files changed

+437
-79
lines changed

README.md

+137-45
Original file line numberDiff line numberDiff line change
@@ -1,109 +1,201 @@
11
# Электронный склад
22

3-
Московская предпрофессиональная олимпиада школьников.
3+
![PyPI - Python Version](https://img.shields.io/pypi/pyversions/Django)
4+
![GitHub release (latest by date)](https://img.shields.io/github/v/release/W-A-L-L-3/electronic-storehouse)
5+
![GitHub last commit](https://img.shields.io/github/last-commit/W-A-L-L-3/electronic-storehouse)
6+
![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/W-A-L-L-3/electronic-storehouse)
7+
![GitHub](https://img.shields.io/github/license/W-A-L-L-3/electronic-storehouse)
48

5-
Профиль "Информационные технологии".
9+
[Московская предпрофессиональная олимпиада школьников.](http://predprof.olimpiada.ru/)
610

7-
Командный кейс №5 "Электронный склад"
11+
[Профиль "Информационные технологии".](http://predprof.olimpiada.ru/it)
812

9-
[Исходный текст технического задания](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/technical-requirements.pdf)
13+
**Командный кейс №5 "Электронный склад".**
14+
[Исходный текст технического задания](docs/technical-requirements.pdf)
1015

11-
## Кратное описание
16+
## Навигация
1217

13-
Информационный сервис обеспечивающий взаимодействие пользователей (операторов) с автоматизированным складом.
18+
* [Описание проекта](#chapter-0)
19+
* [Как начать](#chapter-1)
20+
* [Интерфейс приложения](#chapter-2)
21+
* [Ошибки](#chapter-3)
22+
* [Код](#chapter-4)
23+
* [Авторы](#chapter-5)
24+
* [Лицензия](#chapter-6)
1425

15-
## Функциональность
26+
<a id="chapter-0"></a>
27+
28+
## Описание проекта
29+
30+
Информационный сервис, обеспечивающий взаимодействие пользователей (операторов) с автоматизированным складом.
31+
32+
[Техническая документация](docs/technical-documentation.pdf)
33+
34+
### Функциональность
1635

1736
1. Добавление нескольких позиций из поставки на склад.
18-
2. Отображение в виде списка позиций (товаров), с указанием ячейки, в которой товар находится на складе (по запросу в
37+
2. Отображение в виде списка позиций (товаров) с указанием ячейки, в которой товар находится на складе (по запросу в
1938
пользовательском интерфейсе).
2039

21-
3. Выбор определенного товара (позиции), для осуществления выдачи его аппаратной частью.
40+
3. Выбор определенного товара (позиции) для осуществления выдачи его аппаратной частью.
2241
4. Наличие удалённого склада для позиций, которые невозможно разместить на основном складе.
2342
5. Отображение в виде списка позиций (товаров), находящихся на удалённом складе.
2443

44+
<a id="chapter-1"></a>
45+
46+
## :hammer: Как начать
47+
48+
1. Установить [Python 3](https://www.python.org/downloads/)
49+
2. Установить модуль requests: ```pip install requests```
50+
51+
[Инструкция по установке модулей при помощи PIP](https://pythonru.com/baza-znanij/ustanovka-pip-dlja-python-i-bazovye-komandy)
52+
53+
3. Скачать данный репозиторий
54+
* Вариант 1
55+
1. Установить [Git](https://git-scm.com/download/win)
56+
2. Клонировать репозиторий
57+
```bash
58+
git clone https://github.com/W-A-L-L-3/electronic-storehouse
59+
cd electronic-storehouse
60+
```
61+
* Вариант 2 - [Скачать ZIP](https://github.com/W-A-L-L-3/electronic-storehouse/archive/main.zip)
62+
63+
4. Запустить `./API/app.py`
64+
5. Запустить `./main.py`
65+
66+
<a id="chapter-2"></a>
67+
2568
## Интерфейс приложения
2669

2770
### Главное окно
2871

2972
#### До инициализации склада
3073

31-
![main_window_1](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/main_window_1.jpg)
74+
![main_window_1](docs/img/main_window_1.jpg)
3275

3376
**1** - Инициализация склада.
3477

35-
При успешной инициализации появится всплывающие уведомление:
36-
37-
![successful_initialization](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/successful%20initialization.jpg)
38-
39-
Если произошла ошибка во время связи с API для инициализации:
78+
Уведомление об успешной инициализации склада:
4079

41-
![receiving_error](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/receiving_error.jpg)
80+
![successful_initialization](docs/img/successful%20initialization.jpg)
4281

4382
#### После инициализации склада
4483

45-
![main_window_2](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/main_window_2.jpg)
84+
![main_window_2](docs/img/main_window_2.jpg)
4685

4786
**2** - Добавление нескольких позиций из поставки на склад.
4887

49-
**3** - Отображение в виде списка позиций (товаров), с указанием ячейки, в которой товар находится на складе.
88+
**3** - Отображение в виде списка позиций (товаров) с указанием ячейки, в которой товар находится на складе.
5089

51-
**4** - Выбор определенного товара (позиции), для осуществления выдачи его аппаратной частью.
90+
**4** - Выбор определенного товара (позиции) для осуществления выдачи его аппаратной частью.
5291

5392
**5** - Отображение в виде списка позиций (товаров), находящихся на удалённом складе.
5493

55-
____
56-
5794
### Окно для добавления товаров на склад
5895

59-
![adding_window_1](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/adding_window_1.jpg)
96+
![adding_window_1](docs/img/adding_window_1.jpg)
6097

6198
**1** - Добавить строчку для ещё одного товара.
6299

63-
**2** - Отправить товары на склад.
100+
**2** - Отправить все товары на склад.
64101

65102
После двух нажатий кнопки **1**:
66103

67-
![adding_window_2](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/adding_window_2.jpg)
104+
![adding_window_2](docs/img/adding_window_2.jpg)
68105

69-
Корректный ввод позиций:
106+
_Корректный_ ввод позиций:
70107

71-
![adding_window_3](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/adding_window_3.jpg)
108+
![adding_window_3](docs/img/adding_window_3.jpg)
72109

73-
Некорректный ввод позиций:
110+
+ Название - непустая строка
111+
+ Размеры - 3 натуральных числа, разделённых "\*" (длина\*ширина\*высота)
112+
+ Масса - натуральное число
74113

75-
![adding_window_4](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/adding_window_4.jpg)
114+
_Некорректный_ ввод позиций:
76115

77-
При успешной отправке товаров на склад появится всплывающие уведомление:
116+
![adding_window_4](docs/img/adding_window_4.jpg)
78117

79-
![correct_adding](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/correct_adding.jpg)
118+
Уведомление об успешной отправке товаров на склад:
80119

81-
Если значение в каком-либо из полей в поставке некорректно:
120+
![correct_adding](docs/img/correct_adding.jpg)
82121

83-
![value_error](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/value_error.jpg)
122+
### Окно для отображения позиций (товаров), находящихся на складе
84123

85-
____
124+
![info_window](docs/img/info_window.jpg)
86125

87-
### Окно для отображения позиций (товаров), находящихся на складе
126+
### Окно для выбора определенного товара (позиции) для осуществления выдачи его аппаратной частью.
88127

89-
![info_window](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/info_window.jpg)
128+
![taking_window](docs/img/taking_window.jpg)
90129

91-
____
130+
При успешном выборе и выдаче товара появится всплывающие уведомление:
92131

93-
### Окно для выбора определенного товара (позиции), для осуществления выдачи его аппаратной частью.
132+
![correct_taking](docs/img/correct_taking.jpg)
94133

95-
![taking_window](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/taking_window.jpg)
134+
### Окно для отображения позиций (товаров), находящихся на удалённом складе
96135

97-
При успешном выборе и выдаче товара появится всплывающие уведомление:
136+
![remote_info_window](docs/img/remote_info_window.jpg)
98137

99-
![correct_taking](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/correct_taking.jpg)
138+
<a id="chapter-3"></a>
100139

101-
Если товара с введённым названием нет на складе:
140+
## :heavy_exclamation_mark: Ошибки
102141

103-
![taking_error](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/taking_error.jpg)
142+
### Ошибка получения параметров при инициализации
104143

105-
____
144+
![error_of_getting_parameters](docs/img/receiving_error.jpg)
106145

107-
### Окно для отображения позиций (товаров), находящихся на удалённом складе
146+
**Возможные причины:**
147+
148+
1. Не запущено API (см. пункт 4 раздела [Как начать](#chapter-1)).
149+
2. Какая-либо ошибка связи с API.
150+
151+
### Некорректное значение в каком-либо из полей в поставке
152+
153+
![value_error](docs/img/value_error.jpg)
154+
155+
### Товар не найден
156+
157+
![taking_error](docs/img/taking_error.jpg)
158+
159+
**Причина:**
160+
161+
Товара с введённым названием нет на складе.
162+
163+
<a id="chapter-4"></a>
164+
165+
## Код
166+
167+
### Папки
168+
169+
+ **API** - исходный код программной модели аппаратной части (взят
170+
с [ppo_it_5_2021](https://dt.miet.ru/gitlab/dt_smartpark/ppo_it_5_2021))
171+
+ **server** - серверная часть приложения (моделирование работы склада, обращение к API)
172+
+ **gui** - клиентская часть приложения (графический интерфейс)
173+
174+
### Используемые библиотеки
175+
176+
* [tkinter](https://docs.python.org/3/library/tkinter.html) - графический интерфейс приложения
177+
* [json](https://docs.python.org/3/library/json.html) - работа с форматом json
178+
* [uuid](https://docs.python.org/3/library/uuid.html) - генерация случайного идентификатора товара
179+
* [pickle](https://docs.python.org/3/library/pickle.html) - хранение объекта модели склада в бинарном режиме
180+
* [requests](https://requests.readthedocs.io/en/master/) - составление HTTP-запросов
181+
182+
<a id="chapter-5"></a>
183+
184+
## :smile: Авторы
185+
<a href="https://github.com/Yu-Leo">
186+
<img src="https://avatars3.githubusercontent.com/u/66430048?s=400&u=48f180775538c9967cc45bb4fc07ced723063a6e&v=4" width="50px">
187+
</a>
188+
<a href="https://github.com/kholevenkovav">
189+
<img src="https://avatars3.githubusercontent.com/u/56455393?s=400&u=baa1b3fb667896e8cc43b0a4902ada8b143e4d7b&v=4" width="50px">
190+
</a>
191+
<a href="https://github.com/ASDF2357">
192+
<img src="https://avatars3.githubusercontent.com/u/67108097?s=400&v=4" width="50px">
193+
</a>
194+
195+
<a id="chapter-6"></a>
196+
197+
## :open_hands: Лицензия
198+
199+
GNU General Public License v3.0.
108200

109-
![remote_info_window](https://github.com/W-A-L-L-3/electronic-storehouse/blob/main/docs/img/remote_info_window.jpg)
201+
Полный текст в [LICENSE](LICENSE)

constants.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,30 @@
11
# File with constants
22

33
STOREHOUSE_FILE_NAME = 'storehouse.pickle'
4-
GET_PARAMS_ADDRESS = 'http://127.0.0.1:5000/scheme'
4+
5+
API_ADDRESS = 'http://127.0.0.1:5000'
6+
GET_PARAMS_ADDRESS = f'{API_ADDRESS}/scheme'
7+
58
MAX_ADDING_ITEMS = 30 # Maximum number of rows on one adding-window
69

710

811
class AddingW:
912
NAME_INDEX = 1
1013
SIZE_INDEX = 2
1114
MASS_INDEX = 3
15+
16+
17+
class Cell:
18+
"""Size of storehouse's cells"""
19+
TYPE_1 = (1000, 1000, 1000)
20+
TYPE_2 = (2000, 1000, 1000)
21+
TYPE_3 = (2000, 2000, 1000)
22+
23+
REMOTE = "REMOTE"
24+
25+
26+
class ItemsSizes:
27+
SMALL = "small"
28+
MEDIUM = "medium"
29+
BIG = "big"
30+
LARGE = "large"

docs/img/adding_window_3.jpg

11.7 KB
Loading

docs/img/info_window.jpg

13.7 KB
Loading

docs/img/remote_info_window.jpg

9.52 KB
Loading

docs/social-preview.png

681 KB
Loading

docs/technical-documentation.pdf

793 KB
Binary file not shown.

exceptions.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
OK = 0
55

66

7-
class ReceivingError(Exception):
7+
class GettingParamsError(Exception):
88
pass
99

1010

gui/application.py

+13-5
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ def __init__(self):
3232
take_func=self.open_giving_window,
3333
remote_info_func=self.open_remote_info_window)
3434
self.info_window = None
35+
self.adding_window = None
36+
self.giving_window = None
37+
self.remote_info_window = None
3538

3639
def run(self):
3740
"""Launching the app"""
@@ -40,7 +43,9 @@ def run(self):
4043

4144
def open_info_window(self):
4245
table = server_operations.get_info()
43-
self.info_window = InfoWindow(self, table, need_pos_column=True)
46+
self.info_window = InfoWindow(self,
47+
"Information about storehouse",
48+
table, need_pos_column=True)
4449
self.info_window.draw()
4550

4651
def open_adding_window(self):
@@ -55,8 +60,11 @@ def open_giving_window(self):
5560

5661
def open_remote_info_window(self):
5762
table = server_operations.get_remote_info()
58-
self.info_window = InfoWindow(self, table, need_pos_column=False)
59-
self.info_window.draw()
63+
self.remote_info_window = InfoWindow(self,
64+
"Information about remote storehouse",
65+
table, need_pos_column=False)
66+
self.remote_info_window.draw()
67+
6068

6169
class ChildWindow(tk.Toplevel):
6270
def __init__(self, parent, title="", width=None, height=None,
@@ -81,9 +89,9 @@ def set_focus(self):
8189
class InfoWindow(ChildWindow):
8290
"""Class of window for information about storehouse"""
8391

84-
def __init__(self, parent, table, need_pos_column):
92+
def __init__(self, parent, title, table, need_pos_column):
8593
super().__init__(parent,
86-
title="Information about storehouse",
94+
title=title,
8795
resizable=(False, False))
8896
self.__table = InfoTable(self, table, need_pos_column)
8997

gui/messageboxes.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ def show(self):
3535
class ExceptionMb(ErrorMb):
3636
"""Messageboxes for my exceptions"""
3737

38-
def __get_msg(self, field):
38+
@staticmethod
39+
def __get_msg(field):
3940
first_part = text.entry_content_error["message"]
4041
if field == const.AddingW.NAME_INDEX:
4142
return first_part + " field 'Name'"

gui/style.py

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
font = (font_name, 12)
66

7+
78
class Btn:
89
"""Style-settings for buttons"""
910
font = (font_name, 11)

gui/widgets.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ def __call_init(self):
6161
message=text.successful_init["message"]).show()
6262
self.__activate_btns()
6363
elif result == exceptions.RECEIVING_ERROR:
64-
mb.ErrorMb(title=text.receiving_error["title"],
65-
message=text.receiving_error["message"]).show()
64+
mb.ErrorMb(title=text.error_of_getting_parameters["title"],
65+
message=text.error_of_getting_parameters["message"]).show()
6666

6767
def __activate_btns(self):
6868
"""Activate buttons for interacting with storehouse"""
@@ -323,7 +323,7 @@ def formatted_size(self):
323323
"""
324324
value = self.__get_size()
325325
if self.__check_size(value):
326-
t = value.split("*")
326+
t = map(int, value.split("*"))
327327
return tuple(t)
328328
else:
329329
raise exc.EntryContentError(const.AddingW.SIZE_INDEX)

0 commit comments

Comments
 (0)