Projet

Général

Profil

0001-wip-jsonb-command.patch

Valentin Deniaud, 02 juin 2020 15:03

Télécharger (3,28 ko)

Voir les différences:

Subject: [PATCH] wip jsonb command

 .../base/management/commands/ensure_jsonb.py  | 74 +++++++++++++++++++
 1 file changed, 74 insertions(+)
 create mode 100644 passerelle/base/management/commands/ensure_jsonb.py
passerelle/base/management/commands/ensure_jsonb.py
1
from django.conf import settings
2
from django.core.management.base import BaseCommand
3
from django.db import connection
4

  
5
class Command(BaseCommand):
6

  
7
    apps_models_fields = {
8
        'passerelle.apps.atos_genesys': {
9
            'Link': ('extra',)
10
        },
11
        'passerelle.apps.base_adresse': {
12
            'AddressCacheModel': ('data',)
13
        },
14
        'passerelle.apps.cartads_cs': {
15
            'CartaDSDataCache': ('data_parameters', 'data_values'),
16
            'cartadsdossier': ('cartads_steps_cache', 'cartads_cache_infos')
17
        },
18
        'passerelle.apps.csvdatasource': {
19
            'csvdatasource': ('_dialect_options',),
20
            'TableRow': ('data',)
21
        },
22
        'passerelle.apps.gesbac': {
23
            'Form': ('demand_data', 'card_data')
24
        },
25
        'passerelle.apps.jsondatastore': {
26
            'JsonData': ('content',)
27
        },
28
        'passerelle.apps.mdel_ddpacs': {
29
            'Demand': ('data',)
30
        },
31
        'passerelle.apps.opengis': {
32
            'FeatureCache': ('data',)
33
        },
34
        'passerelle.apps.pastell': {
35
            'Pastell': ('document_fields',)
36
        },
37
        'passerelle.apps.phonecalls': {
38
            'Call': ('details',)
39
        },
40
        'passerelle.apps.sp_fr': {
41
            'Mapping': ('rules',)
42
        },
43
        'passerelle.base': {
44
            'ResourceLog': ('extra',),
45
            'Job': ('parameters', 'status_details'),
46
        },
47
        'passerelle.contrib.fake_family': {
48
            'FakeFamily': ('jsondatabase',)
49
        },
50
        'passerelle.contrib.meyzieu_newsletters': {
51
            'MeyzieuNewsletters': ('transport_titles_mapping',)
52
        },
53
        'passerelle.contrib.planitech': {
54
            'planitechconnector': ('custom_fields',)
55
        },
56
        'passerelle.contrib.teamnet_axel': {
57
            'TeamnetAxel': ('billing_regies',)
58
        },
59
    }
60

  
61
    def handle(self, *args, **options):
62
        for app, model_fields in self.apps_models_fields.items():
63
            if app not settings.INSTALLED_APPS:
64
                continue
65
            for model, fields in model_fields.items():
66
                for field_name in fields:
67
                    table_name = model._meta.db_table
68
                    field = model._meta.get_field(field_name)
69
                    _, column_name = field.get_attname_column()
70
                    with schema_editor.connection.cursor() as cursor:
71
                        cursor.execute(
72
                            'ALTER TABLE {table} ALTER COLUMN {col} TYPE jsonb USING {col}::jsonb;'
73
                            .format(table=table_name, col=column_name)
74
                        )
0
-