def update_submission(self, submission_gus, request): store = self.getStore() context_desc = Context(store).get_single(request['context_gus']) if not context_desc['selectable_receiver']: request.update({'receivers' : context_desc['receivers'] }) submission_desc = Submission(store).update(submission_gus, request) if submission_desc['finalize']: internaltip_desc = InternalTip(store).new(submission_desc) wbtip_desc = WhistleblowerTip(store).new(internaltip_desc) File(store).switch_reference(submission_desc, internaltip_desc) submission_desc.update({'receipt' : wbtip_desc['receipt']}) else: submission_desc.update({'receipt' : ''}) self.returnData(submission_desc) self.returnCode(202) # Updated return self.prepareRetVals()
def delete_context(self, context_gus): """ This DELETE operation, its permanent, and remove all the reference a Context has within the system (Tip, File, submission...) """ store = self.getStore() # Get context description, just to verify that context_gus is valid context_iface = Context(store) context_desc = context_iface.get_single(context_gus) # Collect tip by context and iter on the list receivertip_iface = ReceiverTip(store) tips_related_blocks = receivertip_iface.get_tips_by_context(context_gus) internaltip_iface = InternalTip(store) whistlebtip_iface = WhistleblowerTip(store) file_iface = File(store) comment_iface = Comment(store) # For every InternalTip, delete comment, wTip, rTip and Files for tip_block in tips_related_blocks: internaltip_id = tip_block.get('internaltip')['internaltip_id'] whistlebtip_iface.delete_access_by_itip(internaltip_id) receivertip_iface.massive_delete(internaltip_id) comment_iface.delete_comment_by_itip(internaltip_id) file_iface.delete_file_by_itip(internaltip_id) # and finally, delete the InternalTip internaltip_iface.tip_delete(internaltip_id) # (Just a consistency check - need to be removed) receiver_iface = Receiver(store) receivers_associated = receiver_iface.get_receivers_by_context(context_gus) print "receiver associated by context POV:", len(receivers_associated),\ "receiver associated by context DB-field:", len(context_desc['receivers']) # Align all the receiver associated to the context, that the context cease to exist receiver_iface.align_context_delete(context_desc['receivers'], context_gus) # Get the profile list related to context_gus and delete all of them profile_iface = PluginProfiles(store) profile_list = profile_iface.get_profiles_by_contexts([ context_gus ]) for prof in profile_list: profile_iface.delete_profile(prof['profile_gus']) # Get the submission list under the context, and delete all of them submission_iface = Submission(store) submission_list = submission_iface.get_all() for single_sub in submission_list: submission_iface.submission_delete(single_sub['submission_gus'], wb_request=False) # Finally, delete the context context_iface.delete_context(context_gus) self.returnData(context_desc) self.returnCode(200) return self.prepareRetVals()
def post(self, *uriargs): """ Request: wbSubmissionDesc Response: wbSubmissionDesc Errors: ContextGusNotFound, InvalidInputFormat, SubmissionFailFields This creates an empty submission for the requested context, and returns submissionStatus with empty fields and a Submission Unique String, This is the unique token used during the submission procedure. sessionGUS is used as authentication secret for the next interaction. expire after the time set by Admin (Context dependent setting) """ context_iface = Context() try: request = validateMessage(self.request.body, requests.wbSubmissionDesc) # XXX DUMMY PATCH CLIENT USAGE -- open tiket in GLClient print "Before", request if not request.has_key('wb_fields'): request.update({'wb_fields' : ''}) if not request.has_key('receivers'): request.update({'receivers' : []}) if not request.has_key('files'): request.update({'files' : []}) if not request.has_key('finalize'): request.update({'finalize' : False }) print "After ", request # XXX DUMMY PATCH CLIENT USAGE -- open tiket in GLClient context_desc = yield context_iface.get_single(request['context_gus']) submission_iface = Submission() submission_desc = yield submission_iface.new(request) if not context_desc['selectable_receiver']: submission_iface.receivers = context_iface.receivers if submission_desc['finalize']: internaltip_iface = InternalTip() wb_iface = WhistleblowerTip() internaltip_desc = yield internaltip_iface.new(submission_desc) wbtip_desc = yield wb_iface.new(internaltip_desc) submission_desc.update({'receipt' : wbtip_desc['receipt']}) else: submission_desc.update({'receipt' : ''}) self.set_status(201) # Created # TODO - output processing self.write(submission_desc) except ContextGusNotFound, e: self.set_status(e.http_status) self.write({'error_message': e.error_message, 'error_code' : e.error_code})
def post(self, submission_gus, *args): """ Parameter: submission_gus Request: Unknown Response: Unknown Errors: SubmissionGusNotFound, SubmissionConcluded POST in fileHandlers need to be refactored-engineered """ submission_iface = Submission() try: submission_desc = yield submission_iface.get_single(submission_gus) if submission_desc['finalize']: raise SubmissionConcluded results = [] # XXX will this ever be bigger than 1? file_array, files = self.request.files.popitem() for file in files: start_time = time.time() file_request = { 'filename' : file.get('filename'), 'content_type' : file.get('content_type'), 'file_size' : len(file['body']), 'submission_gus' : submission_gus, 'context_gus' : submission_desc['context_gus'], 'description' : '' } print "file_request", file_request, "\n" file_iface = File() file_desc = yield file_iface.new(file_request) log.debug("Created file from %s with file_gus %s" % (file_request['filename'], file_desc['file_gus'] )) result = self.process_file(file, submission_gus, file_desc['file_gus']) result['elapsed_time'] = time.time() - start_time results.append(result) response = json.dumps(results, separators=(',',':')) if 'application/json' in self.request.headers.get('Accept'): self.set_header('Content-Type', 'application/json') self.set_status(200) self.write(response) except InvalidInputFormat, e: self.set_status(e.http_status) self.write({'error_message': e.error_message, 'error_code' : e.error_message})
def post(self, submission_gus): """ Parameter: submission_gus Request: Unknown Response: Unknown Errors: SubmissionGusNotFound POST in fileHandlers need to be refactored-engineered """ # XXX "I see dead people" method_hack = self.get_arguments('_method') if method_hack and method_hack == 'DELETE': self.delete() try: results = [] # XXX will this ever be bigger than 1? file_array, files = self.request.files.popitem() for file in files: start_time = time.time() submission_iface = Submission() file_gus = yield submission_iface.add_file(submission_gus, file['filename'], file['content_type'], len(file['body']) ) log.debug("Created file with file_gus %s" % file_gus) result = self.process_file(file, submission_gus, file_gus) result['elapsed_time'] = time.time() - start_time results.append(result) # TODO yield on File.something() response = json.dumps(results, separators=(',',':')) if 'application/json' in self.request.headers.get('Accept'): self.set_header('Content-Type', 'application/json') self.set_status(200) self.write(response) except SubmissionGusNotFound, e: self.set_status(e.http_status) self.write({'error_message': e.error_message, 'error_code' : e.error_message})
def post(self, *uriargs): """ Request: wbSubmissionDesc Response: wbSubmissionDesc Errors: ContextGusNotFound, InvalidInputFormat, SubmissionFailFields This creates an empty submission for the requested context, and returns submissionStatus with empty fields and a Submission Unique String, This is the unique token used during the submission procedure. sessionGUS is used as authentication secret for the next interaction. expire after the time set by Admin (Context dependent setting) """ try: request = validateMessage(self.request.body, requests.wbSubmissionDesc) submission = Submission() context_iface = Context() context_info = context_iface.public_get_single(request['context_gus']) # use requested context, for defaults and so on status = yield submission.new(request['context_gus']) submission_gus = status['submission_gus'] # submission.receivers = context_iface. if request.has_key('fields'): log.debug("Fields present in creation: %s" % request['fields']) yield submission.update_fields(submission_gus, request['fields']) # TODO check if context supports receiver_selection if request.has_key('receivers'): yield submission.select_receiver(submission_gus, request['receivers']) self.set_status(201) # Created # TODO - output processing self.write(status) except ContextGusNotFound, e: self.set_status(e.http_status) self.write({'error_message': e.error_message, 'error_code' : e.error_code})
def put(self, submission_gus, *uriargs): """ Parameter: submission_gus Request: wbSubmissionDesc Response: wbSubmissionDesc Errors: ContextGusNotFound, InvalidInputFormat, SubmissionFailFields, SubmissionGusNotFound, SubmissionConcluded PUT update the submission and finalize if requested. """ context_iface = Context() try: request = validateMessage(self.request.body, requests.wbSubmissionDesc) context_desc = yield context_iface.get_single(request['context_gus']) submission_iface = Submission() submission_desc = yield submission_iface.update(submission_gus, request) if not context_desc['selectable_receiver']: submission_iface.receivers = context_iface.receivers if submission_desc['finalize']: internaltip_iface = InternalTip() wb_iface = WhistleblowerTip() internaltip_desc = yield internaltip_iface.new(submission_desc) wbtip_desc = yield wb_iface.new(internaltip_desc) submission_desc.update({'receipt' : wbtip_desc['receipt']}) else: submission_desc.update({'receipt' : ''}) self.set_status(202) # Updated # TODO - output processing self.write(submission_desc) except ContextGusNotFound, e: self.set_status(e.http_status) self.write({'error_message': e.error_message, 'error_code' : e.error_code})
def delete(self, submission_gus, *uriargs): """ Parameter: submission_gus Request: wbSubmissionDesc Response: None Errors: SubmissionGusNotFound, InvalidInputFormat A whistleblower is deleting a Submission because has understand that won't really be an hero. :P """ try: request = validateMessage(self.request.body, requests.wbSubmissionDesc) submission = Submission() submission.submission_delete(request.submission_gus) except SubmissionGusNotFound, e: self.set_status(e.http_status) self.write({'error_message': e.error_message, 'error_code' : e.error_code})
def get(self, submission_gus, *uriargs): """ Parameters: submission_gus Response: wbSubmissionDesc Errors: SubmissionGusNotFound, InvalidInputFormat Get the status of the current submission. """ submission = Submission() try: # TODO perform validation of single GLtype status = yield submission.get_single(submission_gus) self.set_status(200) self.write(status) except SubmissionGusNotFound, e: self.set_status(e.http_status) self.write({'error_message': e.error_message, 'error_code' : e.error_code})
def put(self, submission_gus, *uriargs): """ Parameter: submission_gus Request: wbSubmissionDesc Response: wbSubmissionDesc Errors: ContextGusNotFound, InvalidInputFormat, SubmissionFailFields, SubmissionGusNotFound PUT finalize and complete the Submission """ try: request = validateMessage(self.request.body, requests.wbSubmissionDesc) submission = Submission() if request.has_key('fields'): log.debug("Updating fields with %s" % request['fields']) yield submission.update_fields(submission_gus, request['fields']) if request.has_key('receivers'): log.debug("processing receiver selected: %s" % request['receivers']) yield submission.select_receiver(submission_gus, request['receivers']) if request.has_key('receipt'): yield submission.receipt_proposal(submission_gus, request['receipt']) status = yield submission.complete_submission(submission_gus) self.set_status(202) # Updated # TODO - output processing self.write(status) except ContextGusNotFound, e: # XXX ITS wrong, if a submission start with a context, you can't change them. self.set_status(e.http_status) self.write({'error_message': e.error_message, 'error_code' : e.error_code})
def delete(self, submission_gus, *uriargs): """ Parameter: submission_gus Request: Response: None Errors: SubmissionGusNotFound, InvalidInputFormat, SubmissionConcluded A whistleblower is deleting a Submission because has understand that won't really be an hero. :P """ submission_iface = Submission() try: # TODO perform validation of submission_gus format yield submission_iface.submission_delete(submission_gus) # TODO Delete file associated with submission self.set_status(200) except SubmissionGusNotFound, e: self.set_status(e.http_status) self.write({'error_message': e.error_message, 'error_code' : e.error_code})
def get(self, what, *uriargs): """ Parameters: None Response: Unknown Errors: None /dump/overview GET should return up to all the tables of GLBackend """ expected = [ 'itip', 'wtip', 'rtip', 'receivers', 'comment', 'profiles', 'rcfg', 'file', 'submission', 'contexts', 'plugins', 'all', 'count' ] outputDict = {} if what == 'receivers' or what == 'all' or what == 'count': receiver_iface = Receiver() receiver_list = yield receiver_iface.get_all() if what != 'count': outputDict.update({ 'receivers_elements' : len(receiver_list), 'receivers' : receiver_list}) else: outputDict.update({ 'receivers_elements' : len(receiver_list)}) if what == 'itip' or what == 'all' or what == 'count': itip_iface = InternalTip() itip_list = yield itip_iface.get_all() if what != 'count': outputDict.update({ 'internaltips_elements' : len(itip_list), 'internaltips' : itip_list }) else: outputDict.update({ 'internaltips_elements' : len(itip_list)}) if what == 'rtip' or what == 'all' or what == 'count': rtip_iface = ReceiverTip() rtip_list = yield rtip_iface.get_all() if what != 'count': outputDict.update({ 'rtip_elements' : len(rtip_list), 'receivers_tips' : rtip_list }) else: outputDict.update({ 'rtip_elements' : len(rtip_list)}) if what == 'wtip' or what == 'all' or what == 'count': wtip_iface = WhistleblowerTip() wtip_list = yield wtip_iface.get_all() if what != 'count': outputDict.update({ 'wtip_elements' : len(wtip_list), 'whistleblower_tips' : wtip_list }) else: outputDict.update({ 'wtip_elements' : len(wtip_list)}) if what == 'comment' or what == 'all' or what == 'count': comment_iface = Comment() comment_list = yield comment_iface.get_all() if what != 'count': outputDict.update({ 'comment_elements' : len(comment_list), 'comments' : comment_list }) else: outputDict.update({ 'comment_elements' : len(comment_list)}) if what == 'profiles' or what == 'all' or what == 'count': profile_iface = PluginProfiles() profile_list = yield profile_iface.get_all() if what != 'count': outputDict.update({ 'profiles_elements' : len(profile_list), 'profiles' : profile_list }) else: outputDict.update({ 'profiles_elements' : len(profile_list)}) if what == 'plugins' or what == 'all' or what == 'count': plugin_list = yield PluginManager.get_all() if what != 'count': outputDict.update({ 'plugins_elements' : len(plugin_list), 'plugins' : plugin_list }) else: outputDict.update({ 'plugins_elements' : len(plugin_list) }) if what == 'rcfg' or what == 'all' or what == 'count': rconf_iface = ReceiverConfs() rconf_list = yield rconf_iface.get_all() if what != 'count': outputDict.update({ 'rcfg_elements' : len(rconf_list), 'settings' : rconf_list }) else: outputDict.update({ 'rcfg_elements' : len(rconf_list)}) if what == 'submission' or what == 'all' or what == 'count': submission_iface = Submission() submission_list = yield submission_iface.get_all() if what != 'count': outputDict.update({ 'submission_elements' : len(submission_list), 'submissions' : submission_list }) else: outputDict.update({ 'submission_elements' : len(submission_list)}) if what == 'file' or what == 'all' or what == 'count': file_iface = File() file_list = yield file_iface.get_all() if what != 'count': outputDict.update({ 'file_elements' : len(file_list), 'files' : file_list }) else: outputDict.update({ 'file_elements' : len(file_list)}) if what == 'contexts' or what == 'all' or what == 'count': context_iface = Context() context_list = yield context_iface.get_all() if what != 'count': outputDict.update({ 'contexts_elements' : len(context_list), 'contexts' : context_list }) else: outputDict.update({ 'contexts_elements' : len(context_list)}) if not what in expected: self.set_status(405) else: self.set_status(200) self.write(outputDict) self.finish()