eea.flis.metadata

EEA Metadata models replication support


License
BSD-3-Clause
Install
pip install eea.flis.metadata==0.6.2

Documentation

Flis Metadata Client

Client for FLIS applications that require common metadata

Quick start

  1. Add flis_metadata.common and flis_metadata.client to your INSTALLED_APPS setting like this:

    INSTALLED_APPS = (
        ...
        'flis_metadata.common',
        'flis_metadata.client',
    )
    
  2. Add METADATA_REMOTE_HOST and METADATA_REMOTE_PATH into your settings file:

    METADATA_REMOTE_HOST = 'http://localhost:8000'
    METADATA_REMOTE_PATH = ''
    
  3. Run python manage.py migrate to migrate the common app.

  4. Run python manage.py sync_remote_models to sync the metadata models with the remote ones.

How to add a new model

We want to move model Foo from flis.someapp to be replicated in all FLIS apps

In this app:
  1. Add the model in common/models.py. Make sure it extends ReplicatedModel.
  2. Add urls, views and templates to edit it.
  3. Add a fixture having all instances of Foo for every FLIS app.
Note:
This data will be replicated and migrated in every app that uses this package, so make sure that the migration includes everything
  1. Update the pip package using setup.py.
In flis.someapp and other apps using this model
  1. Update eaa.flis.metadata package in requirements.txt and install it.

  2. For every relation to the Foo model:

    # add a new fake foreign key field
    x = models.ForeingKey(Foo)
    fake_x = models.ForeingKey('common.Foo')
    
    # or add a new fake many to many field
    y = models.ManyToManyField(Foo)
    fake_y = models.ManyToManyField('common.Foo')
    
  3. Add a migration to add the new fields

  4. Create a datamigration that

    1. Calls load_metadata_fixtures management command

    2. For every x copies the same information in fake_x using the instance found in common.Foo:

      obj.fake_x = orm['common.Foo'].objects.get(title=obj.x.title)
      
      # or
      
      for y in obj.y.all():
        obj.fake_y.add(orm['common.Foo'].objects.get(title=y.title)
      
  5. Remove the Foo model and x fields from flis.someapp.

  6. Create an automatic schemamigration to reflect the removals.

  7. Rename fake_x fields to x in models.py.

  8. In the migration generated at step 5 rename the fields and M2M tables from fake_x to x.

  9. Run the migration in different corner cases.

Note:
You can browse through flis.flip, flis.horizon-scanning-tool or flis.live_catalogue to see an example of such migrations.