Skip to content

Commit

Permalink
Refactor tempfile handling improved to avoid duplications
Browse files Browse the repository at this point in the history
  • Loading branch information
triole committed Feb 27, 2018
1 parent 56ef0b3 commit 3646b42
Showing 1 changed file with 12 additions and 35 deletions.
47 changes: 12 additions & 35 deletions rdmo/projects/views.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
import logging
import defusedxml.ElementTree as ET

from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse, reverse_lazy
from django.db import models
from django.http import HttpResponse
from django.http import HttpResponseRedirect, Http404
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import get_object_or_404, render
from django.template import TemplateSyntaxError
from django.views.generic import ListView, TemplateView
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.contrib import messages

from rdmo.core.views import ObjectPermissionMixin, RedirectViewMixin
from rdmo.core.imports import handle_uploaded_file, validate_xml
from rdmo.core.utils import render_to_format
from rdmo.core.views import ObjectPermissionMixin, RedirectViewMixin
from rdmo.projects.imports import import_project
from rdmo.tasks.models import Task
from rdmo.views.models import View
Expand Down Expand Up @@ -111,33 +110,27 @@ class ProjectImportXMLView(ObjectPermissionMixin, TemplateView):
form_class = ProjectForm
success_url = '/'
template_name = 'projects/project_upload.html'
tempfile = '/tmp/tempfile.xml'

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

def form_valid(self, form, request, *args, **kwargs):
form.save(commit=True)
messages.success(request, 'File uploaded!')
# return super(ProjectImportXMLView, self).form_valid(form)
return
return render(request, self.template_name, {'form': form})

def post(self, request, *args, **kwargs):
# context = self.get_context_data(**kwargs)
self.handleUploadedFile(request.FILES['uploaded_file'])
exit_code, xmltree = self.validateProjectXml(request, self.tempfile)
tempfilename = handle_uploaded_file(request.FILES['uploaded_file'])
exit_code, xmltree = validate_xml(tempfilename, 'project')
if exit_code == 0:
self.importProject(xmltree, request)
return HttpResponseRedirect('/')
return HttpResponseRedirect(self.success_url)
else:
log.info('Xml parsing error. Import failed.')
return HttpResponse('Xml parsing error. Import failed.')

def handleUploadedFile(self, filedata):
with open(self.tempfile, 'wb+') as destination:
for chunk in filedata.chunks():
destination.write(chunk)
def form_valid(self, form, request, *args, **kwargs):
form.save(commit=True)
messages.success(request, 'File uploaded!')
# return super(ProjectImportXMLView, self).form_valid(form)
return

def importProject(self, xml_root, request):
try:
Expand All @@ -147,22 +140,6 @@ def importProject(self, xml_root, request):
else:
import_project(xml_root, user)

def validateProjectXml(self, reqeuest, filename):
tree = None
exit_code = 0
try:
tree = ET.parse(filename)
except Exception as e:
exit_code = 1
log.info('Xml parsing error: ' + str(e))
pass
else:
root = tree.getroot()
if root.tag != 'project':
log.info('Xml\'s root node is "' + root.tag + '" and not "project."')
exit_code = 1
return exit_code, tree


class SnapshotCreateView(ObjectPermissionMixin, RedirectViewMixin, CreateView):
model = Snapshot
Expand Down

0 comments on commit 3646b42

Please sign in to comment.