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,368 @@
|
|
1
|
+
from io import BytesIO
|
2
|
+
from abc import ABC
|
3
|
+
from pathlib import Path
|
4
|
+
from typing import Iterator, List, Dict, Any, Tuple, Optional
|
5
|
+
from pptx import Presentation
|
6
|
+
from pptx.util import Inches, Pt
|
7
|
+
from pptx.dml.color import RGBColor
|
8
|
+
from PIL import Image
|
9
|
+
from navconfig.logging import logging
|
10
|
+
|
11
|
+
|
12
|
+
logging.getLogger("PIL").setLevel(logging.INFO)
|
13
|
+
|
14
|
+
|
15
|
+
class PowerPointClient(ABC):
|
16
|
+
def create_presentation_from_template(
|
17
|
+
self,
|
18
|
+
template_path: Path,
|
19
|
+
slide_contents: Iterator[Dict[str, Any]],
|
20
|
+
file_path: Path,
|
21
|
+
default_master_index: int = 0,
|
22
|
+
default_layout_index: int = 1,
|
23
|
+
):
|
24
|
+
"""
|
25
|
+
Create a presentation from a template, adding texts or images per slide.
|
26
|
+
|
27
|
+
:param template_path: Path to the PowerPoint template file.
|
28
|
+
:param slide_contents: An iterator where each item is a dict with content for a slide.
|
29
|
+
:param file_path: Path where the new PowerPoint file will be saved.
|
30
|
+
:param default_layout_index: Default slide layout index to use if not specified per slide.
|
31
|
+
"""
|
32
|
+
prs = Presentation(template_path)
|
33
|
+
prs = self.remove_existing_slides(prs)
|
34
|
+
|
35
|
+
for content in slide_contents:
|
36
|
+
master_index = content.get("master_index", default_master_index)
|
37
|
+
layout_index = content.get("layout_index", default_layout_index)
|
38
|
+
|
39
|
+
if master_index < 0 or master_index >= len(prs.slide_masters):
|
40
|
+
raise ValueError(f"Invalid master index {master_index}.")
|
41
|
+
master = prs.slide_masters[master_index]
|
42
|
+
|
43
|
+
# Use the layout_index from content if specified, else use default
|
44
|
+
if layout_index < 0 or layout_index >= len(master.slide_layouts):
|
45
|
+
raise ValueError(
|
46
|
+
f"Invalid layout index {layout_index} for master {master_index}."
|
47
|
+
)
|
48
|
+
slide_layout = master.slide_layouts[layout_index]
|
49
|
+
|
50
|
+
# Create slide with selected layout
|
51
|
+
slide = prs.slides.add_slide(slide_layout)
|
52
|
+
|
53
|
+
self._add_content_to_slide(
|
54
|
+
slide, prs, content.get("text_content", {}), content.get("image")
|
55
|
+
)
|
56
|
+
prs.save(file_path)
|
57
|
+
|
58
|
+
return file_path
|
59
|
+
|
60
|
+
def _add_content_to_slide(
|
61
|
+
self,
|
62
|
+
slide,
|
63
|
+
prs, # Presentation Object
|
64
|
+
content: List[dict],
|
65
|
+
image_infos: Optional[List[Dict[str, Any]]],
|
66
|
+
):
|
67
|
+
"""
|
68
|
+
Internal method to add content to a slide.
|
69
|
+
|
70
|
+
:param slide: The slide object to add content to.
|
71
|
+
:param prs: The Presentation object.
|
72
|
+
:param content: List of dictionaries with text content.
|
73
|
+
:param image_infos: List of dictionaries with image details.
|
74
|
+
"""
|
75
|
+
# Create a placeholder map by name
|
76
|
+
placeholder_map = {shape.name: shape for shape in slide.placeholders}
|
77
|
+
|
78
|
+
# Process text content first.
|
79
|
+
for text_entry in content:
|
80
|
+
for placeholder_id, text_details in text_entry.items():
|
81
|
+
text_content = text_details.get("text")
|
82
|
+
if placeholder_id in placeholder_map:
|
83
|
+
try:
|
84
|
+
placeholder = placeholder_map[placeholder_id]
|
85
|
+
if placeholder.has_text_frame:
|
86
|
+
text_frame = placeholder.text_frame
|
87
|
+
new_paragraph = text_details.get("new_paragraph", False)
|
88
|
+
|
89
|
+
if new_paragraph:
|
90
|
+
p = text_frame.add_paragraph() if text_frame.paragraphs else text_frame.paragraphs[0]
|
91
|
+
else:
|
92
|
+
p = text_frame.paragraphs[0]
|
93
|
+
|
94
|
+
run = p.add_run()
|
95
|
+
run.text = text_content
|
96
|
+
font = run.font
|
97
|
+
|
98
|
+
if "font_name" in text_details:
|
99
|
+
font.name = text_details["font_name"]
|
100
|
+
|
101
|
+
if "font_size" in text_details:
|
102
|
+
font.size = Pt(text_details["font_size"])
|
103
|
+
|
104
|
+
if "font_color" in text_details:
|
105
|
+
font.color.rgb = RGBColor.from_string(text_details["font_color"])
|
106
|
+
|
107
|
+
if "bold" in text_details:
|
108
|
+
font.bold = text_details["bold"]
|
109
|
+
|
110
|
+
if "italic" in text_details:
|
111
|
+
font.italic = text_details["italic"]
|
112
|
+
|
113
|
+
except KeyError:
|
114
|
+
# Fallback: add a textbox manually if placeholder lookup fails
|
115
|
+
left = Inches(1)
|
116
|
+
top = Inches(1)
|
117
|
+
width = Inches(8)
|
118
|
+
height = Inches(2)
|
119
|
+
textbox = slide.shapes.add_textbox(left, top, width, height)
|
120
|
+
text_frame = textbox.text_frame
|
121
|
+
p = text_frame.paragraphs[0]
|
122
|
+
run = p.add_run()
|
123
|
+
run.text = text_content
|
124
|
+
font = run.font
|
125
|
+
font.name = text_details.get("font_name", "Calibri")
|
126
|
+
font.size = text_details.get("font_size", Pt(18))
|
127
|
+
font.color.rgb = RGBColor.from_string(
|
128
|
+
text_details.get("font_color", "000000")
|
129
|
+
)
|
130
|
+
font.bold = text_details.get("bold", False)
|
131
|
+
font.italic = text_details.get("italic", False)
|
132
|
+
|
133
|
+
# Process each image info in the list.
|
134
|
+
|
135
|
+
if image_infos:
|
136
|
+
for image in image_infos:
|
137
|
+
# Step 1: Get source (BytesIO or file path)
|
138
|
+
if "data" in image and isinstance(image["data"], BytesIO):
|
139
|
+
image_source = image["data"]
|
140
|
+
image_source.seek(0)
|
141
|
+
elif "path" in image:
|
142
|
+
image_source = image["path"]
|
143
|
+
else:
|
144
|
+
raise ValueError("Image must have either 'path' or 'data' field")
|
145
|
+
|
146
|
+
# Step 2: Load image with PIL to check size and convert MPO if needed
|
147
|
+
with Image.open(image_source) as img:
|
148
|
+
if img.format == "MPO":
|
149
|
+
img.seek(0)
|
150
|
+
img = img.convert("RGB")
|
151
|
+
|
152
|
+
if "path" in image:
|
153
|
+
# Overwrite the file if file-based
|
154
|
+
img.save(image["path"], format="JPEG")
|
155
|
+
image_source = image["path"]
|
156
|
+
else:
|
157
|
+
# Replace in-memory BytesIO with JPEG-converted version
|
158
|
+
buffer = BytesIO()
|
159
|
+
img.save(buffer, format="JPEG")
|
160
|
+
buffer.seek(0)
|
161
|
+
# image["data"] = buffer
|
162
|
+
image_source = buffer
|
163
|
+
|
164
|
+
|
165
|
+
img_width, img_height = img.size
|
166
|
+
|
167
|
+
img_width = self.to_emu(img_width)
|
168
|
+
img_height = self.to_emu(img_height)
|
169
|
+
|
170
|
+
# Step 3: Try inserting into placeholder
|
171
|
+
img_id = image.get("placeholder_id")
|
172
|
+
if img_id in placeholder_map:
|
173
|
+
slide_holder = placeholder_map[img_id]
|
174
|
+
try:
|
175
|
+
picture = slide_holder.insert_picture(image_source)
|
176
|
+
print(picture, picture.shape_type)
|
177
|
+
continue
|
178
|
+
except Exception:
|
179
|
+
pass # fallback to manual below
|
180
|
+
|
181
|
+
# Step 4: Manual fallback or no placeholder
|
182
|
+
slide_width = prs.slide_width
|
183
|
+
slide_height = prs.slide_height
|
184
|
+
|
185
|
+
left = image.get("left", Inches(1))
|
186
|
+
top = image.get("top", Inches(2))
|
187
|
+
|
188
|
+
if left == "center":
|
189
|
+
effective_width = slide_width - Inches(1)
|
190
|
+
else:
|
191
|
+
effective_width = slide_width - left
|
192
|
+
|
193
|
+
if top == "center":
|
194
|
+
effective_height = slide_height - Inches(1.5)
|
195
|
+
else:
|
196
|
+
effective_height = slide_height - top
|
197
|
+
|
198
|
+
scale_factor = image.get("scale_factor")
|
199
|
+
if not scale_factor:
|
200
|
+
scale_factor = min(
|
201
|
+
effective_width / img_width,
|
202
|
+
effective_height / img_height,
|
203
|
+
1,
|
204
|
+
)
|
205
|
+
|
206
|
+
width = int(img_width * scale_factor)
|
207
|
+
height = int(img_height * scale_factor)
|
208
|
+
|
209
|
+
if left == "center":
|
210
|
+
left = (slide_width - width) // 2
|
211
|
+
if top == "center":
|
212
|
+
top = (slide_height - height) // 2
|
213
|
+
|
214
|
+
width = image.get("width", width)
|
215
|
+
height = image.get("height", height)
|
216
|
+
|
217
|
+
slide.shapes.add_picture(
|
218
|
+
image_source, left, top, width=width, height=height
|
219
|
+
)
|
220
|
+
|
221
|
+
|
222
|
+
@staticmethod
|
223
|
+
def create_empty_presentation(file_path: Path):
|
224
|
+
"""
|
225
|
+
Create an empty PowerPoint presentation.
|
226
|
+
|
227
|
+
:param file_path: Path where the new PowerPoint file will be saved.
|
228
|
+
"""
|
229
|
+
prs = Presentation()
|
230
|
+
prs.save(file_path)
|
231
|
+
|
232
|
+
@staticmethod
|
233
|
+
def create_presentation_from_text_list(text_list: List[str], file_path: Path):
|
234
|
+
"""
|
235
|
+
Create a PowerPoint file where each slide contains text from a list.
|
236
|
+
|
237
|
+
:param text_list: List of texts to add to slides.
|
238
|
+
:param file_path: Path where the new PowerPoint file will be saved.
|
239
|
+
"""
|
240
|
+
prs = Presentation()
|
241
|
+
for text in text_list:
|
242
|
+
slide = prs.slides.add_slide(
|
243
|
+
prs.slide_layouts[1]
|
244
|
+
) # Title and Content layout
|
245
|
+
textbox = slide.shapes.placeholders[1]
|
246
|
+
textbox.text = text
|
247
|
+
prs.save(file_path)
|
248
|
+
|
249
|
+
@staticmethod
|
250
|
+
def append_slides_to_presentation(
|
251
|
+
file_path: Path, slide_contents: Iterator[Dict[str, Any]]
|
252
|
+
):
|
253
|
+
"""
|
254
|
+
Edit a PowerPoint file to append more slides from an iterator.
|
255
|
+
|
256
|
+
:param file_path: Path to the existing PowerPoint file.
|
257
|
+
:param slide_contents: An iterator where each item is a dict with content for a slide.
|
258
|
+
"""
|
259
|
+
prs = Presentation(file_path)
|
260
|
+
for content in slide_contents:
|
261
|
+
slide = prs.slides.add_slide(
|
262
|
+
prs.slide_layouts[1]
|
263
|
+
) # Adjust layout as needed
|
264
|
+
if "text" in content:
|
265
|
+
textbox = slide.shapes.placeholders[1]
|
266
|
+
textbox.text = content["text"]
|
267
|
+
if "image" in content:
|
268
|
+
left = Inches(1)
|
269
|
+
top = Inches(2)
|
270
|
+
slide.shapes.add_picture(content["image"], left, top, width=Inches(5))
|
271
|
+
prs.save(file_path)
|
272
|
+
|
273
|
+
@staticmethod
|
274
|
+
def create_slide(
|
275
|
+
text_content: Optional[str] = None,
|
276
|
+
image_path: Optional[str] = None,
|
277
|
+
image_size: Optional[Tuple[float, float, float]] = None,
|
278
|
+
font_size: float = 18,
|
279
|
+
font_color: str = "000000",
|
280
|
+
font_name: str = "Calibri",
|
281
|
+
layout_index: Optional[int] = None,
|
282
|
+
) -> Dict[str, Any]:
|
283
|
+
"""
|
284
|
+
Create a slide content dictionary.
|
285
|
+
|
286
|
+
:param text_content: Text to include in the slide.
|
287
|
+
:param image_path: Path to the image file to include in the slide.
|
288
|
+
:param image_size: Tuple of three elements (left, top, width) for image positioning.
|
289
|
+
:param font_size: Font size for the text.
|
290
|
+
:param font_color: Font color for the text in hex format (e.g., 'FF0000' for red).
|
291
|
+
:param font_name: Font name for the text.
|
292
|
+
:param layout_index: Optional index of the slide layout to use for this slide.
|
293
|
+
:return: A dictionary representing the slide content.
|
294
|
+
"""
|
295
|
+
slide_content = {}
|
296
|
+
|
297
|
+
if text_content:
|
298
|
+
slide_content["text"] = {
|
299
|
+
"content": text_content,
|
300
|
+
"font_size": Pt(font_size),
|
301
|
+
"font_color": font_color,
|
302
|
+
"font_name": font_name,
|
303
|
+
}
|
304
|
+
|
305
|
+
if image_path and image_size:
|
306
|
+
left, top, width = image_size
|
307
|
+
slide_content["image"] = {
|
308
|
+
"path": image_path,
|
309
|
+
"left": Inches(left),
|
310
|
+
"top": Inches(top),
|
311
|
+
"width": Inches(width),
|
312
|
+
}
|
313
|
+
|
314
|
+
if layout_index is not None:
|
315
|
+
slide_content["layout_index"] = layout_index
|
316
|
+
|
317
|
+
return slide_content
|
318
|
+
|
319
|
+
@staticmethod
|
320
|
+
def to_emu(size):
|
321
|
+
return size * 9525
|
322
|
+
|
323
|
+
@staticmethod
|
324
|
+
def list_placeholder_ids(template_path: Path):
|
325
|
+
prs = Presentation(template_path)
|
326
|
+
for master_index, master in enumerate(prs.slide_masters):
|
327
|
+
print(f"\nMaster Slide {master_index}:")
|
328
|
+
|
329
|
+
for layout_index, layout in enumerate(master.slide_layouts):
|
330
|
+
print(f" Layout {layout_index}: {layout.name}")
|
331
|
+
|
332
|
+
# Create a slide in a temporary presentation to inspect placeholder IDs
|
333
|
+
temp_prs = Presentation() # Temporary Presentation object
|
334
|
+
slide = temp_prs.slides.add_slide(layout)
|
335
|
+
|
336
|
+
for placeholder in slide.placeholders:
|
337
|
+
# Access idx directly from the XML element
|
338
|
+
idx = placeholder.element.get(
|
339
|
+
"idx"
|
340
|
+
) # Retrieve 'idx' attribute directly from XML
|
341
|
+
name = placeholder.name
|
342
|
+
print(f" Placeholder IDX: {idx}, Name: {name}")
|
343
|
+
|
344
|
+
@staticmethod
|
345
|
+
def remove_existing_slides(prs):
|
346
|
+
for slide in list(prs.slides):
|
347
|
+
# Get the slide ID and relationship ID
|
348
|
+
slide_id = slide.slide_id
|
349
|
+
rId = None
|
350
|
+
|
351
|
+
# Get the list of slide IDs
|
352
|
+
sldIdLst = prs.slides._sldIdLst
|
353
|
+
|
354
|
+
# Remove the slide ID and get the relationship ID
|
355
|
+
for sldId in sldIdLst:
|
356
|
+
if sldId.id == slide_id:
|
357
|
+
rId = sldId.rId
|
358
|
+
sldIdLst.remove(sldId)
|
359
|
+
break
|
360
|
+
|
361
|
+
if rId is not None:
|
362
|
+
# Remove the relationship
|
363
|
+
prs.part.drop_rel(rId)
|
364
|
+
else:
|
365
|
+
print(f"Slide ID {slide_id} not found.")
|
366
|
+
|
367
|
+
return prs
|
368
|
+
|
File without changes
|