views.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. # django imports
  2. from django.shortcuts import render
  3. from django.http import HttpResponse
  4. from django.conf import settings
  5. # main imports
  6. import os
  7. import json
  8. import base64
  9. import random
  10. import numpy as np
  11. from datetime import datetime
  12. # image processing imports
  13. import io
  14. from PIL import Image
  15. # api imports
  16. from .utils import api
  17. from .utils import functions
  18. from .quest.processing import crop_images
  19. from . import config as cfg
  20. def expe_list(request):
  21. # get all scenes from dataset
  22. scenes = api.get_scenes()
  23. # get list of experiences
  24. expes = cfg.expe_name_list
  25. return render(request, 'expe/expe_list.html', {'scenes': scenes, 'expes': expes})
  26. # Create your views here.
  27. def expe(request):
  28. # get param
  29. expe_name = request.GET.get('expe')
  30. scene_name = request.GET.get('scene')
  31. # unique user ID during session (user can launch multiple exeperiences)
  32. if 'id' not in request.session:
  33. request.session['id'] = functions.uniqueID()
  34. # first time expe is launched add expe information
  35. if 'expe' not in request.session:
  36. request.session['expe'] = expe_name
  37. request.session['begin'] = True
  38. else:
  39. request.session['begin'] = False
  40. print(request.session.get('begin'))
  41. # update ref img at first time or expe changed
  42. if expe_name != request.session.get('expe'):
  43. #if 'ref_img' not in request.session or expe_name != request.session.get('expe'):
  44. request.session['begin'] = True
  45. request.session['qualities'] = api.get_scene_qualities(scene_name)
  46. # update unique timestamp each time new experience is launched
  47. request.session['timestamp'] = datetime.strftime(datetime.utcnow(), "%Y-%m-%d_%Hh%Mm%Ss")
  48. # TODO : add in cache ref_image
  49. # get reference image
  50. #ref_image = api.get_image(scene_name, 'max')
  51. # save ref image as list (can't save python object)
  52. #request.session['ref_img'] = np.array(ref_image).tolist()
  53. # construct new image
  54. quality = random.choice(request.session.get('qualities'))
  55. noisy_image = api.get_image(scene_name, quality)
  56. # reconstruct reference image from list stored into session
  57. # ref_image = Image.fromarray(np.array(request.session.get('ref_img')))
  58. ref_image = api.get_image(scene_name, 'max')
  59. img_merge, per, orien, swap_img = crop_images(noisy_image, ref_image)
  60. # create output folder for tmp files if necessary
  61. tmp_folder = os.path.join(settings.MEDIA_ROOT, cfg.output_tmp_folder)
  62. if not os.path.exists(tmp_folder):
  63. os.makedirs(tmp_folder)
  64. # generate tmp merged image (pass as BytesIO was complicated..)
  65. # TODO : add crontab task to erase generated img
  66. filepath_img = os.path.join(tmp_folder, request.session.get('id') + '_' + scene_name + '' + expe_name + '.png')
  67. img_merge.save(filepath_img)
  68. # create output folder for expe_result
  69. current_day = datetime.strftime(datetime.utcnow(), "%Y-%m-%d")
  70. results_folder = os.path.join(cfg.output_expe_folder.format(current_day))
  71. if not os.path.exists(results_folder):
  72. os.makedirs(results_folder)
  73. result_filename = expe_name + '_' + request.session.get('id') + '_' + request.session.get('timestamp') +".csv"
  74. results_filepath = os.path.join(results_folder, result_filename)
  75. if not os.path.exists(results_filepath):
  76. f = open(results_filepath, 'w')
  77. functions.write_header_expe(f, expe_name)
  78. else:
  79. f = open(results_filepath, 'a')
  80. #orientation : 0 = vertical, 1 = horizontal
  81. #image_ref_position : 0 = right/bottom, 1 = left/up
  82. #answer : left = 1, right = 0
  83. print("here")
  84. # expe parameters
  85. data = {
  86. 'expe_name': expe_name,
  87. 'img_merged_path': filepath_img,
  88. 'question': cfg.expe_questions[expe_name]['question'],
  89. 'indication': cfg.expe_questions[expe_name]['indication']
  90. }
  91. return render(request, 'expe/expe.html', data)
  92. def run_quest_one_image():
  93. pass