views.py 7.6 KB

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