Skip to content

Commit 571ef26

Browse files
makseqLamDanghlomzik
authored
Release 0.9.0.post5 fixes (#561)
* Remove hostname prefix for upload files in case of localhost * Update misc.py (#560) Add timeout to version check * Update requests dependency * Add task patch * Fix task patch docs * Add list to Image in validation * Change attrs version to >=19.1.0 * Main page mock-up fixes Gaps and overlays Outliers on mobile screens Simplify sliders and fix console error about missing one Fix github stars rounding Add new release with github link * Add INIT_COMMAND to run.sh * Update DM build * Add editor version to hash * Fix misspell * Change LS version * Fix misspell Co-authored-by: LamDang <[email protected]> Co-authored-by: hlomzik <[email protected]>
1 parent 4f8c68c commit 571ef26

File tree

21 files changed

+142
-216
lines changed

21 files changed

+142
-216
lines changed

docs/source/guide/FAQ.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,9 @@ After the project setup is finished you can import this task (just copy this rig
129129
},
130130
{
131131
"id": "result3",
132-
"type": "choices",
132+
"type": "choices",
133133
"from_name": "choice", "to_name": "image",
134-
"value": {
134+
"value": {
135135
"choices": ["Airbus"]
136136
}
137137
}
@@ -243,4 +243,4 @@ print(pixel_x, pixel_y, pixel_width, pixel_height)
243243
# convert back to LS
244244
x, y, width, height = convert_to_ls(pixel_x, pixel_y, pixel_width, pixel_height, 600, 403)
245245
print(x, y, width, height)
246-
```
246+
```

docs/source/guide/api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ The `format` parameters could be found on the Export page in the dropdown (`JSON
117117
| /api/project-switch | `GET` switch to specified project by project UUID in multi-session mode |
118118
| **Tasks** |
119119
| /api/tasks | `GET` retrieve all tasks from project <br> `DELETE` delete all tasks from project |
120-
| /api/tasks/\<task_id> | `GET` retrieve specific task <br> `DELETE` delete specific task |
120+
| /api/tasks/\<task_id> | `GET` retrieve specific task <br> `DELETE` delete specific task <br> `PATCH \| POST` rewrite task with data, completions and predictions (it's very helpful for changing data in time and prediction updates) |
121121
| /api/tasks/\<task_id>/completions | `POST` create a new completion <br> `DELETE` delete all task completions |
122122
| /api/tasks/\<task_id>/completions/\<completion_id> | `PATCH` update completion <br> `DELETE` delete completion |
123123
| /api/completions | `GET` returns all completion ids <br> `DELETE` delete all project completions |

docs/themes/htx/layout/partials/index.ejs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ menu && menu.classList.add('main__page__header')
3232
function nice_format(n) {
3333
const prefixes = ['', 'k', 'M']
3434
const level = Math.floor(Math.floor(Math.log10(n)) / 3)
35-
const short = (n / Math.pow(10, 3 * level))
36-
.toPrecision(3)
37-
.replace(/\.?0+$|(\.\d)\d+$/g, '$1') // leave max one digit after dot
35+
const thousands = n / Math.pow(10, 3 * level)
36+
const short = thousands
37+
.toPrecision(thousands > 99 ? 3 : 2)
38+
.replace(/\.0+$|(\.\d)\d+$/g, '$1') // leave max one digit after dot
3839
return short + prefixes[level]
3940
}
4041
const star_counter = document.querySelector('.star__counter')

docs/themes/htx/source/css/new-index.css

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -459,13 +459,13 @@ div.container{
459459
.outer__label>.left__overlay{
460460
position: absolute;
461461
left:-15px;
462-
bottom:-15px;
462+
bottom:-40px;
463463
z-index: 5;
464464
}
465465
.outer__label>.right__overlay{
466466
position: absolute;
467467
right:-15px;
468-
bottom:-15px;
468+
bottom:-40px;
469469
z-index: 5;
470470
}
471471
.author__image>img{
@@ -612,7 +612,7 @@ div.container{
612612
}
613613
.community__block{
614614
margin-bottom:0px;
615-
margin-top:-90px;
615+
margin-top:-60px;
616616
position: relative;
617617
background-color:#FAFAF9;
618618
}
@@ -651,14 +651,14 @@ div.container{
651651
.lf__overlay{
652652
position: absolute;
653653
left: 0px;
654-
bottom: 150px;
654+
bottom: 130px;
655655
z-index: 3;
656656
height:150px;
657657
}
658658
.rg__overlay{
659659
position: absolute;
660660
right: 0px;
661-
bottom: 150px;
661+
bottom: 130px;
662662
z-index: 3;
663663
height:150px;
664664
}
@@ -1119,7 +1119,15 @@ footer{
11191119
.inner__articles{
11201120
grid-template-columns:repeat(3 , minmax(300px , 300px));
11211121
overflow-x: auto;
1122-
width:calc(100% + 15px);
1122+
width:calc(100% + 30px);
1123+
margin-left:-15px;
1124+
padding-left:15px;
1125+
}
1126+
/* padding-right doesn't work in scrollable flex block */
1127+
.inner__articles::after{
1128+
content:"";
1129+
flex: 1px 0 0;
1130+
margin-left: -1px;
11231131
}
11241132
.inner__articles::-webkit-scrollbar {
11251133
width: 0px; /* Remove scrollbar space */
@@ -1313,8 +1321,7 @@ footer{
13131321
z-index: 6;
13141322
}
13151323
.lf__overlay{
1316-
width:120px;
1317-
bottom:120px;
1324+
bottom:100px;
13181325
}
13191326
.community__spacer{
13201327
min-width:50px;
@@ -1323,9 +1330,7 @@ footer{
13231330
padding-left:35px;
13241331
}
13251332
.rg__overlay{
1326-
right: -30px;
1327-
width:120px;
1328-
bottom:120px;
1333+
bottom:100px;
13291334
}
13301335
.inner__community{
13311336
width:calc(100% + 30px);
@@ -1350,6 +1355,9 @@ footer{
13501355
.inner__community .info__community{
13511356
margin-bottom:20px;
13521357
}
1358+
.community__block{
1359+
margin-top: 0;
1360+
}
13531361
.community__block .head__community>h2{
13541362
text-align:left;
13551363
font-size:20px;
@@ -1358,8 +1366,11 @@ footer{
13581366
.community__block .head__community{
13591367
margin-bottom:15px;
13601368
}
1369+
.community__block .outer__community{
1370+
top:60px;
1371+
}
13611372
.community__block .opossum__image{
1362-
top:90px;
1373+
top:60px;
13631374
right: 15px;
13641375
max-width:115px;
13651376
}
@@ -1398,7 +1409,7 @@ footer{
13981409
line-height:28px;
13991410
}
14001411
.date__type .head__date--type .switcher__inner{
1401-
width:calc(100% + 20px);
1412+
width:100%;
14021413
}
14031414
.main__content .left__content>p{
14041415
font-size:16px;
@@ -1437,11 +1448,11 @@ footer{
14371448
}
14381449
.outer__label>.left__overlay{
14391450
max-width:100px;
1440-
bottom:-20px;
1451+
bottom:-30px;
14411452
}
14421453
.outer__label>.right__overlay{
14431454
max-width:100px;
1444-
bottom:-20px;
1455+
bottom:-30px;
14451456
}
14461457
.date__type{
14471458
margin-bottom:-250px;

docs/themes/htx/source/js/new-index.js

Lines changed: 30 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -56,76 +56,37 @@ $(document).ready(function(){
5656
}
5757
});
5858

59-
const slider = document.querySelector('.content__label');
60-
let isDown = false;
61-
let startX;
62-
let scrollLeft;
59+
function activateSlider(slider) {
60+
if (!slider) return;
6361

64-
slider.addEventListener('mousedown', (e) => {
65-
isDown = true;
66-
slider.classList.add('active');
67-
startX = e.pageX - slider.offsetLeft;
68-
scrollLeft = slider.scrollLeft;
69-
});
70-
slider.addEventListener('mouseleave', () => {
71-
isDown = false;
72-
slider.classList.remove('active');
73-
});
74-
slider.addEventListener('mouseup', () => {
75-
isDown = false;
76-
slider.classList.remove('active');
77-
});
78-
slider.addEventListener('mousemove', (e) => {
79-
if(!isDown) return;
80-
e.preventDefault();
81-
const x = e.pageX - slider.offsetLeft;
82-
const walk = (x - startX) * 3; //scroll-fast
83-
slider.scrollLeft = scrollLeft - walk;
84-
});
85-
const slider2 = document.querySelector(".community__wrapper");
86-
slider2.addEventListener('mousedown', (e) => {
87-
isDown = true;
88-
slider2.classList.add('active');
89-
startX = e.pageX - slider2.offsetLeft;
90-
scrollLeft = slider2.scrollLeft;
91-
});
92-
slider2.addEventListener('mouseleave', () => {
93-
isDown = false;
94-
slider2.classList.remove('active');
95-
});
96-
slider2.addEventListener('mouseup', () => {
97-
isDown = false;
98-
slider2.classList.remove('active');
99-
});
100-
slider2.addEventListener('mousemove', (e) => {
101-
if(!isDown) return;
102-
e.preventDefault();
103-
const x = e.pageX - slider2.offsetLeft;
104-
const walk = (x - startX) * 3; //scroll-fast
105-
slider2.scrollLeft = scrollLeft - walk;
106-
});
62+
let isDown = false;
63+
let startX;
64+
let scrollLeft;
10765

66+
slider.addEventListener('mousedown', (e) => {
67+
isDown = true;
68+
slider.classList.add('active');
69+
startX = e.pageX - slider.offsetLeft;
70+
scrollLeft = slider.scrollLeft;
71+
});
72+
slider.addEventListener('mouseleave', () => {
73+
isDown = false;
74+
slider.classList.remove('active');
75+
});
76+
slider.addEventListener('mouseup', () => {
77+
isDown = false;
78+
slider.classList.remove('active');
79+
});
80+
slider.addEventListener('mousemove', (e) => {
81+
if(!isDown) return;
82+
e.preventDefault();
83+
const x = e.pageX - slider.offsetLeft;
84+
const walk = (x - startX) * 3; //scroll-fast
85+
slider.scrollLeft = scrollLeft - walk;
86+
});
87+
}
10888

109-
const slider3 = document.querySelector(".content__video");
110-
slider3.addEventListener('mousedown', (e) => {
111-
isDown = true;
112-
slider3.classList.add('active');
113-
startX = e.pageX - slider3.offsetLeft;
114-
scrollLeft = slider3.scrollLeft;
115-
});
116-
slider3.addEventListener('mouseleave', () => {
117-
isDown = false;
118-
slider3.classList.remove('active');
119-
});
120-
slider3.addEventListener('mouseup', () => {
121-
isDown = false;
122-
slider3.classList.remove('active');
123-
});
124-
slider3.addEventListener('mousemove', (e) => {
125-
if(!isDown) return;
126-
e.preventDefault();
127-
const x = e.pageX - slider3.offsetLeft;
128-
const walk = (x - startX) * 3; //scroll-fast
129-
slider3.scrollLeft = scrollLeft - walk;
130-
});
89+
activateSlider(document.querySelector('.content__label'));
90+
activateSlider(document.querySelector(".community__wrapper"));
91+
activateSlider(document.querySelector(".content__video"));
13192
});

label_studio/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
package_name = 'label-studio'
33

44
# Package version
5-
__version__ = '0.9.0.post4'
5+
__version__ = '0.9.0.post5'

label_studio/blueprint.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ def labeling_page():
301301
label_config_line=g.project.label_config_line,
302302
task_id=task_id,
303303
task_data=task_data,
304+
version=label_studio.__version__,
304305
**find_editor_files()
305306
)
306307

@@ -693,7 +694,7 @@ def api_all_tasks():
693694
return make_response(jsonify({'detail': 'deleted'}), 204)
694695

695696

696-
@blueprint.route('/api/tasks/<task_id>', methods=['GET', 'DELETE'])
697+
@blueprint.route('/api/tasks/<task_id>', methods=['GET', 'DELETE', 'PATCH', 'POST'])
697698
@requires_auth
698699
@exception_handler
699700
def api_task_by_id(task_id):
@@ -717,10 +718,16 @@ def api_task_by_id(task_id):
717718
)
718719
return make_response(response, 200)
719720

721+
if request.method == 'PATCH' or request.method == 'POST':
722+
data = request.json
723+
g.project.source_storage._validate_task(task_id, data)
724+
g.project.source_storage.set(task_id, data)
725+
return make_response({'detail': 'Task patched', 'data': data}, 200)
726+
720727
# delete task
721728
elif request.method == 'DELETE':
722729
g.project.delete_task(task_id)
723-
return make_response(jsonify({'detal': 'Task deleted'}), 204)
730+
return make_response(jsonify({'detail': 'Task deleted'}), 204)
724731

725732

726733
@blueprint.route('/api/tasks/<task_id>/completions', methods=['POST', 'DELETE'])

label_studio/data_import/uploader.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,12 @@ def read_task_from_hypertext_body(self, filename, file):
7878

7979
def read_task_from_uploaded_file(self, filename, file):
8080
logger.debug('Read 1 task from uploaded file {}'.format(filename))
81-
path = get_external_hostname() + '/data/upload/' + filename
81+
# remove hostname if it's localhost and use absolute path
82+
hostname = get_external_hostname()
83+
if 'localhost' in hostname:
84+
hostname = ''
85+
# make path with hostname
86+
path = hostname + '/data/upload/' + filename
8287
tasks = [{'data': {settings.UPLOAD_DATA_UNDEFINED_NAME: path}}]
8388
return tasks
8489

label_studio/data_manager/templates/tasks.html

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,17 @@
2323
<center><br><br><br>Loading ...<br></center>
2424
</div>
2525

26-
<script src="static/js/build/index.js?version="{{ version }}></script>
26+
<!-- Editor CSS -->
27+
{% for css in editor_css %}
28+
<link href="{{ css }}?version={{ version }}" rel="stylesheet">
29+
{% endfor %}
30+
31+
<!-- Editor JS -->
32+
{% for js in editor_js %}
33+
<script src="{{ js }}?version={{ version }}"></script>
34+
{% endfor %}
35+
36+
<!-- Data manager JS -->
37+
<script src="static/js/build/index.js?version={{ version }}"></script>
2738

2839
{% endblock %}

label_studio/data_manager/templates/tasks_old.html

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
{% extends 'base.html' %}
22
{% block body %}
3+
4+
<!-- Editor JS -->
5+
{% for js in editor_js %}
6+
<script src="{{ js }}?version={{ version }}"></script>
7+
{% endfor %}
8+
9+
<!-- Editor CSS -->
10+
{% for css in editor_css %}
11+
<link href="{{ css }}?version={{ version }}" rel="stylesheet">
12+
{% endfor %}
13+
314
{% raw %}
415
<script src="static/js/polyfill.min.js"></script>
516
<script src="static/js/vue.js"></script>
@@ -113,7 +124,7 @@
113124
</span>
114125
</span>
115126
<!-- Start labeling -->
116-
<a class="ui button positive" href=".">Start Labeling</a>
127+
<a class="ui button positive" href="./label-old">Start Labeling</a>
117128
</div>
118129
</div>
119130
</div>
@@ -122,7 +133,7 @@
122133

123134
<!-- Critical error -->
124135
<div v-if="error">
125-
<div class="ui hidden divier"></div>
136+
<div class="ui hidden divider"></div>
126137
<div class="ui error message">
127138
<div class="header">{{ error.header }}</div>
128139
<div class="content">{{ error.message }}</div>

label_studio/data_manager/views.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,6 @@ def tasks_old_page():
3636
config=g.project.config,
3737
project=g.project,
3838
serialized_project=serialized_project,
39+
version=label_studio.__version__,
3940
**find_editor_files()
4041
)

0 commit comments

Comments
 (0)