Compare commits
	
		
			2 Commits
		
	
	
		
			5928295f37
			...
			3344394fbc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 3344394fbc | |||
| 7c26e31da1 | 
							
								
								
									
										52
									
								
								confdump.py
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								confdump.py
									
									
									
									
									
								
							| @ -20,7 +20,8 @@ import traceback | |||||||
|  |  | ||||||
| import MySQLdb as mysql | import MySQLdb as mysql | ||||||
|  |  | ||||||
| from typing import Any, Dict | from collections import defaultdict | ||||||
|  | from typing import Any, Dict, List | ||||||
|  |  | ||||||
| from civicrmapi4.civicrmapi4 import APIv4 | from civicrmapi4.civicrmapi4 import APIv4 | ||||||
|  |  | ||||||
| @ -62,8 +63,7 @@ LOAD_TRIVIAL = ["FinancialType", | |||||||
|                 "CustomGroup", |                 "CustomGroup", | ||||||
|                 "OptionGroup", |                 "OptionGroup", | ||||||
|                 "OptionValue", |                 "OptionValue", | ||||||
|                 "Domain", |                 "Domain",] | ||||||
|                 "Contact"] |  | ||||||
|  |  | ||||||
| # This is a payment processor we can assign contribution pages to in order for them to work. | # This is a payment processor we can assign contribution pages to in order for them to work. | ||||||
| # FIXME this seems to produce a non-working setup. | # FIXME this seems to produce a non-working setup. | ||||||
| @ -88,12 +88,28 @@ STANDIN_PAYMENT_PROCESSOR = {"id": "7", | |||||||
|                              "payment_instrument_id": "9"} |                              "payment_instrument_id": "9"} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | CUSTOM_FIELD_TYPE_MAP = { | ||||||
|  |     "String": "VARCHAR(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL", | ||||||
|  |     "Integer": "INT(11) DEFAULT NULL", | ||||||
|  |     "Int": "INT(11) DEFAULT NULL", | ||||||
|  |     "Memo": "VARCHAR(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL", | ||||||
|  |     "Date": "datetime DEFAULT NULL", | ||||||
|  |     "Boolean": "tinyint(4) DEFAULT NULL", | ||||||
|  |     "Money": "decimal(20, 2) DEFAULT NULL", | ||||||
|  |     "ContactReference": "INT(10) DEFAULT NULL" | ||||||
|  | } | ||||||
|  |  | ||||||
| def object_to_table(instr: str) -> str: | def object_to_table(instr: str) -> str: | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     """ | ||||||
|     words = re.findall(r'[A-Z](?:[a-z]+|[A-Z]*(?=[A-Z]|$))', instr) |     words = re.findall(r'[A-Z](?:[a-z]+|[A-Z]*(?=[A-Z]|$))', instr) | ||||||
|     return 'civicrm_' + '_'.join([x.lower() for x in words]) |     return 'civicrm_' + '_'.join([x.lower() for x in words]) | ||||||
|  |  | ||||||
|  |  | ||||||
| def python_value_to_sql(val: Any) -> str: | def python_value_to_sql(val: Any) -> str: | ||||||
|  |     """ | ||||||
|  |     """ | ||||||
|     if type(val) == bool: |     if type(val) == bool: | ||||||
|         if val: |         if val: | ||||||
|             return "TRUE" |             return "TRUE" | ||||||
| @ -110,11 +126,29 @@ def python_value_to_sql(val: Any) -> str: | |||||||
|  |  | ||||||
|  |  | ||||||
| def dict_to_insert(table: str, objdict: Dict) -> str: | def dict_to_insert(table: str, objdict: Dict) -> str: | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     """ | ||||||
|     columns = tuple(x for x in objdict.keys()) |     columns = tuple(x for x in objdict.keys()) | ||||||
|     values = tuple(python_value_to_sql(objdict[x]) for x in columns) |     values = tuple(python_value_to_sql(objdict[x]) for x in columns) | ||||||
|     return "REPLACE INTO {} ({}) VALUES ({});".format(table, ",".join(columns), ",".join(values)) |     return "REPLACE INTO {} ({}) VALUES ({});".format(table, ",".join(columns), ",".join(values)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def create_custom_value_table(custom_group_record: Dict, custom_value_rows: List[Dict]) -> str: | ||||||
|  |     """ | ||||||
|  |     Return a sequence of SQL commands to create the custom value table based on a civicrm_custom_group record and a | ||||||
|  |     series of value rows. | ||||||
|  |  | ||||||
|  |     """ | ||||||
|  |     fields = ",".join(["{} {}".format(x["column_name"], CUSTOM_FIELD_TYPE_MAP[x["data_type"]]) for x in custom_value_rows]) | ||||||
|  |  | ||||||
|  |     return """DROP TABLE IF EXISTS {cgr_name}; CREATE TABLE {cgr_name} ( | ||||||
|  |     id INT(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, | ||||||
|  |     entity_id int(10) unsigned NOT NULL, | ||||||
|  |     {fields}, | ||||||
|  |     UNIQUE(entity_id) | ||||||
|  |     );""".format(cgr_name=custom_group_record['table_name'], fields=fields) | ||||||
|  |  | ||||||
|  |  | ||||||
| def parse_arguments() -> argparse.Namespace: | def parse_arguments() -> argparse.Namespace: | ||||||
|     parser = argparse.ArgumentParser(prog="confdump.py", |     parser = argparse.ArgumentParser(prog="confdump.py", | ||||||
| @ -238,6 +272,18 @@ def main() -> int: | |||||||
|             for row in indata: |             for row in indata: | ||||||
|                 query = dict_to_insert(table_name, row) |                 query = dict_to_insert(table_name, row) | ||||||
|                 cursor.execute(query) |                 cursor.execute(query) | ||||||
|  |  | ||||||
|  |         # create custom field data tables | ||||||
|  |         custom_fields = defaultdict(list) | ||||||
|  |         with open((args.input / "CustomField.json")) as inf: | ||||||
|  |             for field in json.load(inf): | ||||||
|  |                 custom_fields[field["custom_group_id"]].append(field) | ||||||
|  |         with open((args.input / "CustomGroup.json")) as inf: | ||||||
|  |             custom_groups = json.load(inf) | ||||||
|  |  | ||||||
|  |         for group in custom_groups: | ||||||
|  |             cursor.execute(create_custom_value_table(group, custom_fields[group["id"]])) | ||||||
|  |  | ||||||
|         cursor.execute("SET FOREIGN_KEY_CHECKS=1;") |         cursor.execute("SET FOREIGN_KEY_CHECKS=1;") | ||||||
|         cursor.close() |         cursor.close() | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user