Skip to content

Commit

Permalink
Merge 1f089a2 into 8581b6d
Browse files Browse the repository at this point in the history
  • Loading branch information
MyPyDavid committed Apr 29, 2024
2 parents 8581b6d + 1f089a2 commit e0ceec7
Show file tree
Hide file tree
Showing 74 changed files with 3,059 additions and 2,009 deletions.
296 changes: 192 additions & 104 deletions package-lock.json

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@
"react-select": "^5.7.0",
"redux": "^4.1.1",
"redux-logger": "^3.0.6",
"redux-thunk": "^2.3.0"
"redux-thunk": "^2.3.0",
"react-diff-viewer-continued": "^3.3.1"
},
"devDependencies": {
"@babel/cli": "^7.23.4",
Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ dependencies = [
"pypandoc~=1.11",
"requests-toolbelt~=1.0",
"rules~=3.3",
"diff-match-patch==v20230430",
]

[project.optional-dependencies]
Expand Down
50 changes: 11 additions & 39 deletions rdmo/conditions/imports.py
Original file line number Diff line number Diff line change
@@ -1,42 +1,14 @@
import logging

from django.contrib.sites.models import Site

from rdmo.core.imports import check_permissions, set_common_fields, set_foreign_field, validate_instance

from ..core.import_helpers import ElementImportHelper, ExtraFieldDefaultHelper
from .models import Condition
from .validators import ConditionLockedValidator, ConditionUniqueURIValidator

logger = logging.getLogger(__name__)


def import_condition(element, save=False, user=None):
try:
condition = Condition.objects.get(uri=element.get('uri'))
except Condition.DoesNotExist:
condition = Condition()

set_common_fields(condition, element)

set_foreign_field(condition, 'source', element)
set_foreign_field(condition, 'target_option', element)

condition.relation = element.get('relation')
condition.target_text = element.get('target_text') or ''

validate_instance(condition, element, ConditionLockedValidator, ConditionUniqueURIValidator)

check_permissions(condition, element, user)

if save and not element.get('errors'):
if condition.id:
element['updated'] = True
logger.info('Condition %s updated.', element.get('uri'))
else:
element['created'] = True
logger.info('Condition created with uri %s.', element.get('uri'))

condition.save()
condition.editors.add(Site.objects.get_current())

return condition
import_helper_condition = ElementImportHelper(
model=Condition,
model_path="conditions.condition",
validators=(ConditionLockedValidator, ConditionUniqueURIValidator),
foreign_fields=('source', 'target_option'),
extra_fields=(
ExtraFieldDefaultHelper(field_name='relation', value=''),
ExtraFieldDefaultHelper(field_name='target_text', value=''),
),
)
20 changes: 20 additions & 0 deletions rdmo/core/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,23 @@
"tib": {"base": 1024, "power": 4},
"pib": {"base": 1024, "power": 5},
}

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

RDMO_MODELS = {
'catalog': 'questions.catalog',
'section': 'questions.section',
'page': 'questions.page',
'questionset': 'questions.questionset',
'question': 'questions.question',
'attribute': 'domain.attribute',
'optionset': 'options.optionset',
'option': 'options.option',
'condition': 'conditions.condition',
'task': 'tasks.task',
'view': 'views.view'
}
47 changes: 47 additions & 0 deletions rdmo/core/import_helpers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
from dataclasses import dataclass, field
from inspect import signature
from typing import Callable, Iterable, Optional, Sequence, Union

from django.db import models

from rdmo.core.constants import ELEMENT_COMMON_FIELDS


@dataclass(frozen=True)
class ThroughInstanceMapper:
field_name: str
source_name: str
target_name: str
through_name: str


@dataclass(frozen=True)
class ExtraFieldDefaultHelper:
field_name: str
value: Optional[Union[str, bool, int]] = None
callback: Optional[Callable] = None

def get_default(self, **kwargs):
if self.callback is None:
return self.value

sig = signature(self.callback)
_kwargs = {k:val for k,val in kwargs.items() if k in sig.parameters}
_value = self.callback(**_kwargs)
return _value


@dataclass(frozen=True)
class ElementImportHelper:
model: Optional[models.Model] = field(default=None)
model_path: Optional[str] = field(default=None)
validators: Iterable[Callable] = field(default_factory=list)
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[ExtraFieldDefaultHelper] = field(default_factory=list)
m2m_instance_fields: Sequence[str] = field(default_factory=list)
m2m_through_instance_fields: Sequence[ThroughInstanceMapper] = field(default_factory=list)
reverse_m2m_through_instance_fields: Sequence[ThroughInstanceMapper] = field(default_factory=list)
add_current_site_editors: bool = field(default=True)
add_current_site_sites: bool = field(default=False)
Loading

0 comments on commit e0ceec7

Please sign in to comment.