Skip to content

Commit

Permalink
Apply pre-commit fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
jams2 committed Oct 25, 2023
1 parent 32c4a73 commit 84f991d
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 65 deletions.
2 changes: 1 addition & 1 deletion docs/img/wagtail_transfer_logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 0 additions & 1 deletion docs/management_commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,3 @@ Suppose a site has been developed and populated with content on a staging enviro
* On both instances, run: `./manage.py preseed_transfer_table wagtailcore.page --range=1-199`

The `preseed_transfer_table` command generates consistent UUIDs between the two site instances, so any transfers involving this ID range will recognise the pages as matching, and handle them as updates rather than creations.

100 changes: 50 additions & 50 deletions docs/settings.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,24 @@
### `WAGTAILTRANSFER_SECRET_KEY`

```python
WAGTAILTRANSFER_SECRET_KEY = '7cd5de8229be75e1e0c2af8abc2ada7e'
WAGTAILTRANSFER_SECRET_KEY = "7cd5de8229be75e1e0c2af8abc2ada7e"
```

The secret key used to authenticate requests to import content from this site to another. The secret key in the
matching part of the importing site's `WAGTAILTRANSFER_SOURCES` must be identical, or the transfer will be rejected -
this prevents unauthorised import of sensitive data.
The secret key used to authenticate requests to import content from this site to another. The secret key in the
matching part of the importing site's `WAGTAILTRANSFER_SOURCES` must be identical, or the transfer will be rejected -
this prevents unauthorised import of sensitive data.

### `WAGTAILTRANSFER_SOURCES`

```python
WAGTAILTRANSFER_SOURCES = {
'staging': {
'BASE_URL': 'https://staging.example.com/wagtail-transfer/',
'SECRET_KEY': '4ac4822149691395773b2a8942e1a472',
"staging": {
"BASE_URL": "https://staging.example.com/wagtail-transfer/",
"SECRET_KEY": "4ac4822149691395773b2a8942e1a472",
},
'production': {
'BASE_URL': 'https://www.example.com/wagtail-transfer/',
'SECRET_KEY': 'a36476ffc6af34dc935570d97369eca0',
"production": {
"BASE_URL": "https://www.example.com/wagtail-transfer/",
"SECRET_KEY": "a36476ffc6af34dc935570d97369eca0",
},
}
```
Expand All @@ -32,44 +32,44 @@ A dictionary defining the sites available to import from, and their secret keys.
### `WAGTAILTRANSFER_UPDATE_RELATED_MODELS`

```python
WAGTAILTRANSFER_UPDATE_RELATED_MODELS = ['wagtailimages.image', 'adverts.advert']
WAGTAILTRANSFER_UPDATE_RELATED_MODELS = ["wagtailimages.image", "adverts.advert"]
```

Specifies a list of models that, whenever we encounter references to them in imported content, should be updated to the
Specifies a list of models that, whenever we encounter references to them in imported content, should be updated to the
latest version from the source site as part of the import.

Whenever an object being imported contains a reference to a related object (through a ForeignKey, RichTextField or
StreamField), the 'importance' of that related object will tend to vary according to its type. For example, a reference
to an Image object within a page usually means that the image will be shown on that page; in this case, the Image model
is sufficiently important to the imported page that we want the importer to not only ensure that image exists at the
destination, but is updated to its newest version as well. Contrast this with the example of an 'author' snippet
attached to blog posts, containing various fields of data about that person (e.g. bio, social media links); in this
case, the author information is not really part of the blog post, and it's not expected that we would update it when
Whenever an object being imported contains a reference to a related object (through a ForeignKey, RichTextField or
StreamField), the 'importance' of that related object will tend to vary according to its type. For example, a reference
to an Image object within a page usually means that the image will be shown on that page; in this case, the Image model
is sufficiently important to the imported page that we want the importer to not only ensure that image exists at the
destination, but is updated to its newest version as well. Contrast this with the example of an 'author' snippet
attached to blog posts, containing various fields of data about that person (e.g. bio, social media links); in this
case, the author information is not really part of the blog post, and it's not expected that we would update it when
running an import of blog posts.

