Skip to content

Commit

Permalink
Add domain import function and a few minor fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
triole committed Feb 28, 2018
1 parent 943d635 commit 3905edc
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 104 deletions.
170 changes: 80 additions & 90 deletions rdmo/domain/imports.py
Original file line number Diff line number Diff line change
@@ -1,129 +1,119 @@
from rdmo.core.utils import get_ns_tag
import logging

from rdmo.core.utils import get_ns_map, get_ns_tag
from rdmo.conditions.models import Condition
from rdmo.options.models import OptionSet

from .models import AttributeEntity, Attribute, Range, VerboseName


def import_domain(domain_node):
from .models import AttributeEntity, Attribute, VerboseName

nsmap = domain_node.nsmap
log = logging.getLogger(__name__)

for entity_node in domain_node.iterchildren():

def import_domain(domain_node):
nsmap = get_ns_map(domain_node.getroot())
log.info('Starting to parse domain node')
for entity_node in domain_node.iter():
if entity_node.tag == 'entity':
import_attribute_entity(entity_node, nsmap)
else:
elif entity_node.tag == 'attribute':
import_attribute(entity_node, nsmap)


def import_attribute_entity(entity_node, nsmap, parent=None):

uri = entity_node[get_ns_tag('dc:uri', nsmap)].text
uri = entity_node.find(get_ns_tag('dc:uri', nsmap)).text
log.info('Importing attribute_entity with uri "' + uri + '"...')

try:
entity = AttributeEntity.objects.get(uri=uri, parent=parent)
except AttributeEntity.DoesNotExist:
log.info('Attribute entity import: ' + str(AttributeEntity.DoesNotExist))
entity = AttributeEntity()

entity.parent = parent
entity.uri_prefix = uri.split('/domain/')[0]
entity.key = uri.split('/')[-1]
entity.comment = entity_node[get_ns_tag('dc:comment', nsmap)]
entity.is_collection = entity_node['is_collection'] == 'True'
entity.comment = entity_node.find(get_ns_tag('dc:comment', nsmap))
entity.is_collection = entity_node.find('is_collection') == 'True'
entity.save()

if hasattr(entity_node, 'verbosename'):
import_verbose_name(entity_node.verbosename, entity)
if entity_node.find('verbosename').text is not None:
import_verbose_name(entity_node.find('verbosename').text, entity)

if hasattr(entity_node, 'conditions'):
for condition_node in entity_node.conditions.iterchildren():
if entity_node.find('conditions') is not None:
for condition_node in entity_node.find('conditions').findall('condition'):
try:
condition_uri = condition_node.get(get_ns_tag('dc:uri', nsmap))
condition_uri = condition_node.find(get_ns_tag('dc:uri', nsmap))
condition = Condition.objects.get(uri=condition_uri)
entity.conditions.add(condition)
except Condition.DoesNotExist:
log.info('Condition import failed: ' + str(Condition.DoesNotExist))
pass

if hasattr(entity_node, 'children'):
for child_node in entity_node.children.iterchildren():
if child_node.tag == 'entity':
import_attribute_entity(child_node, nsmap, parent=entity)
else:
import_attribute(child_node, nsmap, parent=entity)
for child_node in entity_node.findall('children'):
if child_node.tag == 'entity':
import_attribute_entity(child_node, nsmap, parent=entity)
else:
import_attribute(child_node, nsmap, parent=entity)


def import_attribute(attribute_node, nsmap, parent=None):

uri = attribute_node[get_ns_tag('dc:uri', nsmap)].text

try:
attribute = Attribute.objects.get(uri=uri)
except Attribute.DoesNotExist:
attribute = Attribute()

attribute.parent = parent
attribute.uri_prefix = uri.split('/domain/')[0]
attribute.key = uri.split('/')[-1]
attribute.comment = attribute_node[get_ns_tag('dc:comment', nsmap)]
attribute.is_collection = attribute_node['is_collection'] == 'True'
attribute.value_type = attribute_node['value_type']
attribute.unit = attribute_node['unit']
attribute.save()

if hasattr(attribute_node, 'range'):
import_verbose_name(attribute_node.range, attribute)

if hasattr(attribute_node, 'verbosename'):
import_verbose_name(attribute_node.verbosename, attribute)

if hasattr(attribute_node, 'optionsets'):
for optionset_node in attribute_node.optionsets.iterchildren():
try:
optionset_uri = optionset_node.get(get_ns_tag('dc:uri', nsmap))
optionset = OptionSet.objects.get(uri=optionset_uri)
attribute.optionsets.add(optionset)
except OptionSet.DoesNotExist:
pass
uri = attribute_node.find(get_ns_tag('dc:uri', nsmap)).text
except Exception as e:
log.error(e)
else:
log.info('Importing attribute with uri "' + uri + '"...')

if hasattr(attribute_node, 'conditions'):
for condition_node in attribute_node.conditions.iterchildren():
try:
condition_uri = condition_node.get(get_ns_tag('dc:uri', nsmap))
condition = Condition.objects.get(uri=condition_uri)
attribute.conditions.add(condition)
except Condition.DoesNotExist:
pass


def import_verbose_name(verbosename_node, entity):
if verbosename_node is not None:
try:
try:
verbosename = VerboseName.objects.get(attribute_entity=entity)
except VerboseName.DoesNotExist:
verbosename = VerboseName(attribute_entity=entity)

