def get_worksheet_uuid(self, base_worksheet_uuid, worksheet_spec): if worksheet_spec == '': # Default worksheet name: take the username. worksheet_spec = self._current_user_name() try: return canonicalize.get_worksheet_uuid(self.model, base_worksheet_uuid, worksheet_spec) except UsageError: return self.new_worksheet(worksheet_spec) else: return canonicalize.get_worksheet_uuid(self.model, base_worksheet_uuid, worksheet_spec)
def parse_worksheet_form(form_result, model, user, worksheet_uuid): """ Input: form_result is a list of lines. Return (list of (bundle_info, subworksheet_info, value, type) tuples, commands to execute) """ def get_line_type(line): if line.startswith('!'): # Run commands return 'command' elif line.startswith('//'): return 'comment' elif BUNDLE_REGEX.match(line) is not None: return TYPE_BUNDLE elif SUBWORKSHEET_REGEX.match(line) is not None: return TYPE_WORKSHEET elif DIRECTIVE_REGEX.match(line) is not None: return TYPE_DIRECTIVE else: return TYPE_MARKUP line_types = [get_line_type(line) for line in form_result] # Extract bundle specs and resolve uuids in one batch bundle_lines = [ (i, BUNDLE_REGEX.match(line).group(3)) for i, line in enumerate(form_result) if line_types[i] == TYPE_BUNDLE ] # bundle_specs = (line_indices, bundle_specs) bundle_specs = zip(*bundle_lines) if len(bundle_lines) > 0 else [(), ()] # bundle_uuids = {line_i: bundle_uuid, ...} bundle_uuids = dict(zip(bundle_specs[0], canonicalize.get_bundle_uuids(model, user, worksheet_uuid, bundle_specs[1]))) commands = [] items = [] for line_i, (line_type, line) in enumerate(izip(line_types, form_result)): if line_type == 'command': command = formatting.string_to_tokens(line[1:].strip()) # The user can specify '!<command> ^', which perform actions on the previous bundle. # Replace ^ with the reference to the last bundle. command = [(bundle_uuids[-1][1] if arg == '^' else arg) for arg in command] commands.append(command) elif line_type == 'comment': comment = line[2:] items.append(directive_item([DIRECTIVE_CHAR, comment])) elif line_type == TYPE_BUNDLE: bundle_info = {'uuid': bundle_uuids[line_i]} # info doesn't need anything other than uuid items.append(bundle_item(bundle_info)) elif line_type == TYPE_WORKSHEET: subworksheet_spec = SUBWORKSHEET_REGEX.match(line).group(3) try: subworksheet_uuid = canonicalize.get_worksheet_uuid(model, user, worksheet_uuid, subworksheet_spec) subworksheet_info = {'uuid': subworksheet_uuid} # info doesn't need anything other than uuid items.append(subworksheet_item(subworksheet_info)) except UsageError, e: items.append(markup_item(e.message + ': ' + line)) elif line_type == TYPE_DIRECTIVE: directive = DIRECTIVE_REGEX.match(line).group(1) items.append(directive_item(formatting.string_to_tokens(directive)))
def ensure_unused_worksheet_name(name): """ Ensure worksheet names are unique. Note: for simplicity, we are ensuring uniqueness across the system, even on worksheet names that the user may not have access to. """ # If trying to set the name to a home worksheet, then it better be # user's home worksheet. if (spec_util.is_home_worksheet(name) and spec_util.home_worksheet(request.user.user_name) != name): raise UsageError( 'Cannot create %s because this is potentially the home worksheet of another user' % name) try: canonicalize.get_worksheet_uuid(local.model, request.user, None, name) raise UsageError('Worksheet with name %s already exists' % name) except NotFoundError: pass # all good!
def ensure_unused_worksheet_name(name): """ Ensure worksheet names are unique. Note: for simplicity, we are ensuring uniqueness across the system, even on worksheet names that the user may not have access to. """ # If trying to set the name to a home worksheet, then it better be # user's home worksheet. if ( spec_util.is_home_worksheet(name) and spec_util.home_worksheet(request.user.user_name) != name ): raise UsageError( 'Cannot create %s because this is potentially the home worksheet of another user' % name ) try: canonicalize.get_worksheet_uuid(local.model, request.user, None, name) raise UsageError('Worksheet with name %s already exists' % name) except NotFoundError: pass # all good!
def get_worksheet_uuid_or_create(base_worksheet_uuid, worksheet_spec): """ Return the uuid of the specified worksheet if it exists. If not, create a new worksheet if the specified worksheet is home_worksheet or dashboard. Otherwise, throw an error. """ try: return canonicalize.get_worksheet_uuid( local.model, request.user, base_worksheet_uuid, worksheet_spec ) except NotFoundError: # A bit hacky, duplicates a bit of canonicalize if (worksheet_spec == '' or worksheet_spec == HOME_WORKSHEET) and request.user: return new_worksheet(spec_util.home_worksheet(request.user.user_name)) elif spec_util.is_dashboard(worksheet_spec): return new_worksheet(worksheet_spec) else: raise
def parse_worksheet_form(form_result, model, user, worksheet_uuid): """ Input: form_result is a list of lines. Return (list of (bundle_info, subworksheet_info, value, type) tuples, commands to execute) """ def get_line_type(line): if line.startswith('//'): return 'comment' elif BUNDLE_REGEX.match(line) is not None: return TYPE_BUNDLE elif SUBWORKSHEET_REGEX.match(line) is not None: return TYPE_WORKSHEET elif DIRECTIVE_REGEX.match(line) is not None: return TYPE_DIRECTIVE else: return TYPE_MARKUP line_types = [get_line_type(line) for line in form_result] # Extract bundle specs and resolve uuids in one batch bundle_lines = [(i, BUNDLE_REGEX.match(line).group(3)) for i, line in enumerate(form_result) if line_types[i] == TYPE_BUNDLE] # bundle_specs = (line_indices, bundle_specs) bundle_specs = list(zip(*bundle_lines)) if len(bundle_lines) > 0 else [(), ()] # bundle_uuids = {line_i: bundle_uuid, ...} bundle_uuids = dict( list( zip( bundle_specs[0], canonicalize.get_bundle_uuids(model, user, worksheet_uuid, bundle_specs[1]), ))) items = [] for line_i, (line_type, line) in enumerate(zip(line_types, form_result)): if line_type == 'comment': comment = line[2:] items.append(directive_item([DIRECTIVE_CHAR, comment])) elif line_type == TYPE_BUNDLE: bundle_info = { 'uuid': bundle_uuids[line_i] } # info doesn't need anything other than uuid items.append(bundle_item(bundle_info)) elif line_type == TYPE_WORKSHEET: subworksheet_spec = SUBWORKSHEET_REGEX.match(line).group(3) try: subworksheet_uuid = canonicalize.get_worksheet_uuid( model, user, worksheet_uuid, subworksheet_spec) subworksheet_info = { 'uuid': subworksheet_uuid } # info doesn't need anything other than uuid items.append(subworksheet_item(subworksheet_info)) except UsageError as e: items.append(markup_item(str(e) + ': ' + line)) elif line_type == TYPE_DIRECTIVE: directive = DIRECTIVE_REGEX.match(line).group(1) items.append(directive_item( formatting.string_to_tokens(directive))) elif line_type == TYPE_MARKUP: items.append(markup_item(line)) else: raise RuntimeError( "Invalid line type %s: this should not happen." % line_type) return items
def get_worksheet_uuid(self, worksheet_spec): return canonicalize.get_worksheet_uuid(self.model, worksheet_spec)
def parse_worksheet_form(form_result, model, user, worksheet_uuid): """ Input: form_result is a list of lines. Return (list of (bundle_info, subworksheet_info, value, type) tuples, commands to execute) """ def get_line_type(line): if line.startswith('//'): return 'comment' elif BUNDLE_REGEX.match(line) is not None: return TYPE_BUNDLE elif SUBWORKSHEET_REGEX.match(line) is not None: return TYPE_WORKSHEET elif DIRECTIVE_REGEX.match(line) is not None: return TYPE_DIRECTIVE else: return TYPE_MARKUP line_types = [get_line_type(line) for line in form_result] # Extract bundle specs and resolve uuids in one batch bundle_lines = [ (i, BUNDLE_REGEX.match(line).group(3)) for i, line in enumerate(form_result) if line_types[i] == TYPE_BUNDLE ] # bundle_specs = (line_indices, bundle_specs) bundle_specs = zip(*bundle_lines) if len(bundle_lines) > 0 else [(), ()] # bundle_uuids = {line_i: bundle_uuid, ...} bundle_uuids = dict( zip( bundle_specs[0], canonicalize.get_bundle_uuids(model, user, worksheet_uuid, bundle_specs[1]), ) ) items = [] for line_i, (line_type, line) in enumerate(izip(line_types, form_result)): if line_type == 'comment': comment = line[2:] items.append(directive_item([DIRECTIVE_CHAR, comment])) elif line_type == TYPE_BUNDLE: bundle_info = { 'uuid': bundle_uuids[line_i] } # info doesn't need anything other than uuid items.append(bundle_item(bundle_info)) elif line_type == TYPE_WORKSHEET: subworksheet_spec = SUBWORKSHEET_REGEX.match(line).group(3) try: subworksheet_uuid = canonicalize.get_worksheet_uuid( model, user, worksheet_uuid, subworksheet_spec ) subworksheet_info = { 'uuid': subworksheet_uuid } # info doesn't need anything other than uuid items.append(subworksheet_item(subworksheet_info)) except UsageError as e: items.append(markup_item(e.message + ': ' + line)) elif line_type == TYPE_DIRECTIVE: directive = DIRECTIVE_REGEX.match(line).group(1) items.append(directive_item(formatting.string_to_tokens(directive))) elif line_type == TYPE_MARKUP: items.append(markup_item(line)) else: raise RuntimeError("Invalid line type %s: this should not happen." % line_type) return items