### `WAGTAILTRANSFER_LOOKUP_FIELDS`

```python
WAGTAILTRANSFER_LOOKUP_FIELDS = {'blog.author': ['first_name', 'surname']}
WAGTAILTRANSFER_LOOKUP_FIELDS = {"blog.author": ["first_name", "surname"]}
```

Specifies a list of fields to use for object lookups on the given models.

Normally, imported objects will be assigned a random UUID known across all sites, so that those objects can be
recognised on subsequent imports and be updated rather than creating a duplicate. This behaviour is less useful for
models that already have a uniquely identifying field, or set of fields, such as an author identified by first name
and surname - if the same author exists on the source and destination site, but this was not the result of a previous
import, then the UUID-based matching will consider them distinct, and attempt to create a duplicate author record at the
destination. Adding an entry in WAGTAILTRANSFER_LOOKUP_FIELDS will mean that any imported instances of the given model
Normally, imported objects will be assigned a random UUID known across all sites, so that those objects can be
recognised on subsequent imports and be updated rather than creating a duplicate. This behaviour is less useful for
models that already have a uniquely identifying field, or set of fields, such as an author identified by first name
and surname - if the same author exists on the source and destination site, but this was not the result of a previous
import, then the UUID-based matching will consider them distinct, and attempt to create a duplicate author record at the
destination. Adding an entry in WAGTAILTRANSFER_LOOKUP_FIELDS will mean that any imported instances of the given model
will be looked up based on the specified fields, rather than by UUID.

The default value for `WAGTAILTRANSFER_LOOKUP_FIELDS` is:

```python
{
'taggit.tag': ['slug'],
'wagtailcore.locale': ["language_code"],
'contenttypes.contenttype': ['app_label', 'model'],
"taggit.tag": ["slug"],
"wagtailcore.locale": ["language_code"],
"contenttypes.contenttype": ["app_label", "model"],
}
```

Expand All @@ -78,31 +78,33 @@ Overriding these values may result in issues as described above, particularly in
### `WAGTAILTRANSFER_NO_FOLLOW_MODELS`

```python
WAGTAILTRANSFER_NO_FOLLOW_MODELS = ['wagtailcore.page', 'organisations.Company']
WAGTAILTRANSFER_NO_FOLLOW_MODELS = ["wagtailcore.page", "organisations.Company"]
```

Specifies a list of models that should not be imported by association when they are referenced from imported content.
Specifies a list of models that should not be imported by association when they are referenced from imported content.
Defaults to `['wagtailcore.page', 'contenttypes.contenttype']`.

