Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 17c2cad47a | |||
| ba81f91189 | |||
| bf9e6364b9 | |||
| c941ac2022 | |||
| 2229e75644 | |||
| f71e97b6ff | |||
| 3679f641e5 | |||
| 5702bdce4d | |||
| c8787ad1f7 | |||
| 302fd36c34 | |||
| 9feddb6bac | |||
| 941c5be8f3 | |||
| 577e565552 | |||
| c70ddad444 | |||
| 3dc979873b | |||
| 6fdb3b9072 | |||
| 2c392feee6 | |||
| 9b538c7d8e | |||
| 28fd966167 | |||
| 47a3e33c03 | |||
| 61f9f6e5e0 | |||
| a5cef512ce | |||
| 6de002b175 | |||
| 1da2840938 | |||
| 688e2a7984 | |||
| 02e4da8050 | |||
| 0ae26a6d0a | |||
| e1499383d1 | |||
| 53734e9998 |
2
.gitignore
vendored
@@ -106,3 +106,5 @@ dist
|
|||||||
# utils/table-generator generated files
|
# utils/table-generator generated files
|
||||||
utils/table-generator/tables/
|
utils/table-generator/tables/
|
||||||
utils/table-generator/tables.md
|
utils/table-generator/tables.md
|
||||||
|
utils/table-generator/activities/
|
||||||
|
utils/table-generator/activities.md
|
||||||
|
|||||||
8
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
0
.idea/edu-dis-labs.iml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/edu-dis-labs.iml" filepath="$PROJECT_DIR$/.idea/edu-dis-labs.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
@@ -36,6 +36,15 @@ module.exports = {
|
|||||||
{
|
{
|
||||||
title: 'Розроблення вимог до системи',
|
title: 'Розроблення вимог до системи',
|
||||||
path:"/requirements/",
|
path:"/requirements/",
|
||||||
|
children: [
|
||||||
|
"/requirements/state-of-the-art",
|
||||||
|
"/requirements/stakeholders-needs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: 'Розроблення вимог до функціональности системи',
|
||||||
|
path:"/use-cases/"
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -58,10 +67,6 @@ module.exports = {
|
|||||||
path:"/conclusion/"
|
path:"/conclusion/"
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
|
||||||
title: 'API',
|
|
||||||
path:"/api/"
|
|
||||||
}
|
|
||||||
|
|
||||||
],
|
],
|
||||||
sidebarDepth: 2,
|
sidebarDepth: 2,
|
||||||
@@ -93,8 +98,8 @@ module.exports = {
|
|||||||
// editLinkText: 'Ви можете покращити цю сторінку'
|
// editLinkText: 'Ви можете покращити цю сторінку'
|
||||||
|
|
||||||
},
|
},
|
||||||
title: 'Назва проєкту',
|
title: 'Xpertise',
|
||||||
description: 'Лабораторні роботи з дисципліни "Розподілені інформаційні системи"',
|
description: 'Лабораторні роботи з дисципліни "Організація баз даних"',
|
||||||
configureWebpack: {
|
configureWebpack: {
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
|
|||||||
@@ -6,24 +6,12 @@ actionLink: /intro/
|
|||||||
footer: "ECL 2.0 Licensed | Copyright © 2024 [Your Name]"
|
footer: "ECL 2.0 Licensed | Copyright © 2024 [Your Name]"
|
||||||
---
|
---
|
||||||
|
|
||||||
**Виконали:**
|
**Виконала:**
|
||||||
|
|
||||||
*студенти 2-го курсу, групи ІО-23:*
|
*студентка 2-го курсу, групи ІО-23:*
|
||||||
|
|
||||||
*Олег ШМУЛЯР [shmuliar1@ukr.net, [@dmytrofiot23](https://t.me/dmytrofiot23)]*
|
|
||||||
|
|
||||||
*Андрій БОДНАР [bodnarandrew123@gmail.com, [@andrux4](https://t.me/andrux4)]*
|
|
||||||
|
|
||||||
*Андрій ШВЕД [andreyfrog26@gmail.com, [@Rhinemann](https://t.me/Rhinemann)]*
|
|
||||||
|
|
||||||
*Євгеній ГОЛОВАТЕНКО [ievgeniigol@gmail.com, [@yevholova](https://t.me/yevholova)]*
|
|
||||||
|
|
||||||
*Вікторія ВОДЯНА [vodyanayaviktoria@gmail.com, [@victoriavodyana](https://t.me/victoriavodyana)]*
|
*Вікторія ВОДЯНА [vodyanayaviktoria@gmail.com, [@victoriavodyana](https://t.me/victoriavodyana)]*
|
||||||
|
|
||||||
*Михайло КОРБУТ [korbutmykhailo@gmail.com, [@misha1tigr](https://t.me/misha1tigr)]*
|
|
||||||
|
|
||||||
*Олександр ГУРАНЕЦЬ [bacant150@gmail.com, [@Bacant150](https://t.me/Bacant150)]*
|
|
||||||
|
|
||||||
|
|
||||||
**Керівник**
|
**Керівник**
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
# Висновки
|
# Висновки
|
||||||
|
|
||||||
У висновках наводять оцінку отриманих результатів, можливі галузі його використання. Висновки повинні містити в собі коротку узагальнену оцінку результатів розробки, у
|
У цьому проєкті була використана локальна база даних для зберігання інформації. Розроблена серверна частина надає RESTful-інтерфейс для доступу до цієї бази даних. Цей інтерфейс може використовуватися для взаємодії з таблицею питань (survey), що дозволяє здійснювати операції читання, запису, оновлення та видалення даних через HTTP-запити. Такий підхід забезпечує зручний та ефективний спосіб взаємодії з базою даних і відкриває широкі можливості для розвитку та розширення функціональності системи.
|
||||||
тому числі і з погляду на їх технічно-економічну ефективність. Необхідно порівняти
|
|
||||||
отримані результати усіх характеристик об’єкта проєктування із завданням і з основними показниками сучасних аналогічних об’єктів.
|
|
||||||
|
|
||||||
Необхідно вказати яке нове технічне рішення покладене в основу проєкту і у чому її
|
|
||||||
переваги, що нового було запропоновано самим студентом.
|
|
||||||
|
|
||||||
На базі отриманих висновків можуть надаватися рекомендації по використанню розробки. Вони повинні
|
Технічне рішення, що покладене в основу проєкту, полягає у використанні мови програмування Python та веб-фреймворку Flask для створення RESTful сервісу. Це дозволило забезпечити швидку реалізацію системи та забезпечити її продуктивність та масштабованість.
|
||||||
мати конкретний характер і бути цілком підтверджені проєктом.
|
|
||||||
|
Отримана система дозволяє автоматизувати процес збору та аналізу відповідей, що значно знижує час та ресурси, необхідні для проведення таких опитувань. Завдяки використанню сучасних технологій, таких як Flask, система має високу продуктивність та може легко масштабуватися відповідно до потреб користувачів.
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
# Проєктування системи
|
# Проєктування бази даних
|
||||||
|
|
||||||
|
## BE модель
|
||||||
Вбудовування зображень діаграм здійснюється з використанням сервісу [plantuml.com](https://plantuml.com/).
|
|
||||||
|
|
||||||
В markdown-файлі використовується опис діаграми
|
|
||||||
|
|
||||||
```md
|
|
||||||
|
|
||||||
<center style="
|
<center style="
|
||||||
border-radius:4px;
|
border-radius:4px;
|
||||||
@@ -16,34 +11,58 @@
|
|||||||
|
|
||||||
@startuml
|
@startuml
|
||||||
|
|
||||||
participant Client
|
entity Account <<ENTITY>>
|
||||||
|
entity Account.username <<TEXT>>
|
||||||
|
entity Account.password <<TEXT>>
|
||||||
|
|
||||||
participant SR as "Service Registry"
|
entity Survey <<ENTITY>>
|
||||||
|
entity Survey.name <<TEXT>>
|
||||||
|
entity Survey.duration <<TEXT>>
|
||||||
|
entity Survey.isPaused <<BOOLEAN>>
|
||||||
|
entity Survey.isNamed <<BOOLEAN>>
|
||||||
|
|
||||||
participant Service
|
entity Question <<ENTITY>>
|
||||||
|
entity Question.text <<TEXT>>
|
||||||
|
|
||||||
Service -> SR : register
|
entity Responce <<ENTITY>>
|
||||||
SR -> SR
|
entity Responce.value <<TEXT>>
|
||||||
SR --> Service
|
|
||||||
...
|
|
||||||
|
|
||||||
SR -> Service: heartbeat
|
entity Link <<ENTITY>>
|
||||||
SR <-- Service: health
|
entity Link.usageLimit <<INT>>
|
||||||
...
|
entity Link.responceLimit <<INT>>
|
||||||
|
entity Link.uses <<INT>>
|
||||||
|
entity Link.responces <<INT>>
|
||||||
|
entity Link.path <<TEXT>>
|
||||||
|
|
||||||
Client -> SR: find
|
Account.username --* Account
|
||||||
Client <-- SR: service endpoint
|
Account.password --* Account
|
||||||
Client -> Service: request
|
|
||||||
Client <-- Service: response
|
|
||||||
|
|
||||||
|
Survey.name --* Survey
|
||||||
|
Survey.duration --* Survey
|
||||||
|
Survey.isPaused --* Survey
|
||||||
|
Survey.isNamed --* Survey
|
||||||
|
|
||||||
|
Link.usageLimit -u-* Link
|
||||||
|
Link.responceLimit -u-* Link
|
||||||
|
Link.uses --* Link
|
||||||
|
Link.responces --* Link
|
||||||
|
Link.path -u-* Link
|
||||||
|
|
||||||
|
Responce.value -u-* Responce
|
||||||
|
|
||||||
|
Question.text -u-* Question
|
||||||
|
|
||||||
|
Account "1,1" -- "0,*" Survey
|
||||||
|
Survey "1,1" -- "0,*" Question
|
||||||
|
Question "1,1" -r- "0,*" Responce
|
||||||
|
Account "0,1" -r- "0,*" Responce
|
||||||
|
Link "0,*" -- "1,1" Survey
|
||||||
|
|
||||||
@enduml
|
@enduml
|
||||||
|
|
||||||
</center>
|
</center>
|
||||||
```
|
|
||||||
|
|
||||||
яка буде відображена наступним чином
|
## ER-модель
|
||||||
|
|
||||||
<center style="
|
<center style="
|
||||||
border-radius:4px;
|
border-radius:4px;
|
||||||
@@ -54,33 +73,58 @@ Client <-- Service: response
|
|||||||
|
|
||||||
@startuml
|
@startuml
|
||||||
|
|
||||||
@startuml
|
entity Account <<ENTITY>> {
|
||||||
|
id:INT
|
||||||
|
username:CHAR(64)
|
||||||
|
password:CHAR(256)
|
||||||
|
}
|
||||||
|
|
||||||
participant Client
|
entity Responce <<ENTITY>> {
|
||||||
|
id:INT
|
||||||
|
value:CHAR(16384)
|
||||||
|
}
|
||||||
|
|
||||||
participant SR as "Service Registry"
|
entity Question <<ENTITY>> {
|
||||||
|
id:INT
|
||||||
|
text:CHAR(256)
|
||||||
|
}
|
||||||
|
|
||||||
participant Service
|
entity Survey <<ENTITY>> {
|
||||||
|
id:INT
|
||||||
Service -> SR : register
|
name:CHAR(256)
|
||||||
SR -> SR
|
duration:CHAR(256)
|
||||||
SR --> Service
|
isPaused:BOOLEAN
|
||||||
...
|
isNamed:BOOLEAN
|
||||||
|
}
|
||||||
SR -> Service: heartbeat
|
|
||||||
SR <-- Service: health
|
|
||||||
...
|
|
||||||
|
|
||||||
Client -> SR: find
|
|
||||||
Client <-- SR: service endpoint
|
|
||||||
Client -> Service: request
|
|
||||||
Client <-- Service: response
|
|
||||||
|
|
||||||
|
entity Link <<ENTITY>> {
|
||||||
|
id:INT
|
||||||
|
uses:INT
|
||||||
|
responces:INT
|
||||||
|
usageLimit:INT
|
||||||
|
responceLimit:INT
|
||||||
|
path:CHAR(32)
|
||||||
|
}
|
||||||
|
|
||||||
|
Responce "0,*" --> "1,1" Question
|
||||||
|
Question "0,*" --> "1,1" Survey
|
||||||
|
Survey "0,*" --> "1,1" Account
|
||||||
|
Link "0,*" --> "1,1" Survey
|
||||||
|
Responce "0,*" --> "0,1" Account
|
||||||
|
|
||||||
@enduml
|
@enduml
|
||||||
|
|
||||||
</center>
|
</center>
|
||||||
|
|
||||||
|
## Реляційна схема
|
||||||
|
|
||||||
|
<center style="
|
||||||
|
border-radius:4px;
|
||||||
|
border: 1px solid #cfd7e6;
|
||||||
|
box-shadow: 0 1px 3px 0 rgba(89,105,129,.05), 0 1px 1px 0 rgba(0,0,0,.025);
|
||||||
|
padding: 1em;"
|
||||||
|
>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</center>
|
||||||
|
|||||||
BIN
docs/design/relational_scheme.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
@@ -93,6 +93,33 @@
|
|||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований |
|
| Виключні ситуації | 001.005 Користувач не ідентифікований |
|
||||||
| Основний сценарій | 1. Користувач натискає на кнопку редагування облікового запису<br>2. Система виводить інтерфейс для редагування облікового запису (можлива 001.005)<br>3. Користувач вказує бажані зміни властивостей облікового запису<br>4. Користувач натискає на кнопку внесення змін до властивостей облікового запису<br>5. Система змінює властивості облікового запису |
|
| Основний сценарій | 1. Користувач натискає на кнопку редагування облікового запису<br>2. Система виводить інтерфейс для редагування облікового запису (можлива 001.005)<br>3. Користувач вказує бажані зміни властивостей облікового запису<br>4. Користувач натискає на кнопку внесення змін до властивостей облікового запису<br>5. Система змінює властивості облікового запису |
|
||||||
|
|
||||||
|
| ID | SURVEY.LINK.CREATE |
|
||||||
|
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Додати посилання на опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач авторизований у системі |
|
||||||
|
| Результат | Нове посилання на опитування |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
||||||
|
| Основний сценарій | 1. Користувач натискає кнопку створення посилання на опитування<br>2. Система виводить налаштування для нового посилання (можливі 001.005, 001.006, 001.008)<br>3. Користувач вводить налаштування для нового посилання<br>4. Користувач натискає на кнопку створення посилання<br>5. Система створює нове посилання |
|
||||||
|
|
||||||
|
| ID | SURVEY.LINK.DELETE |
|
||||||
|
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Видалити посилання на опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач авторизований у системі |
|
||||||
|
| Результат | Видалення посилання на опитування |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування<br>001.009 Запитане посилання на існує |
|
||||||
|
| Основний сценарій | 1. Користувач натискає кнопку видалення посилання<br>2. Система виводить кнопку підтвердження видалення посилання<br>3. Користувач натискає на кнопку підтвердження видалення посилання<br>4. Система видаляє посилання (можливі 001.005, 001.006, 001.008, 001.009) |
|
||||||
|
|
||||||
|
| ID | SURVEY.LINK.MODIFY |
|
||||||
|
|:-----------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Змінити властивості посилання на опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач авторизований у системі |
|
||||||
|
| Результат | Зміна властивостей посилання на опитування |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування<br>001.009 Запитане посилання на існує |
|
||||||
|
| Основний сценарій | 1. Користувач натискає кнопку редагування властивостей посилання<br>2. Система виводить налаштування для обраного посилання (можливі 001.005, 001.006, 001.008, 001.009)<br>3. Користувач вводить юажані зміни властивостей посилання<br>4. Користувач натискає на кнопку збереження властиностей посилання<br>5. Система змінює властивості посилання |
|
||||||
|
|
||||||
| ID | USER.CREATE_SURVEY |
|
| ID | USER.CREATE_SURVEY |
|
||||||
|:-----------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Створити опитування |
|
| Назва | Створити опитування |
|
||||||
@@ -210,6 +237,9 @@ Cистема розділяє користувачів на дві катего
|
|||||||
- створити опитування
|
- створити опитування
|
||||||
- відредагувати своє опитування
|
- відредагувати своє опитування
|
||||||
- видалити своє опитування
|
- видалити своє опитування
|
||||||
|
- створити посилання на своє опитування
|
||||||
|
- редагувати властивості посилання на своє опитування
|
||||||
|
- видалити посилання на своє опитування
|
||||||
- призупинити своє опитування
|
- призупинити своє опитування
|
||||||
- продовжити своє опитування
|
- продовжити своє опитування
|
||||||
- переглянути властивості свого опитування
|
- переглянути властивості свого опитування
|
||||||
|
|||||||
@@ -1,3 +1,176 @@
|
|||||||
# Реалізація інформаційного та програмного забезпечення
|
# Реалізація інформаційного та програмного забезпечення
|
||||||
|
|
||||||
|
## SQL-скрипт для створення та початкового наповнення бази даних
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- MySQL Workbench Forward Engineering
|
||||||
|
|
||||||
|
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
|
||||||
|
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
|
||||||
|
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Schema mydb
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Schema mydb
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
|
||||||
|
USE `mydb` ;
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `mydb`.`Account`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `mydb`.`Account` (
|
||||||
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`username` CHAR(255) NOT NULL,
|
||||||
|
`password` CHAR(255) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
|
UNIQUE INDEX `username_UNIQUE` (`username` ASC) VISIBLE)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `mydb`.`Survey`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `mydb`.`Survey` (
|
||||||
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`isPaused` TINYINT UNSIGNED NOT NULL,
|
||||||
|
`isNamed` TINYINT UNSIGNED NOT NULL,
|
||||||
|
`name` CHAR(255) NULL,
|
||||||
|
`duration` CHAR(255) NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
|
CONSTRAINT `fk_Survey_Account1`
|
||||||
|
FOREIGN KEY (`id`)
|
||||||
|
REFERENCES `mydb`.`Account` (`id`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `mydb`.`Question`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `mydb`.`Question` (
|
||||||
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`Text` CHAR(255) NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
|
CONSTRAINT `fk_Question_Survey1`
|
||||||
|
FOREIGN KEY (`id`)
|
||||||
|
REFERENCES `mydb`.`Survey` (`id`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `mydb`.`Response`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `mydb`.`Response` (
|
||||||
|
`id` INT UNSIGNED NULL AUTO_INCREMENT,
|
||||||
|
`Value` VARCHAR(16384) NULL,
|
||||||
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
CONSTRAINT `fk_Response_Question`
|
||||||
|
FOREIGN KEY (`id`)
|
||||||
|
REFERENCES `mydb`.`Question` (`id`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION,
|
||||||
|
CONSTRAINT `fk_Response_Account1`
|
||||||
|
FOREIGN KEY (`id`)
|
||||||
|
REFERENCES `mydb`.`Account` (`id`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `mydb`.`Link`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `mydb`.`Link` (
|
||||||
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`uses` INT NOT NULL,
|
||||||
|
`responces` INT NOT NULL,
|
||||||
|
`usageLimit` INT NULL,
|
||||||
|
`responceLimit` INT NULL,
|
||||||
|
`path` CHAR(32) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
CONSTRAINT `fk_Link_Survey1`
|
||||||
|
FOREIGN KEY (`id`)
|
||||||
|
REFERENCES `mydb`.`Survey` (`id`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
SET SQL_MODE=@OLD_SQL_MODE;
|
||||||
|
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
|
||||||
|
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
|
||||||
|
```
|
||||||
|
## RESTfull-сервіс для керування опитуваннями
|
||||||
|
|
||||||
|
Код серверу (Python, Flask) для таблиці "survey":
|
||||||
|
```from flask import Flask, request, jsonify
|
||||||
|
from flask_sqlalchemy import SQLAlchemy
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:1234@localhost/odb'
|
||||||
|
db = SQLAlchemy(app)
|
||||||
|
|
||||||
|
class Survey(db.Model):
|
||||||
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
isPaused = db.Column(db.Boolean)
|
||||||
|
isNamed = db.Column(db.Boolean)
|
||||||
|
name = db.Column(db.String(255))
|
||||||
|
duration = db.Column(db.Integer)
|
||||||
|
account_id = db.Column(db.Integer)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"<Survey {self.name}>"
|
||||||
|
|
||||||
|
def as_dict(self):
|
||||||
|
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
|
||||||
|
|
||||||
|
@app.route("/api/survey", methods=["GET", "POST"])
|
||||||
|
def api_survey():
|
||||||
|
if request.method == "GET":
|
||||||
|
surveys = Survey.query.all()
|
||||||
|
return jsonify([survey.as_dict() for survey in surveys])
|
||||||
|
|
||||||
|
elif request.method == "POST":
|
||||||
|
data = request.json
|
||||||
|
new_survey = Survey(isPaused=data['isPaused'], isNamed=data['isNamed'], name=data['name'],
|
||||||
|
duration=data['duration'], account_id=data['account_id'])
|
||||||
|
db.session.add(new_survey)
|
||||||
|
db.session.commit()
|
||||||
|
return jsonify({'success': True}), 201
|
||||||
|
|
||||||
|
@app.route("/api/survey/<int:survey_id>", methods=["GET", "PUT", "DELETE"])
|
||||||
|
def api_survey_numbered(survey_id):
|
||||||
|
survey = Survey.query.get_or_404(survey_id)
|
||||||
|
|
||||||
|
if request.method == "GET":
|
||||||
|
return jsonify(survey.as_dict())
|
||||||
|
|
||||||
|
elif request.method == "PUT":
|
||||||
|
data = request.json
|
||||||
|
survey.isPaused = data['isPaused']
|
||||||
|
survey.isNamed = data['isNamed']
|
||||||
|
survey.name = data['name']
|
||||||
|
survey.duration = data['duration']
|
||||||
|
survey.account_id = data['account_id']
|
||||||
|
db.session.commit()
|
||||||
|
return jsonify({'success': True})
|
||||||
|
|
||||||
|
elif request.method == "DELETE":
|
||||||
|
db.session.delete(survey)
|
||||||
|
db.session.commit()
|
||||||
|
return jsonify({'success': True})
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(debug=True)
|
||||||
|
'''
|
||||||
@@ -1,4 +1,34 @@
|
|||||||
# Тестування працездатності системи
|
# Тестування працездатності системи
|
||||||
|
|
||||||
*В цьому розділі необхідно вказати засоби тестування, навести вихідні коди тестів та результати тестування.*
|
Тестування працездатності системи
|
||||||
|
Для тестування системи використовувся додаток Postman
|
||||||
|
|
||||||
|
Запуск сервера:
|
||||||
|

|
||||||
|
|
||||||
|
Метод POST
|
||||||
|
POST Survey
|
||||||
|
Запит та відповідь:
|
||||||
|

|
||||||
|
|
||||||
|
Перевірка за допомогою GET:
|
||||||
|
](image-2.png)
|
||||||
|
|
||||||
|
Метод PUT
|
||||||
|
PUT Survey
|
||||||
|
Запит та відповідь:
|
||||||
|

|
||||||
|
|
||||||
|
Перевірка за допомогою GET:
|
||||||
|

|
||||||
|
|
||||||
|
Метод DELETE
|
||||||
|
DELETE Survey
|
||||||
|
Запит та відповідь:
|
||||||
|

|
||||||
|
|
||||||
|
Перевірка за допомогою GET:
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
docs/test/image-1.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
docs/test/image-2.png
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
docs/test/image-3.png
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
docs/test/image-4.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
docs/test/image-5.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
docs/test/image-6.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
docs/test/image.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
@@ -17,6 +17,9 @@
|
|||||||
(<b>ACCOUNT.CREATE</b>\nСтворити обліковий запис) as CreateAccount
|
(<b>ACCOUNT.CREATE</b>\nСтворити обліковий запис) as CreateAccount
|
||||||
(<b>ACCOUNT.DELETE</b>\nВидалити обліковий запис) as DeleteAccount
|
(<b>ACCOUNT.DELETE</b>\nВидалити обліковий запис) as DeleteAccount
|
||||||
(<b>ACCOUNT.MODIFY</b>\nЗмінити властивості облікового запису) as ModifyAccount
|
(<b>ACCOUNT.MODIFY</b>\nЗмінити властивості облікового запису) as ModifyAccount
|
||||||
|
(<b>SURVEY.LINK.CREATE</b>\nСтворити посилання на опитування) as CreateLink
|
||||||
|
(<b>SURVEY.LINK.DELETE</b>\nВидалити посилання на опитування) as DeleteLink
|
||||||
|
(<b>SURVEY.LINK.MODIFY</b>\nЗмінити властивості посилання на опитування) as ModifyLink
|
||||||
(<b>USER.CREATE_SURVEY</b>\nСтворити опитування) as CreateSurvey
|
(<b>USER.CREATE_SURVEY</b>\nСтворити опитування) as CreateSurvey
|
||||||
(<b>USER.DELETE_SURVEY</b>\nВидалити опитування) as DeleteSurvey
|
(<b>USER.DELETE_SURVEY</b>\nВидалити опитування) as DeleteSurvey
|
||||||
(<b>USER.GET_SURVEY_RESULT</b>\nПереглянути відповіді на опитування) as GetSurveyResult
|
(<b>USER.GET_SURVEY_RESULT</b>\nПереглянути відповіді на опитування) as GetSurveyResult
|
||||||
@@ -33,6 +36,9 @@
|
|||||||
|
|
||||||
AuthorisedUser -r-> ModifyAccount
|
AuthorisedUser -r-> ModifyAccount
|
||||||
AuthorisedUser -u-> DeleteAccount
|
AuthorisedUser -u-> DeleteAccount
|
||||||
|
AuthorisedUser -r-> CreateLink
|
||||||
|
AuthorisedUser -l-> DeleteLink
|
||||||
|
AuthorisedUser -u-> ModifyLink
|
||||||
AuthorisedUser -u-> LogOut
|
AuthorisedUser -u-> LogOut
|
||||||
AuthorisedUser --> CreateSurvey
|
AuthorisedUser --> CreateSurvey
|
||||||
AuthorisedUser -u-> DeleteSurvey
|
AuthorisedUser -u-> DeleteSurvey
|
||||||
@@ -45,3 +51,454 @@
|
|||||||
@enduml
|
@enduml
|
||||||
|
|
||||||
</center>
|
</center>
|
||||||
|
|
||||||
|
## Схеми використання для окремих діячів
|
||||||
|
|
||||||
|
Схема використання для гостя:
|
||||||
|
|
||||||
|
@startuml
|
||||||
|
|
||||||
|
:Гість: as Guest
|
||||||
|
|
||||||
|
(<b>ACCOUNT.CREATE</b>\nСтворити обліковий запис) as CreateAccount
|
||||||
|
(<b>USER.LOGIN</b>\nПройти ідентифікацію в системі) as LogIn
|
||||||
|
(<b>USER.TAKE_ANON_SURVEY</b>\nПройти анонімне опитування) as TakeAnonSurvey
|
||||||
|
|
||||||
|
Guest -u-> CreateAccount
|
||||||
|
Guest --> LogIn
|
||||||
|
Guest -r-> TakeAnonSurvey
|
||||||
|
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
Схема використання для зареєстрованого користувача:
|
||||||
|
|
||||||
|
@startuml
|
||||||
|
|
||||||
|
:Зареєстрований користувач: as AuthorisedUser
|
||||||
|
|
||||||
|
(<b>ACCOUNT.DELETE</b>\nВидалити обліковий запис) as DeleteAccount
|
||||||
|
(<b>ACCOUNT.MODIFY</b>\nЗмінити властивості облікового запису) as ModifyAccount
|
||||||
|
(<b>USER.CREATE_SURVEY</b>\nСтворити опитування) as CreateSurvey
|
||||||
|
(<b>USER.DELETE_SURVEY</b>\nВидалити опитування) as DeleteSurvey
|
||||||
|
(<b>USER.GET_SURVEY_RESULT</b>\nПереглянути відповіді на опитування) as GetSurveyResult
|
||||||
|
(<b>USER.LOGOUT</b>\nСкинути дані про ідентифікацію в системі) as LogOut
|
||||||
|
(<b>USER.MODIFY_SURVEY</b>\nРедагувати опитування) as ModifySurvey
|
||||||
|
(<b>USER.STAT_SURVEY</b>\nПереглянути властивості опитування) as StatSurvey
|
||||||
|
(<b>USER.TAKE_ANON_SURVEY</b>\nПройти анонімне опитування) as TakeAnonSurvey
|
||||||
|
(<b>USER.TAKE_NAMED_SURVEY</b>\nПройти поіменне опитування) as TakeNamedSurvey
|
||||||
|
(<b>SURVEY.LINK.CREATE</b>\nСтворити посилання на опитування) as CreateLink
|
||||||
|
(<b>SURVEY.LINK.DELETE</b>\nВидалити посилання на опитування) as DeleteLink
|
||||||
|
(<b>SURVEY.LINK.MODIFY</b>\nЗмінити властивості посилання на опитування) as ModifyLink
|
||||||
|
|
||||||
|
AuthorisedUser -r-> ModifyAccount
|
||||||
|
AuthorisedUser -u-> DeleteAccount
|
||||||
|
AuthorisedUser -r-> CreateLink
|
||||||
|
AuthorisedUser -l-> DeleteLink
|
||||||
|
AuthorisedUser -u-> ModifyLink
|
||||||
|
AuthorisedUser -u-> LogOut
|
||||||
|
AuthorisedUser -d-> CreateSurvey
|
||||||
|
AuthorisedUser -u-> DeleteSurvey
|
||||||
|
AuthorisedUser --> StatSurvey
|
||||||
|
AuthorisedUser -d-> ModifySurvey
|
||||||
|
AuthorisedUser --> GetSurveyResult
|
||||||
|
AuthorisedUser -l-> TakeAnonSurvey
|
||||||
|
AuthorisedUser -d-> TakeNamedSurvey
|
||||||
|
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
## Сценарії використання
|
||||||
|
### Для гостя
|
||||||
|
|
||||||
|
| ID | ACCOUNT.CREATE |
|
||||||
|
|:-----------------:|:------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Створити обліковий запис |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Відсутні |
|
||||||
|
| Результат | Обліковий запис користувача |
|
||||||
|
| Виключні ситуації | 001.001 Користувач ввів заборонені символи в поле псевдоніму<br>001.002 Ідентичний псевдонім вже існує |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Вводить бажаний псевдонім у поле вводу псевдоніму;
|
||||||
|
: Вводить пароль у поле вводу паролю;
|
||||||
|
: Натискає на кнопку створення облікового запису;
|
||||||
|
|Система|
|
||||||
|
: Створює обліковий запис користувача;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можливі 001.001, 001.002</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | USER.LOGIN |
|
||||||
|
|:-----------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Пройти ідентифікацію в системі |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач має обліковий запис |
|
||||||
|
| Результат | Користувач ідентифікований в системі |
|
||||||
|
| Виключні ситуації | 001.001 Користувач ввів заборонені символи в поле псевдоніму<br>001.003 Користувач ввів псевдонім, якого не існує в системі<br>001.004 Користувач ввів неправильний пароль до облікового запису |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Вводить псевдонім у поле вводу псевдоніму;
|
||||||
|
: Вводить пароль у поле вводу паролю;
|
||||||
|
: Натискає кнопку ідентифікації;
|
||||||
|
|Система|
|
||||||
|
: Ідентифікує користувача;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можливі 001.001, 001.003, 001.004</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | USER.TAKE_ANON_SURVEY |
|
||||||
|
|:-----------------:|:------------------------------------:|
|
||||||
|
| Назва | Пройти анонімне опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Відсутні |
|
||||||
|
| Результат | Запис відповідей на опитування |
|
||||||
|
| Виключні ситуації | 001.006 Запитане опитування не існує |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Переходить на сторінку проходження опитування;
|
||||||
|
|Система|
|
||||||
|
: Виводить перелік запитань опитування;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можлива 001.006</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
: Вводить відповіді на запитання;
|
||||||
|
: Натискає кнопку надсилання відповідей;
|
||||||
|
|Система|
|
||||||
|
: Записує відповіді на опитування;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можлива 001.006</b>
|
||||||
|
end note
|
||||||
|
: Виводить прощальне повідомлення;
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
### Для зареєстрованого користувача
|
||||||
|
|
||||||
|
| ID | ACCOUNT.DELETE |
|
||||||
|
|:-----------------:|:-----------------------------------------:|
|
||||||
|
| Назва | Видалити обліковий запис |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач ідентифікований в системі |
|
||||||
|
| Результат | Відсутність облікового запису користувача |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Натискає на кнопку видалення облікового запису;
|
||||||
|
|Система|
|
||||||
|
: Виводить кнопку-запит на підтвердження видалення облікового запису;
|
||||||
|
|Користувач|
|
||||||
|
: Натискає на кнопку підтвердження видалення облікового запису;
|
||||||
|
|Система|
|
||||||
|
: Видаляє обліковий запис;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можлива 001.005</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | ACCOUNT.MODIFY |
|
||||||
|
|:-----------------:|:-------------------------------------:|
|
||||||
|
| Назва | Змінити властивості облікового запису |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач ідентифікований в системі |
|
||||||
|
| Результат | Зміна властивостей облікового запису |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Натискає на кнопку редагування облікового запису;
|
||||||
|
|Система|
|
||||||
|
: Виводить інтерфейс для редагування облікового запису;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можлива 001.005</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
: Вказує бажані зміни властивостей облікового запису;
|
||||||
|
: Натискає на кнопку внесення змін до властивостей облікового запису;
|
||||||
|
|Система|
|
||||||
|
: Змінює властивості облікового запису;
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | SURVEY.LINK.CREATE |
|
||||||
|
|:-----------------:|:-----------------------------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Додати посилання на опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач авторизований у системі |
|
||||||
|
| Результат | Нове посилання на опитування |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Натискає кнопку створення посилання на опитування;
|
||||||
|
|Система|
|
||||||
|
: Виводить налаштування для нового посилання;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можливі 001.005, 001.006, 001.008</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
: Вводить налаштування для нового посилання;
|
||||||
|
: Натискає на кнопку створення посилання;
|
||||||
|
|Система|
|
||||||
|
: Створює нове посилання;
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | SURVEY.LINK.DELETE |
|
||||||
|
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Видалити посилання на опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач авторизований у системі |
|
||||||
|
| Результат | Видалення посилання на опитування |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування<br>001.009 Запитане посилання на існує |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Натискає кнопку видалення посилання;
|
||||||
|
|Система|
|
||||||
|
: Виводить кнопку підтвердження видалення посилання;
|
||||||
|
|Користувач|
|
||||||
|
: Натискає на кнопку підтвердження видалення посилання;
|
||||||
|
|Система|
|
||||||
|
: Видаляє посилання;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можливі 001.005, 001.006, 001.008, 001.009</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | SURVEY.LINK.MODIFY |
|
||||||
|
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Змінити властивості посилання на опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач авторизований у системі |
|
||||||
|
| Результат | Зміна властивостей посилання на опитування |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування<br>001.009 Запитане посилання на існує |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Натискає кнопку редагування властивостей посилання;
|
||||||
|
|Система|
|
||||||
|
: Виводить налаштування для обраного посилання;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можливі 001.005, 001.006, 001.008, 001.009</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
: Вводить юажані зміни властивостей посилання;
|
||||||
|
: Натискає на кнопку збереження властиностей посилання;
|
||||||
|
|Система|
|
||||||
|
: Змінює властивості посилання;
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | USER.CREATE_SURVEY |
|
||||||
|
|:-----------------:|:--------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Створити опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач ідентифікований в системі |
|
||||||
|
| Результат | Створене опитування |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.007 Користувач ввів неприпустимі символи в назві опитування |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Переходить на сторінку створення опитування;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можлива 001.005</b>
|
||||||
|
end note
|
||||||
|
|Система|
|
||||||
|
: Виводить інтерфейс створення опитування;
|
||||||
|
|Користувач|
|
||||||
|
: Задає інформацію про запитання та тип опитування;
|
||||||
|
: Натискає кнопку збереження опитування;
|
||||||
|
|Система|
|
||||||
|
: Створює опитування;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можлива 001.007</b>
|
||||||
|
end note
|
||||||
|
: Виводить посилання на проходження опитування;
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | USER.DELETE_SURVEY |
|
||||||
|
|:-----------------:|:-----------------------------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Видалити опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач ідентифікований в системі, користувач є власником опитування |
|
||||||
|
| Результат | Відсутність опитування |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Натискає на кнопку видалення опитування;
|
||||||
|
|Система|
|
||||||
|
: Виводить запит на підтвердження видалення опитування;
|
||||||
|
|Користувач|
|
||||||
|
: Натискає на кнопку підтвердження видалення опитування;
|
||||||
|
|Система|
|
||||||
|
: Видаляє опитування;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можливі 001.005, 001.006, 001.008</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | USER.GET_SURVEY_RESULT |
|
||||||
|
|:-----------------:|:-----------------------------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Переглянути відповіді на опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач ідентифікований в системі, користувач є власником опитування |
|
||||||
|
| Результат | Інформація про відповіді на опитування |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Натискає на кнопку перегляду відповідей на опитування;
|
||||||
|
|Система|
|
||||||
|
: Виводить інформацію про відповіді на опитування;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можливі 001.005, 001.006, 001.008</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | USER.LOGOUT |
|
||||||
|
|:-----------------:|:----------------------------------------:|
|
||||||
|
| Назва | Скинути дані про ідентифікацію в системі |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач ідентифікований в системі |
|
||||||
|
| Результат | Користувач не ідентифікований в системі |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Натискає на кнопку виходу з облікового запису;
|
||||||
|
|Система|
|
||||||
|
: Скидає інформацію про ідентифікацію користувача;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можлива 001.005</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | USER.MODIFY_SURVEY |
|
||||||
|
|:-----------------:|:-----------------------------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Редагувати опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач ідентифікований в системі, користувач є власником опитування |
|
||||||
|
| Результат | Змінене опитування |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Переходить на сторінку редагування опитування;
|
||||||
|
|Система|
|
||||||
|
: Виводить інтерфейс редагування опитування;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можливі 001.005, 001.006, 001.008</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
: Задає інформацію про зміни в опитуванні;
|
||||||
|
: Натискає кнопку збереження змін в опитуванні;
|
||||||
|
|Система|
|
||||||
|
: Змінює опитування;
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | USER.STAT_SURVEY |
|
||||||
|
|:-----------------:|:-----------------------------------------------------------------------------------------------------------------------------:|
|
||||||
|
| Назва | Переглянути властивості опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач ідентифікований в системі, користувач є власником опитування |
|
||||||
|
| Результат | Інформація про властивості опитування |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Натискає на кнопку перегляду інформації про опитування;
|
||||||
|
|Система|
|
||||||
|
: Виводить інформацію про опитування;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можливі 001.005, 001.006, 001.008</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | USER.TAKE_ANON_SURVEY |
|
||||||
|
|:-----------------:|:------------------------------------:|
|
||||||
|
| Назва | Пройти анонімне опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Відсутні |
|
||||||
|
| Результат | Запис відповідей на опитування |
|
||||||
|
| Виключні ситуації | 001.006 Запитане опитування не існує |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Переходить на сторінку проходження опитування;
|
||||||
|
|Система|
|
||||||
|
: Виводить перелік запитань опитування;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можлива 001.006</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
: Вводить відповіді на запитання;
|
||||||
|
: Натискає кнопку надсилання відповідей;
|
||||||
|
|Система|
|
||||||
|
: Записує відповіді на опитування;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можлива 001.006</b>
|
||||||
|
end note
|
||||||
|
: Виводить прощальне повідомлення;
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|
||||||
|
| ID | USER.TAKE_NAMED_SURVEY |
|
||||||
|
|:-----------------:|:-----------------------------------------------------------------------------:|
|
||||||
|
| Назва | Пройти поіменне опитування |
|
||||||
|
| Учасники | Користувач, система |
|
||||||
|
| Передумови | Користувач ідентифікований в системі |
|
||||||
|
| Результат | Запис відповідей на опитування та відомості про користувача |
|
||||||
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує |
|
||||||
|
@startuml
|
||||||
|
|Користувач|
|
||||||
|
start
|
||||||
|
: Переходить на сторінку проходження опитування;
|
||||||
|
|Система|
|
||||||
|
: Виводить перелік запитань опитування;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можливі 001.005, 001.006</b>
|
||||||
|
end note
|
||||||
|
|Користувач|
|
||||||
|
: Вводить відповіді на запитання;
|
||||||
|
: Натискає кнопку надсилання відповідей;
|
||||||
|
|Система|
|
||||||
|
: Записує відповіді на опитування та відомості про користувача;
|
||||||
|
note right #lightpink
|
||||||
|
<b>Можлива 001.006</b>
|
||||||
|
end note
|
||||||
|
: Виводить прощальне повідомлення;
|
||||||
|
|Користувач|
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
# програмні коди
|
# JS-скрипти
|
||||||
В цьому розділі розміщені програмні коди.
|
|
||||||
|
В цьому розділі розміщені програмні коди javascript.
|
||||||
BIN
src/restful-server/__pycache__/serverSurvey.cpython-312.pyc
Normal file
0
src/restful-server/flask
Normal file
62
src/restful-server/serverSurvey.py
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
from flask import Flask, request, jsonify
|
||||||
|
from flask_sqlalchemy import SQLAlchemy
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:1234@localhost/odb'
|
||||||
|
db = SQLAlchemy(app)
|
||||||
|
|
||||||
|
class Survey(db.Model):
|
||||||
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
isPaused = db.Column(db.Boolean)
|
||||||
|
isNamed = db.Column(db.Boolean)
|
||||||
|
name = db.Column(db.String(255))
|
||||||
|
duration = db.Column(db.Integer)
|
||||||
|
account_id = db.Column(db.Integer)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"<Survey {self.name}>"
|
||||||
|
|
||||||
|
def as_dict(self):
|
||||||
|
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
|
||||||
|
|
||||||
|
@app.route("/api/survey", methods=["GET", "POST"])
|
||||||
|
def api_survey():
|
||||||
|
if request.method == "GET":
|
||||||
|
surveys = Survey.query.all()
|
||||||
|
return jsonify([survey.as_dict() for survey in surveys])
|
||||||
|
|
||||||
|
elif request.method == "POST":
|
||||||
|
data = request.json
|
||||||
|
new_survey = Survey(isPaused=data['isPaused'], isNamed=data['isNamed'], name=data['name'],
|
||||||
|
duration=data['duration'], account_id=data['account_id'])
|
||||||
|
db.session.add(new_survey)
|
||||||
|
db.session.commit()
|
||||||
|
return jsonify({'success': True}), 201
|
||||||
|
|
||||||
|
@app.route("/api/survey/<int:survey_id>", methods=["GET", "PUT", "DELETE"])
|
||||||
|
def api_survey_numbered(survey_id):
|
||||||
|
survey = Survey.query.get_or_404(survey_id)
|
||||||
|
|
||||||
|
|
||||||
|
if request.method == "GET":
|
||||||
|
return jsonify(survey.as_dict())
|
||||||
|
|
||||||
|
elif request.method == "PUT":
|
||||||
|
data = request.json
|
||||||
|
|
||||||
|
survey.isPaused = data['isPaused']
|
||||||
|
survey.isNamed = data['isNamed']
|
||||||
|
survey.name = data['name']
|
||||||
|
survey.duration = data['duration']
|
||||||
|
survey.account_id = data['account_id']
|
||||||
|
|
||||||
|
db.session.commit()
|
||||||
|
return jsonify({'success': True})
|
||||||
|
|
||||||
|
elif request.method == "DELETE":
|
||||||
|
db.session.delete(survey)
|
||||||
|
db.session.commit()
|
||||||
|
return jsonify({'success': True})
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(debug=True)
|
||||||
3
src/sql/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# SQL-скрипти
|
||||||
|
|
||||||
|
В цьому розділі розміщені сирцеві коди для створення бази даних.
|
||||||
107
src/sql/script.sql
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
-- MySQL Workbench Forward Engineering
|
||||||
|
|
||||||
|
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
|
||||||
|
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
|
||||||
|
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Schema mydb
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Schema mydb
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
|
||||||
|
USE `mydb` ;
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `mydb`.`Account`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `mydb`.`Account` (
|
||||||
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`username` CHAR(255) NOT NULL,
|
||||||
|
`password` CHAR(255) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
|
UNIQUE INDEX `username_UNIQUE` (`username` ASC) VISIBLE)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `mydb`.`Survey`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `mydb`.`Survey` (
|
||||||
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`isPaused` TINYINT UNSIGNED NOT NULL,
|
||||||
|
`isNamed` TINYINT UNSIGNED NOT NULL,
|
||||||
|
`name` CHAR(255) NULL,
|
||||||
|
`duration` CHAR(255) NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
|
CONSTRAINT `fk_Survey_Account1`
|
||||||
|
FOREIGN KEY (`id`)
|
||||||
|
REFERENCES `mydb`.`Account` (`id`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `mydb`.`Question`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `mydb`.`Question` (
|
||||||
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`Text` CHAR(255) NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
|
CONSTRAINT `fk_Question_Survey1`
|
||||||
|
FOREIGN KEY (`id`)
|
||||||
|
REFERENCES `mydb`.`Survey` (`id`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `mydb`.`Response`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `mydb`.`Response` (
|
||||||
|
`id` INT UNSIGNED NULL AUTO_INCREMENT,
|
||||||
|
`Value` VARCHAR(16384) NULL,
|
||||||
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
CONSTRAINT `fk_Response_Question`
|
||||||
|
FOREIGN KEY (`id`)
|
||||||
|
REFERENCES `mydb`.`Question` (`id`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION,
|
||||||
|
CONSTRAINT `fk_Response_Account1`
|
||||||
|
FOREIGN KEY (`id`)
|
||||||
|
REFERENCES `mydb`.`Account` (`id`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `mydb`.`Link`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `mydb`.`Link` (
|
||||||
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`uses` INT NOT NULL,
|
||||||
|
`responces` INT NOT NULL,
|
||||||
|
`usageLimit` INT NULL,
|
||||||
|
`responceLimit` INT NULL,
|
||||||
|
`path` CHAR(32) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
CONSTRAINT `fk_Link_Survey1`
|
||||||
|
FOREIGN KEY (`id`)
|
||||||
|
REFERENCES `mydb`.`Survey` (`id`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
SET SQL_MODE=@OLD_SQL_MODE;
|
||||||
|
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
|
||||||
|
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
|
||||||
@@ -34,6 +34,27 @@ def convert_usecase_v1(filename, data):
|
|||||||
|
|
||||||
return generate_table(merged_lines)
|
return generate_table(merged_lines)
|
||||||
|
|
||||||
|
def convert_activity_v1(filename, data):
|
||||||
|
split_raw_lines_from_file = [i.split(" | ") for i in data.split("\n") if i]
|
||||||
|
|
||||||
|
if '/' in filename:
|
||||||
|
use_case_name = filename.rsplit("/", 1)[1].upper()
|
||||||
|
elif '\\' in filename:
|
||||||
|
use_case_name = filename.rsplit("\\", 1)[1].upper()
|
||||||
|
else:
|
||||||
|
use_case_name = filename.upper()
|
||||||
|
|
||||||
|
split_raw_lines = [["ID", use_case_name]] + split_raw_lines_from_file
|
||||||
|
|
||||||
|
merged_lines = []
|
||||||
|
for i in split_raw_lines:
|
||||||
|
if i[0].replace(" ", "") == "":
|
||||||
|
merged_lines[-1][1] += "<br>" + i[1]
|
||||||
|
else:
|
||||||
|
merged_lines.append(i)
|
||||||
|
|
||||||
|
return generate_table_with_activity_diagram(merged_lines)
|
||||||
|
|
||||||
def generate_table(raw_table_data):
|
def generate_table(raw_table_data):
|
||||||
table_lines = raw_table_data
|
table_lines = raw_table_data
|
||||||
transposed_table = list(zip(*table_lines))
|
transposed_table = list(zip(*table_lines))
|
||||||
@@ -60,15 +81,101 @@ def generate_table(raw_table_data):
|
|||||||
|
|
||||||
return "\n".join(formatted_table_lines)
|
return "\n".join(formatted_table_lines)
|
||||||
|
|
||||||
|
def convert_line_to_activity_diagram(line):
|
||||||
|
split_line = line[1].split("<br>")
|
||||||
|
|
||||||
|
result = "@startuml\n %PLACEHOLDER%\nstop\n@enduml"
|
||||||
|
|
||||||
|
last_swimline_name = ""
|
||||||
|
initiator_name = ""
|
||||||
|
|
||||||
|
for i in split_line:
|
||||||
|
clear_line = i.lstrip("1234567890. ")
|
||||||
|
swimline_label, combined_action = clear_line.split(" ", 1)
|
||||||
|
|
||||||
|
action_and_exceptions = combined_action.split(" (")
|
||||||
|
|
||||||
|
if len(action_and_exceptions) > 1:
|
||||||
|
action = action_and_exceptions[0].strip().capitalize()
|
||||||
|
exceptions = action_and_exceptions[1].strip(") ").capitalize()
|
||||||
|
else:
|
||||||
|
action = action_and_exceptions[0].strip().capitalize()
|
||||||
|
exceptions = ""
|
||||||
|
|
||||||
|
# запам'ятовуємо назву користувача системи
|
||||||
|
# (він завжди починає взаємодію, а, отже,
|
||||||
|
# перша дія завжди належить йому)
|
||||||
|
if not initiator_name:
|
||||||
|
initiator_name = swimline_label
|
||||||
|
|
||||||
|
# змінюємо swinline, якщо керування перейшло до іншого актора
|
||||||
|
if last_swimline_name != swimline_label:
|
||||||
|
result = result.replace("%PLACEHOLDER%", f"|{swimline_label}|\n %PLACEHOLDER%")
|
||||||
|
|
||||||
|
# якщо це перша дія, то вказуємо start
|
||||||
|
if not last_swimline_name:
|
||||||
|
result = result.replace("%PLACEHOLDER%", f"start\n %PLACEHOLDER%")
|
||||||
|
|
||||||
|
# зберігаємо нове ім'я актора
|
||||||
|
last_swimline_name = swimline_label
|
||||||
|
|
||||||
|
# прописуємо поточну дію актора
|
||||||
|
result = result.replace("%PLACEHOLDER%", f": {action};\n %PLACEHOLDER%")
|
||||||
|
|
||||||
|
# якщо є виключні ситуації, додаємо інформацію про них
|
||||||
|
if exceptions:
|
||||||
|
result = result.replace("%PLACEHOLDER%", f"note right #lightpink\n <b>{exceptions}</b>\n end note\n %PLACEHOLDER%")
|
||||||
|
|
||||||
|
# впенюємося, що взаємодія закінчується на swinline користувача
|
||||||
|
if last_swimline_name != initiator_name:
|
||||||
|
result = result.replace("%PLACEHOLDER%", f"|{initiator_name}|\n %PLACEHOLDER%")
|
||||||
|
|
||||||
|
# видаляємо мітку %PLACEHOLDER%
|
||||||
|
result = result.replace("%PLACEHOLDER%\n", "")
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def generate_table_with_activity_diagram(raw_table_data):
|
||||||
|
table_lines = raw_table_data[:-1]
|
||||||
|
activity_line = raw_table_data[-1]
|
||||||
|
|
||||||
|
transposed_table = list(zip(*table_lines))
|
||||||
|
|
||||||
|
field_sizes = [max([max([len(k)+2 for k in j.split("\n")]) for j in i]) for i in transposed_table]
|
||||||
|
|
||||||
|
formatted_table_lines = []
|
||||||
|
|
||||||
|
l = "|"
|
||||||
|
for i, field in enumerate(table_lines[0]):
|
||||||
|
l += field.center(field_sizes[i])
|
||||||
|
l += "|"
|
||||||
|
|
||||||
|
formatted_table_lines.append(l)
|
||||||
|
formatted_table_lines.append(f"|{'|'.join([':'+'-'*(i-2)+':' for i in field_sizes])}|")
|
||||||
|
|
||||||
|
for line in table_lines[1:]:
|
||||||
|
l = "|"
|
||||||
|
for i, field in enumerate(line):
|
||||||
|
l += field.center(field_sizes[i])
|
||||||
|
l += "|"
|
||||||
|
|
||||||
|
formatted_table_lines.append(l)
|
||||||
|
|
||||||
|
activity_diagram = convert_line_to_activity_diagram(activity_line)
|
||||||
|
|
||||||
|
return "\n".join(formatted_table_lines) + "\n" + activity_diagram
|
||||||
|
|
||||||
|
|
||||||
if __name__=="__main__":
|
if __name__=="__main__":
|
||||||
# parse args
|
# parse args
|
||||||
files = []
|
files = []
|
||||||
|
|
||||||
write_to_file = AUTO
|
write_to_file = AUTO
|
||||||
write_to_stdout = AUTO
|
write_to_stdout = AUTO
|
||||||
usecase_formatting = AUTO
|
usecase_formatting = AUTO
|
||||||
verbose = AUTO
|
verbose = AUTO
|
||||||
process_table_files = AUTO
|
process_table_files = AUTO
|
||||||
|
convert_to_activity_diagram = AUTO
|
||||||
file_output_path = None
|
file_output_path = None
|
||||||
|
|
||||||
# 1 pass (argument harvest)
|
# 1 pass (argument harvest)
|
||||||
@@ -104,6 +211,12 @@ if __name__=="__main__":
|
|||||||
elif i in ["-nt", "--no-process-table"]:
|
elif i in ["-nt", "--no-process-table"]:
|
||||||
process_table_files = NO
|
process_table_files = NO
|
||||||
|
|
||||||
|
# перетворює останню клітинку таблиці в діаграму активностей
|
||||||
|
if i in ["-a", "--convert-to-activity-diagram"]:
|
||||||
|
convert_to_activity_diagram = YES
|
||||||
|
elif i in ["-na", "--no-convert-to-activity-diagram"]:
|
||||||
|
convert_to_activity_diagram = NO
|
||||||
|
|
||||||
# задає папку, в яку необхідно зберігати конвертовані таблиці
|
# задає папку, в яку необхідно зберігати конвертовані таблиці
|
||||||
elif i in ["-d", "--destination"]:
|
elif i in ["-d", "--destination"]:
|
||||||
file_output_path = sys.argv[n+2]
|
file_output_path = sys.argv[n+2]
|
||||||
@@ -133,6 +246,13 @@ if __name__=="__main__":
|
|||||||
elif (name.endswith(".usecase") or name.endswith(".uc")) and usecase_formatting >= AUTO:
|
elif (name.endswith(".usecase") or name.endswith(".uc")) and usecase_formatting >= AUTO:
|
||||||
if verbose == YES:
|
if verbose == YES:
|
||||||
print(f"Auto-detected use-case in file {name}\n")
|
print(f"Auto-detected use-case in file {name}\n")
|
||||||
|
|
||||||
|
if convert_to_activity_diagram == YES:
|
||||||
|
if verbose == YES:
|
||||||
|
print(f"Converting file {name} to activity diagram\n")
|
||||||
|
|
||||||
|
formatted_table_data = convert_activity_v1(name.rsplit(".", 1)[0], data)
|
||||||
|
else:
|
||||||
formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data)
|
formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data)
|
||||||
else:
|
else:
|
||||||
formatted_table_data = convert_generic_v1(data)
|
formatted_table_data = convert_generic_v1(data)
|
||||||
@@ -162,6 +282,13 @@ if __name__=="__main__":
|
|||||||
elif (name.endswith(".usecase") or name.endswith(".uc")) and usecase_formatting >= AUTO:
|
elif (name.endswith(".usecase") or name.endswith(".uc")) and usecase_formatting >= AUTO:
|
||||||
if verbose >= AUTO:
|
if verbose >= AUTO:
|
||||||
print(f"Auto-detected use-case in file {name}")
|
print(f"Auto-detected use-case in file {name}")
|
||||||
|
|
||||||
|
if convert_to_activity_diagram == YES:
|
||||||
|
if verbose == YES:
|
||||||
|
print(f"Converting file {name} to activity diagram\n")
|
||||||
|
|
||||||
|
formatted_table_data = convert_activity_v1(name.rsplit(".", 1)[0], data)
|
||||||
|
else:
|
||||||
formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data)
|
formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data)
|
||||||
else:
|
else:
|
||||||
formatted_table_data = convert_generic_v1(data)
|
formatted_table_data = convert_generic_v1(data)
|
||||||
|
|||||||
8
utils/table-generator/update-activities.py
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import updater
|
||||||
|
|
||||||
|
target_folder = "activities"
|
||||||
|
converter_args = "-a -nv"
|
||||||
|
|
||||||
|
updater.process(target_folder, converter_args)
|
||||||
13
utils/table-generator/update-activities.sh
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
mkdir -p activities/
|
||||||
|
./convert.py use-cases/* -a -nv -d activities/
|
||||||
|
|
||||||
|
if [ -f activities.md ]; then
|
||||||
|
rm activities.md
|
||||||
|
fi
|
||||||
|
|
||||||
|
for i in activities/*; do
|
||||||
|
cat $i >> activities.md
|
||||||
|
echo "" >> activities.md
|
||||||
|
done
|
||||||
8
utils/table-generator/update-tables.py
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import updater
|
||||||
|
|
||||||
|
target_folder = "tables"
|
||||||
|
converter_args = "-nv"
|
||||||
|
|
||||||
|
updater.process(target_folder, converter_args)
|
||||||
26
utils/table-generator/updater.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import shutil
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
PYTHON_INTERPRETER = sys.executable
|
||||||
|
|
||||||
|
def process(target_folder, converter_args):
|
||||||
|
if os.path.exists(target_folder):
|
||||||
|
shutil.rmtree(target_folder)
|
||||||
|
|
||||||
|
os.mkdir(target_folder)
|
||||||
|
os.system(f"{PYTHON_INTERPRETER} convert.py use-cases/* {converter_args} -d {target_folder}/")
|
||||||
|
|
||||||
|
result_file = open(f"{target_folder}.md", "w")
|
||||||
|
|
||||||
|
try:
|
||||||
|
for i in os.listdir(target_folder):
|
||||||
|
with open(os.path.abspath(f"{target_folder}/{i}")) as f:
|
||||||
|
result_file.write(f.read())
|
||||||
|
result_file.write("\n")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"File {target_folder}/{i} has raised exception {e}")
|
||||||
|
|
||||||
|
result_file.close()
|
||||||
12
utils/table-generator/use-cases/survey.link.create.uc
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
Назва | Додати посилання на опитування
|
||||||
|
Учасники | Користувач, система
|
||||||
|
Передумови | Користувач авторизований у системі
|
||||||
|
Результат | Нове посилання на опитування
|
||||||
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
|
| 001.006 Запитане опитування не існує
|
||||||
|
| 001.008 Користувач не є власником опитування
|
||||||
|
Основний сценарій | 1. Користувач натискає кнопку створення посилання на опитування
|
||||||
|
| 2. Система виводить налаштування для нового посилання (можливі 001.005, 001.006, 001.008)
|
||||||
|
| 3. Користувач вводить налаштування для нового посилання
|
||||||
|
| 4. Користувач натискає на кнопку створення посилання
|
||||||
|
| 5. Система створює нове посилання
|
||||||
12
utils/table-generator/use-cases/survey.link.delete.uc
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
Назва | Видалити посилання на опитування
|
||||||
|
Учасники | Користувач, система
|
||||||
|
Передумови | Користувач авторизований у системі
|
||||||
|
Результат | Видалення посилання на опитування
|
||||||
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
|
| 001.006 Запитане опитування не існує
|
||||||
|
| 001.008 Користувач не є власником опитування
|
||||||
|
| 001.009 Запитане посилання на існує
|
||||||
|
Основний сценарій | 1. Користувач натискає кнопку видалення посилання
|
||||||
|
| 2. Система виводить кнопку підтвердження видалення посилання
|
||||||
|
| 3. Користувач натискає на кнопку підтвердження видалення посилання
|
||||||
|
| 4. Система видаляє посилання (можливі 001.005, 001.006, 001.008, 001.009)
|
||||||
13
utils/table-generator/use-cases/survey.link.modify.uc
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
Назва | Змінити властивості посилання на опитування
|
||||||
|
Учасники | Користувач, система
|
||||||
|
Передумови | Користувач авторизований у системі
|
||||||
|
Результат | Зміна властивостей посилання на опитування
|
||||||
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
|
| 001.006 Запитане опитування не існує
|
||||||
|
| 001.008 Користувач не є власником опитування
|
||||||
|
| 001.009 Запитане посилання на існує
|
||||||
|
Основний сценарій | 1. Користувач натискає кнопку редагування властивостей посилання
|
||||||
|
| 2. Система виводить налаштування для обраного посилання (можливі 001.005, 001.006, 001.008, 001.009)
|
||||||
|
| 3. Користувач вводить юажані зміни властивостей посилання
|
||||||
|
| 4. Користувач натискає на кнопку збереження властиностей посилання
|
||||||
|
| 5. Система змінює властивості посилання
|
||||||