Skip to content

Commit

Permalink
refactor: move extra fields setter to management import
Browse files Browse the repository at this point in the history
  • Loading branch information
MyPyDavid committed Jan 24, 2024
1 parent 5e4ec2b commit 8c47d9f
Show file tree
Hide file tree
Showing 9 changed files with 82 additions and 97 deletions.
8 changes: 3 additions & 5 deletions rdmo/conditions/imports.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,7 @@ def import_condition(

# set_foreign_field are already set in management/import.py
# check_permissions already done in management/import.py
instance.relation = element.get('relation') or ''
instance.target_text = element.get('target_text') or ''

# extra_fields are set in in management/import.py
validate_instance(instance, element, *validators)

if element.get('errors'):
Expand All @@ -41,7 +39,7 @@ def import_condition(
model="conditions.condition",
import_func=import_condition,
validators=(ConditionLockedValidator, ConditionUniqueURIValidator),
lang_fields=[],
foreign_fields=('source', 'target_option'),
serializer=ConditionSerializer
serializer=ConditionSerializer,
extra_fields=('relation', 'target_text')
)
23 changes: 23 additions & 0 deletions rdmo/core/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,26 @@
"tib": {"base": 1024, "power": 4},
"pib": {"base": 1024, "power": 5},
}

ELEMENT_COMMON_FIELDS = (
'uri_prefix',
'uri_path',
'key',
'comment',
)

ELEMENT_IMPORT_EXTRA_FIELDS_DEFAULTS = {
'order': 0,
'available': True,
'template': '',
'relation': '',
'target_text': '',
'provider_key': '',
'additional_input': '',
'is_collection': False,
'is_optional': False,
'default_external_id': '',
'value_type': '',
'unit': '',
'widget_type': 'text',
}
26 changes: 16 additions & 10 deletions rdmo/core/imports.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,19 @@
from os.path import join as pj
from pathlib import Path
from random import randint
from typing import Any, Callable, Iterable, Optional, Sequence, Tuple
from typing import Callable, Iterable, Optional, Sequence, Tuple

from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db import models

from rest_framework.utils import model_meta

from rdmo.core.constants import ELEMENT_COMMON_FIELDS, ELEMENT_IMPORT_EXTRA_FIELDS_DEFAULTS
from rdmo.core.utils import get_languages

logger = logging.getLogger(__name__)


ELEMENT_COMMON_FIELDS = (
'uri_prefix',
'uri_path',
'key',
'comment',
)


def handle_uploaded_file(filedata):
tempfilename = generate_tempfile_name()
with open(tempfilename, 'wb+') as destination:
Expand Down Expand Up @@ -76,7 +69,7 @@ class ElementImportHelper:
common_fields: Sequence[str] = field(default=ELEMENT_COMMON_FIELDS)
lang_fields: Sequence[str] = field(default_factory=list)
foreign_fields: Sequence[str] = field(default_factory=list)
extra_fields: Sequence[Tuple[str, Any]] = field(default_factory=list)
extra_fields: Sequence[str] = field(default_factory=list)
add_current_site_editors: bool = True
add_current_site_sites: bool = False

Expand Down Expand Up @@ -141,6 +134,19 @@ def set_foreign_field(instance, field_name, element, uploaded_uris=None) -> None
logger.info(message)
element['warnings'][foreign_uri].append(message)

def set_extra_field(instance, field_name, element, questions_widget_types=None) -> None:

element_value = element.get(field_name)
default_value = ELEMENT_IMPORT_EXTRA_FIELDS_DEFAULTS.get(field_name)
extra_value = element_value or default_value
if field_name == 'widget_type':
if element_value in questions_widget_types:
extra_value = element_value
else:
extra_value = default_value

setattr(instance, field_name, extra_value)


def set_m2m_instances(instance, field_name, element):
if field_name not in element:
Expand Down
2 changes: 0 additions & 2 deletions rdmo/domain/imports.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ def import_attribute(
# set_foreign_field are already set in management/import.py
# check_permissions already done in management/import.py
instance.path = instance.build_path(instance.key, instance.parent)

validate_instance(instance, element, *validators)

if element.get('errors'):
Expand All @@ -40,5 +39,4 @@ def import_attribute(
validators=(AttributeLockedValidator, AttributeParentValidator, AttributeUniqueURIValidator),
foreign_fields=('parent',),
serializer=BaseAttributeSerializer,

)
18 changes: 14 additions & 4 deletions rdmo/management/imports.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
check_permissions,
get_or_return_instance,
make_import_info_msg,
set_extra_field,
set_foreign_field,
set_lang_field,
)
Expand All @@ -23,6 +24,7 @@
import_helper_questionset,
import_helper_section,
)
from rdmo.questions.utils import get_widget_types
from rdmo.tasks.imports import import_helper_task
from rdmo.views.imports import import_helper_view

