Skip to content

Commit d8dbae1

Browse files
authored
Merge pull request #800 from rdmorganiser/validate_conflicts
Validate conflicts
2 parents 2f278c5 + e956649 commit d8dbae1

21 files changed

+353
-36
lines changed

rdmo/core/constants.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,22 @@
5858
'views.add_view', 'views.change_view', 'views.delete_view'
5959
)
6060
}
61+
62+
HUMAN2BYTES_MAPPER = {
63+
"b": {"base": 1000, "power": 0},
64+
"kb": {"base": 1000, "power": 1},
65+
"k": {"base": 1000, "power": 1},
66+
"mb": {"base": 1000, "power": 2},
67+
"m": {"base": 1000, "power": 2},
68+
"gb": {"base": 1000, "power": 3},
69+
"g": {"base": 1000, "power": 3},
70+
"tb": {"base": 1000, "power": 4},
71+
"t": {"base": 1000, "power": 4},
72+
"p": {"base": 1000, "power": 5},
73+
"pb": {"base": 1000, "power": 5},
74+
"kib": {"base": 1024, "power": 1},
75+
"mib": {"base": 1024, "power": 2},
76+
"gib": {"base": 1024, "power": 3},
77+
"tib": {"base": 1024, "power": 4},
78+
"pib": {"base": 1024, "power": 5},
79+
}

rdmo/core/tests/test_utils.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
from typing import Optional
2+
13
import pytest
24

3-
from rdmo.core.utils import join_url, sanitize_url
5+
from rdmo.core.utils import human2bytes, join_url, sanitize_url
46

57
urls = (
68
('', ''),
@@ -15,6 +17,12 @@
1517
(1, ''),
1618
)
1719

20+
human2bytes_test_values = (
21+
("1Gb", 1e+9),
22+
(None, 0),
23+
("0", 0),
24+
)
25+
1826

1927
@pytest.mark.parametrize("url,sanitized_url", urls)
2028
def test_sanitize_url(url, sanitized_url):
@@ -23,3 +31,8 @@ def test_sanitize_url(url, sanitized_url):
2331

2432
def test_join_url():
2533
assert join_url('https://example.com//', '/terms', 'foo') == 'https://example.com/terms/foo'
34+
35+
36+
@pytest.mark.parametrize("human,bytes", human2bytes_test_values)
37+
def test_human2bytes(human: Optional[str], bytes: float):
38+
assert human2bytes(human) == bytes

rdmo/core/utils.py

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
from defusedcsv import csv
1919
from markdown import markdown
2020

21+
from .constants import HUMAN2BYTES_MAPPER
22+
2123
log = logging.getLogger(__name__)
2224

2325

@@ -351,32 +353,15 @@ def copy_model(instance, **kwargs):
351353

352354

353355
def human2bytes(string):
354-
if not string:
356+
if not string or string == '0':
355357
return 0
356358

357359
m = re.match(r'([0-9.]+)\s*([A-Za-z]+)', string)
358360
number, unit = float(m.group(1)), m.group(2).strip().lower()
359361

360-
if unit == 'kb' or unit == 'k':
361-
return number * 1000
362-
elif unit == 'mb' or unit == 'm':
363-
return number * 1000**2
364-
elif unit == 'gb' or unit == 'g':
365-
return number * 1000**3
366-
elif unit == 'tb' or unit == 't':
367-
return number * 1000**4
368-
elif unit == 'pb' or unit == 'p':
369-
return number * 1000**5
370-
elif unit == 'kib':
371-
return number * 1024
372-
elif unit == 'mib':
373-
return number * 1024**2
374-
elif unit == 'gib':
375-
return number * 1024**3
376-
elif unit == 'tib':
377-
return number * 1024**4
378-
elif unit == 'pib':
379-
return number * 1024**5
362+
conversion = HUMAN2BYTES_MAPPER[unit]
363+
number = number*conversion['base']**(conversion['power'])
364+
return number
380365

381366

382367
def is_truthy(value):

rdmo/projects/serializers/v1/__init__.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from rdmo.services.validators import ProviderValidator
99

