Creates an editor session for the given path object.
(pad, path, is_attachment=None, alt=PRIMARY_ALT, datamodel=None)
| 42 | |
| 43 | |
| 44 | def make_editor_session(pad, path, is_attachment=None, alt=PRIMARY_ALT, datamodel=None): |
| 45 | """Creates an editor session for the given path object.""" |
| 46 | if not _is_valid_path(path): |
| 47 | raise BadEdit("Invalid path") |
| 48 | path = cleanup_path(path) |
| 49 | |
| 50 | if alt != PRIMARY_ALT and not pad.db.config.is_valid_alternative(alt): |
| 51 | raise BadEdit("Attempted to edit an invalid alternative (%s)" % alt) |
| 52 | |
| 53 | raw_data = pad.db.load_raw_data(path, cls=OrderedDict, alt=alt, fallback=False) |
| 54 | raw_data_fallback = None |
| 55 | if alt != PRIMARY_ALT: |
| 56 | raw_data_fallback = pad.db.load_raw_data(path, cls=OrderedDict) |
| 57 | all_data = OrderedDict() |
| 58 | all_data.update(raw_data_fallback or ()) |
| 59 | all_data.update(raw_data or ()) |
| 60 | else: |
| 61 | all_data = raw_data |
| 62 | |
| 63 | id = posixpath.basename(path) |
| 64 | if not is_valid_id(id): |
| 65 | raise BadEdit("Invalid ID") |
| 66 | |
| 67 | record = None |
| 68 | exists = raw_data is not None or raw_data_fallback is not None |
| 69 | if raw_data is None: |
| 70 | raw_data = OrderedDict() |
| 71 | |
| 72 | if is_attachment is None: |
| 73 | if not exists: |
| 74 | is_attachment = False |
| 75 | else: |
| 76 | is_attachment = bool(all_data.get("_attachment_for")) |
| 77 | elif bool(all_data.get("_attachment_for")) != is_attachment: |
| 78 | raise BadEdit( |
| 79 | "The attachment flag passed is conflicting with the " |
| 80 | "record's attachment flag." |
| 81 | ) |
| 82 | |
| 83 | if exists: |
| 84 | # XXX: what about changing the datamodel after the fact? |
| 85 | if datamodel is not None: |
| 86 | raise BadEdit( |
| 87 | "When editing an existing record, a datamodel " "must not be provided." |
| 88 | ) |
| 89 | datamodel = pad.db.get_datamodel_for_raw_data(all_data, pad) |
| 90 | else: |
| 91 | if datamodel is None: |
| 92 | datamodel = pad.db.get_implied_datamodel(path, is_attachment, pad) |
| 93 | elif isinstance(datamodel, str): |
| 94 | datamodel = pad.db.datamodels[datamodel] |
| 95 | |
| 96 | if exists: |
| 97 | record = pad.instance_from_data(dict(all_data), datamodel) |
| 98 | |
| 99 | for key in implied_keys: |
| 100 | raw_data.pop(key, None) |
| 101 | if raw_data_fallback: |