Expand Down Expand Up @@ -58,9 +60,11 @@ def import_elements(uploaded_elements: List[Dict], save: bool = True, request: O
imported_elements = []
uploaded_uris = {i.get('uri') for i in uploaded_elements}
current_site = get_current_site(request)
questions_widget_types = get_widget_types()
for uploaded_element in uploaded_elements:
element = import_element(element=uploaded_element, save=save, uploaded_uris=imported_elements,
request=request, current_site=current_site)
request=request, current_site=current_site,
questions_widget_types=questions_widget_types)
element['warnings'] = [val for k, val in element['warnings'].items() if k not in uploaded_uris]
imported_elements.append(element)
return imported_elements
Expand All @@ -72,7 +76,8 @@ def import_element(
save: bool = True,
request: Optional[HttpRequest] = None,
uploaded_uris: Optional[Sequence[str]] = None,
current_site = None
current_site = None,
questions_widget_types = None
) -> Dict:

if element is None:
Expand All @@ -92,8 +97,10 @@ def import_element(
import_func = import_helper.import_func
validators = import_helper.validators
common_fields = import_helper.common_fields
lang_field_names = import_helper.lang_fields if import_helper.lang_fields is not None else []
foreign_field_names = import_helper.foreign_fields if import_helper.foreign_fields is not None else []
lang_field_names = import_helper.lang_fields
foreign_field_names = import_helper.foreign_fields
extra_field_names = import_helper.extra_fields

uri = element.get('uri')

# get or create instance from uri and model_path
Expand Down Expand Up @@ -127,6 +134,9 @@ def import_element(
# set foreign fields
for foreign_field in foreign_field_names:
set_foreign_field(instance, foreign_field, element, uploaded_uris=uploaded_uris)
# set extra fields
for extra_field in extra_field_names:
set_extra_field(instance, extra_field, element, questions_widget_types=questions_widget_types)

# call the element specific import method
instance = import_func(instance, element, validators, save)
Expand Down
21 changes: 6 additions & 15 deletions rdmo/options/imports.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import logging
from typing import Callable, Tuple

from django.db import models

from rdmo.core.imports import (
ElementImportHelper,
set_m2m_instances,
Expand All @@ -28,13 +26,9 @@ def import_option(
element: dict,
validators: Tuple[Callable],
save: bool = False,
user: models.Model = None
):
# check_permissions already done in management/import.py
instance.order = element.get('order') or 0
instance.provider_key = element.get('provider_key') or ''
instance.additional_input = element.get('additional_input') or ""

# extra_fields are set in in management/import.py
validate_instance(instance, element, *validators)

if element.get('errors'):
Expand All @@ -54,7 +48,8 @@ def import_option(
import_func=import_option,
validators=(OptionLockedValidator, OptionUniqueURIValidator),
lang_fields=('text',),
serializer = OptionSerializer
serializer = OptionSerializer,
extra_fields = ('order', 'provider_key', 'additional_input')
)


Expand All @@ -63,14 +58,10 @@ def import_optionset(
element: dict,
validators: Tuple[Callable],
save: bool = False,
user: models.Model = None
):

# lang_fields are already set in management/import.py
# check_permissions already done in management/import.py

instance.additional_input = element.get('additional_input') or ""

# extra_fields are set in in management/import.py
validate_instance(instance, element, *validators)

if element.get('errors'):
Expand All @@ -88,6 +79,6 @@ def import_optionset(
model="options.optionset",
import_func=import_optionset,
validators=(OptionSetLockedValidator, OptionSetUniqueURIValidator),
lang_fields=[],
serializer = OptionSetSerializer
serializer = OptionSetSerializer,
extra_fields=('additional_input',)
)
54 changes: 13 additions & 41 deletions rdmo/questions/imports.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import logging
from typing import Callable, Tuple

from django.db import models

from rdmo.core.imports import (
ElementImportHelper,
set_m2m_instances,
Expand All @@ -23,7 +21,6 @@
QuestionSetSerializer,
SectionSerializer,
)
from .utils import get_widget_types
from .validators import (
CatalogLockedValidator,
CatalogUniqueURIValidator,
Expand All @@ -45,13 +42,9 @@ def import_catalog(
element: dict,
validators: Tuple[Callable],
save: bool = False,
user: models.Model = None
):
# check_permissions already done in management/import.py
instance.order = element.get('order') or 0

instance.available = element.get('available', True)

# extra_fields are set in management/import.py
validate_instance(instance, element, *validators)

if element.get('errors'):
Expand All @@ -70,7 +63,6 @@ def import_section(
element: dict,
validators: Tuple[Callable],
save: bool = False,
user: models.Model = None
):
# check_permissions already done in management/import.py
validate_instance(instance, element, *validators)
Expand All @@ -92,14 +84,11 @@ def import_page(
element: dict,
validators: Tuple[Callable],
save: bool = False,
user: models.Model = None
):
# lang_fields are already set in management/import.py
# set_foreign_field are already set in management/import.py
# check_permissions already done in management/import.py

instance.is_collection = element.get('is_collection') or False

# extra_fields are set in management/import.py
validate_instance(instance, element, *validators)

if element.get('errors'):
Expand All @@ -121,14 +110,11 @@ def import_questionset(
element: dict,
validators: Tuple[Callable],
save: bool = False,
user: models.Model = None
):
# lang_fields are already set in management/import.py
# set_foreign_field are already set in management/import.py
# check_permissions already done in management/import.py

instance.is_collection = element.get('is_collection') or False

# extra_fields are set in management/import.py
validate_instance(instance, element, *validators)

if element.get('errors'):
Expand All @@ -151,31 +137,12 @@ def import_question(
element: dict,
validators: Tuple[Callable],
save: bool = False,
user: models.Model = None
):
# lang_fields are already set in management/import.py
# set_foreign_fields are already set in management/import.py
# check_permissions already done in management/import.py

instance.is_collection = element.get('is_collection') or False
instance.is_optional = element.get('is_optional') or False

instance.default_external_id = element.get('default_external_id') or ''

if element.get('widget_type') in get_widget_types():
instance.widget_type = element.get('widget_type')
else:
instance.widget_type = 'text'

instance.value_type = element.get('value_type') or ''
instance.maximum = element.get('maximum')
instance.minimum = element.get('minimum')
instance.step = element.get('step')
instance.unit = element.get('unit') or ''
instance.width = element.get('width')

# extra_fields are set in management/import.py
validate_instance(instance, element, *validators)

if element.get('errors'):
return instance

Expand All @@ -196,7 +163,8 @@ def import_question(
validators=(CatalogLockedValidator, CatalogUniqueURIValidator),
lang_fields=('help', 'title'),
serializer = CatalogSerializer,
add_current_site_sites = True
add_current_site_sites = True,
extra_fields = ('order', 'available')
)

import_helper_section = ElementImportHelper(
Expand All @@ -213,7 +181,8 @@ def import_question(
validators=(PageLockedValidator, PageUniqueURIValidator),
lang_fields=('help', 'title', 'verbose_name'),
foreign_fields=('attribute',),
serializer = PageSerializer
serializer = PageSerializer,
extra_fields = ('is_collection',)
)

import_helper_questionset = ElementImportHelper(
Expand All @@ -222,7 +191,8 @@ def import_question(
validators=(QuestionSetLockedValidator, QuestionSetUniqueURIValidator),
lang_fields=('help', 'title', 'verbose_name'),
foreign_fields=('attribute',),
serializer = QuestionSetSerializer
serializer = QuestionSetSerializer,
extra_fields = ('is_collection',)
)

import_helper_question = ElementImportHelper(
Expand All @@ -231,5 +201,7 @@ def import_question(
validators=(QuestionLockedValidator, QuestionUniqueURIValidator),
lang_fields=('text', 'help', 'default_text', 'verbose_name'),
foreign_fields=('attribute','default_option'),
serializer = QuestionSerializer
serializer = QuestionSerializer,
extra_fields = ('is_collection','is_optional', 'default_external_id', 'widget_type',
'value_type', 'maximum', 'minimum', 'step', 'unit','width')
)
Loading

0 comments on commit 8c47d9f

Please sign in to comment.