1010
from ...models import Integration, IntegrationOption, Invite, Issue, IssueResource, Membership, Project, Snapshot, Value
11-
from ...validators import ValueValidator
11+
from ...validators import ValueConflictValidator, ValueQuotaValidator
1212

1313

1414
class UserSerializer(serializers.ModelSerializer):
@@ -259,7 +259,10 @@ class Meta:
259259
'unit',
260260
'external_id'
261261
)
262-
validators = (ValueValidator(), )
262+
validators = (
263+
ValueConflictValidator(),
264+
ValueQuotaValidator()
265+
)
263266

264267

265268
class MembershipSerializer(serializers.ModelSerializer):

rdmo/projects/static/projects/js/project_questions/services.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,9 @@ angular.module('project_questions')
706706
};
707707

708708
service.storeValue = function(value, question, set_prefix, set_index, collection_index) {
709+
// reset value errors
710+
value.errors = []
711+
709712
if (angular.isDefined(value.removed) && value.removed) {
710713
// remove additional_input from unselected checkboxes
711714
value.additional_input = {};
@@ -826,10 +829,16 @@ angular.module('project_questions')
826829
}, function (response) {
827830
if (response.status == 500) {
828831
service.error = response;
832+
} else if (response.status == 400) {
833+
service.error = true;
834+
value.errors = Object.keys(response.data);
835+
} else if (response.status == 404) {
836+
service.error = true;
837+
value.errors = ['not_found']
829838
}
830839
})
831840
}
832-
};
841+
};
833842

834843
service.storeValues = function() {
835844
var promises = [];
@@ -1058,11 +1067,19 @@ angular.module('project_questions')
10581067
service.values[attribute][set_prefix][set_index][collection_index].autocomplete_text = '';
10591068
service.values[attribute][set_prefix][set_index][collection_index].autocomplete_locked = false;
10601069
service.values[attribute][set_prefix][set_index][collection_index].changed = true;
1070+
1071+
if (service.settings.project_questions_autosave) {
1072+
service.save(false);
1073+
}
10611074
};
10621075

10631076
service.removeValue = function(attribute, set_prefix, set_index, collection_index) {
10641077
service.values[attribute][set_prefix][set_index][collection_index].removed = true;
10651078
service.values[attribute][set_prefix][set_index][collection_index].changed = true;
1079+
1080+
if (service.settings.project_questions_autosave) {
1081+
service.save(false);
1082+
}
10661083
};
10671084

10681085
service.openValueSetFormModal = function(questionset, set_prefix, set_index) {

rdmo/projects/templates/projects/project_questions_form_group_autocomplete.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
</div>
4545
</div>
4646
</div>
47+
48+
{% include 'projects/project_questions_value_errors.html' %}
4749
</div>
4850

4951
<div ng-if="question.is_collection">

rdmo/projects/templates/projects/project_questions_form_group_checkbox.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
ng-disabled="service.project.read_only"
2525
ng-change="service.changed(service.values[question.attribute][valueset.set_prefix][valueset.set_index][$index])" />
2626
</label>
27+
<div ng-init="value = service.values[question.attribute][valueset.set_prefix][valueset.set_index][$index]">
28+
{% include 'projects/project_questions_value_errors.html' %}
29+
</div>
2730
</div>
2831
</div>
2932
</div>

rdmo/projects/templates/projects/project_questions_form_group_date.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
ng-change="service.changed(value, true)"
2525
ng-class="{'default-value': service.isDefaultValue(question, value)}"/>
2626
</div>
27+
28+
{% include 'projects/project_questions_value_errors.html' %}
2729
</div>
2830

2931
<div ng-if="question.is_collection">

rdmo/projects/templates/projects/project_questions_form_group_file.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
</ul>
3434
</label>
3535
</div>
36+
37+
{% include 'projects/project_questions_value_errors.html' %}
3638
</div>
3739

3840
<div ng-if="question.is_collection">

rdmo/projects/templates/projects/project_questions_form_group_radio.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
</div>
4444
</div>
4545
</div>
46+
47+
{% include 'projects/project_questions_value_errors.html' %}
4648
</div>
4749

4850
<div ng-if="question.is_collection">

0 commit comments

Comments
 (0)