def invite_user(permit, users_to_invite, invited, role, assignments_finished, operation=None, context=None): if not permit: return invited if assignments_finished: return [] message = models.Message() message.message_type = 'Request' message.response = operation message.content = operation.description message.ctx = context message.save() if not role: return invited if not users_to_invite: return invited for user in users_to_invite: if User.objects.filter(username=user.get("username", None)).exists(): if user['username'] in invited: continue # The user has already been invited. invited.append(user["username"]) else: #Handle what happens if user does not exist continue return invited
def multiple_choice(choices, chosen, operation=None, context=None): if chosen in choices: return chosen message = models.Message() message.message_type = 'Request' message.response = operation message.content = json.dumps(choices) message.ctx = context message.save() return None
def associate_resource(resource_identifier, operation=None, context=None): if resource_identifier is None: message = models.Message() message.message_type = 'Request' message.response = operation message.content = operation.description message.ctx = context message.save() return None return True
def file_upload(condition, file_url, operation=None, context=None): def check_file_uploaded(): return True if condition == "upload": message = models.Message() message.message_type = 'Request' message.response = operation message.content = operation.description message.ctx = context message.save() return file_url if file_url else None
def make_decision(ready_for_decision, decision, operation=None, context=None): if not ready_for_decision: return None message = models.Message() message.message_type = 'Request' message.response = operation message.content = operation.description message.ctx = context message.save() if decision: return True return None
def add_tags(tags, added_tags, operation=None, context=None): if added_tags is None: added_tags = [] message = models.Message() message.message_type = 'Request' message.response = operation message.content = operation.description message.ctx = context message.save() tag_set = set(tags) tag_set.update(set(added_tags)) return list(tag_set)
def set_string(string, old_string=None, condition=True, operation=None, context=None): message = models.Message() message.message_type = 'Request' message.response = operation message.content = operation.description message.ctx = context message.save() if string: return string return old_string
def run(self, request, *args, **kwargs): user_parameters = json.loads(request.body) context = models.Context.objects.get(pk=user_parameters.pop('ctx', None)) if not context: return Response({ "status": "404", "title": "context does not exist", "description": "the requested context does not currently exist" }, status=status.http_404_not_found) operation = models.Operation.objects.get(pk=kwargs['pk']) parameters = {} for arg in operation.arguments.all(): operation_parameter = user_parameters.get(arg.value.key, None) if arg.value.type.split(' ')[0] != 'IO': operation_parameter = context.values.get(arg.value.key, None) if not operation_parameter: return Response({ "status": "404", "title": "Missing Parameter", "description": "<Paramter: {}> is missing.".format(arg.value.key) }, status=status.HTTP_404_NOT_FOUND) parameters[arg.name] = operation_parameter context.values[arg.value.key] = operation_parameter result = getattr(operations, operation.operation)(**parameters) context.values[operation.return_value.key] = result context.save() new_operations = [] operations_to_check = models.Operation.objects.filter(parameters__in=[operation.return_value.pk]) for operation in operations_to_check: new_operations.extend(utils.get_allowed_operations(context, operation)) for operation in new_operations: message = models.Message() message.message_type = 'Request' message.response = operation message.content = 'Your input is required to {}.'.format(operation.name) message.ctx = context message.save() return Response("Success")
def run(self, request, *args, **kwargs): user_args = json.loads(request.body) context = models.Case.objects.get(pk=user_args.pop('ctx', None)) if not context: return Response( { "status": "404", "title": "Context Does Not Exist", "description": "The requested context does not currently exist." }, status=status.http_404_not_found) # TODO Use the following line to run an optimized # version of `run` that only runs the affected fns. # Onf faliure here, defer to recreating the available messages #operation = models.Operation.objects.get(pk=kwargs['pk']) previous_context = None while not previous_context == context.values: # This is ugly. previous_context = copy.deepcopy(context.values) # Delete all current messages. context.messages.all().delete() context.save() # Rebuild all messages from tree. for workflow in context.workflows.all(): context if utils.run(context, user_args, workflow.resolver): print("WORKFLOW COMPLETED") context.messages.all().delete() message = models.Message() message.message_type = 'Notification' message.response = None message.content = 'Thank you for completing the workflow.' message.ctx = context message.save() return Response("Success")
def submit_preprint(project_guid, title, disciplines, authors, license, doi, tags, abstract, preprint_uploaded, operation=None, context=None): if project_guid is None: message = models.Message() message.message_type = 'Request' message.response = operation message.content = operation.description message.ctx = context message.save() return None return True
def finish_assignment(active_assignees, finished_assignee, finished_assignees, assignments_finished, operation=None, context=None): if assignments_finished: return finished_assignees if finished_assignee in active_assignees and finished_assignee not in finished_assignees: finished_assignees.append(finished_assignee) for assignee in active_assignees: if assignee in finished_assignees: continue message = models.Message() message.message_type = 'Request' message.response = operation message.content = operation.description message.ctx = context message.save() return finished_assignees
def accept_invitation(invited, invitee, rsvp, active_assignees, assignments_finished, operation=None, context=None): if assignments_finished: return [] if invitee in invited and invitee not in active_assignees: active_assignees.append(invitee) for invite in invited: if invite in active_assignees: continue message = models.Message() message.message_type = 'Request' message.response = operation message.content = 'Hi, {}. {}'.format(invite, operation.description) message.ctx = context message.save() return active_assignees
def perform_create(self, serializer): context = serializer.save() context.values = { 'editor_role': 'Editor', 'reviewer_role': 'Reviewer', 'editor_count': 1, 'reviewer_count': 3 } context.save() allowed_operations = [] for workflow in context.workflows.all(): resolver = workflow.resolver allowed_operations.extend(utils.get_allowed_operations(context, resolver)) for operation in allowed_operations: message = models.Message() message.message_type = 'Request' message.response = operation message.content = 'Your input is required to {}.'.format(operation.name) message.ctx = context message.save()
id=token['color']['location']) for token_request in location.tokens.filter(case=case).filter( name=token['color']['token_name']): try: models.Message.objects.get(id=token_request.color).delete() token_request.delete() except Exception as e: print(e) print(token_request) print(token_request.color) import ipdb ipdb.set_trace() if token.get('name') == 'token_request_location': location = models.Location.objects.get( id=token['color']['location']) message = models.Message() message.message_type = 'Request' message.response = location message.content = location.description message.view = location.view message.section = token['color']['section'] try: message.response_token_name = token['color']['token_name'] except Exception as e: print(f'{transition} caused error {e}; no token name') raise message.case = case message.save() sinks.extend([{ 'name': 'request_pointer', 'color': str(message.id),