Skip to content

Commit

Permalink
Merge c34ea81 into 7bb043d
Browse files Browse the repository at this point in the history
  • Loading branch information
jochenklar committed Aug 24, 2020
2 parents 7bb043d + c34ea81 commit 513dd91
Show file tree
Hide file tree
Showing 160 changed files with 9,026 additions and 4,880 deletions.
1 change: 1 addition & 0 deletions rdmo/accounts/forms.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging

from django import forms
from django.conf import settings
from django.contrib.auth.models import User
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ <h2>{% trans "Verify your e-mail address" %}</h2>
{% url 'account_email' as email_url %}

<p>
{% blocktrans %}This part of the site requires us to verify that you are who you claim to be. For this purpose, we require that you verify ownership of your e-mail address. {% endblocktrans %}
{% blocktrans %}This part of the site requires us to verify that you are who you claim to be. For this purpose, we require that you verify ownership of your e-mail address.{% endblocktrans %}
</p>

<p>
Expand Down
57 changes: 18 additions & 39 deletions rdmo/conditions/imports.py
Original file line number Diff line number Diff line change
@@ -1,57 +1,36 @@
import logging

from django.core.exceptions import ValidationError

from rdmo.core.xml import flat_xml_to_elements, filter_elements_by_type
from rdmo.core.imports import (get_foreign_field, set_common_fields,
validate_instance)
from rdmo.domain.models import Attribute
from rdmo.options.models import Option

from .models import Condition
from .validators import ConditionUniqueKeyValidator

log = logging.getLogger(__name__)


def import_conditions(root):
elements = flat_xml_to_elements(root)
logger = logging.getLogger(__name__)

for element in filter_elements_by_type(elements, 'condition'):
import_condition(element)


def import_condition(element):
def import_condition(element, save=False):
try:
condition = Condition.objects.get(uri=element['uri'])
condition = Condition.objects.get(uri=element.get('uri'))
except Condition.DoesNotExist:
log.info('Condition not in db. Created with uri %s.', element['uri'])
condition = Condition()

condition.uri_prefix = element['uri_prefix'] or ''
condition.key = element['key'] or ''
condition.comment = element['comment'] or ''
set_common_fields(condition, element)

condition.source = None
if element['source']:
try:
condition.source = Attribute.objects.get(uri=element['source'])
except Attribute.DoesNotExist:
pass
condition.source = get_foreign_field(condition, element.get('source'), Attribute)
condition.target_option = get_foreign_field(condition, element.get('target_option'), Option)

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

condition.target_option = None
if element['target_option']:
try:
condition.target_option = Option.objects.get(uri=element['target_option'])
except Option.DoesNotExist:
pass
if save and validate_instance(condition):
if condition.id:
logger.info('Catalog created with uri %s.', element.get('uri'))
else:
logger.info('Catalog %s updated.', element.get('uri'))

try:
ConditionUniqueKeyValidator(condition).validate()
except ValidationError as e:
log.info('Condition not saving "%s" due to validation error (%s).', element['uri'], e)
pass
else:
log.info('Condition saving to "%s".', element['uri'])
condition.save()
condition.imported = True

return condition
24 changes: 24 additions & 0 deletions rdmo/conditions/migrations/0021_related_name.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Generated by Django 2.2.13 on 2020-08-24 11:47

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('conditions', '0020_require_uri_prefix'),
]

operations = [
migrations.AlterField(
model_name='condition',
name='source',
field=models.ForeignKey(blank=True, db_constraint=False, help_text='The attribute of the value for this condition.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='conditions', to='domain.Attribute', verbose_name='Source'),
),
migrations.AlterField(
model_name='condition',
name='target_option',
field=models.ForeignKey(blank=True, db_constraint=False, help_text='If using a value pointing to an option, the option this condition is checking against.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='conditions', to='options.Option', verbose_name='Target (Option)'),
),
]
13 changes: 10 additions & 3 deletions rdmo/conditions/models.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.db import models
from django.utils.translation import ugettext_lazy as _

from rdmo.core.utils import get_uri_prefix
from rdmo.core.utils import copy_model, get_uri_prefix
from rdmo.domain.models import Attribute

from .validators import ConditionUniqueKeyValidator
Expand Down Expand Up @@ -51,7 +51,7 @@ class Condition(models.Model):
help_text=_('Additional internal information about this condition.')
)
source = models.ForeignKey(
Attribute, db_constraint=False, blank=True, null=True, on_delete=models.SET_NULL, related_name='+',
Attribute, db_constraint=False, blank=True, null=True, on_delete=models.SET_NULL, related_name='conditions',
verbose_name=_('Source'),
help_text=_('The attribute of the value for this condition.')
)
Expand All @@ -66,7 +66,7 @@ class Condition(models.Model):
help_text=_('If using a regular value, the text value this condition is checking against (for boolean values use 1 and 0).')
)
target_option = models.ForeignKey(
'options.Option', db_constraint=False, blank=True, null=True, on_delete=models.SET_NULL, related_name='+',
'options.Option', db_constraint=False, blank=True, null=True, on_delete=models.SET_NULL, related_name='conditions',
verbose_name=_('Target (Option)'),
help_text=_('If using a value pointing to an option, the option this condition is checking against.')
)
Expand All @@ -82,6 +82,13 @@ def __str__(self):
def clean(self):
ConditionUniqueKeyValidator(self).validate()

