Skip to content

Commit

Permalink
Add first version of view import
Browse files Browse the repository at this point in the history
  • Loading branch information
triole committed Mar 21, 2018
1 parent eba712a commit 0888deb
Show file tree
Hide file tree
Showing 9 changed files with 138 additions and 41 deletions.
19 changes: 11 additions & 8 deletions rdmo/core/management/commands/import.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import io
import logging

from lxml import objectify
# from lxml import objectify

from django.contrib.auth.models import User
from django.core.management.base import BaseCommand, CommandError
Expand All @@ -10,9 +10,9 @@
from rdmo.conditions.imports import import_conditions
from rdmo.options.imports import import_options
from rdmo.domain.imports import import_domain
from rdmo.questions.utils import import_catalog
# from rdmo.questions.utils import import_catalog
from rdmo.tasks.imports import import_tasks
from rdmo.views.utils import import_views
from rdmo.views.imports import import_views
from rdmo.projects.imports import import_project

log = logging.getLogger(__name__)
Expand All @@ -30,17 +30,17 @@ def handle(self, *args, **options):
roottag, xmltree = validate_xml(f)

if roottag == 'conditions':
print('\nImporting conditions...')
print('Importing conditions...')
import_conditions(xmltree)
print('Done.\n')

elif roottag == 'options':
print('\nImporting options...')
print('Importing options...')
import_options(xmltree)
print('Done.\n')

elif roottag == 'domain':
print('\nImporting domain...')
print('Importing domain...')
import_domain(xmltree)
print('Done.\n')

Expand All @@ -49,6 +49,11 @@ def handle(self, *args, **options):
import_tasks(xmltree)
print('Done.\n')

elif roottag == 'views':
print('Importing views...')
import_views(xmltree)
print('Done.\n')

elif roottag == 'project':
print('Importing project...')
try:
Expand All @@ -62,5 +67,3 @@ def handle(self, *args, **options):
# xml_root = objectify.parse(f).getroot()
# if xml_root.tag == 'catalog':
# import_catalog(xml_root)
# elif xml_root.tag == 'views':
# import_views(xml_root)
2 changes: 1 addition & 1 deletion rdmo/tasks/imports.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@


def import_tasks(tasks_node):
log.info("Importing conditions")
log.info('Importing conditions')
nsmap = get_ns_map(tasks_node.getroot())

for task_node in tasks_node.findall('task'):
Expand Down
7 changes: 7 additions & 0 deletions rdmo/views/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django import forms


class UploadFileForm(forms.Form):
uploaded_file = forms.FileField(
label='Select a file',
)
34 changes: 34 additions & 0 deletions rdmo/views/imports.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import logging

from rdmo.core.utils import get_ns_map, get_ns_tag

from .models import View

log = logging.getLogger(__name__)


def import_views(views_node):
log.info('Importing views')
nsmap = get_ns_map(views_node.getroot())

for view_node in views_node.findall('view'):
view_uri = view_node.find(get_ns_tag('dc:uri', nsmap)).text

try:
view = View.objects.get(uri=view_uri)
except View.DoesNotExist:
view = View()
log.info('View not in db. Created with uri ' + view_uri)
else:
log.info('View does exist. Loaded from uri ' + view_uri)

view.uri_prefix = view_uri.split('/views/')[0]
view.key = view_uri.split('/')[-1]

for element in view_node.findall('title'):
setattr(view, 'title_' + element.attrib['lang'], element.text)
for element in view_node.findall('help'):
setattr(view, 'help_' + element.attrib['lang'], element.text)

view.template = view_node.find('template').text
view.save()
12 changes: 12 additions & 0 deletions rdmo/views/templates/views/file_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="/views/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 %}
10 changes: 10 additions & 0 deletions rdmo/views/templates/views/views.html
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,16 @@ <h2>{% trans 'Export' %}</h2>
</li>
</ul>

<h2>{% trans 'Import' %}</h2>

<ul class="list-unstyled">
<li >
<a href="{% url 'views_import' 'xml' %}" target="_blank">
{% trans 'XML' %}
</a>
</li>
</ul>

