def auto_create_project_mappings(workspace_id: int): """ Create Project Mappings :return: mappings """ try: fyle_credentials: FyleCredential = FyleCredential.objects.get( workspace_id=workspace_id) qbo_credentials: QBOCredential = QBOCredential.objects.get( workspace_id=workspace_id) fyle_connection = FyleConnector( refresh_token=fyle_credentials.refresh_token, workspace_id=workspace_id) qbo_connection = QBOConnector(credentials_object=qbo_credentials, workspace_id=workspace_id) fyle_connection.sync_projects() qbo_connection.sync_customers() post_projects_in_batches(fyle_connection, workspace_id) except WrongParamsError as exception: logger.error( 'Error while creating projects workspace_id - %s in Fyle %s %s', workspace_id, exception.message, {'error': exception.response}) except Exception: error = traceback.format_exc() error = {'error': error} logger.error( 'Error while creating projects workspace_id - %s error: %s', workspace_id, error)
def post_projects_in_batches(fyle_connection: FyleConnector, workspace_id: int): existing_project_names = ExpenseAttribute.objects.filter( attribute_type='PROJECT', workspace_id=workspace_id).values_list('value', flat=True) qbo_attributes_count = DestinationAttribute.objects.filter( attribute_type='CUSTOMER', workspace_id=workspace_id).count() page_size = 200 for offset in range(0, qbo_attributes_count, page_size): limit = offset + page_size paginated_qbo_attributes = DestinationAttribute.objects.filter( attribute_type='CUSTOMER', workspace_id=workspace_id).order_by('value', 'id')[offset:limit] paginated_qbo_attributes = remove_duplicates(paginated_qbo_attributes) fyle_payload: List[Dict] = create_fyle_projects_payload( paginated_qbo_attributes, existing_project_names, workspace_id) if fyle_payload: fyle_connection.connection.Projects.post(fyle_payload) fyle_connection.sync_projects() Mapping.bulk_create_mappings(paginated_qbo_attributes, 'PROJECT', 'CUSTOMER', workspace_id)