def copy(self, uri_prefix, key):
condition = copy_model(self, uri_prefix=uri_prefix, key=key)
condition.source = self.source
condition.target_option = self.target_option

return condition

@property
def source_path(self):
return self.source.path
Expand Down
21 changes: 12 additions & 9 deletions rdmo/conditions/renderers.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,7 @@
from rdmo.core.renderers import BaseXMLRenderer


class XMLRenderer(BaseXMLRenderer):

def render_document(self, xml, conditions):
xml.startElement('rdmo', {
'xmlns:dc': 'http://purl.org/dc/elements/1.1/'
})
for condition in conditions:
self.render_condition(xml, condition)
xml.endElement('rdmo')
class ConditionsRenderer(BaseXMLRenderer):

def render_condition(self, xml, condition):
xml.startElement('condition', {'dc:uri': condition['uri']})
Expand All @@ -21,3 +13,14 @@ def render_condition(self, xml, condition):
self.render_text_element(xml, 'target_text', {}, condition['target_text'])
self.render_text_element(xml, 'target_option', {'dc:uri': condition['target_option']}, None)
xml.endElement('condition')


class ConditionRenderer(ConditionsRenderer):

def render_document(self, xml, conditions):
xml.startElement('rdmo', {
'xmlns:dc': 'http://purl.org/dc/elements/1.1/'
})
for condition in conditions:
self.render_condition(xml, condition)
xml.endElement('rdmo')
2 changes: 1 addition & 1 deletion rdmo/conditions/serializers/export.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from ..models import Condition


class ConditionSerializer(serializers.ModelSerializer):
class ConditionExportSerializer(serializers.ModelSerializer):

source = serializers.CharField(source='source.uri', default=None, read_only=True)
target_option = serializers.CharField(source='target_option.uri', default=None, read_only=True)
Expand Down
66 changes: 62 additions & 4 deletions rdmo/conditions/serializers/v1.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,64 @@
from rest_framework import serializers
from rest_framework.reverse import reverse

from rdmo.domain.models import Attribute
from rdmo.options.models import Option
from rdmo.options.models import OptionSet
from rdmo.questions.models import Question, QuestionSet
from rdmo.tasks.models import Task

from ..models import Condition
from ..validators import ConditionUniqueKeyValidator


class OptionSetSerializer(serializers.ModelSerializer):

class Meta:
model = OptionSet
fields = (
'id',
'key',
)


class QuestionSetSerializer(serializers.ModelSerializer):

class Meta:
model = QuestionSet
fields = (
'id',
'path',
)


class QuestionSerializer(serializers.ModelSerializer):

class Meta:
model = Question
fields = (
'id',
'path',
)


class TaskSerializer(serializers.ModelSerializer):

class Meta:
model = Task
fields = (
'id',
'key',
)


class ConditionSerializer(serializers.ModelSerializer):

key = serializers.CharField(required=True)
source = serializers.PrimaryKeyRelatedField(queryset=Attribute.objects.all(), required=True)

optionsets = OptionSetSerializer(many=True, read_only=True)
questionsets = QuestionSetSerializer(many=True, read_only=True)
questions = QuestionSerializer(many=True, read_only=True)
tasks = TaskSerializer(many=True, read_only=True)

class Meta:
model = Condition
fields = (
Expand All @@ -22,7 +69,11 @@ class Meta:
'source',
'relation',
'target_text',
'target_option'
'target_option',
'optionsets',
'questionsets',
'questions',
'tasks'
)
validators = (ConditionUniqueKeyValidator(), )

