Skip to content

Commit

Permalink
RDISCROWD-7779 - add duplicate field settings (#1033)
Browse files Browse the repository at this point in the history
* add option to enable/disable check
* Update github-actions.yml
   * remove coverage for now. "--no-fail" option is not working.
  • Loading branch information
peterkle authored Feb 13, 2025
1 parent a59dc2b commit 61420e6
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 11 deletions.
6 changes: 0 additions & 6 deletions .github/workflows/github-actions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,3 @@ jobs:
echo "::remove-matcher owner=python::"
./run_tests
- name: Run code coverage
run: |
python -m pip install coveralls
coveralls --service=github
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
8 changes: 7 additions & 1 deletion pybossa/forms/fields/select_two.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,10 @@ class Select2Field(SelectMultipleField):
type. The rendering logic must be handled in the client code which includes
adding the select2 source files.
'''
pass

def pre_validate(self, form):
if self.validate_choice and self.data:
values = list(c[0] for c in self.choices)
for d in self.data:
if d not in values:
raise ValueError(self.gettext("'%(value)s' is not a valid choice for this field") % dict(value=d))
6 changes: 6 additions & 0 deletions pybossa/forms/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,9 @@ class ProjectUpdateForm(ProjectForm):
private_instance = data_access.data_access_levels.get("valid_access_levels", []) == ["L1", "L2", "L3", "L4"]
if not private_instance:
allow_taskrun_edit = BooleanField(lazy_gettext('Allow Editing of Task Submissions'))
duplicate_task_check_duplicate_fields = Select2Field(lazy_gettext('Task.info field names to be included in duplication check'), choices=[], validate_choice=False)
duplicate_task_check_completed_tasks = BooleanField(lazy_gettext('Include completed tasks in task duplication check'))
enable_duplicate_task_check = BooleanField(lazy_gettext('Enable task duplication check'))
zip_download = BooleanField(lazy_gettext('Allow ZIP data download'))
category_id = SelectField(lazy_gettext('Category'), coerce=int)
hidden = BooleanField(lazy_gettext('Hide?'))
Expand All @@ -164,6 +167,9 @@ class ProjectUpdateForm(ProjectForm):
[pb_validator.Webhook()])
sync_enabled = BooleanField(lazy_gettext('Enable Project Syncing'))

def set_duplicate_task_check_duplicate_fields_options(self, options):
self.duplicate_task_check_duplicate_fields.choices = options

class AnnotationForm(Form):
dataset_description = TextAreaField(lazy_gettext('Dataset Description'))
provider = create_nullable_select(
Expand Down
13 changes: 12 additions & 1 deletion pybossa/view/projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -810,7 +810,6 @@ def delete(short_name):
@blueprint.route('/<short_name>/update', methods=['GET', 'POST'])
@login_required
def update(short_name):

sync_enabled = current_app.config.get('SYNC_ENABLED')
project, owner, ps = project_by_shortname(short_name)

Expand Down Expand Up @@ -847,6 +846,13 @@ def handle_valid_form(form):
'input_data': form.input_data_class.data,
'output_data': form.output_data_class.data
}
if form.enable_duplicate_task_check.data:
new_project.info['duplicate_task_check'] = {
'duplicate_fields': form.duplicate_task_check_duplicate_fields.data,
'completed_tasks': form.duplicate_task_check_completed_tasks.data
}
else:
new_project.info.pop('duplicate_task_check', None)
if "allow_taskrun_edit" in form:
new_project.info["allow_taskrun_edit"] = form.allow_taskrun_edit.data

Expand Down Expand Up @@ -880,6 +886,10 @@ def handle_valid_form(form):
project.input_data_class = project.info.get('data_classification', {}).get('input_data')
project.output_data_class = project.info.get('data_classification', {}).get('output_data')
project.allow_taskrun_edit = project.info.get("allow_taskrun_edit", False)
duplicate_task_check_duplicate_fields = project.info.get("duplicate_task_check", {}).get("duplicate_fields", [])
project.duplicate_task_check_duplicate_fields = duplicate_task_check_duplicate_fields
project.duplicate_task_check_completed_tasks = project.info.get("duplicate_task_check", {}).get("completed_tasks", False)
project.enable_duplicate_task_check = True if project.info.get("duplicate_task_check") else False
ensure_amp_config_applied_to_project(project, project.info.get('annotation_config', {}))
form = dynamic_project_form(ProjectUpdateForm, None, data_access_levels, obj=project,
products=prodsubprods, data_classes=data_classes)
Expand All @@ -891,6 +901,7 @@ def handle_valid_form(form):
if project.category_id is None:
project.category_id = categories[0].id
form.populate_obj(project)
form.set_duplicate_task_check_duplicate_fields_options([(field, field) for field in duplicate_task_check_duplicate_fields])


if request.method == 'POST':
Expand Down
27 changes: 24 additions & 3 deletions test/test_view/test_project_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,19 @@
import json
from unittest.mock import patch

from test import with_context
from test import db, with_context
from test.factories import ProjectFactory
from test.helper import web
from pybossa import data_access
from pybossa.repositories import ProjectRepository


class TestProjectSettings(web.Helper):

def setUp(self):
super(TestProjectSettings, self).setUp()
self.project_repo = ProjectRepository(db)

@staticmethod
def patched_levels(**kwargs):
patch_data_access_levels = dict(
Expand All @@ -22,10 +27,10 @@ def patched_levels(**kwargs):
)
patch_data_access_levels.update(kwargs)
return patch_data_access_levels

@with_context
def test_project_update_amp_store(self):
with patch.dict(data_access.data_access_levels, self.patched_levels()):
with patch.dict(data_access.data_access_levels, self.patched_levels()):
project = ProjectFactory.create(
published=True,
info={
Expand All @@ -39,3 +44,19 @@ def test_project_update_amp_store(self):
res = self.app_get_json(url)
data = json.loads(res.data)
assert data['form']['amp_store'], 'opt-in amp store should be checked'

@with_context
def test_project_get_request_update_duplicate_tasks_setting(self):
project = ProjectFactory.create(
published=True,
info={
'duplicate_task_check': {
'duplicate_fields': ["company_name", "company_website"],
'completed_tasks': True
}
})
url = f'/project/{project.short_name}/update?api_key={project.owner.api_key}'
res = self.app_get_json(url)
data = json.loads(res.data)
assert data['form']['duplicate_task_check_completed_tasks'] == True, data['form']
assert data['form']['duplicate_task_check_duplicate_fields'] == ['company_name', 'company_website'], data['form']

0 comments on commit 61420e6

Please sign in to comment.