{% endblock %}

{% block page %}
Expand Down
3 changes: 2 additions & 1 deletion rdmo/views/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@

from rest_framework import routers

from .views import ViewsView, ViewsExportView
from .views import ViewsView, ViewsExportView, ViewsImportXMLView
from .viewsets import ViewViewSet, ViewApiViewSet

# regular views

views_patterns = [
url(r'^$', ViewsView.as_view(), name='views'),
url(r'^export/(?P<format>[a-z]+)/$', ViewsExportView.as_view(), name='views_export'),
url(r'^import/(?P<format>[a-z]+)/$', ViewsImportXMLView.as_view(), name='views_import'),
]

# internal AJAX API
Expand Down
60 changes: 30 additions & 30 deletions rdmo/views/utils.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
from lxml import etree

from rdmo.core.utils import get_ns_tag
from rdmo.domain.models import AttributeEntity

from .models import View


def import_views(views_node):

nsmap = views_node.nsmap

for view_node in views_node.iterchildren():
view_uri = view_node[get_ns_tag('dc:uri', nsmap)].text

try:
view = View.objects.get(uri=view_uri)
except View.DoesNotExist:
view = View()

view.uri_prefix = view_uri.split('/views/')[0]
view.key = view_uri.split('/')[-1]

for element in view_node['title']:
setattr(view, 'title_' + element.get('lang'), element.text)
for element in view_node['help']:
setattr(view, 'help_' + element.get('lang'), element.text)

view.template = view_node['template'].text
view.save()
# from lxml import etree
#
# from rdmo.core.utils import get_ns_tag
# from rdmo.domain.models import AttributeEntity
#
# from .models import View
#
#
# def import_views(views_node):
#
# nsmap = views_node.nsmap
#
# for view_node in views_node.iterchildren():
# view_uri = view_node[get_ns_tag('dc:uri', nsmap)].text
#
# try:
# view = View.objects.get(uri=view_uri)
# except View.DoesNotExist:
# view = View()
#
# view.uri_prefix = view_uri.split('/views/')[0]
# view.key = view_uri.split('/')[-1]
#
# for element in view_node['title']:
# setattr(view, 'title_' + element.get('lang'), element.text)
# for element in view_node['help']:
# setattr(view, 'help_' + element.get('lang'), element.text)
#
# view.template = view_node['template'].text
# view.save()
32 changes: 31 additions & 1 deletion rdmo/views/views.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
import logging

from django.conf import settings
from django.http import HttpResponse
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.utils.translation import ugettext_lazy as _
from django.views.generic import TemplateView, ListView

from rdmo.core.imports import handle_uploaded_file, validate_xml
from rdmo.core.views import ModelPermissionMixin
from rdmo.core.utils import get_model_field_meta, render_to_format

from .forms import UploadFileForm
from .imports import import_views
from .models import View
from .serializers.export import ViewSerializer as ExportSerializer
from .renderers import XMLRenderer

log = logging.getLogger(__name__)


class ViewsView(ModelPermissionMixin, TemplateView):
template_name = 'views/views.html'
Expand Down Expand Up @@ -38,3 +46,25 @@ def render_to_response(self, context, **response_kwargs):
return response
else:
return render_to_format(self.request, format, _('Views'), 'views/views_export.html', context)


class ViewsImportXMLView(ModelPermissionMixin, ListView):
permission_required = 'projects.export_project_object'
success_url = '/views'
template_name = 'views/file_upload.html'

def get(self, request, *args, **kwargs):
form = UploadFileForm()
return render(request, self.template_name, {'form': form})

def post(self, request, *args, **kwargs):
# context = self.get_context_data(**kwargs)
tempfilename = handle_uploaded_file(request.FILES['uploaded_file'])
# TODO: improve validation function
roottag, xmltree = validate_xml(tempfilename)
if roottag == 'views':
import_views(xmltree)
return HttpResponseRedirect(self.success_url)
else:
log.info('Xml parsing error. Import failed.')
return HttpResponse('Xml parsing error. Import failed.')

0 comments on commit 0888deb

Please sign in to comment.