By default, objects referenced within imported content will be recursively imported to ensure that those references are
still valid on the destination site. However, this is not always desirable - for example, if this happened for the Page
model, this would imply that any pages linked from an imported page would get imported as well, along with any pages
linked from those pages, and so on, leading to an unpredictable number of extra pages being added anywhere in the page
tree as a side-effect of the import. Models listed in WAGTAILTRANSFER_NO_FOLLOW_MODELS will thus be skipped in this
process, leaving the reference unresolved. The effect this has on the referencing page will vary according to the kind
of relation: nullable foreign keys, one-to-many and many-to-many relations will simply omit the missing object;
references in rich text and StreamField will become broken links (just as linking a page and then deleting it would);
while non-nullable foreign keys will prevent the object from being created at all (meaning that any objects referencing
By default, objects referenced within imported content will be recursively imported to ensure that those references are
still valid on the destination site. However, this is not always desirable - for example, if this happened for the Page
model, this would imply that any pages linked from an imported page would get imported as well, along with any pages
linked from those pages, and so on, leading to an unpredictable number of extra pages being added anywhere in the page
tree as a side-effect of the import. Models listed in WAGTAILTRANSFER_NO_FOLLOW_MODELS will thus be skipped in this
process, leaving the reference unresolved. The effect this has on the referencing page will vary according to the kind
of relation: nullable foreign keys, one-to-many and many-to-many relations will simply omit the missing object;
references in rich text and StreamField will become broken links (just as linking a page and then deleting it would);
while non-nullable foreign keys will prevent the object from being created at all (meaning that any objects referencing
that object will end up with unresolved references, to be handled by the same set of rules).

Note that these settings do not accept models that are defined as subclasses through multi-table inheritance - in
Note that these settings do not accept models that are defined as subclasses through multi-table inheritance - in
particular, they cannot be used to define behaviour that only applies to specific subclasses of Page.


### `WAGTAILTRANSFER_FOLLOWED_REVERSE_RELATIONS`

```python
WAGTAILTRANSFER_FOLLOWED_REVERSE_RELATIONS = [('wagtailimages.image', 'tagged_items', True)]
WAGTAILTRANSFER_FOLLOWED_REVERSE_RELATIONS = [
("wagtailimages.image", "tagged_items", True)
]
```

Specifies a list of models, their reverse relations to follow, and whether deletions should be synced, when identifying object references that should be imported to the destination site. Defaults to `[('wagtailimages.image', 'tagged_items', True)]`.
Expand Down Expand Up @@ -145,10 +147,9 @@ class MyCustomAdapter(FieldAdapter):
pass


@hooks.register('register_field_adapters')
@hooks.register("register_field_adapters")
def register_my_custom_adapter():
return {models.Field: MyCustomAdapter}

```


Expand All @@ -168,18 +169,17 @@ from wagtail_transfer.serializers import PageSerializer

from myapp.models import MyModel

class MyModelCustomSerializer(PageSerializer):

class MyModelCustomSerializer(PageSerializer):
ignored_fields = PageSerializer.ignored_fields + [
'secret_field_1',
'environment_specific_data_field_123',
...
"secret_field_1",
"environment_specific_data_field_123",
...,
]
pass


@hooks.register('register_custom_serializers')
@hooks.register("register_custom_serializers")
def register_my_custom_serializer():
return {MyModel: MyModelCustomSerializer}

```
25 changes: 12 additions & 13 deletions docs/setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
3. In your project's top-level urls.py, add:

from wagtail_transfer import urls as wagtailtransfer_urls

and add:

url(r'^wagtail-transfer/', include(wagtailtransfer_urls)),

to the `urlpatterns` list above `include(wagtail_urls)`.

4. Add the settings `WAGTAILTRANSFER_SOURCES` and `WAGTAILTRANSFER_SECRET_KEY` to your project settings.
These are formatted as:

Expand All @@ -29,20 +29,19 @@
}

WAGTAILTRANSFER_SECRET_KEY = '7cd5de8229be75e1e0c2af8abc2ada7e'

However, it is best to store the `SECRET_KEY`s themselves in local environment variables for security.

`WAGTAILTRANSFER_SOURCES` is a dictionary defining the sites available to import from, and their secret keys.

`WAGTAILTRANSFER_SECRET_KEY` and the per-source `SECRET_KEY` settings are used to authenticate the communication between the
source and destination instances; this prevents unauthorised users from using this API to retrieve sensitive data such
as password hashes. The `SECRET_KEY` for each entry in `WAGTAILTRANSFER_SOURCES` must match that instance's
`WAGTAILTRANSFER_SECRET_KEY` and the per-source `SECRET_KEY` settings are used to authenticate the communication between the
source and destination instances; this prevents unauthorised users from using this API to retrieve sensitive data such
as password hashes. The `SECRET_KEY` for each entry in `WAGTAILTRANSFER_SOURCES` must match that instance's
`WAGTAILTRANSFER_SECRET_KEY`.

Once you've followed these instructions for all your source and destination sites, you can start
[importing content](basic_usage.md).

If you need additional configuration - you want to configure which referenced models are updated, how models are identified
Once you've followed these instructions for all your source and destination sites, you can start
[importing content](basic_usage.md).

If you need additional configuration - you want to configure which referenced models are updated, how models are identified
between Wagtail instances, or which models are pulled in and imported from references on an imported page, you can
check out [how mappings and references work](how_it_works.md) and the [settings reference](settings.md).

0 comments on commit 84f991d

Please sign in to comment.