Expand All @@ -31,16 +82,23 @@ class ConditionIndexSerializer(serializers.ModelSerializer):

target_option_path = serializers.CharField(source='target_option.path', default=None, read_only=True)
target_option_text = serializers.CharField(source='target_option.text', default=None, read_only=True)
xml_url = serializers.SerializerMethodField()

class Meta:
model = Condition
fields = (
'id',
'uri_prefix',
'uri',
'key',
'comment',
'source_path',
'relation_label',
'target_text',
'target_option_path',
'target_option_text'
'target_option_text',
'xml_url'
)

def get_xml_url(self, obj):
return reverse('v1-conditions:condition-detail-export', args=[obj.pk])
51 changes: 26 additions & 25 deletions rdmo/conditions/static/conditions/js/conditions.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
angular.module('conditions', ['core'])

.factory('ConditionsService', ['$resource', '$timeout', '$window', '$q', '$filter', function($resource, $timeout, $window, $q, $filter) {
.factory('ConditionsService', ['$resource', '$timeout', '$window', '$q', '$filter', 'utils', function($resource, $timeout, $window, $q, $filter, utils) {

/* get the base url */

Expand All @@ -9,7 +9,7 @@ angular.module('conditions', ['core'])
/* configure resources */

var resources = {
conditions: $resource(baseurl + 'api/v1/conditions/conditions/:list_action/:id/'),
conditions: $resource(baseurl + 'api/v1/conditions/conditions/:list_action/:id/:detail_action/'),
relations: $resource(baseurl + 'api/v1/conditions/relations/:id/'),
attributes: $resource(baseurl + 'api/v1/domain/attributes/:id/'),
options: $resource(baseurl + 'api/v1/options/options/:id/'),
Expand Down Expand Up @@ -38,6 +38,8 @@ angular.module('conditions', ['core'])
service.options = resources.options.query();
service.relations = resources.relations.query();
service.settings = resources.settings.get();
service.uri_prefixes = []
service.uri_prefix = ''

service.initView().then(function () {
var current_scroll_pos = sessionStorage.getItem('current_scroll_pos');
Expand All @@ -56,18 +58,18 @@ angular.module('conditions', ['core'])
service.initView = function(options) {
return resources.conditions.query({list_action: 'index'}, function(response) {
service.conditions = response;
service.uri_prefixes = response.reduce(function(list, item) {
if (list.indexOf(item.uri_prefix) < 0) {
list.push(item.uri_prefix)
}
return list
}, [])
}).$promise;
};

service.openFormModal = function(resource, obj, create) {
service.openFormModal = function(resource, obj, create, copy) {
service.errors = {};
service.values = {};

if (angular.isDefined(create) && create) {
service.values = factories[resource](obj);
} else {
service.values = resources[resource].get({id: obj.id});
}
service.values = utils.fetchValues(resources[resource], factories[resource], obj, create, copy);

$q.when(service.values.$promise).then(function() {
$('#' + resource + '-form-modal').modal('show');
Expand All @@ -76,7 +78,7 @@ angular.module('conditions', ['core'])
};

service.submitFormModal = function(resource) {
service.storeValues(resource).then(function() {
utils.storeValues(resources[resource], service.values).then(function() {
$('#' + resource + '-form-modal').modal('hide');
service.initView();
}, function(result) {
Expand All @@ -96,21 +98,20 @@ angular.module('conditions', ['core'])
});
};

service.storeValues = function(resource, values) {
if (angular.isUndefined(values)) {
values = service.values;
}
service.openShowModal = function(resource, obj) {
service.values = utils.fetchValues(resources[resource], factories[resource], obj)

if (angular.isDefined(values.removed) && values.removed) {
if (angular.isDefined(values.id)) {
return resources[resource].delete({id: values.id}).$promise;
}
} else {
if (angular.isDefined(values.id)) {
return resources[resource].update({id: values.id}, values).$promise;
} else {
return resources[resource].save(values).$promise;
}
$q.when(service.values.$promise).then(function() {
$('#' + resource + '-show-modal').modal('show');
});
};

service.hideCondition = function(item) {
if (service.filter && item.key.indexOf(service.filter) < 0) {
return true;
}
if (service.uri_prefix && item.uri_prefix != service.uri_prefix) {
return true;
}
};

Expand Down

0 comments on commit 513dd91

Please sign in to comment.