views.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. from django.core.urlresolvers import reverse
  2. from django.shortcuts import render, render_to_response
  3. from django.template import RequestContext
  4. from django.http import HttpResponseRedirect, HttpResponse
  5. from django.contrib import messages
  6. from django.conf import settings
  7. import json
  8. from mongoengine import ValidationError
  9. from multiprocessing import Process
  10. from .models import Volume
  11. from .forms import VolumeForm
  12. from volumes.processing.service import SliceGenerator, SubvolumeCreator
  13. import logging
  14. import os
  15. logger = logging.getLogger(__name__)
  16. # volumes views
  17. def index(request):
  18. return render(request, 'volumes/index.html', {'volumes': Volume.objects()})
  19. def show(request, id):
  20. try:
  21. volume = Volume.objects(id=id)[0]
  22. except (IndexError, ValidationError) as e:
  23. return handleException(request, id, e)
  24. return render(request, 'volumes/show.html', {'volume': volume})
  25. def showStatus(request, id):
  26. try:
  27. volume = Volume.objects(id=id)[0]
  28. except (IndexError, ValidationError) as e:
  29. return handleException(request, id, e)
  30. jsonDump = json.dumps({
  31. 'volumeId': str(volume.id),
  32. 'generateSlicesStatus': volume.generateSlicesStatus
  33. })
  34. return HttpResponse(jsonDump, content_type="json")
  35. def add(request):
  36. logger.debug('processing add requested')
  37. if request.method == 'GET':
  38. return edit(request, None)
  39. elif request.method == 'POST':
  40. form = VolumeForm(request.POST)
  41. if form.is_valid():
  42. volume = form.save()
  43. return HttpResponseRedirect(reverse('volumes:show', args=(volume.id,)))
  44. else:
  45. messages.error(request, 'input not valid')
  46. return HttpResponseRedirect(reverse('volumes:home'))
  47. def edit(request, id=None):
  48. if id is not None:
  49. try:
  50. volume = Volume.objects(id=id)[0]
  51. except (IndexError, ValidationError) as e:
  52. return handleException(request, id, e)
  53. if request.method == 'POST':
  54. form = VolumeForm(request.POST, instance=volume)
  55. if form.is_valid():
  56. instance = form.save()
  57. return HttpResponseRedirect(reverse('volumes:show', args=(instance.id,)))
  58. else:
  59. form = VolumeForm(instance=volume)
  60. submitAction = reverse('volumes:edit', args=(id,))
  61. else:
  62. form = VolumeForm()
  63. submitAction = reverse('volumes:add')
  64. template_context = {
  65. 'form': form,
  66. 'submitAction': submitAction,
  67. 'defaultPath': settings.DEFAULT_IMPORT_PATH,
  68. # 'fileList': json.dumps(__gatherInputFolderList())'''
  69. 'fileList': json.dumps([])
  70. }
  71. return render_to_response('volumes/edit.html', template_context, RequestContext(request))
  72. def addList(request):
  73. if request.method == 'POST':
  74. data = request.POST
  75. imageSequences = 'imagesequences' in data
  76. paths = data['paths'].split('\r\n')
  77. volumesToProcess = []
  78. for path in paths:
  79. pathParts = path.split(':')
  80. volume = Volume()
  81. volume.name = pathParts[0].strip()
  82. volume.path = pathParts[1].strip()
  83. volume.imageSequence = imageSequences
  84. volume = volume.save()
  85. volumesToProcess.append(volume.id)
  86. process = Process(target=SliceGenerator.generateListOfVolumes, args=(volumesToProcess,))
  87. process.start()
  88. messages.info(request, 'automatic processing started')
  89. return HttpResponseRedirect(reverse('volumes:home'))
  90. ''' this is a simple view, that adds volumes from a list, and preprocesses them '''
  91. template_context = {
  92. 'submitAction': reverse('volumes:addList')
  93. }
  94. return render_to_response('volumes/addList.html', template_context, RequestContext(request))
  95. def delete(request, id):
  96. try:
  97. volume = Volume.objects(id=id)[0]
  98. except (IndexError, ValidationError) as e:
  99. return handleException(request, id, e)
  100. volume.delete()
  101. return HttpResponseRedirect(reverse('volumes:home'))
  102. def handleException(request, id, e):
  103. if type(e) is ValidationError:
  104. messages.error(request, '%s not a valid ObjectId' % id)
  105. elif type(e) is IndexError:
  106. messages.error(request, 'object for %s not found in db' % id)
  107. return HttpResponseRedirect(reverse('volumes:home'))
  108. def showSprite(request, id, spriteId):
  109. try:
  110. sprite, contenttype = Volume.read_sprite(id, spriteId)
  111. except (IndexError, ValidationError) as e:
  112. return handleException(request, spriteId, e)
  113. # need a fallback for old data
  114. # can be removed in production, only needed for early test datas
  115. if contenttype is None:
  116. contenttype = 'image/jpeg'
  117. response = HttpResponse(sprite.read(), content_type=contenttype)
  118. response['Content-Length'] = sprite.length
  119. return response
  120. def getTextureInfo(request, id, size):
  121. if size == '':
  122. size = None
  123. try:
  124. texture = Volume.read_texture(id, size)
  125. except (IndexError, ValidationError) as e:
  126. return handleException(request, id, e)
  127. request.session['requestedRes'] = size
  128. jsonDump = texture.to_json()
  129. return HttpResponse(jsonDump, content_type="json")
  130. def deleteTexture(request, id, size):
  131. try:
  132. size = int(size)
  133. except ValueError:
  134. messages.error(request, 'please provide a valid value(s) for "size"')
  135. return HttpResponseRedirect(reverse('volumes:show', args=(id,)))
  136. try:
  137. Volume.objects(id=id).first().remove_texture(size)
  138. except (IndexError, ValidationError) as e:
  139. return handleException(request, id, e)
  140. return HttpResponseRedirect(reverse('volumes:show', args=(id,)))
  141. def render3D(request, id, res=None):
  142. try:
  143. volume = Volume.objects(id=id)[0]
  144. except (IndexError, ValidationError) as e:
  145. return handleException(request, id, e)
  146. if volume.textures is None or len(volume.textures) == 0:
  147. messages.error(request, 'please run the generation')
  148. return HttpResponseRedirect(reverse('volumes:show', args=(volume.id,)))
  149. if res is not None:
  150. res = int(res)
  151. #SubvolumeCreator.preread_volume(id)
  152. requestedResFound = False
  153. sizes = []
  154. for index in range(0, len(volume.textures)):
  155. curSize = volume.textures[index].size
  156. sizes.append(curSize)
  157. if curSize == res:
  158. requestedResFound = True
  159. sizes.sort()
  160. defaultSize = sizes[0]
  161. if requestedResFound:
  162. defaultSize = res
  163. return render(request, 'volumes/render.html', {
  164. 'volume': volume,
  165. 'textureSizes': sizes,
  166. 'defaultSize': defaultSize
  167. })
  168. def __gatherInputFolderList():
  169. fileList = __controlForSubfolder(settings.DEFAULT_IMPORT_PATH, 0)
  170. return fileList
  171. def __controlForSubfolder(path, depth):
  172. outputList = [path]
  173. try:
  174. dirContent = os.listdir(path)
  175. except OSError as e:
  176. logger.error('failed to read directory %s with error %s' % (path, str(e)))
  177. return []
  178. for fileItem in dirContent:
  179. fileItem = os.path.join(path, fileItem)
  180. if os.path.isdir(fileItem) is True:
  181. dirList = __controlForSubfolder(fileItem, depth + 1)
  182. outputList += dirList
  183. else:
  184. outputList.append(fileItem)
  185. return outputList