def main(argv=sys.argv): if len(argv) < 2: usage(argv) config_uri = argv[1] setup_logging(config_uri) env = bootstrap('%s#dashboard'% config_uri) settings = env.get('registry').settings engine = engine_from_config(settings, 'sa.dashboard.') DBSession.configure(bind=engine) Base.metadata.bind = engine google_opts = argv[2:] try: google_user = google_opts.pop(0) except IndexError: google_user = raw_input('Google Spreadsheet User: '******'Google Spreadsheet ID: ') google_password = getpass.getpass("Google Spreadsheet Password: ") gc = gspread.login(google_user, google_password) sht = gc.open_by_key(spreadsheet_key) worksheet = sht.get_worksheet(0) crs = worksheet.get_all_records() contracts = {} for row in crs: if not row['titolocommessa']: continue contract_uid = '%s_%s_%s' % (row['project_name'], row['titolocommessa'], row['customer_id']) contracts.setdefault(contract_uid, {'crs': []}) contracts[contract_uid]['titolocommessa'] = row['titolocommessa'] contracts[contract_uid]['nrcontratto'] = row['nrcontratto'] contracts[contract_uid]['gg'] = row['gg'] or 0 contracts[contract_uid]['amount'] = row['amount'] or 0 contracts[contract_uid]['crs'].append(row['cr_id']) contracts[contract_uid]['stato'] = map_state(row['stato']) # now we have a structure: # contracts['ContractUID'] = {'crs': ['customer_request_id_1', # 'customer_request_id_2'], # 'gg': '12'} with transaction.manager: session = DBSession() for contract_uid, opts in contracts.items(): crs = [session.query(CustomerRequest).get(a) for a in opts['crs']] crs = [a for a in crs if a] if not crs: continue contract = crs[0].contract if not contract: contract = Contract(name=opts['titolocommessa']) contract.days = opts['gg'] contract.ammount = opts['amount'] contract.contract_number = opts['nrcontratto'] contract.workflow_state = opts['stato'] for cr in crs: if not cr: continue cr.contract = contract contract.project_id = cr.project_id update_time_entries()