for element in verbosename_node['name']:
setattr(verbosename, 'name_' + element.get('lang'), element.text)
for element in verbosename_node['name_plural']:
setattr(verbosename, 'name_plural_' + element.get('lang'), element.text)
verbosename.save()
except AttributeError:
pass
attribute = Attribute.objects.get(uri=uri)
except Attribute.DoesNotExist:
attribute = Attribute()

attribute.parent = parent
attribute.uri_prefix = uri.split('/domain/')[0]
attribute.key = uri.split('/')[-1]
attribute.comment = attribute_node.find(get_ns_tag('dc:comment', nsmap))
attribute.is_collection = attribute_node.find('is_collection') == 'True'
attribute.value_type = attribute_node.find('value_type')
attribute.unit = attribute_node.find('unit')
attribute.save()

if hasattr(attribute_node, 'range'):
import_verbose_name(attribute_node.range, attribute)

if hasattr(attribute_node, 'verbosename'):
import_verbose_name(attribute_node.verbosename, attribute)

if hasattr(attribute_node, 'optionsets'):
for optionset_node in attribute_node.optionsets.iterchildren():
try:
optionset_uri = optionset_node.get(get_ns_tag('dc:uri', nsmap))
optionset = OptionSet.objects.get(uri=optionset_uri)
attribute.optionsets.add(optionset)
except OptionSet.DoesNotExist:
pass

if hasattr(attribute_node, 'conditions'):
for condition_node in attribute_node.conditions.iterchildren():
try:
condition_uri = condition_node.get(get_ns_tag('dc:uri', nsmap))
condition = Condition.objects.get(uri=condition_uri)
attribute.conditions.add(condition)
except Condition.DoesNotExist:
pass


def import_range(range_node, attribute):
if range_node is not None:
def import_verbose_name(verbosename_node, entity):
try:
try:
try:
range = Range.objects.get(attribute=attribute)
except Range.DoesNotExist:
range = Range(attribute=attribute)

range.minimum = range_node['minimum']
range.maximum = range_node['maximum']
range.step = range_node['step']
range.save()
except AttributeError:
pass
verbosename = VerboseName.objects.get(attribute_entity=entity)
except VerboseName.DoesNotExist:
verbosename = VerboseName(attribute_entity=entity)
for element in verbosename_node.findall('name'):
setattr(verbosename, 'name_' + element.get('lang'), element.text)
for element in verbosename_node.findall('name_plural'):
setattr(verbosename, 'name_plural_' + element.get('lang'), element.text)
verbosename.save()
except Exception as e:
log.info('An exception occured: ' + str(e))
pass
12 changes: 12 additions & 0 deletions rdmo/domain/templates/domain/domain_upload.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{% extends 'core/page.html' %}
{% load i18n %}
{% load core_tags %}

{% block page %}

<form action="/domain/import/xml/" method="post" enctype="multipart/form-data">
{% csrf_token %} {% include 'core/bootstrap_form_fields.html' %}
<input type="submit" id="submit" value="Submit File" />
</form>

{% endblock %}
1 change: 0 additions & 1 deletion rdmo/domain/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
domain_patterns = [
url(r'^$', DomainView.as_view(), name='domain'),
url(r'^export/(?P<format>[a-z]+)/$', DomainExportView.as_view(), name='domain_export'),
# TODO: change link below when there is a real function to use
url(r'^import/(?P<format>[a-z]+)/$', DomainImportXMLView.as_view(), name='domain_import'),
]

Expand Down
15 changes: 4 additions & 11 deletions rdmo/domain/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class DomainImportXMLView(ObjectPermissionMixin, TemplateView):
permission_required = 'projects.export_project_object'
# form_class = ProjectForm
success_url = '/'
template_name = 'projects/project_upload.html'
template_name = 'domain/domain_upload.html'

def get(self, request, *args, **kwargs):
form = UploadFileForm()
Expand All @@ -84,9 +84,10 @@ def get(self, request, *args, **kwargs):
def post(self, request, *args, **kwargs):
# context = self.get_context_data(**kwargs)
tempfilename = handle_uploaded_file(request.FILES['uploaded_file'])
exit_code, xmltree = validate_xml(tempfilename, 'project')
# TODO: improve validation function
exit_code, xmltree = validate_xml(tempfilename, 'domain')
if exit_code == 0:
self.importProject(xmltree, request)
import_domain(xmltree)
return HttpResponseRedirect(self.success_url)
else:
log.info('Xml parsing error. Import failed.')
Expand All @@ -97,11 +98,3 @@ def form_valid(self, form, request, *args, **kwargs):
messages.success(request, 'File uploaded!')
# return super(ProjectImportXMLView, self).form_valid(form)
return

def importProject(self, xml_root, request):
try:
user = request.user
except User.DoesNotExist:
log.info('Unable to detect user name. Import failed.')
else:
import_domain(xml_root, user)
4 changes: 2 additions & 2 deletions rdmo/projects/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ def post(self, request, *args, **kwargs):
tempfilename = handle_uploaded_file(request.FILES['uploaded_file'])
exit_code, xmltree = validate_xml(tempfilename, 'project')
if exit_code == 0:
self.importProject(xmltree, request)
self.import_project(xmltree, request)
return HttpResponseRedirect(self.success_url)
else:
log.info('Xml parsing error. Import failed.')
Expand All @@ -132,7 +132,7 @@ def form_valid(self, form, request, *args, **kwargs):
# return super(ProjectImportXMLView, self).form_valid(form)
return

def importProject(self, xml_root, request):
def import_project(self, xml_root, request):
try:
user = request.user
except User.DoesNotExist:
Expand Down

0 comments on commit 3905edc

Please sign in to comment.