flowtask 5.8.4__cp39-cp39-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-39-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-39-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/argparser.py +235 -0
- flowtask/parsers/base.c +15155 -0
- flowtask/parsers/base.cpython-39-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/json.c +11968 -0
- flowtask/parsers/json.cpython-39-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/maps.py +49 -0
- flowtask/parsers/toml.c +11968 -0
- flowtask/parsers/toml.cpython-39-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-39-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-39-x86_64-linux-gnu.so +0 -0
- flowtask/utils/json.cpp +13349 -0
- flowtask/utils/json.cpython-39-x86_64-linux-gnu.so +0 -0
- flowtask/utils/mail.py +63 -0
- flowtask/utils/parseqs.c +13324 -0
- flowtask/utils/parserqs.cpython-39-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
plugins/sources/icims.py
ADDED
@@ -0,0 +1,679 @@
|
|
1
|
+
from typing import Any
|
2
|
+
from urllib.parse import urlencode
|
3
|
+
from requests.exceptions import ReadTimeout
|
4
|
+
import aiohttp
|
5
|
+
from navconfig.logging import logging
|
6
|
+
from querysource.libs.json import json_encoder, json_decoder
|
7
|
+
from querysource.exceptions import DataNotFound, ConfigError, OutputError
|
8
|
+
from querysource.providers.sources import restSource
|
9
|
+
|
10
|
+
|
11
|
+
class icims(restSource):
|
12
|
+
"""
|
13
|
+
ICIMS
|
14
|
+
Getting Data from ICIMS servers.
|
15
|
+
"""
|
16
|
+
|
17
|
+
url: str = 'https://api.icims.com/'
|
18
|
+
original_url: str = 'https://api.icims.com/' # Keep original url
|
19
|
+
login_url = 'https://login.icims.com/oauth/token'
|
20
|
+
stream_url: str = 'https://data-transfer-assembler.production.env.icims.tools/datastream/v2/streams/{customer_id}/'
|
21
|
+
_token: str = None
|
22
|
+
_expiration: int = 1800
|
23
|
+
_token_type: str = 'Bearer'
|
24
|
+
_caching: bool = True
|
25
|
+
_saved_token: str = 'navigator_icims_token'
|
26
|
+
_legacy_call: bool = False
|
27
|
+
_is_test: bool = False
|
28
|
+
use_redis: bool = True
|
29
|
+
|
30
|
+
def __init__(
|
31
|
+
self,
|
32
|
+
definition: dict = None,
|
33
|
+
conditions: dict = None,
|
34
|
+
request: Any = None, **kwargs
|
35
|
+
):
|
36
|
+
super(icims, self).__init__(definition, conditions, request, **kwargs)
|
37
|
+
|
38
|
+
args = self._args
|
39
|
+
self._conditions = conditions
|
40
|
+
self.customer_id = conditions.get('customer_id', None)
|
41
|
+
|
42
|
+
if not self.customer_id:
|
43
|
+
self.customer_id = self._env.get('ICIMS_CUSTOMER_ID')
|
44
|
+
|
45
|
+
try:
|
46
|
+
self.type = definition.params['type']
|
47
|
+
except (ValueError, AttributeError):
|
48
|
+
self.type = None
|
49
|
+
|
50
|
+
if 'type' in kwargs:
|
51
|
+
self.type = kwargs['type']
|
52
|
+
del kwargs['type']
|
53
|
+
|
54
|
+
if 'type' in conditions:
|
55
|
+
self.type = conditions['type']
|
56
|
+
del conditions['type']
|
57
|
+
|
58
|
+
# Credentials
|
59
|
+
# Username and password:
|
60
|
+
if 'api_username' in conditions:
|
61
|
+
self.api_username = conditions['api_username']
|
62
|
+
del conditions['api_username']
|
63
|
+
else:
|
64
|
+
self.api_username = self._env.get('ICIMS_API_USERNAME')
|
65
|
+
if not self.api_username:
|
66
|
+
try:
|
67
|
+
self.api_username = definition.params['api_username']
|
68
|
+
except (ValueError, AttributeError) as exc:
|
69
|
+
raise ValueError(
|
70
|
+
"ICIMS: Missing API Username"
|
71
|
+
) from exc
|
72
|
+
|
73
|
+
if 'api_password' in conditions:
|
74
|
+
self.api_password = conditions['api_password']
|
75
|
+
del conditions['api_password']
|
76
|
+
else:
|
77
|
+
self.api_password = self._env.get('ICIMS_API_PASSWORD')
|
78
|
+
if not self.api_password:
|
79
|
+
try:
|
80
|
+
self.api_password = definition.params['api_password']
|
81
|
+
except (ValueError, AttributeError):
|
82
|
+
pass
|
83
|
+
|
84
|
+
if 'api_key' in conditions:
|
85
|
+
self.client_id = conditions['api_key']
|
86
|
+
del conditions['api_key']
|
87
|
+
else:
|
88
|
+
self.client_id = self._env.get('ICIMS_API_KEY')
|
89
|
+
if not self.client_id:
|
90
|
+
try:
|
91
|
+
self.client_id = definition.params['api_key']
|
92
|
+
except (ValueError, AttributeError) as exc:
|
93
|
+
raise ValueError(
|
94
|
+
"ICIMS: Missing API Key"
|
95
|
+
) from exc
|
96
|
+
|
97
|
+
if 'api_secret' in conditions:
|
98
|
+
self.client_secret = conditions['api_secret']
|
99
|
+
del self._conditions['api_secret']
|
100
|
+
else:
|
101
|
+
self.client_secret = self._env.get('ICIMS_API_SECRET')
|
102
|
+
if not self.client_secret:
|
103
|
+
try:
|
104
|
+
self.client_secret = definition.params['api_secret']
|
105
|
+
except (ValueError, AttributeError) as exc:
|
106
|
+
raise ValueError(
|
107
|
+
"ICIMS: Missing API Secret"
|
108
|
+
) from exc
|
109
|
+
|
110
|
+
self.original_url = self.url
|
111
|
+
|
112
|
+
# check if the call is legacy
|
113
|
+
if 'legacy' in conditions and conditions['legacy'] is True:
|
114
|
+
self.setup_legacy_request()
|
115
|
+
del conditions['legacy']
|
116
|
+
|
117
|
+
# check if the request is a test (To only get limited records)
|
118
|
+
if 'test' in conditions and conditions['test'] is True:
|
119
|
+
self._is_test = True
|
120
|
+
del conditions['test']
|
121
|
+
|
122
|
+
# if types
|
123
|
+
# if self.type == 'people':
|
124
|
+
# self.url = self.url + 'customers/{customer_id}/search/people'
|
125
|
+
# elif self.type == 'person':
|
126
|
+
# self.url = self.url + 'customers/{customer_id}/people/{person_id}'
|
127
|
+
|
128
|
+
if self.type == 'forms_list':
|
129
|
+
self.setup_legacy_request()
|
130
|
+
self.url = self.url + 'customers/{customer_id}/forms/list'
|
131
|
+
|
132
|
+
if self.type == 'forms':
|
133
|
+
self.setup_legacy_request()
|
134
|
+
self.url = self.url + 'customers/{customer_id}/forms'
|
135
|
+
|
136
|
+
# set parameters
|
137
|
+
self._args = args
|
138
|
+
|
139
|
+
async def get_token(self):
|
140
|
+
result = None
|
141
|
+
# get the redis connection
|
142
|
+
try:
|
143
|
+
await self._redis.connection()
|
144
|
+
except Exception as err:
|
145
|
+
logging.exception(f'REST ICIM error: {err!s}')
|
146
|
+
raise
|
147
|
+
# try if is saved on redis:
|
148
|
+
try:
|
149
|
+
result = await self._redis.get(self._saved_token)
|
150
|
+
if result:
|
151
|
+
data = json_decoder(result)
|
152
|
+
logging.debug(':: ICIMS: Using credentials in Cache')
|
153
|
+
self._token = data['access_token']
|
154
|
+
self._token_type = data['token_type']
|
155
|
+
return self._token
|
156
|
+
except Exception as err:
|
157
|
+
print(err)
|
158
|
+
logging.exception(f'ICIMS Redis Error: {err!s}')
|
159
|
+
raise
|
160
|
+
# else: get token from URL
|
161
|
+
data = {
|
162
|
+
"audience": 'https://api.icims.com/v1/',
|
163
|
+
"grant_type": 'client_credentials',
|
164
|
+
"client_id": self.client_id,
|
165
|
+
"client_secret": self.client_secret
|
166
|
+
}
|
167
|
+
result = None
|
168
|
+
# getting the authentication token
|
169
|
+
# first: search in redis (with expiration)
|
170
|
+
timeout = aiohttp.ClientTimeout(total=self.timeout)
|
171
|
+
async with aiohttp.ClientSession() as session:
|
172
|
+
async with session.post(
|
173
|
+
self.login_url,
|
174
|
+
timeout=timeout,
|
175
|
+
data=data
|
176
|
+
) as response:
|
177
|
+
if response.status == 200:
|
178
|
+
try:
|
179
|
+
result = await response.json()
|
180
|
+
data = await response.text()
|
181
|
+
# saving the token on redis with expiration:
|
182
|
+
self._token = result['access_token']
|
183
|
+
self._expiration = result['expires_in']
|
184
|
+
self._token_type = result['token_type']
|
185
|
+
try:
|
186
|
+
status = await self._redis.setex(
|
187
|
+
self._saved_token,
|
188
|
+
data,
|
189
|
+
self._expiration
|
190
|
+
)
|
191
|
+
print(status)
|
192
|
+
except Exception as err:
|
193
|
+
print(err)
|
194
|
+
finally:
|
195
|
+
await self._redis.close()
|
196
|
+
return self._token
|
197
|
+
except Exception as e:
|
198
|
+
print(e)
|
199
|
+
b = await response.content.read()
|
200
|
+
result = b.decode("utf-8")
|
201
|
+
raise ConfigError(
|
202
|
+
f'Error: {result}'
|
203
|
+
) from e
|
204
|
+
else:
|
205
|
+
raise ConfigError(f'Error: {response.text()}')
|
206
|
+
|
207
|
+
def setup_legacy_request(self):
|
208
|
+
self.auth_type = 'basic'
|
209
|
+
self._user = self.api_username
|
210
|
+
self._pwd = self.api_password
|
211
|
+
self.auth = {}
|
212
|
+
self._legacy_call = True
|
213
|
+
|
214
|
+
def setup_bearer_token_request(self, JWT):
|
215
|
+
# pass
|
216
|
+
self.auth_type = 'api_key'
|
217
|
+
self.auth = {'Authorization': 'Bearer ' + JWT}
|
218
|
+
|
219
|
+
async def people(self):
|
220
|
+
"""people
|
221
|
+
|
222
|
+
Get all the people for a given customer.
|
223
|
+
"""
|
224
|
+
self.url = self.original_url + 'customers/{customer_id}/search/people'
|
225
|
+
self.type = 'people'
|
226
|
+
self._legacy_call = True
|
227
|
+
self.method = 'get'
|
228
|
+
|
229
|
+
try:
|
230
|
+
self._args['customer_id'] = self._conditions['customer_id']
|
231
|
+
del self._conditions['customer_id']
|
232
|
+
except (KeyError, AttributeError) as exc:
|
233
|
+
self._args['customer_id'] = self.customer_id
|
234
|
+
if not self._args['customer_id']:
|
235
|
+
raise ValueError(
|
236
|
+
"ICIMS: Missing Customer ID"
|
237
|
+
) from exc
|
238
|
+
|
239
|
+
try:
|
240
|
+
self._result = await self.query()
|
241
|
+
return self._result
|
242
|
+
except Exception as err:
|
243
|
+
logging.exception(err)
|
244
|
+
raise
|
245
|
+
|
246
|
+
async def person(self):
|
247
|
+
"""person
|
248
|
+
|
249
|
+
Get a single person by id for a given customer.
|
250
|
+
"""
|
251
|
+
self.url = self.original_url + 'customers/{customer_id}/people/{person_id}'
|
252
|
+
self.type = 'person'
|
253
|
+
self._legacy_call = True
|
254
|
+
self.method = 'get'
|
255
|
+
|
256
|
+
try:
|
257
|
+
self._args['customer_id'] = self._conditions['customer_id']
|
258
|
+
del self._conditions['customer_id']
|
259
|
+
except (KeyError, AttributeError) as exc:
|
260
|
+
self._args['customer_id'] = self.customer_id
|
261
|
+
if not self._args['customer_id']:
|
262
|
+
raise ValueError(
|
263
|
+
"ICIMS: Missing Customer ID"
|
264
|
+
) from exc
|
265
|
+
|
266
|
+
try:
|
267
|
+
self._args['person_id'] = self._conditions['person_id']
|
268
|
+
del self._conditions['person_id']
|
269
|
+
except (KeyError, AttributeError):
|
270
|
+
raise ValueError("ICIMS: Missing Person ID")
|
271
|
+
|
272
|
+
try:
|
273
|
+
self._result = await self.query()
|
274
|
+
return self._result
|
275
|
+
except Exception as err:
|
276
|
+
logging.exception(err)
|
277
|
+
raise
|
278
|
+
|
279
|
+
async def forms_list(self):
|
280
|
+
"""forms.
|
281
|
+
|
282
|
+
Get a list of Forms.
|
283
|
+
"""
|
284
|
+
self.url = self.original_url + 'customers/{customer_id}/forms/list'
|
285
|
+
self.type = 'forms_list'
|
286
|
+
self._legacy_call = True
|
287
|
+
self.method = 'get'
|
288
|
+
try:
|
289
|
+
self._args['customer_id'] = self._conditions['customer_id']
|
290
|
+
del self._conditions['customer_id']
|
291
|
+
except (KeyError, AttributeError) as exc:
|
292
|
+
self._args['customer_id'] = self.customer_id
|
293
|
+
if not self._args['customer_id']:
|
294
|
+
raise ValueError(
|
295
|
+
"ICIMS: Missing Customer ID"
|
296
|
+
) from exc
|
297
|
+
try:
|
298
|
+
self._result = await self.query()
|
299
|
+
return self._result
|
300
|
+
except Exception as err:
|
301
|
+
logging.exception(err)
|
302
|
+
raise
|
303
|
+
|
304
|
+
async def form_data(self):
|
305
|
+
"""forms.
|
306
|
+
|
307
|
+
Get a list of Forms.
|
308
|
+
"""
|
309
|
+
self.url = self.url + 'customers/{customer_id}/forms/{form_data_id}'
|
310
|
+
self.type = 'form_data'
|
311
|
+
self._legacy_call = True
|
312
|
+
self.method = 'get'
|
313
|
+
try:
|
314
|
+
self._args['customer_id'] = self._conditions['customer_id']
|
315
|
+
del self._conditions['customer_id']
|
316
|
+
except (KeyError, AttributeError) as exc:
|
317
|
+
self._args['customer_id'] = self.customer_id
|
318
|
+
if not self._args['customer_id']:
|
319
|
+
raise ValueError(
|
320
|
+
"ICIMS: Missing Customer ID"
|
321
|
+
) from exc
|
322
|
+
|
323
|
+
try:
|
324
|
+
self._args['form_data_id'] = self._conditions['form_data_id']
|
325
|
+
del self._conditions['form_data_id']
|
326
|
+
except (KeyError, AttributeError) as exc:
|
327
|
+
raise ValueError(
|
328
|
+
"ICIMS: Missing Form Data ID"
|
329
|
+
) from exc
|
330
|
+
|
331
|
+
try:
|
332
|
+
self._result = await self.query()
|
333
|
+
return self._result
|
334
|
+
except Exception as err:
|
335
|
+
logging.exception(err)
|
336
|
+
raise
|
337
|
+
|
338
|
+
async def jobs(self):
|
339
|
+
"""jobs
|
340
|
+
|
341
|
+
Get a all jobs for a given customer in a portal.
|
342
|
+
"""
|
343
|
+
self.url = self.url + 'customers/{customer_id}/search/portals/{portal_id}'
|
344
|
+
self.type = 'jobs'
|
345
|
+
|
346
|
+
try:
|
347
|
+
self._args['customer_id'] = self._conditions['customer_id']
|
348
|
+
del self._conditions['customer_id']
|
349
|
+
except (KeyError, AttributeError) as exc:
|
350
|
+
raise ValueError(
|
351
|
+
"ICIMS: Missing Customer ID"
|
352
|
+
) from exc
|
353
|
+
|
354
|
+
try:
|
355
|
+
self._args['portal_id'] = self._conditions['portal_id']
|
356
|
+
del self._conditions['portal_id']
|
357
|
+
except (KeyError, AttributeError) as exc:
|
358
|
+
raise ValueError(
|
359
|
+
"ICIMS: Missing Portal ID"
|
360
|
+
) from exc
|
361
|
+
|
362
|
+
try:
|
363
|
+
self._result = await self.query()
|
364
|
+
return self._result
|
365
|
+
except Exception as err:
|
366
|
+
logging.exception(err)
|
367
|
+
raise
|
368
|
+
|
369
|
+
async def job(self):
|
370
|
+
"""jobs
|
371
|
+
|
372
|
+
Get a job by id for a given customer in a portal.
|
373
|
+
"""
|
374
|
+
self.url = self.url + 'customers/{customer_id}/portals/{portal_id}/{job_id}'
|
375
|
+
self.type = 'job'
|
376
|
+
|
377
|
+
try:
|
378
|
+
self._args['customer_id'] = self._conditions['customer_id']
|
379
|
+
del self._conditions['customer_id']
|
380
|
+
except (KeyError, AttributeError):
|
381
|
+
raise ValueError("ICIMS: Missing Customer ID")
|
382
|
+
|
383
|
+
try:
|
384
|
+
self._args['portal_id'] = self._conditions['portal_id']
|
385
|
+
del self._conditions['portal_id']
|
386
|
+
except (KeyError, AttributeError):
|
387
|
+
raise ValueError("ICIMS: Missing Portal ID")
|
388
|
+
|
389
|
+
try:
|
390
|
+
self._args['job_id'] = self._conditions['job_id']
|
391
|
+
del self._conditions['job_id']
|
392
|
+
except (KeyError, AttributeError):
|
393
|
+
raise ValueError("ICIMS: Missing Job ID")
|
394
|
+
|
395
|
+
try:
|
396
|
+
self._result = await self.query()
|
397
|
+
return self._result
|
398
|
+
except Exception as err:
|
399
|
+
logging.exception(err)
|
400
|
+
raise
|
401
|
+
|
402
|
+
async def jobs_filters(self):
|
403
|
+
"""jobs filters
|
404
|
+
|
405
|
+
Get a all jobs filters for a given customer in a portal.
|
406
|
+
"""
|
407
|
+
self.url = self.url + 'customers/{customer_id}/search/portals/{portal_id}/filters'
|
408
|
+
self.type = 'jobs_filters'
|
409
|
+
|
410
|
+
try:
|
411
|
+
self._args['customer_id'] = self._conditions['customer_id']
|
412
|
+
del self._conditions['customer_id']
|
413
|
+
except (KeyError, AttributeError):
|
414
|
+
raise ValueError("ICIMS: Missing Customer ID")
|
415
|
+
|
416
|
+
try:
|
417
|
+
self._args['portal_id'] = self._conditions['portal_id']
|
418
|
+
del self._conditions['portal_id']
|
419
|
+
except (KeyError, AttributeError):
|
420
|
+
raise ValueError("ICIMS: Missing Portal ID")
|
421
|
+
|
422
|
+
try:
|
423
|
+
self._result = await self.query()
|
424
|
+
return self._result
|
425
|
+
except Exception as err:
|
426
|
+
logging.exception(err)
|
427
|
+
raise
|
428
|
+
|
429
|
+
async def get_next_result(self, result, resource):
|
430
|
+
"""get next result
|
431
|
+
|
432
|
+
Get the next pages of a given resource.
|
433
|
+
"""
|
434
|
+
self.headers['Content-Type'] = 'application/json'
|
435
|
+
r = result['searchResults']
|
436
|
+
next = True
|
437
|
+
limit = 1
|
438
|
+
current = 0
|
439
|
+
while next is True and (current < limit or self._is_test is not True):
|
440
|
+
current += 1
|
441
|
+
print('Fetching next result, page:', current)
|
442
|
+
last_id = r[-1]['id']
|
443
|
+
data = {
|
444
|
+
'filters': [
|
445
|
+
{
|
446
|
+
'name': resource + '.id',
|
447
|
+
'value': [
|
448
|
+
str(last_id)
|
449
|
+
],
|
450
|
+
'operator': '>'
|
451
|
+
},
|
452
|
+
]
|
453
|
+
}
|
454
|
+
data = json_encoder(data)
|
455
|
+
try:
|
456
|
+
res, error = await self.request(self.url, method='POST', data=data)
|
457
|
+
if error:
|
458
|
+
print('ICIMS: Error: Error getting next result', error)
|
459
|
+
next = False
|
460
|
+
break
|
461
|
+
if 'searchResults' in res and len(res['searchResults']) > 0:
|
462
|
+
r = r + res['searchResults']
|
463
|
+
else:
|
464
|
+
next = False
|
465
|
+
break
|
466
|
+
except Exception as err:
|
467
|
+
print(err)
|
468
|
+
next = False
|
469
|
+
del self.headers['Content-Type']
|
470
|
+
return r
|
471
|
+
|
472
|
+
async def get_next_result_v2(self, result):
|
473
|
+
"""get next result
|
474
|
+
|
475
|
+
Get the next pages of a given stream data subscription.
|
476
|
+
"""
|
477
|
+
r = result['events']
|
478
|
+
next = True
|
479
|
+
limit = 1
|
480
|
+
current = 0
|
481
|
+
while next is True and (current < limit or self._is_test is not True):
|
482
|
+
current += 1
|
483
|
+
print('Fetching next result, page:', current)
|
484
|
+
if 'lastEvaluatedKey' in result and result['lastEvaluatedKey'] != '':
|
485
|
+
last_id = result['lastEvaluatedKey']
|
486
|
+
else:
|
487
|
+
break
|
488
|
+
self._conditions['exclusiveStartKey'] = last_id
|
489
|
+
try:
|
490
|
+
res, error = await self.request(self.url)
|
491
|
+
if error:
|
492
|
+
print('ICIMS: Error: Error getting next result', error)
|
493
|
+
next = False
|
494
|
+
break
|
495
|
+
if 'events' in res and len(res['events']) > 0:
|
496
|
+
r = r + res['events']
|
497
|
+
else:
|
498
|
+
next = False
|
499
|
+
break
|
500
|
+
except Exception as err:
|
501
|
+
print(err)
|
502
|
+
next = False
|
503
|
+
if 'exclusiveStartKey' in self._conditions:
|
504
|
+
del self._conditions['exclusiveStartKey']
|
505
|
+
return r
|
506
|
+
|
507
|
+
async def process_result_list(self, result, resource, resource_url):
|
508
|
+
"""process result list
|
509
|
+
|
510
|
+
Process results list and get each item details.
|
511
|
+
"""
|
512
|
+
r = list()
|
513
|
+
next = True
|
514
|
+
limit = 3
|
515
|
+
current = 0
|
516
|
+
while next is True and (current < limit or self._is_test is not True):
|
517
|
+
print('Fetching next item:', current)
|
518
|
+
try:
|
519
|
+
id = result[current]['id']
|
520
|
+
self._args[resource + '_id'] = id
|
521
|
+
url = self.original_url + resource_url
|
522
|
+
url = self.build_url(url, args=self._args)
|
523
|
+
res, error = await self.request(url, method='GET')
|
524
|
+
if error:
|
525
|
+
print('ICIMS: Error: Error getting next item', error)
|
526
|
+
next = False
|
527
|
+
break
|
528
|
+
if 'errors' in res:
|
529
|
+
next = False
|
530
|
+
break
|
531
|
+
res['id'] = id
|
532
|
+
r.append(res)
|
533
|
+
|
534
|
+
except Exception as err:
|
535
|
+
print(err)
|
536
|
+
next = False
|
537
|
+
current += 1
|
538
|
+
return r
|
539
|
+
|
540
|
+
# Stream API
|
541
|
+
|
542
|
+
async def stream_ids(self):
|
543
|
+
"""stream ids
|
544
|
+
|
545
|
+
Get the stream ids.
|
546
|
+
"""
|
547
|
+
|
548
|
+
str_len = len('{customer_id}/')
|
549
|
+
self.url = self.stream_url[:-str_len]
|
550
|
+
|
551
|
+
try:
|
552
|
+
self._result = await self.query()
|
553
|
+
return self._result
|
554
|
+
except Exception as err:
|
555
|
+
logging.exception(err)
|
556
|
+
raise
|
557
|
+
|
558
|
+
async def stream_subscriptions(self):
|
559
|
+
"""stream subscriptions
|
560
|
+
|
561
|
+
Get the subscription stream ids for a given customer.
|
562
|
+
"""
|
563
|
+
self.url = self.stream_url
|
564
|
+
self.url = self.url + 'subscriptions'
|
565
|
+
|
566
|
+
try:
|
567
|
+
self._args['customer_id'] = self._conditions['customer_id']
|
568
|
+
del self._conditions['customer_id']
|
569
|
+
except (KeyError, AttributeError):
|
570
|
+
raise ValueError("ICIMS: Missing Customer ID")
|
571
|
+
|
572
|
+
try:
|
573
|
+
self._result = await self.query()
|
574
|
+
return self._result
|
575
|
+
except Exception as err:
|
576
|
+
logging.exception(err)
|
577
|
+
raise
|
578
|
+
|
579
|
+
async def stream_data(self):
|
580
|
+
"""stream data
|
581
|
+
|
582
|
+
Get a subscription stream data by subscription id.
|
583
|
+
"""
|
584
|
+
self.url = self.stream_url
|
585
|
+
self.url = self.url + 'subscriptions/{subscription_id}/events'
|
586
|
+
|
587
|
+
try:
|
588
|
+
self._args['subscription_id'] = self._conditions['subscription_id']
|
589
|
+
del self._conditions['subscription_id']
|
590
|
+
except (KeyError, AttributeError):
|
591
|
+
raise ValueError("ICIMS: Missing Subscription ID")
|
592
|
+
|
593
|
+
try:
|
594
|
+
self._args['customer_id'] = self._conditions['customer_id']
|
595
|
+
del self._conditions['customer_id']
|
596
|
+
except (KeyError, AttributeError):
|
597
|
+
raise ValueError("ICIMS: Missing Customer ID")
|
598
|
+
|
599
|
+
try:
|
600
|
+
self._result = await self.query()
|
601
|
+
return self._result
|
602
|
+
except Exception as err:
|
603
|
+
logging.exception(err)
|
604
|
+
raise
|
605
|
+
|
606
|
+
async def query(self, url: str = None, params: dict = {}):
|
607
|
+
"""Query.
|
608
|
+
|
609
|
+
Basic Query of ICIMS API.
|
610
|
+
"""
|
611
|
+
self._result = None
|
612
|
+
if url:
|
613
|
+
self.url = self.build_url(url, queryparams=urlencode(params))
|
614
|
+
# get the credentials
|
615
|
+
try:
|
616
|
+
# TODO Refactor this to call the token only when its stream api
|
617
|
+
if self._legacy_call is False:
|
618
|
+
jwt = await self.get_token()
|
619
|
+
self.setup_bearer_token_request(jwt)
|
620
|
+
else:
|
621
|
+
self.setup_legacy_request()
|
622
|
+
except Exception as err:
|
623
|
+
print(err)
|
624
|
+
logging.error(
|
625
|
+
f'ICIMS: Error getting token: {err!s}'
|
626
|
+
)
|
627
|
+
raise
|
628
|
+
try:
|
629
|
+
result = await super().query()
|
630
|
+
if self.type == 'jobs':
|
631
|
+
self._result = await self.get_next_result(result, 'job')
|
632
|
+
if self.type == 'people':
|
633
|
+
self._result = await self.get_next_result(result, 'person')
|
634
|
+
if self.type in ('forms'):
|
635
|
+
self._result = await self.get_next_result(result, 'forms')
|
636
|
+
if self.type == 'stream_data':
|
637
|
+
self._result = await self.get_next_result_v2(result)
|
638
|
+
elif self.type == 'forms_list':
|
639
|
+
self._result = result
|
640
|
+
elif self.type == 'form_data':
|
641
|
+
if 'errors' in result:
|
642
|
+
errors = []
|
643
|
+
for error in result['errors']:
|
644
|
+
message = f"{error['errorMessage']}, code: {error['errorCode']}"
|
645
|
+
raise OutputError(
|
646
|
+
message
|
647
|
+
)
|
648
|
+
try:
|
649
|
+
owner = result['owner']
|
650
|
+
result['associate_id'] = str(owner['id'])
|
651
|
+
result['full_name'] = owner['value']
|
652
|
+
result['customer_id'] = self.customer_id
|
653
|
+
result['form_data_id'] = self._args['form_data_id']
|
654
|
+
self._result = result
|
655
|
+
except KeyError as exc:
|
656
|
+
raise DataNotFound(
|
657
|
+
f"ICIMS: Invalid Form Data, {exc}"
|
658
|
+
) from exc
|
659
|
+
if not self._result:
|
660
|
+
raise DataNotFound(
|
661
|
+
"ICIMS: No ICIMS data was found."
|
662
|
+
)
|
663
|
+
return self._result
|
664
|
+
except ReadTimeout as err:
|
665
|
+
logging.exception(f'ICIMS: Error: {err!s}')
|
666
|
+
raise
|
667
|
+
except Exception as err:
|
668
|
+
if 'Question (status) uses a name that is reserved in Web Services' in str(err):
|
669
|
+
# This Exception is usable for saving this data in error:
|
670
|
+
result = {}
|
671
|
+
result['form_data_id'] = self._args['form_data_id']
|
672
|
+
result['status'] = 'Failed'
|
673
|
+
result['customer_id'] = self.customer_id
|
674
|
+
result['completed_date'] = None
|
675
|
+
result['updated_date'] = None
|
676
|
+
self._result = result
|
677
|
+
return self._result
|
678
|
+
logging.error(f'ICIMS: Error: {err!s}')
|
679
|
+
raise
|