def create(request): """ Creates a new translation request for the current user. Does not yet work for anonymous users! """ LOGGER.info('Rendering create request view for user "{0}".'.format(request.user.username)) form = None if request.method == "POST": form = TranslationRequestForm(request.user, request.POST, request.FILES) if form.errors: LOGGER.info( "Form validation errors: {0}".format(["{0}: {1}".format(a, b[0]) for a, b in form.errors.items()]) ) if form.is_valid(): LOGGER.info("Create request form is valid.") new = TranslationRequest() new.shortname = request.POST["shortname"] new.owner = request.user new.worker = WorkerServer.objects.get(pk=int(request.POST["worker"])) message = TranslationRequestMessage() message.request_id = new.request_id message.source_language = request.POST["source_language"] message.target_language = request.POST["target_language"] message.source_text = u"" for chunk in request.FILES["source_text"].chunks(): message.source_text += unicode(chunk, "utf-8") handle = open("{0}/{1}.message".format(TRANSLATION_MESSAGE_PATH, new.request_id), "w+b") # pylint: disable-msg=E1101 handle.write(message.SerializeToString()) handle.close() new.save() # cfedermann: We have to decide whether the translation process # should directly be sent to the worker server or whether it # makes more sense to "queue" it on the broker server and have # a cronjob start the process when the worker is not busy... # This does have impact on system performance/robustness! new.start_translation() messages.add_message( request, messages.SUCCESS, "Successfully " 'started translation request "{0}".'.format(new.shortname) ) return HttpResponseRedirect(reverse("dashboard")) else: try: form = TranslationRequestForm(user=request.user) except AssertionError, msg: messages.add_message(request, messages.ERROR, msg) return HttpResponseRedirect(reverse("dashboard"))
def dict_to_tro(dict_obj): ''' Converts a dictionary representation into a TranslationRequestObject protobuf. ''' tr_obj = TranslationRequestObject() # TODO: check if we really need "blah" which is questionable ; defined_keys = set(['blah', 'shortname', 'request_id', 'worker', 'owner', 'created', 'ready', 'result', 'source_language', 'target_language']) tr_obj.shortname = dict_obj['shortname'] tr_obj.request_id = dict_obj['request_id'] tr_obj.worker = dict_obj['worker'] tr_obj.owner = dict_obj['owner'] tr_obj.created = dict_obj['created'].isoformat() tr_obj.ready = dict_obj['ready'] if 'result' in dict_obj: result_obj = TranslationRequestMessage() result_obj.request_id = dict_obj['request_id'] result_obj.source_language = dict_obj['source_language'] result_obj.target_language = dict_obj['target_language'] result_obj.source_text = '' result_obj.target_text = dict_obj['result'] # pylint: disable-msg=E1101 for key in set(dict_obj.keys()) - defined_keys: kv_pair = result_obj.packet_data.add() kv_pair.key = key kv_pair.value = dict_obj[key] tr_obj.serialized = b64encode(result_obj.SerializeToString()) else: tr_obj.serialized = '' return tr_obj
def dict_to_tro(dict_obj): """ Converts a dictionary representation into a TranslationRequestObject protobuf. """ tr_obj = TranslationRequestObject() defined_keys = set( [ "blah", "shortname", "request_id", "worker", "owner", "created", "ready", "result", "source_language", "target_language", ] ) tr_obj.shortname = dict_obj["shortname"] tr_obj.request_id = dict_obj["request_id"] tr_obj.worker = dict_obj["worker"] tr_obj.owner = dict_obj["owner"] tr_obj.created = dict_obj["created"].isoformat() tr_obj.ready = dict_obj["ready"] if "result" in dict_obj: result_obj = TranslationRequestMessage() result_obj.request_id = dict_obj["request_id"] result_obj.source_language = dict_obj["source_language"] result_obj.target_language = dict_obj["target_language"] result_obj.source_text = "" result_obj.target_text = dict_obj["result"] for key in set(dict_obj.keys()) - defined_keys: kv_pair = result_obj.packet_data.add() kv_pair.key = key kv_pair.value = dict_obj[key] tr_obj.serialized = b64encode(result_obj.SerializeToString()) else: tr_obj.serialized = "" return tr_obj
def create(self, request, shortname = None, results = False): '''Handles a POST request to create a new translation request.''' if shortname is not None or results: return rc.BAD_REQUEST print 'CREATE content-type', request.content_type # DEBUG # get the data from the POST request postdata = self.flatten_dict(request.data) # ensure that the worker field is present postdata['worker'] = postdata.get('worker','') # convert worker shortname to a worker ID if needed if not postdata['worker'].isdigit(): try: postdata['worker'] = str(WorkerServer.objects.get( shortname=postdata['worker']).id) except ObjectDoesNotExist: return rc.BAD_REQUEST # check whether the translation request is a duplicate if 'shortname' in postdata: try: TranslationRequest.objects.get(shortname=postdata['shortname']) return rc.DUPLICATE_ENTRY except MultipleObjectsReturned: return rc.DUPLICATE_ENTRY except ObjectDoesNotExist: pass # validate POST data using our Django form form = TranslationRequestForm(request.user, postdata, request.FILES) try: if not form.is_valid(): return rc.BAD_REQUEST except KeyError: return rc.BAD_REQUEST # create a new request object new = TranslationRequest() new.shortname = form.cleaned_data['shortname'] new.owner = request.user new.worker = form.cleaned_data['worker'] # create a new worker message message = TranslationRequestMessage() message.request_id = new.request_id message.source_language = form.cleaned_data['source_language'] message.target_language = form.cleaned_data['target_language'] message.source_text = u'' for chunk in request.FILES['source_text'].chunks(): message.source_text += unicode(chunk, 'utf-8') handle = open('{0}/{1}.message'.format(TRANSLATION_MESSAGE_PATH, new.request_id), 'w+b') handle.write(message.SerializeToString()) handle.close() new.save() new.start_translation() messages.add_message(request, messages.SUCCESS, 'Successfully ' \ 'started translation request "{0}".'.format( new.shortname)) # return 201 CREATED response = rc.CREATED # put the URI of the newly created object into the HTTP header # Location field (see RFC 2616) response['Location'] = reverse('requests', args=[new.request_id + '/']) # echo the created object inside the HTTP response # NOTE: this overwrites the "Location" header field set above. # See piston.resource.__call__() response.content = RequestHandler.request_to_dict(new) return response
def create(request): """ Creates a new translation request for the current user. Does not yet work for anonymous users! """ LOGGER.info('Rendering create request view for user "{0}".'.format(request.user.username)) form = None if request.method == "POST": form = TranslationRequestForm(request.POST, request.FILES) if form.errors: LOGGER.info( "Form validation errors: {0}".format(["{0}: {1}".format(a, b[0]) for a, b in form.errors.items()]) ) if form.is_valid(): LOGGER.info("Create request form is valid.") new = TranslationRequest() new.shortname = request.POST["shortname"] new.owner = request.user new.worker = WorkerServer.objects.get(pk=int(request.POST["worker"])) message = TranslationRequestMessage() message.request_id = new.request_id message.source_language = request.POST["source_language"] message.target_language = request.POST["target_language"] message.source_text = u"" for chunk in request.FILES["source_text"].chunks(): message.source_text += unicode(chunk, "utf-8") handle = open("{0}/{1}.message".format(TRANSLATION_MESSAGE_PATH, new.request_id), "w+b") handle.write(message.SerializeToString()) handle.close() new.save() # cfedermann: We have to decide whether the translation process # should directly be sent to the worker server or whether it # makes more sense to "queue" it on the broker server and have # a cronjob start the process when the worker is not busy... # This does have impact on system performance/robustness! new.start_translation() messages.add_message( request, messages.SUCCESS, "Successfully " 'started translation request "{0}".'.format(new.shortname) ) return HttpResponseRedirect("/dashboard/") else: form = TranslationRequestForm() # from serverland.dashboard.models import WorkerServer # workers = WorkerServer.objects.all() # active_workers = [w for w in workers if w.is_alive()] dictionary = {"title": "MT Server Land (prototype) -- Create translation", "form": form} return render_to_response("dashboard/create.html", dictionary, context_instance=RequestContext(request))