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
 | 
			
		||||
 | 
			
		||||
from typing import Any, Dict
 | 
			
		||||
from collections import defaultdict
 | 
			
		||||
from typing import Any, Dict, List
 | 
			
		||||
 | 
			
		||||
from civicrmapi4.civicrmapi4 import APIv4
 | 
			
		||||
 | 
			
		||||
@ -62,8 +63,7 @@ LOAD_TRIVIAL = ["FinancialType",
 | 
			
		||||
                "CustomGroup",
 | 
			
		||||
                "OptionGroup",
 | 
			
		||||
                "OptionValue",
 | 
			
		||||
                "Domain",
 | 
			
		||||
                "Contact"]
 | 
			
		||||
                "Domain",]
 | 
			
		||||
 | 
			
		||||
# 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.
 | 
			
		||||
@ -88,12 +88,28 @@ STANDIN_PAYMENT_PROCESSOR = {"id": "7",
 | 
			
		||||
                             "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:
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    words = re.findall(r'[A-Z](?:[a-z]+|[A-Z]*(?=[A-Z]|$))', instr)
 | 
			
		||||
    return 'civicrm_' + '_'.join([x.lower() for x in words])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def python_value_to_sql(val: Any) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    """
 | 
			
		||||
    if type(val) == bool:
 | 
			
		||||
        if val:
 | 
			
		||||
            return "TRUE"
 | 
			
		||||
@ -110,11 +126,29 @@ def python_value_to_sql(val: Any) -> str:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def dict_to_insert(table: str, objdict: Dict) -> str:
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    columns = tuple(x for x in objdict.keys())
 | 
			
		||||
    values = tuple(python_value_to_sql(objdict[x]) for x in columns)
 | 
			
		||||
    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:
 | 
			
		||||
    parser = argparse.ArgumentParser(prog="confdump.py",
 | 
			
		||||
@ -238,6 +272,18 @@ def main() -> int:
 | 
			
		||||
            for row in indata:
 | 
			
		||||
                query = dict_to_insert(table_name, row)
 | 
			
		||||
                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.close()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user