Asterisk - The Open Source Telephony Project  21.4.1
74dc751dfe8e_more_permission_boolean_columns.py
1 """more permission boolean columns
2 
3 Revision ID: 74dc751dfe8e
4 Revises: bd335bae5d33
5 Create Date: 2024-02-27 15:31:09.458313
6 
7 """
8 
9 # revision identifiers, used by Alembic.
10 revision = '74dc751dfe8e'
11 down_revision = 'bd335bae5d33'
12 
13 import itertools
14 import operator
15 
16 from alembic import op
17 import sqlalchemy as sa
18 from sqlalchemy import case, cast, or_, text
19 from sqlalchemy.dialects.postgresql import ENUM
20 from sqlalchemy.sql import table, column
21 
22 COLUMNS = [ ('ps_aors', 'authenticate_qualify'),
23  ('ps_aors', 'remove_existing'),
24  ('ps_aors', 'support_path'),
25  ('ps_asterisk_publications', 'device_state'),
26  ('ps_asterisk_publications', 'mailbox_state'),
27  ('ps_contacts', 'authenticate_qualify'),
28  ('ps_contacts', 'prune_on_boot'),
29  ('ps_endpoint_id_ips', 'srv_lookups'),
30  ('ps_endpoints', 'accept_multiple_sdp_answers'),
31  ('ps_endpoints', 'aggregate_mwi'),
32  ('ps_endpoints', 'allow_overlap'),
33  ('ps_endpoints', 'allow_subscribe'),
34  ('ps_endpoints', 'allow_transfer'),
35  ('ps_endpoints', 'asymmetric_rtp_codec'),
36  ('ps_endpoints', 'bind_rtp_to_media_address'),
37  ('ps_endpoints', 'bundle'),
38  ('ps_endpoints', 'direct_media'),
39  ('ps_endpoints', 'disable_direct_media_on_nat'),
40  ('ps_endpoints', 'dtls_auto_generate_cert'),
41  ('ps_endpoints', 'fax_detect'),
42  ('ps_endpoints', 'follow_early_media_fork'),
43  ('ps_endpoints', 'force_avp'),
44  ('ps_endpoints', 'force_rport'),
45  ('ps_endpoints', 'g726_non_standard'),
46  ('ps_endpoints', 'ice_support'),
47  ('ps_endpoints', 'inband_progress'),
48  ('ps_endpoints', 'media_encryption_optimistic'),
49  ('ps_endpoints', 'media_use_received_transport'),
50  ('ps_endpoints', 'moh_passthrough'),
51  ('ps_endpoints', 'notify_early_inuse_ringing'),
52  ('ps_endpoints', 'one_touch_recording'),
53  ('ps_endpoints', 'preferred_codec_only'),
54  ('ps_endpoints', 'refer_blind_progress'),
55  ('ps_endpoints', 'rewrite_contact'),
56  ('ps_endpoints', 'rpid_immediate'),
57  ('ps_endpoints', 'rtcp_mux'),
58  ('ps_endpoints', 'rtp_ipv6'),
59  ('ps_endpoints', 'rtp_symmetric'),
60  ('ps_endpoints', 'send_diversion'),
61  ('ps_endpoints', 'send_pai'),
62  ('ps_endpoints', 'send_rpid'),
63  ('ps_endpoints', 'srtp_tag_32'),
64  ('ps_endpoints', 'suppress_q850_reason_headers'),
65  ('ps_endpoints', 't38_udptl'),
66  ('ps_endpoints', 't38_udptl_ipv6'),
67  ('ps_endpoints', 't38_udptl_nat'),
68  ('ps_endpoints', 'trust_id_inbound'),
69  ('ps_endpoints', 'trust_id_outbound'),
70  ('ps_endpoints', 'use_avpf'),
71  ('ps_endpoints', 'use_ptime'),
72  ('ps_endpoints', 'user_eq_phone'),
73  ('ps_endpoints', 'webrtc'),
74  ('ps_globals', 'disable_multi_domain'),
75  ('ps_globals', 'ignore_uri_user_options'),
76  ('ps_globals', 'mwi_disable_initial_unsolicited'),
77  ('ps_outbound_publishes', 'multi_user'),
78  ('ps_registrations', 'auth_rejection_permanent'),
79  ('ps_registrations', 'line'),
80  ('ps_registrations', 'support_path'),
81  ('ps_resource_list', 'full_state'),
82  ('ps_subscription_persistence', 'prune_on_boot'),
83  ('ps_systems', 'accept_multiple_sdp_answers'),
84  ('ps_systems', 'compact_headers'),
85  ('ps_systems', 'disable_tcp_switch'),
86  ('ps_systems', 'follow_early_media_fork'),
87  ('ps_transports', 'allow_reload'),
88  ('ps_transports', 'allow_wildcard_certs'),
89  ('ps_transports', 'require_client_cert'),
90  ('ps_transports', 'symmetric_transport'),
91  ('ps_transports', 'verify_client'),
92  ('ps_transports', 'verify_server') ]
93 
94 YESNO_NAME = 'yesno_values'
95 YESNO_VALUES = ['yes', 'no']
96 
97 AST_BOOL_NAME = 'ast_bool_values'
98 AST_BOOL_VALUES = [ '0', '1',
99  'off', 'on',
100  'false', 'true',
101  'no', 'yes' ]
102 
103 yesno_values = ENUM(*YESNO_VALUES, name=YESNO_NAME, create_type=False)
104 ast_bool_values = ENUM(*AST_BOOL_VALUES, name=AST_BOOL_NAME, create_type=False)
105 
106 def upgrade():
107  for table_name, column_list in itertools.groupby(COLUMNS, operator.itemgetter(0)):
108  with op.batch_alter_table(table_name) as batch_op:
109  for _, column_name in column_list:
110  batch_op.alter_column(column_name,
111  type_=ast_bool_values,
112  existing_type=yesno_values,
113  postgresql_using='"{}"::text::{}'.format(column_name, AST_BOOL_NAME))
114 
115 def downgrade():
116  for table_name, column_list in itertools.groupby(COLUMNS, operator.itemgetter(0)):
117  subject = table(table_name)
118  values_exprs = {}
119  for _, column_name in column_list:
120  subject.append_column(column(column_name))
121  values_exprs[column_name] = cast(
122  case((or_(subject.c[column_name] == text("'yes'"),
123  subject.c[column_name] == text("'1'"),
124  subject.c[column_name] == text("'on'"),
125  subject.c[column_name] == text("'true'")), text("'yes'")),
126  else_=text("'no'")),
127  ast_bool_values)
128 
129  op.execute(
130  subject.update().values(values_exprs)
131  )
132 
133  for table_name, column_list in itertools.groupby(COLUMNS, operator.itemgetter(0)):
134  with op.batch_alter_table(table_name) as batch_op:
135  for _, column_name in column_list:
136  batch_op.alter_column(column_name,
137  type_=yesno_values,
138  existing_type=ast_bool_values,
139  postgresql_using='"{}"::text::{}'.format(column_name, YESNO_NAME))