Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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)
Пример #7
0
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
Пример #8
0
    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")
Пример #9
0
    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")
Пример #10
0
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
Пример #11
0
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
Пример #12
0
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
Пример #13
0
    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()
Пример #14
0
         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),