flowtask 5.8.4__cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flowtask/__init__.py +93 -0
- flowtask/__main__.py +38 -0
- flowtask/bots/__init__.py +6 -0
- flowtask/bots/check.py +93 -0
- flowtask/bots/codebot.py +51 -0
- flowtask/components/ASPX.py +148 -0
- flowtask/components/AddDataset.py +352 -0
- flowtask/components/Amazon.py +523 -0
- flowtask/components/AutoTask.py +314 -0
- flowtask/components/Azure.py +80 -0
- flowtask/components/AzureUsers.py +106 -0
- flowtask/components/BaseAction.py +91 -0
- flowtask/components/BaseLoop.py +198 -0
- flowtask/components/BestBuy.py +800 -0
- flowtask/components/CSVToGCS.py +120 -0
- flowtask/components/CompanyScraper/__init__.py +1 -0
- flowtask/components/CompanyScraper/parsers/__init__.py +6 -0
- flowtask/components/CompanyScraper/parsers/base.py +102 -0
- flowtask/components/CompanyScraper/parsers/explorium.py +192 -0
- flowtask/components/CompanyScraper/parsers/leadiq.py +206 -0
- flowtask/components/CompanyScraper/parsers/rocket.py +133 -0
- flowtask/components/CompanyScraper/parsers/siccode.py +109 -0
- flowtask/components/CompanyScraper/parsers/visualvisitor.py +130 -0
- flowtask/components/CompanyScraper/parsers/zoominfo.py +118 -0
- flowtask/components/CompanyScraper/scrapper.py +1054 -0
- flowtask/components/CopyTo.py +177 -0
- flowtask/components/CopyToBigQuery.py +243 -0
- flowtask/components/CopyToMongoDB.py +291 -0
- flowtask/components/CopyToPg.py +609 -0
- flowtask/components/CopyToRethink.py +207 -0
- flowtask/components/CreateGCSBucket.py +102 -0
- flowtask/components/CreateReport/CreateReport.py +228 -0
- flowtask/components/CreateReport/__init__.py +9 -0
- flowtask/components/CreateReport/charts/__init__.py +15 -0
- flowtask/components/CreateReport/charts/bar.py +51 -0
- flowtask/components/CreateReport/charts/base.py +66 -0
- flowtask/components/CreateReport/charts/pie.py +64 -0
- flowtask/components/CreateReport/utils.py +9 -0
- flowtask/components/CustomerSatisfaction.py +196 -0
- flowtask/components/DataInput.py +200 -0
- flowtask/components/DateList.py +255 -0
- flowtask/components/DbClient.py +163 -0
- flowtask/components/DialPad.py +146 -0
- flowtask/components/DocumentDBQuery.py +200 -0
- flowtask/components/DownloadFrom.py +371 -0
- flowtask/components/DownloadFromD2L.py +113 -0
- flowtask/components/DownloadFromFTP.py +181 -0
- flowtask/components/DownloadFromIMAP.py +315 -0
- flowtask/components/DownloadFromS3.py +198 -0
- flowtask/components/DownloadFromSFTP.py +265 -0
- flowtask/components/DownloadFromSharepoint.py +110 -0
- flowtask/components/DownloadFromSmartSheet.py +114 -0
- flowtask/components/DownloadS3File.py +229 -0
- flowtask/components/Dummy.py +59 -0
- flowtask/components/DuplicatePhoto.py +411 -0
- flowtask/components/EmployeeEvaluation.py +237 -0
- flowtask/components/ExecuteSQL.py +323 -0
- flowtask/components/ExtractHTML.py +178 -0
- flowtask/components/FileBase.py +178 -0
- flowtask/components/FileCopy.py +181 -0
- flowtask/components/FileDelete.py +82 -0
- flowtask/components/FileExists.py +146 -0
- flowtask/components/FileIteratorDelete.py +112 -0
- flowtask/components/FileList.py +194 -0
- flowtask/components/FileOpen.py +75 -0
- flowtask/components/FileRead.py +120 -0
- flowtask/components/FileRename.py +106 -0
- flowtask/components/FilterIf.py +284 -0
- flowtask/components/FilterRows/FilterRows.py +200 -0
- flowtask/components/FilterRows/__init__.py +10 -0
- flowtask/components/FilterRows/functions.py +4 -0
- flowtask/components/GCSToBigQuery.py +103 -0
- flowtask/components/GoogleA4.py +150 -0
- flowtask/components/GoogleGeoCoding.py +344 -0
- flowtask/components/GooglePlaces.py +315 -0
- flowtask/components/GoogleSearch.py +539 -0
- flowtask/components/HTTPClient.py +268 -0
- flowtask/components/ICIMS.py +146 -0
- flowtask/components/IF.py +179 -0
- flowtask/components/IcimsFolderCopy.py +173 -0
- flowtask/components/ImageFeatures/__init__.py +5 -0
- flowtask/components/ImageFeatures/process.py +233 -0
- flowtask/components/IteratorBase.py +251 -0
- flowtask/components/LangchainLoader/__init__.py +5 -0
- flowtask/components/LangchainLoader/loader.py +194 -0
- flowtask/components/LangchainLoader/loaders/__init__.py +22 -0
- flowtask/components/LangchainLoader/loaders/abstract.py +362 -0
- flowtask/components/LangchainLoader/loaders/basepdf.py +50 -0
- flowtask/components/LangchainLoader/loaders/docx.py +91 -0
- flowtask/components/LangchainLoader/loaders/html.py +119 -0
- flowtask/components/LangchainLoader/loaders/pdfblocks.py +146 -0
- flowtask/components/LangchainLoader/loaders/pdfmark.py +79 -0
- flowtask/components/LangchainLoader/loaders/pdftables.py +135 -0
- flowtask/components/LangchainLoader/loaders/qa.py +67 -0
- flowtask/components/LangchainLoader/loaders/txt.py +55 -0
- flowtask/components/LeadIQ.py +650 -0
- flowtask/components/Loop.py +253 -0
- flowtask/components/Lowes.py +334 -0
- flowtask/components/MS365Usage.py +156 -0
- flowtask/components/MSTeamsMessages.py +320 -0
- flowtask/components/MarketClustering.py +1051 -0
- flowtask/components/MergeFiles.py +362 -0
- flowtask/components/MilvusOutput.py +87 -0
- flowtask/components/NearByStores.py +175 -0
- flowtask/components/NetworkNinja/__init__.py +6 -0
- flowtask/components/NetworkNinja/models/__init__.py +52 -0
- flowtask/components/NetworkNinja/models/abstract.py +177 -0
- flowtask/components/NetworkNinja/models/account.py +39 -0
- flowtask/components/NetworkNinja/models/client.py +19 -0
- flowtask/components/NetworkNinja/models/district.py +14 -0
- flowtask/components/NetworkNinja/models/events.py +101 -0
- flowtask/components/NetworkNinja/models/forms.py +499 -0
- flowtask/components/NetworkNinja/models/market.py +16 -0
- flowtask/components/NetworkNinja/models/organization.py +34 -0
- flowtask/components/NetworkNinja/models/photos.py +125 -0
- flowtask/components/NetworkNinja/models/project.py +44 -0
- flowtask/components/NetworkNinja/models/region.py +28 -0
- flowtask/components/NetworkNinja/models/store.py +203 -0
- flowtask/components/NetworkNinja/models/user.py +151 -0
- flowtask/components/NetworkNinja/router.py +854 -0
- flowtask/components/Odoo.py +175 -0
- flowtask/components/OdooInjector.py +192 -0
- flowtask/components/OpenFromXML.py +126 -0
- flowtask/components/OpenWeather.py +41 -0
- flowtask/components/OpenWithBase.py +616 -0
- flowtask/components/OpenWithPandas.py +715 -0
- flowtask/components/PGPDecrypt.py +199 -0
- flowtask/components/PandasIterator.py +187 -0
- flowtask/components/PandasToFile.py +189 -0
- flowtask/components/Paradox.py +339 -0
- flowtask/components/ParamIterator.py +117 -0
- flowtask/components/ParseHTML.py +84 -0
- flowtask/components/PlacerStores.py +249 -0
- flowtask/components/Pokemon.py +507 -0
- flowtask/components/PositiveBot.py +62 -0
- flowtask/components/PowerPointSlide.py +400 -0
- flowtask/components/PrintMessage.py +127 -0
- flowtask/components/ProductCompetitors/__init__.py +5 -0
- flowtask/components/ProductCompetitors/parsers/__init__.py +7 -0
- flowtask/components/ProductCompetitors/parsers/base.py +72 -0
- flowtask/components/ProductCompetitors/parsers/bestbuy.py +86 -0
- flowtask/components/ProductCompetitors/parsers/lowes.py +103 -0
- flowtask/components/ProductCompetitors/scrapper.py +155 -0
- flowtask/components/ProductCompliant.py +169 -0
- flowtask/components/ProductInfo/__init__.py +1 -0
- flowtask/components/ProductInfo/parsers/__init__.py +5 -0
- flowtask/components/ProductInfo/parsers/base.py +83 -0
- flowtask/components/ProductInfo/parsers/brother.py +97 -0
- flowtask/components/ProductInfo/parsers/canon.py +167 -0
- flowtask/components/ProductInfo/parsers/epson.py +118 -0
- flowtask/components/ProductInfo/parsers/hp.py +131 -0
- flowtask/components/ProductInfo/parsers/samsung.py +97 -0
- flowtask/components/ProductInfo/scraper.py +319 -0
- flowtask/components/ProductPricing.py +118 -0
- flowtask/components/QS.py +261 -0
- flowtask/components/QSBase.py +201 -0
- flowtask/components/QueryIterator.py +273 -0
- flowtask/components/QueryToInsert.py +327 -0
- flowtask/components/QueryToPandas.py +432 -0
- flowtask/components/RESTClient.py +195 -0
- flowtask/components/RethinkDBQuery.py +189 -0
- flowtask/components/Rsync.py +74 -0
- flowtask/components/RunSSH.py +59 -0
- flowtask/components/RunShell.py +71 -0
- flowtask/components/SalesForce.py +20 -0
- flowtask/components/SaveImageBank/__init__.py +257 -0
- flowtask/components/SchedulingVisits.py +592 -0
- flowtask/components/ScrapPage.py +216 -0
- flowtask/components/ScrapSearch.py +79 -0
- flowtask/components/SendNotify.py +257 -0
- flowtask/components/SentimentAnalysis.py +694 -0
- flowtask/components/ServiceScrapper/__init__.py +5 -0
- flowtask/components/ServiceScrapper/parsers/__init__.py +1 -0
- flowtask/components/ServiceScrapper/parsers/base.py +94 -0
- flowtask/components/ServiceScrapper/parsers/costco.py +93 -0
- flowtask/components/ServiceScrapper/scrapper.py +199 -0
- flowtask/components/SetVariables.py +156 -0
- flowtask/components/SubTask.py +182 -0
- flowtask/components/SuiteCRM.py +48 -0
- flowtask/components/Switch.py +175 -0
- flowtask/components/TableBase.py +148 -0
- flowtask/components/TableDelete.py +312 -0
- flowtask/components/TableInput.py +143 -0
- flowtask/components/TableOutput/TableOutput.py +384 -0
- flowtask/components/TableOutput/__init__.py +3 -0
- flowtask/components/TableSchema.py +534 -0
- flowtask/components/Target.py +223 -0
- flowtask/components/ThumbnailGenerator.py +156 -0
- flowtask/components/ToPandas.py +67 -0
- flowtask/components/TransformRows/TransformRows.py +507 -0
- flowtask/components/TransformRows/__init__.py +9 -0
- flowtask/components/TransformRows/functions.py +559 -0
- flowtask/components/TransposeRows.py +176 -0
- flowtask/components/UPCDatabase.py +86 -0
- flowtask/components/UnGzip.py +171 -0
- flowtask/components/Uncompress.py +172 -0
- flowtask/components/UniqueRows.py +126 -0
- flowtask/components/Unzip.py +107 -0
- flowtask/components/UpdateOperationalVars.py +147 -0
- flowtask/components/UploadTo.py +299 -0
- flowtask/components/UploadToS3.py +136 -0
- flowtask/components/UploadToSFTP.py +160 -0
- flowtask/components/UploadToSharepoint.py +205 -0
- flowtask/components/UserFunc.py +122 -0
- flowtask/components/VivaTracker.py +140 -0
- flowtask/components/WSDLClient.py +123 -0
- flowtask/components/Wait.py +18 -0
- flowtask/components/Walmart.py +199 -0
- flowtask/components/Workplace.py +134 -0
- flowtask/components/XMLToPandas.py +267 -0
- flowtask/components/Zammad/__init__.py +41 -0
- flowtask/components/Zammad/models.py +0 -0
- flowtask/components/ZoomInfoScraper.py +409 -0
- flowtask/components/__init__.py +104 -0
- flowtask/components/abstract.py +18 -0
- flowtask/components/flow.py +530 -0
- flowtask/components/google.py +335 -0
- flowtask/components/group.py +221 -0
- flowtask/components/py.typed +0 -0
- flowtask/components/reviewscrap.py +132 -0
- flowtask/components/tAutoincrement.py +117 -0
- flowtask/components/tConcat.py +109 -0
- flowtask/components/tExplode.py +119 -0
- flowtask/components/tFilter.py +184 -0
- flowtask/components/tGroup.py +236 -0
- flowtask/components/tJoin.py +270 -0
- flowtask/components/tMap/__init__.py +9 -0
- flowtask/components/tMap/functions.py +54 -0
- flowtask/components/tMap/tMap.py +450 -0
- flowtask/components/tMelt.py +112 -0
- flowtask/components/tMerge.py +114 -0
- flowtask/components/tOrder.py +93 -0
- flowtask/components/tPandas.py +94 -0
- flowtask/components/tPivot.py +71 -0
- flowtask/components/tPluckCols.py +76 -0
- flowtask/components/tUnnest.py +82 -0
- flowtask/components/user.py +401 -0
- flowtask/conf.py +457 -0
- flowtask/download.py +102 -0
- flowtask/events/__init__.py +11 -0
- flowtask/events/events/__init__.py +20 -0
- flowtask/events/events/abstract.py +95 -0
- flowtask/events/events/alerts/__init__.py +362 -0
- flowtask/events/events/alerts/colfunctions.py +131 -0
- flowtask/events/events/alerts/functions.py +158 -0
- flowtask/events/events/dummy.py +12 -0
- flowtask/events/events/exec.py +124 -0
- flowtask/events/events/file/__init__.py +7 -0
- flowtask/events/events/file/base.py +51 -0
- flowtask/events/events/file/copy.py +23 -0
- flowtask/events/events/file/delete.py +16 -0
- flowtask/events/events/interfaces/__init__.py +9 -0
- flowtask/events/events/interfaces/client.py +67 -0
- flowtask/events/events/interfaces/credentials.py +28 -0
- flowtask/events/events/interfaces/notifications.py +58 -0
- flowtask/events/events/jira.py +122 -0
- flowtask/events/events/log.py +26 -0
- flowtask/events/events/logerr.py +52 -0
- flowtask/events/events/notify.py +59 -0
- flowtask/events/events/notify_event.py +160 -0
- flowtask/events/events/publish.py +54 -0
- flowtask/events/events/sendfile.py +104 -0
- flowtask/events/events/task.py +97 -0
- flowtask/events/events/teams.py +98 -0
- flowtask/events/events/webhook.py +58 -0
- flowtask/events/manager.py +287 -0
- flowtask/exceptions.c +39393 -0
- flowtask/exceptions.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/extensions/__init__.py +3 -0
- flowtask/extensions/abstract.py +82 -0
- flowtask/extensions/logging/__init__.py +65 -0
- flowtask/hooks/__init__.py +9 -0
- flowtask/hooks/actions/__init__.py +22 -0
- flowtask/hooks/actions/abstract.py +66 -0
- flowtask/hooks/actions/dummy.py +23 -0
- flowtask/hooks/actions/jira.py +74 -0
- flowtask/hooks/actions/rest.py +320 -0
- flowtask/hooks/actions/sampledata.py +37 -0
- flowtask/hooks/actions/sensor.py +23 -0
- flowtask/hooks/actions/task.py +9 -0
- flowtask/hooks/actions/ticket.py +37 -0
- flowtask/hooks/actions/zammad.py +55 -0
- flowtask/hooks/hook.py +62 -0
- flowtask/hooks/models.py +17 -0
- flowtask/hooks/service.py +187 -0
- flowtask/hooks/step.py +91 -0
- flowtask/hooks/types/__init__.py +23 -0
- flowtask/hooks/types/base.py +129 -0
- flowtask/hooks/types/brokers/__init__.py +11 -0
- flowtask/hooks/types/brokers/base.py +54 -0
- flowtask/hooks/types/brokers/mqtt.py +35 -0
- flowtask/hooks/types/brokers/rabbitmq.py +82 -0
- flowtask/hooks/types/brokers/redis.py +83 -0
- flowtask/hooks/types/brokers/sqs.py +44 -0
- flowtask/hooks/types/fs.py +232 -0
- flowtask/hooks/types/http.py +49 -0
- flowtask/hooks/types/imap.py +200 -0
- flowtask/hooks/types/jira.py +279 -0
- flowtask/hooks/types/mail.py +205 -0
- flowtask/hooks/types/postgres.py +98 -0
- flowtask/hooks/types/responses/__init__.py +8 -0
- flowtask/hooks/types/responses/base.py +5 -0
- flowtask/hooks/types/sharepoint.py +288 -0
- flowtask/hooks/types/ssh.py +141 -0
- flowtask/hooks/types/tagged.py +59 -0
- flowtask/hooks/types/upload.py +85 -0
- flowtask/hooks/types/watch.py +71 -0
- flowtask/hooks/types/web.py +36 -0
- flowtask/interfaces/AzureClient.py +137 -0
- flowtask/interfaces/AzureGraph.py +839 -0
- flowtask/interfaces/Boto3Client.py +326 -0
- flowtask/interfaces/DropboxClient.py +173 -0
- flowtask/interfaces/ExcelHandler.py +94 -0
- flowtask/interfaces/FTPClient.py +131 -0
- flowtask/interfaces/GoogleCalendar.py +201 -0
- flowtask/interfaces/GoogleClient.py +133 -0
- flowtask/interfaces/GoogleDrive.py +127 -0
- flowtask/interfaces/GoogleGCS.py +89 -0
- flowtask/interfaces/GoogleGeocoding.py +93 -0
- flowtask/interfaces/GoogleLang.py +114 -0
- flowtask/interfaces/GooglePub.py +61 -0
- flowtask/interfaces/GoogleSheet.py +68 -0
- flowtask/interfaces/IMAPClient.py +137 -0
- flowtask/interfaces/O365Calendar.py +113 -0
- flowtask/interfaces/O365Client.py +220 -0
- flowtask/interfaces/OneDrive.py +284 -0
- flowtask/interfaces/Outlook.py +155 -0
- flowtask/interfaces/ParrotBot.py +130 -0
- flowtask/interfaces/SSHClient.py +378 -0
- flowtask/interfaces/Sharepoint.py +496 -0
- flowtask/interfaces/__init__.py +36 -0
- flowtask/interfaces/azureauth.py +119 -0
- flowtask/interfaces/cache.py +201 -0
- flowtask/interfaces/client.py +82 -0
- flowtask/interfaces/compress.py +525 -0
- flowtask/interfaces/credentials.py +124 -0
- flowtask/interfaces/d2l.py +239 -0
- flowtask/interfaces/databases/__init__.py +5 -0
- flowtask/interfaces/databases/db.py +223 -0
- flowtask/interfaces/databases/documentdb.py +55 -0
- flowtask/interfaces/databases/rethink.py +39 -0
- flowtask/interfaces/dataframes/__init__.py +11 -0
- flowtask/interfaces/dataframes/abstract.py +21 -0
- flowtask/interfaces/dataframes/arrow.py +71 -0
- flowtask/interfaces/dataframes/dt.py +69 -0
- flowtask/interfaces/dataframes/pandas.py +167 -0
- flowtask/interfaces/dataframes/polars.py +60 -0
- flowtask/interfaces/db.py +263 -0
- flowtask/interfaces/env.py +46 -0
- flowtask/interfaces/func.py +137 -0
- flowtask/interfaces/http.py +1780 -0
- flowtask/interfaces/locale.py +40 -0
- flowtask/interfaces/log.py +75 -0
- flowtask/interfaces/mask.py +143 -0
- flowtask/interfaces/notification.py +154 -0
- flowtask/interfaces/playwright.py +339 -0
- flowtask/interfaces/powerpoint.py +368 -0
- flowtask/interfaces/py.typed +0 -0
- flowtask/interfaces/qs.py +376 -0
- flowtask/interfaces/result.py +87 -0
- flowtask/interfaces/selenium_service.py +779 -0
- flowtask/interfaces/smartsheet.py +154 -0
- flowtask/interfaces/stat.py +39 -0
- flowtask/interfaces/task.py +96 -0
- flowtask/interfaces/template.py +118 -0
- flowtask/interfaces/vectorstores/__init__.py +1 -0
- flowtask/interfaces/vectorstores/abstract.py +133 -0
- flowtask/interfaces/vectorstores/milvus.py +669 -0
- flowtask/interfaces/zammad.py +107 -0
- flowtask/models.py +193 -0
- flowtask/parsers/__init__.py +15 -0
- flowtask/parsers/_yaml.c +11978 -0
- flowtask/parsers/_yaml.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/argparser.py +235 -0
- flowtask/parsers/base.c +15155 -0
- flowtask/parsers/base.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/json.c +11968 -0
- flowtask/parsers/json.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/maps.py +49 -0
- flowtask/parsers/toml.c +11968 -0
- flowtask/parsers/toml.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/plugins/__init__.py +16 -0
- flowtask/plugins/components/__init__.py +0 -0
- flowtask/plugins/handler/__init__.py +45 -0
- flowtask/plugins/importer.py +31 -0
- flowtask/plugins/sources/__init__.py +0 -0
- flowtask/runner.py +283 -0
- flowtask/scheduler/__init__.py +9 -0
- flowtask/scheduler/functions.py +493 -0
- flowtask/scheduler/handlers/__init__.py +8 -0
- flowtask/scheduler/handlers/manager.py +504 -0
- flowtask/scheduler/handlers/models.py +58 -0
- flowtask/scheduler/handlers/service.py +72 -0
- flowtask/scheduler/notifications.py +65 -0
- flowtask/scheduler/scheduler.py +993 -0
- flowtask/services/__init__.py +0 -0
- flowtask/services/bots/__init__.py +0 -0
- flowtask/services/bots/telegram.py +264 -0
- flowtask/services/files/__init__.py +11 -0
- flowtask/services/files/manager.py +522 -0
- flowtask/services/files/model.py +37 -0
- flowtask/services/files/service.py +767 -0
- flowtask/services/jira/__init__.py +3 -0
- flowtask/services/jira/jira_actions.py +191 -0
- flowtask/services/tasks/__init__.py +13 -0
- flowtask/services/tasks/launcher.py +213 -0
- flowtask/services/tasks/manager.py +323 -0
- flowtask/services/tasks/service.py +275 -0
- flowtask/services/tasks/task_manager.py +376 -0
- flowtask/services/tasks/tasks.py +155 -0
- flowtask/storages/__init__.py +16 -0
- flowtask/storages/exceptions.py +12 -0
- flowtask/storages/files/__init__.py +8 -0
- flowtask/storages/files/abstract.py +29 -0
- flowtask/storages/files/filesystem.py +66 -0
- flowtask/storages/tasks/__init__.py +19 -0
- flowtask/storages/tasks/abstract.py +26 -0
- flowtask/storages/tasks/database.py +33 -0
- flowtask/storages/tasks/filesystem.py +108 -0
- flowtask/storages/tasks/github.py +119 -0
- flowtask/storages/tasks/memory.py +45 -0
- flowtask/storages/tasks/row.py +25 -0
- flowtask/tasks/__init__.py +0 -0
- flowtask/tasks/abstract.py +526 -0
- flowtask/tasks/command.py +118 -0
- flowtask/tasks/pile.py +486 -0
- flowtask/tasks/py.typed +0 -0
- flowtask/tasks/task.py +778 -0
- flowtask/template/__init__.py +161 -0
- flowtask/tests.py +257 -0
- flowtask/types/__init__.py +8 -0
- flowtask/types/typedefs.c +11347 -0
- flowtask/types/typedefs.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/__init__.py +24 -0
- flowtask/utils/constants.py +117 -0
- flowtask/utils/encoders.py +21 -0
- flowtask/utils/executor.py +112 -0
- flowtask/utils/functions.cpp +14280 -0
- flowtask/utils/functions.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/json.cpp +13349 -0
- flowtask/utils/json.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/mail.py +63 -0
- flowtask/utils/parseqs.c +13324 -0
- flowtask/utils/parserqs.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/stats.py +308 -0
- flowtask/utils/transformations.py +74 -0
- flowtask/utils/uv.py +12 -0
- flowtask/utils/validators.py +97 -0
- flowtask/version.py +11 -0
- flowtask-5.8.4.dist-info/LICENSE +201 -0
- flowtask-5.8.4.dist-info/METADATA +209 -0
- flowtask-5.8.4.dist-info/RECORD +470 -0
- flowtask-5.8.4.dist-info/WHEEL +6 -0
- flowtask-5.8.4.dist-info/entry_points.txt +3 -0
- flowtask-5.8.4.dist-info/top_level.txt +2 -0
- plugins/components/CreateQR.py +39 -0
- plugins/components/TestComponent.py +28 -0
- plugins/components/Use1.py +13 -0
- plugins/components/Workplace.py +117 -0
- plugins/components/__init__.py +3 -0
- plugins/sources/__init__.py +0 -0
- plugins/sources/get_populartimes.py +78 -0
- plugins/sources/google.py +150 -0
- plugins/sources/hubspot.py +679 -0
- plugins/sources/icims.py +679 -0
- plugins/sources/mobileinsight.py +501 -0
- plugins/sources/newrelic.py +262 -0
- plugins/sources/uap.py +268 -0
- plugins/sources/venu.py +244 -0
- plugins/sources/vocinity.py +314 -0
@@ -0,0 +1,679 @@
|
|
1
|
+
import logging
|
2
|
+
import rapidjson
|
3
|
+
from time import sleep
|
4
|
+
from .rest import restSource
|
5
|
+
from hubspot import HubSpot
|
6
|
+
from urllib.parse import urlencode
|
7
|
+
from querysource.exceptions import *
|
8
|
+
from asyncdb.exceptions import ProviderError, NoDataFound
|
9
|
+
from querysource.exceptions import DriverError
|
10
|
+
from urllib.parse import urlencode
|
11
|
+
|
12
|
+
class hubspot(restSource):
|
13
|
+
"""
|
14
|
+
HubSpot CRM
|
15
|
+
API for integration with CRM HubSpot
|
16
|
+
"""
|
17
|
+
base_url: str = 'https://api.hubapi.com'
|
18
|
+
method: str = 'GET'
|
19
|
+
timeout: int = 30
|
20
|
+
type: str = None
|
21
|
+
auth_type: str = 'api_key'
|
22
|
+
auth: dict = {
|
23
|
+
"API-Key": None
|
24
|
+
}
|
25
|
+
|
26
|
+
def __init__(self, definition=None, params: dict = {}, **kwargs):
|
27
|
+
super(hubspot, self).__init__(definition, params, **kwargs)
|
28
|
+
|
29
|
+
try:
|
30
|
+
self.type = definition.params['type']
|
31
|
+
except (ValueError, AttributeError):
|
32
|
+
self.type = None
|
33
|
+
|
34
|
+
if 'type' in self._params:
|
35
|
+
self.type = self._params['type']
|
36
|
+
del self._params['type']
|
37
|
+
|
38
|
+
if 'api_key' in self._params:
|
39
|
+
self._params['hapikey'] = self._params['api_key']
|
40
|
+
del self._params['api_key']
|
41
|
+
else:
|
42
|
+
self._params['hapikey'] = self._env.get('HUBSPOT_API_KEY')
|
43
|
+
if not self._params['hapikey']:
|
44
|
+
try:
|
45
|
+
self._params['hapikey'] = definition.params['api_key']
|
46
|
+
except (ValueError, AttributeError):
|
47
|
+
raise ValueError("HubSpot: Missing API Key")
|
48
|
+
|
49
|
+
# self._params = params
|
50
|
+
self._args = kwargs
|
51
|
+
|
52
|
+
if self.type == 'campaigns':
|
53
|
+
self.url = self.base_url + '/email/public/v1/campaigns/by-id'
|
54
|
+
elif self.type == 'campaign':
|
55
|
+
try:
|
56
|
+
self._args['campaign_id'] = self._params['campaign_id']
|
57
|
+
del self._params['campaign_id']
|
58
|
+
except (KeyError, AttributeError):
|
59
|
+
raise ValueError("HubSpot: Missing Email Campaign ID")
|
60
|
+
self.url = self.base_url + '/email/public/v1/campaigns/{campaign_id}'
|
61
|
+
elif self.type == 'active_campaigns':
|
62
|
+
self.url = self.base_url + '/email/public/v1/campaigns'
|
63
|
+
elif self.type == 'marketing_email_stats':
|
64
|
+
self._params['limit'] = 100
|
65
|
+
self.url = self.base_url + '/marketing-emails/v1/emails/with-statistics'
|
66
|
+
elif self.type == 'engagements':
|
67
|
+
self._params['limit'] = 250
|
68
|
+
self.url = self.base_url + '/engagements/v1/engagements/paged'
|
69
|
+
elif self.type == 'active_engagements':
|
70
|
+
self._params['limit'] = 250
|
71
|
+
self.url = self.base_url + '/engagements/v1/engagements/recent/modified'
|
72
|
+
elif self.type == 'engagement':
|
73
|
+
try:
|
74
|
+
self._args['engagement_id'] = self._params['engagement_id']
|
75
|
+
del self._params['engagement_id']
|
76
|
+
except (KeyError, AttributeError):
|
77
|
+
raise ValueError("HubSpot: Missing Engagement ID")
|
78
|
+
self.url = self.base_url + '/engagements/v1/engagements/{engagement_id}'
|
79
|
+
elif self.type == 'email_events':
|
80
|
+
self.url = self.base_url + '/email/public/v1/events'
|
81
|
+
elif self.type == 'companies':
|
82
|
+
self.url = self.base_url + '/companies/v2/companies/paged'
|
83
|
+
elif self.type == 'company':
|
84
|
+
self.url = self.base_url + '/companies/v2/companies/{companyId}'
|
85
|
+
try:
|
86
|
+
self._args['companyId'] = self._params['companyId']
|
87
|
+
del self._params['companyId']
|
88
|
+
except (KeyError, AttributeError):
|
89
|
+
raise ValueError("HubSpot: Missing Company ID")
|
90
|
+
elif self.type == 'contacts':
|
91
|
+
self.url = self.base_url + '/contacts/v1/lists/all/contacts/all'
|
92
|
+
self._params['count'] = 100
|
93
|
+
self._params['showListMemberships'] = True
|
94
|
+
elif self.type == 'contact':
|
95
|
+
self.url = self.base_url + '/contacts/v1/contact/vid/{vid}/profile'
|
96
|
+
self._params['showListMemberships'] = True
|
97
|
+
try:
|
98
|
+
self._args['vid'] = self._params['vid']
|
99
|
+
del self._params['vid']
|
100
|
+
except (KeyError, AttributeError):
|
101
|
+
raise ValueError("HubSpot: Missing User VID ID")
|
102
|
+
elif self.type == 'company_contacts':
|
103
|
+
self.url = self.base_url + '/companies/v2/companies/{companyId}/contacts'
|
104
|
+
self._params['count'] = 100
|
105
|
+
try:
|
106
|
+
self._args['companyId'] = self._params['companyId']
|
107
|
+
del self._params['companyId']
|
108
|
+
except (KeyError, AttributeError):
|
109
|
+
raise ValueError("HubSpot: Missing Company ID")
|
110
|
+
elif self.type == 'contact_by_email':
|
111
|
+
self.url = self.base_url + '/contacts/v1/contact/email/{email}/profile'
|
112
|
+
self.type = 'contact'
|
113
|
+
elif self.type == 'companies_list':
|
114
|
+
self.url = self.base_url + '/crm/v3/objects/companies'
|
115
|
+
self._params['limit'] = 100
|
116
|
+
elif self.type == 'contacts_list':
|
117
|
+
self.url = self.base_url + '/crm/v3/objects/contacts'
|
118
|
+
self._params['limit'] = 100
|
119
|
+
|
120
|
+
async def marketing_email_stats(self):
|
121
|
+
"""marketing_email_stats.
|
122
|
+
|
123
|
+
Get the statistics for all marketing emails.
|
124
|
+
"""
|
125
|
+
self.method = 'GET'
|
126
|
+
self._params['limit'] = 100
|
127
|
+
self.url = self.base_url + '/marketing-emails/v1/emails/with-statistics'
|
128
|
+
self.type = 'marketing_email_stats'
|
129
|
+
try:
|
130
|
+
self._result = await self.query()
|
131
|
+
return self._result
|
132
|
+
except Exception as err:
|
133
|
+
logging.exception(err)
|
134
|
+
raise
|
135
|
+
|
136
|
+
async def social_media_channels(self):
|
137
|
+
"""Social media Channels.
|
138
|
+
|
139
|
+
Get Publishing channels.
|
140
|
+
"""
|
141
|
+
self.method = 'GET'
|
142
|
+
self.url = self.base_url + '/broadcast/v1/channels/setting/publish/current'
|
143
|
+
self.type = 'social_media'
|
144
|
+
try:
|
145
|
+
self._result = await self.query()
|
146
|
+
return self._result
|
147
|
+
except Exception as err:
|
148
|
+
logging.exception(err)
|
149
|
+
raise
|
150
|
+
|
151
|
+
async def broadcasts(self):
|
152
|
+
self.method = 'GET'
|
153
|
+
self.url = self.base_url + '/broadcast/v1/broadcasts'
|
154
|
+
self.type = 'social_media'
|
155
|
+
try:
|
156
|
+
self._result = await self.query()
|
157
|
+
return self._result
|
158
|
+
except Exception as err:
|
159
|
+
logging.exception(err)
|
160
|
+
raise
|
161
|
+
|
162
|
+
async def engagements(self):
|
163
|
+
"""engagements.
|
164
|
+
|
165
|
+
get all engagements in an account.
|
166
|
+
"""
|
167
|
+
self.method = 'GET'
|
168
|
+
self._params['limit'] = 250
|
169
|
+
self.url = self.base_url + '/engagements/v1/engagements/paged'
|
170
|
+
self.type = 'engagements'
|
171
|
+
try:
|
172
|
+
self._result = await self.query()
|
173
|
+
return self._result
|
174
|
+
except Exception as err:
|
175
|
+
logging.exception(err)
|
176
|
+
raise
|
177
|
+
|
178
|
+
async def active_engagements(self):
|
179
|
+
"""engagements.
|
180
|
+
|
181
|
+
get all engagements in an account.
|
182
|
+
"""
|
183
|
+
self.method = 'GET'
|
184
|
+
self._params['limit'] = 250
|
185
|
+
self.url = self.base_url + '/engagements/v1/engagements/recent/modified'
|
186
|
+
self.type = 'engagements'
|
187
|
+
try:
|
188
|
+
self._result = await self.query()
|
189
|
+
return self._result
|
190
|
+
except Exception as err:
|
191
|
+
logging.exception(err)
|
192
|
+
raise
|
193
|
+
|
194
|
+
async def engagement(self):
|
195
|
+
"""engagement.
|
196
|
+
|
197
|
+
get an engagement (a task or activity) for a CRM record in HubSpot.
|
198
|
+
"""
|
199
|
+
self.method = 'GET'
|
200
|
+
try:
|
201
|
+
if 'engagement_id' not in self._args:
|
202
|
+
self._args['engagement_id'] = self._params['engagement_id']
|
203
|
+
del self._params['engagement_id']
|
204
|
+
except (KeyError, AttributeError):
|
205
|
+
raise ValueError("HubSpot: Missing Engagement ID")
|
206
|
+
self.url = self.base_url + '/engagements/v1/engagements/{engagement_id}'
|
207
|
+
self.type = 'engagement'
|
208
|
+
try:
|
209
|
+
self._result = await self.query()
|
210
|
+
return self._result
|
211
|
+
except Exception as err:
|
212
|
+
logging.exception(err)
|
213
|
+
raise
|
214
|
+
|
215
|
+
async def owner(self):
|
216
|
+
"""campaigns.
|
217
|
+
|
218
|
+
Get information about a Campaign
|
219
|
+
"""
|
220
|
+
self.method = 'GET'
|
221
|
+
self.url = self.base_url + '/owners/v2/owners/{ownerId}'
|
222
|
+
self.type = 'owner'
|
223
|
+
try:
|
224
|
+
if 'ownerId' not in self._args:
|
225
|
+
self._args['ownerId'] = self._params['ownerId']
|
226
|
+
del self._params['ownerId']
|
227
|
+
except (KeyError, AttributeError):
|
228
|
+
raise ValueError("HubSpot: Missing Owner ID")
|
229
|
+
try:
|
230
|
+
self._result = await self.query()
|
231
|
+
return self._result
|
232
|
+
except Exception as err:
|
233
|
+
logging.exception(err)
|
234
|
+
raise
|
235
|
+
|
236
|
+
async def campaign(self):
|
237
|
+
"""campaigns.
|
238
|
+
|
239
|
+
Get information about a Campaign
|
240
|
+
"""
|
241
|
+
self.method = 'GET'
|
242
|
+
self.url = self.base_url + '/email/public/v1/campaigns/{campaign_id}'
|
243
|
+
self.type = 'campaign'
|
244
|
+
try:
|
245
|
+
if 'campaign_id' not in self._args:
|
246
|
+
self._args['campaign_id'] = self._params['campaign_id']
|
247
|
+
del self._params['campaign_id']
|
248
|
+
except (KeyError, AttributeError):
|
249
|
+
raise ValueError("HubSpot: Missing Email Campaign ID")
|
250
|
+
try:
|
251
|
+
self._result = await self.query()
|
252
|
+
return self._result
|
253
|
+
except Exception as err:
|
254
|
+
logging.exception(err)
|
255
|
+
raise
|
256
|
+
|
257
|
+
async def campaigns(self):
|
258
|
+
"""campaigns.
|
259
|
+
|
260
|
+
Get all the campaigns in a given portal.
|
261
|
+
"""
|
262
|
+
self.method = 'GET'
|
263
|
+
self.url = self.base_url + '/email/public/v1/campaigns/by-id'
|
264
|
+
self.type = 'active_campaigns'
|
265
|
+
try:
|
266
|
+
self._result = await self.query()
|
267
|
+
return self._result
|
268
|
+
except Exception as err:
|
269
|
+
logging.exception(err)
|
270
|
+
raise
|
271
|
+
|
272
|
+
async def email_events(self):
|
273
|
+
"""email_events.
|
274
|
+
|
275
|
+
query the event log for events.
|
276
|
+
"""
|
277
|
+
self.method = 'GET'
|
278
|
+
self.url = self.base_url + '/email/public/v1/events'
|
279
|
+
self.type = 'email_events'
|
280
|
+
try:
|
281
|
+
self._params['campaignId'] = self._params['campaign_id']
|
282
|
+
del self._params['campaign_id']
|
283
|
+
except (KeyError, AttributeError):
|
284
|
+
raise ValueError("HubSpot: Missing Email Campaign ID")
|
285
|
+
try:
|
286
|
+
self._result = await self.query()
|
287
|
+
return self._result
|
288
|
+
except Exception as err:
|
289
|
+
logging.exception(err)
|
290
|
+
raise
|
291
|
+
|
292
|
+
async def active_campaigns(self):
|
293
|
+
"""active_campaigns.
|
294
|
+
|
295
|
+
Get all the active campaigns in a given portal.
|
296
|
+
"""
|
297
|
+
self.method = 'GET'
|
298
|
+
self.url = self.base_url + '/email/public/v1/campaigns'
|
299
|
+
self.type = 'active_campaigns'
|
300
|
+
try:
|
301
|
+
self._result = await self.query()
|
302
|
+
return self._result
|
303
|
+
except Exception as err:
|
304
|
+
logging.exception(err)
|
305
|
+
raise
|
306
|
+
|
307
|
+
async def companies(self):
|
308
|
+
"""companies.
|
309
|
+
|
310
|
+
Get all companies in the HubSpot account.
|
311
|
+
"""
|
312
|
+
self.method = 'GET'
|
313
|
+
self.url = self.base_url + '/companies/v2/companies/paged'
|
314
|
+
self.type = 'companies'
|
315
|
+
self._params['limit'] = 100
|
316
|
+
try:
|
317
|
+
self._result = await self.query()
|
318
|
+
return self._result
|
319
|
+
except Exception as err:
|
320
|
+
logging.exception(err)
|
321
|
+
raise
|
322
|
+
|
323
|
+
async def companies_list(self):
|
324
|
+
"""companies_list.
|
325
|
+
|
326
|
+
Get all companies in the HubSpot account (api v3).
|
327
|
+
"""
|
328
|
+
self.method = 'GET'
|
329
|
+
self.url = self.base_url + '/crm/v3/objects/companies'
|
330
|
+
self.type = 'companies_list'
|
331
|
+
self._params['limit'] = 100
|
332
|
+
try:
|
333
|
+
self._result = await self.query()
|
334
|
+
return self._result
|
335
|
+
except Exception as err:
|
336
|
+
logging.exception(err)
|
337
|
+
raise
|
338
|
+
|
339
|
+
async def company(self):
|
340
|
+
"""company.
|
341
|
+
|
342
|
+
Get all information about a Company
|
343
|
+
"""
|
344
|
+
self.method = 'GET'
|
345
|
+
self.url = self.base_url + '/companies/v2/companies/{companyId}'
|
346
|
+
self.type = 'company'
|
347
|
+
try:
|
348
|
+
if 'company' not in self._args:
|
349
|
+
self._args['companyId'] = self._params['companyId']
|
350
|
+
del self._params['companyId']
|
351
|
+
except (KeyError, AttributeError):
|
352
|
+
raise ValueError("HubSpot: Missing Company ID")
|
353
|
+
try:
|
354
|
+
self._result = await self.query()
|
355
|
+
return self._result
|
356
|
+
except Exception as err:
|
357
|
+
logging.exception(err)
|
358
|
+
raise
|
359
|
+
|
360
|
+
async def events(self):
|
361
|
+
"""events.
|
362
|
+
|
363
|
+
Get all events on a given portal.
|
364
|
+
"""
|
365
|
+
self.method = 'GET'
|
366
|
+
self.url = self.base_url + '/reports/v2/events'
|
367
|
+
self.type = 'events'
|
368
|
+
try:
|
369
|
+
self._result = await self.query()
|
370
|
+
return self._result
|
371
|
+
except Exception as err:
|
372
|
+
logging.exception(err)
|
373
|
+
raise
|
374
|
+
|
375
|
+
async def event(self):
|
376
|
+
"""event.
|
377
|
+
|
378
|
+
Given an event, returns a specific event definition in a given portal.
|
379
|
+
"""
|
380
|
+
self.method = 'GET'
|
381
|
+
self.url = self.base_url + '/reports/v2/events/{event_id}'
|
382
|
+
self.type = 'event'
|
383
|
+
try:
|
384
|
+
self._args['event_id'] = self._params['event_id']
|
385
|
+
del self._params['event_id']
|
386
|
+
except (KeyError, AttributeError):
|
387
|
+
raise ValueError("HubSpot: Missing Event ID")
|
388
|
+
try:
|
389
|
+
self._result = await self.query()
|
390
|
+
return self._result
|
391
|
+
except Exception as err:
|
392
|
+
logging.exception(err)
|
393
|
+
raise
|
394
|
+
|
395
|
+
async def contacts(self):
|
396
|
+
"""user contacts.
|
397
|
+
|
398
|
+
Get all contacts in the HubSpot account.
|
399
|
+
"""
|
400
|
+
self.method = 'GET'
|
401
|
+
self.url = self.base_url + '/contacts/v1/lists/all/contacts/all'
|
402
|
+
self.type = 'contacts'
|
403
|
+
self._params['count'] = 100
|
404
|
+
self._params['showListMemberships'] = True
|
405
|
+
try:
|
406
|
+
self._result = await self.query()
|
407
|
+
return self._result
|
408
|
+
except Exception as err:
|
409
|
+
logging.exception(err)
|
410
|
+
raise
|
411
|
+
|
412
|
+
async def contacts_list(self):
|
413
|
+
"""user contacts.
|
414
|
+
|
415
|
+
Get all contacts in the HubSpot account (v3 api).
|
416
|
+
"""
|
417
|
+
self.method = 'GET'
|
418
|
+
self.url = self.base_url + '/crm/v3/objects/contacts'
|
419
|
+
self.type = 'contacts_list'
|
420
|
+
self._params['limit'] = 100
|
421
|
+
try:
|
422
|
+
self._result = await self.query()
|
423
|
+
return self._result
|
424
|
+
except Exception as err:
|
425
|
+
logging.exception(err)
|
426
|
+
raise
|
427
|
+
|
428
|
+
async def contact_by_email(self):
|
429
|
+
"""user contact.
|
430
|
+
|
431
|
+
Given an User Id (vid), returns the contact.
|
432
|
+
"""
|
433
|
+
self.method = 'GET'
|
434
|
+
self.url = self.base_url + '/contacts/v1/contact/email/{email}/profile'
|
435
|
+
self.type = 'contact'
|
436
|
+
try:
|
437
|
+
self._args['email'] = self._params['email']
|
438
|
+
del self._params['email']
|
439
|
+
except (KeyError, AttributeError):
|
440
|
+
raise ValueError("HubSpot: Missing User Email for Search")
|
441
|
+
try:
|
442
|
+
self._result = await self.query()
|
443
|
+
return self._result
|
444
|
+
except Exception as err:
|
445
|
+
logging.exception(err)
|
446
|
+
raise
|
447
|
+
|
448
|
+
async def contact(self):
|
449
|
+
"""user contact.
|
450
|
+
|
451
|
+
Given an User Id (vid), returns the contact.
|
452
|
+
"""
|
453
|
+
self.method = 'GET'
|
454
|
+
self.url = self.base_url + '/contacts/v1/contact/vid/{vid}/profile'
|
455
|
+
self.type = 'contact'
|
456
|
+
self._params['showListMemberships'] = True
|
457
|
+
try:
|
458
|
+
self._args['vid'] = self._params['vid']
|
459
|
+
del self._params['vid']
|
460
|
+
except (KeyError, AttributeError):
|
461
|
+
raise ValueError("HubSpot: Missing User VID ID")
|
462
|
+
try:
|
463
|
+
self._result = await self.query()
|
464
|
+
return self._result
|
465
|
+
except Exception as err:
|
466
|
+
logging.exception(err)
|
467
|
+
raise
|
468
|
+
|
469
|
+
async def company_contacts(self):
|
470
|
+
"""user contacts.
|
471
|
+
|
472
|
+
Get all contacts in the HubSpot account.
|
473
|
+
"""
|
474
|
+
self.method = 'GET'
|
475
|
+
self.url = self.base_url + '/companies/v2/companies/{companyId}/contacts'
|
476
|
+
self.type = 'company_contacts'
|
477
|
+
self._params['count'] = 100
|
478
|
+
try:
|
479
|
+
self._args['companyId'] = self._params['companyId']
|
480
|
+
del self._params['companyId']
|
481
|
+
except (KeyError, AttributeError):
|
482
|
+
raise ValueError("HubSpot: Missing Company ID")
|
483
|
+
try:
|
484
|
+
self._result = await self.query()
|
485
|
+
return self._result
|
486
|
+
except Exception as err:
|
487
|
+
logging.exception(err)
|
488
|
+
raise
|
489
|
+
|
490
|
+
async def get_next_result(
|
491
|
+
self,
|
492
|
+
result,
|
493
|
+
event: str = '',
|
494
|
+
more:str = 'hasMore',
|
495
|
+
offset_name: str = 'offset',
|
496
|
+
offset_url: str = 'offset'
|
497
|
+
):
|
498
|
+
r = result[event]
|
499
|
+
next = True
|
500
|
+
page = 1
|
501
|
+
offset = result[offset_name]
|
502
|
+
more_results = result[more]
|
503
|
+
while next == True:
|
504
|
+
if more_results is False:
|
505
|
+
break
|
506
|
+
url = self.build_url(
|
507
|
+
self.url, queryparams=urlencode({offset_url: offset})
|
508
|
+
)
|
509
|
+
page = page + 1
|
510
|
+
print('Fetching page %s' % page)
|
511
|
+
try:
|
512
|
+
res, error = await self.request(url)
|
513
|
+
if error:
|
514
|
+
print(error)
|
515
|
+
next = False
|
516
|
+
break
|
517
|
+
data = res[event]
|
518
|
+
offset = res[offset_name]
|
519
|
+
more_results = res[more]
|
520
|
+
if len(data) > 0:
|
521
|
+
r = r + data
|
522
|
+
else:
|
523
|
+
next = False
|
524
|
+
break
|
525
|
+
except Exception as err:
|
526
|
+
print(err)
|
527
|
+
next = False
|
528
|
+
print(':: Returning Results')
|
529
|
+
return r
|
530
|
+
|
531
|
+
async def get_next_result_v2(
|
532
|
+
self,
|
533
|
+
result,
|
534
|
+
event: str = '',
|
535
|
+
more:str = 'has-more',
|
536
|
+
offset_name: str = 'offset',
|
537
|
+
offset_url: str = 'offset'
|
538
|
+
):
|
539
|
+
r = result[event]
|
540
|
+
next = True
|
541
|
+
offset = result[offset_name] + 1
|
542
|
+
while next == True:
|
543
|
+
url = self.build_url(
|
544
|
+
self.url, queryparams=urlencode({offset_url: offset})
|
545
|
+
)
|
546
|
+
offset = offset + 1
|
547
|
+
print('Fetching page %s' % offset)
|
548
|
+
try:
|
549
|
+
res, error = await self.request(url)
|
550
|
+
if error:
|
551
|
+
print(error)
|
552
|
+
next = False
|
553
|
+
break
|
554
|
+
data = res[event]
|
555
|
+
if len(data) > 0:
|
556
|
+
r = r + data
|
557
|
+
else:
|
558
|
+
next = False
|
559
|
+
break
|
560
|
+
except Exception as err:
|
561
|
+
print(err)
|
562
|
+
next = False
|
563
|
+
print(':: Returning Results')
|
564
|
+
return r
|
565
|
+
|
566
|
+
async def get_next_result_v3(
|
567
|
+
self,
|
568
|
+
result,
|
569
|
+
event: str = ''
|
570
|
+
):
|
571
|
+
r = result[event]
|
572
|
+
next = True
|
573
|
+
paging = result['paging']
|
574
|
+
page = 1
|
575
|
+
try:
|
576
|
+
offset = paging['next']['after']
|
577
|
+
except (ValueError, KeyError):
|
578
|
+
next = False
|
579
|
+
while next == True:
|
580
|
+
url = self.build_url(
|
581
|
+
self.url, queryparams=urlencode({"after": offset})
|
582
|
+
)
|
583
|
+
print('Fetching page %s' % page)
|
584
|
+
try:
|
585
|
+
res, error = await self.request(url)
|
586
|
+
if error:
|
587
|
+
print(error)
|
588
|
+
next = False
|
589
|
+
break
|
590
|
+
data = res[event]
|
591
|
+
try:
|
592
|
+
paging = res['paging']
|
593
|
+
offset = paging['next']['after']
|
594
|
+
except (ValueError, KeyError):
|
595
|
+
next = False
|
596
|
+
break
|
597
|
+
page = page + 1
|
598
|
+
if len(data) > 0:
|
599
|
+
r = r + data
|
600
|
+
else:
|
601
|
+
next = False
|
602
|
+
break
|
603
|
+
except Exception as err:
|
604
|
+
print(err)
|
605
|
+
next = False
|
606
|
+
print(':: Returning Results')
|
607
|
+
return r
|
608
|
+
|
609
|
+
async def query(self):
|
610
|
+
"""Query.
|
611
|
+
|
612
|
+
Basic Query of HubSpot API.
|
613
|
+
"""
|
614
|
+
self._result = None
|
615
|
+
# create URL
|
616
|
+
self.url = self.build_url(
|
617
|
+
self.url,
|
618
|
+
args=self._args,
|
619
|
+
queryparams=urlencode(self._params)
|
620
|
+
)
|
621
|
+
try:
|
622
|
+
result, error = await self.request(
|
623
|
+
self.url, self.method
|
624
|
+
)
|
625
|
+
if not result:
|
626
|
+
raise NoDataFound('HubSpot: No data was found')
|
627
|
+
if error:
|
628
|
+
print(err)
|
629
|
+
raise ProviderError(str(error))
|
630
|
+
if self.type in ['campaigns', 'active_campaigns']:
|
631
|
+
self._result = await self.get_next_result(result, 'campaigns')
|
632
|
+
elif self.type in ['email_events']:
|
633
|
+
self._result = await self.get_next_result(result, 'events')
|
634
|
+
elif self.type in ['engagements']:
|
635
|
+
self._result = await self.get_next_result(result, 'results')
|
636
|
+
elif self.type in ['companies']:
|
637
|
+
self._result = await self.get_next_result(result, self.type, more='has-more')
|
638
|
+
elif self.type == 'company_contacts':
|
639
|
+
self._result = await self.get_next_result(
|
640
|
+
result,
|
641
|
+
'contacts',
|
642
|
+
more='hasMore',
|
643
|
+
offset_name='vidOffset',
|
644
|
+
offset_url='vidOffset'
|
645
|
+
)
|
646
|
+
elif self.type == 'contacts':
|
647
|
+
self._result = await self.get_next_result(
|
648
|
+
result,
|
649
|
+
self.type,
|
650
|
+
more='has-more',
|
651
|
+
offset_name='vid-offset',
|
652
|
+
offset_url='vidOffset'
|
653
|
+
)
|
654
|
+
elif self.type == 'marketing_email_stats':
|
655
|
+
try:
|
656
|
+
self._result = await self.get_next_result_v2(result, 'objects')
|
657
|
+
except Exception as err:
|
658
|
+
logging.error(err)
|
659
|
+
elif self.type in ['companies_list', 'contacts_list', 'deals']:
|
660
|
+
# version 3 of API
|
661
|
+
try:
|
662
|
+
self._result = await self.get_next_result_v3(result, 'results')
|
663
|
+
except Exception as err:
|
664
|
+
logging.error(err)
|
665
|
+
else:
|
666
|
+
self._result = result
|
667
|
+
except NoDataFound as err:
|
668
|
+
print("HUBSPOT NO DATA FOUND: === ", err)
|
669
|
+
raise
|
670
|
+
self._result = None
|
671
|
+
except ProviderError as err:
|
672
|
+
print("HUBSPOT PROVIDER ERROR: === ", err)
|
673
|
+
raise
|
674
|
+
except Exception as err:
|
675
|
+
print("HUBSPOT ERROR: === ", err)
|
676
|
+
self._result = None
|
677
|
+
raise
|
678
|
+
finally:
|
679
|
+
return self._result
|