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.
Files changed (470) hide show
  1. flowtask/__init__.py +93 -0
  2. flowtask/__main__.py +38 -0
  3. flowtask/bots/__init__.py +6 -0
  4. flowtask/bots/check.py +93 -0
  5. flowtask/bots/codebot.py +51 -0
  6. flowtask/components/ASPX.py +148 -0
  7. flowtask/components/AddDataset.py +352 -0
  8. flowtask/components/Amazon.py +523 -0
  9. flowtask/components/AutoTask.py +314 -0
  10. flowtask/components/Azure.py +80 -0
  11. flowtask/components/AzureUsers.py +106 -0
  12. flowtask/components/BaseAction.py +91 -0
  13. flowtask/components/BaseLoop.py +198 -0
  14. flowtask/components/BestBuy.py +800 -0
  15. flowtask/components/CSVToGCS.py +120 -0
  16. flowtask/components/CompanyScraper/__init__.py +1 -0
  17. flowtask/components/CompanyScraper/parsers/__init__.py +6 -0
  18. flowtask/components/CompanyScraper/parsers/base.py +102 -0
  19. flowtask/components/CompanyScraper/parsers/explorium.py +192 -0
  20. flowtask/components/CompanyScraper/parsers/leadiq.py +206 -0
  21. flowtask/components/CompanyScraper/parsers/rocket.py +133 -0
  22. flowtask/components/CompanyScraper/parsers/siccode.py +109 -0
  23. flowtask/components/CompanyScraper/parsers/visualvisitor.py +130 -0
  24. flowtask/components/CompanyScraper/parsers/zoominfo.py +118 -0
  25. flowtask/components/CompanyScraper/scrapper.py +1054 -0
  26. flowtask/components/CopyTo.py +177 -0
  27. flowtask/components/CopyToBigQuery.py +243 -0
  28. flowtask/components/CopyToMongoDB.py +291 -0
  29. flowtask/components/CopyToPg.py +609 -0
  30. flowtask/components/CopyToRethink.py +207 -0
  31. flowtask/components/CreateGCSBucket.py +102 -0
  32. flowtask/components/CreateReport/CreateReport.py +228 -0
  33. flowtask/components/CreateReport/__init__.py +9 -0
  34. flowtask/components/CreateReport/charts/__init__.py +15 -0
  35. flowtask/components/CreateReport/charts/bar.py +51 -0
  36. flowtask/components/CreateReport/charts/base.py +66 -0
  37. flowtask/components/CreateReport/charts/pie.py +64 -0
  38. flowtask/components/CreateReport/utils.py +9 -0
  39. flowtask/components/CustomerSatisfaction.py +196 -0
  40. flowtask/components/DataInput.py +200 -0
  41. flowtask/components/DateList.py +255 -0
  42. flowtask/components/DbClient.py +163 -0
  43. flowtask/components/DialPad.py +146 -0
  44. flowtask/components/DocumentDBQuery.py +200 -0
  45. flowtask/components/DownloadFrom.py +371 -0
  46. flowtask/components/DownloadFromD2L.py +113 -0
  47. flowtask/components/DownloadFromFTP.py +181 -0
  48. flowtask/components/DownloadFromIMAP.py +315 -0
  49. flowtask/components/DownloadFromS3.py +198 -0
  50. flowtask/components/DownloadFromSFTP.py +265 -0
  51. flowtask/components/DownloadFromSharepoint.py +110 -0
  52. flowtask/components/DownloadFromSmartSheet.py +114 -0
  53. flowtask/components/DownloadS3File.py +229 -0
  54. flowtask/components/Dummy.py +59 -0
  55. flowtask/components/DuplicatePhoto.py +411 -0
  56. flowtask/components/EmployeeEvaluation.py +237 -0
  57. flowtask/components/ExecuteSQL.py +323 -0
  58. flowtask/components/ExtractHTML.py +178 -0
  59. flowtask/components/FileBase.py +178 -0
  60. flowtask/components/FileCopy.py +181 -0
  61. flowtask/components/FileDelete.py +82 -0
  62. flowtask/components/FileExists.py +146 -0
  63. flowtask/components/FileIteratorDelete.py +112 -0
  64. flowtask/components/FileList.py +194 -0
  65. flowtask/components/FileOpen.py +75 -0
  66. flowtask/components/FileRead.py +120 -0
  67. flowtask/components/FileRename.py +106 -0
  68. flowtask/components/FilterIf.py +284 -0
  69. flowtask/components/FilterRows/FilterRows.py +200 -0
  70. flowtask/components/FilterRows/__init__.py +10 -0
  71. flowtask/components/FilterRows/functions.py +4 -0
  72. flowtask/components/GCSToBigQuery.py +103 -0
  73. flowtask/components/GoogleA4.py +150 -0
  74. flowtask/components/GoogleGeoCoding.py +344 -0
  75. flowtask/components/GooglePlaces.py +315 -0
  76. flowtask/components/GoogleSearch.py +539 -0
  77. flowtask/components/HTTPClient.py +268 -0
  78. flowtask/components/ICIMS.py +146 -0
  79. flowtask/components/IF.py +179 -0
  80. flowtask/components/IcimsFolderCopy.py +173 -0
  81. flowtask/components/ImageFeatures/__init__.py +5 -0
  82. flowtask/components/ImageFeatures/process.py +233 -0
  83. flowtask/components/IteratorBase.py +251 -0
  84. flowtask/components/LangchainLoader/__init__.py +5 -0
  85. flowtask/components/LangchainLoader/loader.py +194 -0
  86. flowtask/components/LangchainLoader/loaders/__init__.py +22 -0
  87. flowtask/components/LangchainLoader/loaders/abstract.py +362 -0
  88. flowtask/components/LangchainLoader/loaders/basepdf.py +50 -0
  89. flowtask/components/LangchainLoader/loaders/docx.py +91 -0
  90. flowtask/components/LangchainLoader/loaders/html.py +119 -0
  91. flowtask/components/LangchainLoader/loaders/pdfblocks.py +146 -0
  92. flowtask/components/LangchainLoader/loaders/pdfmark.py +79 -0
  93. flowtask/components/LangchainLoader/loaders/pdftables.py +135 -0
  94. flowtask/components/LangchainLoader/loaders/qa.py +67 -0
  95. flowtask/components/LangchainLoader/loaders/txt.py +55 -0
  96. flowtask/components/LeadIQ.py +650 -0
  97. flowtask/components/Loop.py +253 -0
  98. flowtask/components/Lowes.py +334 -0
  99. flowtask/components/MS365Usage.py +156 -0
  100. flowtask/components/MSTeamsMessages.py +320 -0
  101. flowtask/components/MarketClustering.py +1051 -0
  102. flowtask/components/MergeFiles.py +362 -0
  103. flowtask/components/MilvusOutput.py +87 -0
  104. flowtask/components/NearByStores.py +175 -0
  105. flowtask/components/NetworkNinja/__init__.py +6 -0
  106. flowtask/components/NetworkNinja/models/__init__.py +52 -0
  107. flowtask/components/NetworkNinja/models/abstract.py +177 -0
  108. flowtask/components/NetworkNinja/models/account.py +39 -0
  109. flowtask/components/NetworkNinja/models/client.py +19 -0
  110. flowtask/components/NetworkNinja/models/district.py +14 -0
  111. flowtask/components/NetworkNinja/models/events.py +101 -0
  112. flowtask/components/NetworkNinja/models/forms.py +499 -0
  113. flowtask/components/NetworkNinja/models/market.py +16 -0
  114. flowtask/components/NetworkNinja/models/organization.py +34 -0
  115. flowtask/components/NetworkNinja/models/photos.py +125 -0
  116. flowtask/components/NetworkNinja/models/project.py +44 -0
  117. flowtask/components/NetworkNinja/models/region.py +28 -0
  118. flowtask/components/NetworkNinja/models/store.py +203 -0
  119. flowtask/components/NetworkNinja/models/user.py +151 -0
  120. flowtask/components/NetworkNinja/router.py +854 -0
  121. flowtask/components/Odoo.py +175 -0
  122. flowtask/components/OdooInjector.py +192 -0
  123. flowtask/components/OpenFromXML.py +126 -0
  124. flowtask/components/OpenWeather.py +41 -0
  125. flowtask/components/OpenWithBase.py +616 -0
  126. flowtask/components/OpenWithPandas.py +715 -0
  127. flowtask/components/PGPDecrypt.py +199 -0
  128. flowtask/components/PandasIterator.py +187 -0
  129. flowtask/components/PandasToFile.py +189 -0
  130. flowtask/components/Paradox.py +339 -0
  131. flowtask/components/ParamIterator.py +117 -0
  132. flowtask/components/ParseHTML.py +84 -0
  133. flowtask/components/PlacerStores.py +249 -0
  134. flowtask/components/Pokemon.py +507 -0
  135. flowtask/components/PositiveBot.py +62 -0
  136. flowtask/components/PowerPointSlide.py +400 -0
  137. flowtask/components/PrintMessage.py +127 -0
  138. flowtask/components/ProductCompetitors/__init__.py +5 -0
  139. flowtask/components/ProductCompetitors/parsers/__init__.py +7 -0
  140. flowtask/components/ProductCompetitors/parsers/base.py +72 -0
  141. flowtask/components/ProductCompetitors/parsers/bestbuy.py +86 -0
  142. flowtask/components/ProductCompetitors/parsers/lowes.py +103 -0
  143. flowtask/components/ProductCompetitors/scrapper.py +155 -0
  144. flowtask/components/ProductCompliant.py +169 -0
  145. flowtask/components/ProductInfo/__init__.py +1 -0
  146. flowtask/components/ProductInfo/parsers/__init__.py +5 -0
  147. flowtask/components/ProductInfo/parsers/base.py +83 -0
  148. flowtask/components/ProductInfo/parsers/brother.py +97 -0
  149. flowtask/components/ProductInfo/parsers/canon.py +167 -0
  150. flowtask/components/ProductInfo/parsers/epson.py +118 -0
  151. flowtask/components/ProductInfo/parsers/hp.py +131 -0
  152. flowtask/components/ProductInfo/parsers/samsung.py +97 -0
  153. flowtask/components/ProductInfo/scraper.py +319 -0
  154. flowtask/components/ProductPricing.py +118 -0
  155. flowtask/components/QS.py +261 -0
  156. flowtask/components/QSBase.py +201 -0
  157. flowtask/components/QueryIterator.py +273 -0
  158. flowtask/components/QueryToInsert.py +327 -0
  159. flowtask/components/QueryToPandas.py +432 -0
  160. flowtask/components/RESTClient.py +195 -0
  161. flowtask/components/RethinkDBQuery.py +189 -0
  162. flowtask/components/Rsync.py +74 -0
  163. flowtask/components/RunSSH.py +59 -0
  164. flowtask/components/RunShell.py +71 -0
  165. flowtask/components/SalesForce.py +20 -0
  166. flowtask/components/SaveImageBank/__init__.py +257 -0
  167. flowtask/components/SchedulingVisits.py +592 -0
  168. flowtask/components/ScrapPage.py +216 -0
  169. flowtask/components/ScrapSearch.py +79 -0
  170. flowtask/components/SendNotify.py +257 -0
  171. flowtask/components/SentimentAnalysis.py +694 -0
  172. flowtask/components/ServiceScrapper/__init__.py +5 -0
  173. flowtask/components/ServiceScrapper/parsers/__init__.py +1 -0
  174. flowtask/components/ServiceScrapper/parsers/base.py +94 -0
  175. flowtask/components/ServiceScrapper/parsers/costco.py +93 -0
  176. flowtask/components/ServiceScrapper/scrapper.py +199 -0
  177. flowtask/components/SetVariables.py +156 -0
  178. flowtask/components/SubTask.py +182 -0
  179. flowtask/components/SuiteCRM.py +48 -0
  180. flowtask/components/Switch.py +175 -0
  181. flowtask/components/TableBase.py +148 -0
  182. flowtask/components/TableDelete.py +312 -0
  183. flowtask/components/TableInput.py +143 -0
  184. flowtask/components/TableOutput/TableOutput.py +384 -0
  185. flowtask/components/TableOutput/__init__.py +3 -0
  186. flowtask/components/TableSchema.py +534 -0
  187. flowtask/components/Target.py +223 -0
  188. flowtask/components/ThumbnailGenerator.py +156 -0
  189. flowtask/components/ToPandas.py +67 -0
  190. flowtask/components/TransformRows/TransformRows.py +507 -0
  191. flowtask/components/TransformRows/__init__.py +9 -0
  192. flowtask/components/TransformRows/functions.py +559 -0
  193. flowtask/components/TransposeRows.py +176 -0
  194. flowtask/components/UPCDatabase.py +86 -0
  195. flowtask/components/UnGzip.py +171 -0
  196. flowtask/components/Uncompress.py +172 -0
  197. flowtask/components/UniqueRows.py +126 -0
  198. flowtask/components/Unzip.py +107 -0
  199. flowtask/components/UpdateOperationalVars.py +147 -0
  200. flowtask/components/UploadTo.py +299 -0
  201. flowtask/components/UploadToS3.py +136 -0
  202. flowtask/components/UploadToSFTP.py +160 -0
  203. flowtask/components/UploadToSharepoint.py +205 -0
  204. flowtask/components/UserFunc.py +122 -0
  205. flowtask/components/VivaTracker.py +140 -0
  206. flowtask/components/WSDLClient.py +123 -0
  207. flowtask/components/Wait.py +18 -0
  208. flowtask/components/Walmart.py +199 -0
  209. flowtask/components/Workplace.py +134 -0
  210. flowtask/components/XMLToPandas.py +267 -0
  211. flowtask/components/Zammad/__init__.py +41 -0
  212. flowtask/components/Zammad/models.py +0 -0
  213. flowtask/components/ZoomInfoScraper.py +409 -0
  214. flowtask/components/__init__.py +104 -0
  215. flowtask/components/abstract.py +18 -0
  216. flowtask/components/flow.py +530 -0
  217. flowtask/components/google.py +335 -0
  218. flowtask/components/group.py +221 -0
  219. flowtask/components/py.typed +0 -0
  220. flowtask/components/reviewscrap.py +132 -0
  221. flowtask/components/tAutoincrement.py +117 -0
  222. flowtask/components/tConcat.py +109 -0
  223. flowtask/components/tExplode.py +119 -0
  224. flowtask/components/tFilter.py +184 -0
  225. flowtask/components/tGroup.py +236 -0
  226. flowtask/components/tJoin.py +270 -0
  227. flowtask/components/tMap/__init__.py +9 -0
  228. flowtask/components/tMap/functions.py +54 -0
  229. flowtask/components/tMap/tMap.py +450 -0
  230. flowtask/components/tMelt.py +112 -0
  231. flowtask/components/tMerge.py +114 -0
  232. flowtask/components/tOrder.py +93 -0
  233. flowtask/components/tPandas.py +94 -0
  234. flowtask/components/tPivot.py +71 -0
  235. flowtask/components/tPluckCols.py +76 -0
  236. flowtask/components/tUnnest.py +82 -0
  237. flowtask/components/user.py +401 -0
  238. flowtask/conf.py +457 -0
  239. flowtask/download.py +102 -0
  240. flowtask/events/__init__.py +11 -0
  241. flowtask/events/events/__init__.py +20 -0
  242. flowtask/events/events/abstract.py +95 -0
  243. flowtask/events/events/alerts/__init__.py +362 -0
  244. flowtask/events/events/alerts/colfunctions.py +131 -0
  245. flowtask/events/events/alerts/functions.py +158 -0
  246. flowtask/events/events/dummy.py +12 -0
  247. flowtask/events/events/exec.py +124 -0
  248. flowtask/events/events/file/__init__.py +7 -0
  249. flowtask/events/events/file/base.py +51 -0
  250. flowtask/events/events/file/copy.py +23 -0
  251. flowtask/events/events/file/delete.py +16 -0
  252. flowtask/events/events/interfaces/__init__.py +9 -0
  253. flowtask/events/events/interfaces/client.py +67 -0
  254. flowtask/events/events/interfaces/credentials.py +28 -0
  255. flowtask/events/events/interfaces/notifications.py +58 -0
  256. flowtask/events/events/jira.py +122 -0
  257. flowtask/events/events/log.py +26 -0
  258. flowtask/events/events/logerr.py +52 -0
  259. flowtask/events/events/notify.py +59 -0
  260. flowtask/events/events/notify_event.py +160 -0
  261. flowtask/events/events/publish.py +54 -0
  262. flowtask/events/events/sendfile.py +104 -0
  263. flowtask/events/events/task.py +97 -0
  264. flowtask/events/events/teams.py +98 -0
  265. flowtask/events/events/webhook.py +58 -0
  266. flowtask/events/manager.py +287 -0
  267. flowtask/exceptions.c +39393 -0
  268. flowtask/exceptions.cpython-39-x86_64-linux-gnu.so +0 -0
  269. flowtask/extensions/__init__.py +3 -0
  270. flowtask/extensions/abstract.py +82 -0
  271. flowtask/extensions/logging/__init__.py +65 -0
  272. flowtask/hooks/__init__.py +9 -0
  273. flowtask/hooks/actions/__init__.py +22 -0
  274. flowtask/hooks/actions/abstract.py +66 -0
  275. flowtask/hooks/actions/dummy.py +23 -0
  276. flowtask/hooks/actions/jira.py +74 -0
  277. flowtask/hooks/actions/rest.py +320 -0
  278. flowtask/hooks/actions/sampledata.py +37 -0
  279. flowtask/hooks/actions/sensor.py +23 -0
  280. flowtask/hooks/actions/task.py +9 -0
  281. flowtask/hooks/actions/ticket.py +37 -0
  282. flowtask/hooks/actions/zammad.py +55 -0
  283. flowtask/hooks/hook.py +62 -0
  284. flowtask/hooks/models.py +17 -0
  285. flowtask/hooks/service.py +187 -0
  286. flowtask/hooks/step.py +91 -0
  287. flowtask/hooks/types/__init__.py +23 -0
  288. flowtask/hooks/types/base.py +129 -0
  289. flowtask/hooks/types/brokers/__init__.py +11 -0
  290. flowtask/hooks/types/brokers/base.py +54 -0
  291. flowtask/hooks/types/brokers/mqtt.py +35 -0
  292. flowtask/hooks/types/brokers/rabbitmq.py +82 -0
  293. flowtask/hooks/types/brokers/redis.py +83 -0
  294. flowtask/hooks/types/brokers/sqs.py +44 -0
  295. flowtask/hooks/types/fs.py +232 -0
  296. flowtask/hooks/types/http.py +49 -0
  297. flowtask/hooks/types/imap.py +200 -0
  298. flowtask/hooks/types/jira.py +279 -0
  299. flowtask/hooks/types/mail.py +205 -0
  300. flowtask/hooks/types/postgres.py +98 -0
  301. flowtask/hooks/types/responses/__init__.py +8 -0
  302. flowtask/hooks/types/responses/base.py +5 -0
  303. flowtask/hooks/types/sharepoint.py +288 -0
  304. flowtask/hooks/types/ssh.py +141 -0
  305. flowtask/hooks/types/tagged.py +59 -0
  306. flowtask/hooks/types/upload.py +85 -0
  307. flowtask/hooks/types/watch.py +71 -0
  308. flowtask/hooks/types/web.py +36 -0
  309. flowtask/interfaces/AzureClient.py +137 -0
  310. flowtask/interfaces/AzureGraph.py +839 -0
  311. flowtask/interfaces/Boto3Client.py +326 -0
  312. flowtask/interfaces/DropboxClient.py +173 -0
  313. flowtask/interfaces/ExcelHandler.py +94 -0
  314. flowtask/interfaces/FTPClient.py +131 -0
  315. flowtask/interfaces/GoogleCalendar.py +201 -0
  316. flowtask/interfaces/GoogleClient.py +133 -0
  317. flowtask/interfaces/GoogleDrive.py +127 -0
  318. flowtask/interfaces/GoogleGCS.py +89 -0
  319. flowtask/interfaces/GoogleGeocoding.py +93 -0
  320. flowtask/interfaces/GoogleLang.py +114 -0
  321. flowtask/interfaces/GooglePub.py +61 -0
  322. flowtask/interfaces/GoogleSheet.py +68 -0
  323. flowtask/interfaces/IMAPClient.py +137 -0
  324. flowtask/interfaces/O365Calendar.py +113 -0
  325. flowtask/interfaces/O365Client.py +220 -0
  326. flowtask/interfaces/OneDrive.py +284 -0
  327. flowtask/interfaces/Outlook.py +155 -0
  328. flowtask/interfaces/ParrotBot.py +130 -0
  329. flowtask/interfaces/SSHClient.py +378 -0
  330. flowtask/interfaces/Sharepoint.py +496 -0
  331. flowtask/interfaces/__init__.py +36 -0
  332. flowtask/interfaces/azureauth.py +119 -0
  333. flowtask/interfaces/cache.py +201 -0
  334. flowtask/interfaces/client.py +82 -0
  335. flowtask/interfaces/compress.py +525 -0
  336. flowtask/interfaces/credentials.py +124 -0
  337. flowtask/interfaces/d2l.py +239 -0
  338. flowtask/interfaces/databases/__init__.py +5 -0
  339. flowtask/interfaces/databases/db.py +223 -0
  340. flowtask/interfaces/databases/documentdb.py +55 -0
  341. flowtask/interfaces/databases/rethink.py +39 -0
  342. flowtask/interfaces/dataframes/__init__.py +11 -0
  343. flowtask/interfaces/dataframes/abstract.py +21 -0
  344. flowtask/interfaces/dataframes/arrow.py +71 -0
  345. flowtask/interfaces/dataframes/dt.py +69 -0
  346. flowtask/interfaces/dataframes/pandas.py +167 -0
  347. flowtask/interfaces/dataframes/polars.py +60 -0
  348. flowtask/interfaces/db.py +263 -0
  349. flowtask/interfaces/env.py +46 -0
  350. flowtask/interfaces/func.py +137 -0
  351. flowtask/interfaces/http.py +1780 -0
  352. flowtask/interfaces/locale.py +40 -0
  353. flowtask/interfaces/log.py +75 -0
  354. flowtask/interfaces/mask.py +143 -0
  355. flowtask/interfaces/notification.py +154 -0
  356. flowtask/interfaces/playwright.py +339 -0
  357. flowtask/interfaces/powerpoint.py +368 -0
  358. flowtask/interfaces/py.typed +0 -0
  359. flowtask/interfaces/qs.py +376 -0
  360. flowtask/interfaces/result.py +87 -0
  361. flowtask/interfaces/selenium_service.py +779 -0
  362. flowtask/interfaces/smartsheet.py +154 -0
  363. flowtask/interfaces/stat.py +39 -0
  364. flowtask/interfaces/task.py +96 -0
  365. flowtask/interfaces/template.py +118 -0
  366. flowtask/interfaces/vectorstores/__init__.py +1 -0
  367. flowtask/interfaces/vectorstores/abstract.py +133 -0
  368. flowtask/interfaces/vectorstores/milvus.py +669 -0
  369. flowtask/interfaces/zammad.py +107 -0
  370. flowtask/models.py +193 -0
  371. flowtask/parsers/__init__.py +15 -0
  372. flowtask/parsers/_yaml.c +11978 -0
  373. flowtask/parsers/_yaml.cpython-39-x86_64-linux-gnu.so +0 -0
  374. flowtask/parsers/argparser.py +235 -0
  375. flowtask/parsers/base.c +15155 -0
  376. flowtask/parsers/base.cpython-39-x86_64-linux-gnu.so +0 -0
  377. flowtask/parsers/json.c +11968 -0
  378. flowtask/parsers/json.cpython-39-x86_64-linux-gnu.so +0 -0
  379. flowtask/parsers/maps.py +49 -0
  380. flowtask/parsers/toml.c +11968 -0
  381. flowtask/parsers/toml.cpython-39-x86_64-linux-gnu.so +0 -0
  382. flowtask/plugins/__init__.py +16 -0
  383. flowtask/plugins/components/__init__.py +0 -0
  384. flowtask/plugins/handler/__init__.py +45 -0
  385. flowtask/plugins/importer.py +31 -0
  386. flowtask/plugins/sources/__init__.py +0 -0
  387. flowtask/runner.py +283 -0
  388. flowtask/scheduler/__init__.py +9 -0
  389. flowtask/scheduler/functions.py +493 -0
  390. flowtask/scheduler/handlers/__init__.py +8 -0
  391. flowtask/scheduler/handlers/manager.py +504 -0
  392. flowtask/scheduler/handlers/models.py +58 -0
  393. flowtask/scheduler/handlers/service.py +72 -0
  394. flowtask/scheduler/notifications.py +65 -0
  395. flowtask/scheduler/scheduler.py +993 -0
  396. flowtask/services/__init__.py +0 -0
  397. flowtask/services/bots/__init__.py +0 -0
  398. flowtask/services/bots/telegram.py +264 -0
  399. flowtask/services/files/__init__.py +11 -0
  400. flowtask/services/files/manager.py +522 -0
  401. flowtask/services/files/model.py +37 -0
  402. flowtask/services/files/service.py +767 -0
  403. flowtask/services/jira/__init__.py +3 -0
  404. flowtask/services/jira/jira_actions.py +191 -0
  405. flowtask/services/tasks/__init__.py +13 -0
  406. flowtask/services/tasks/launcher.py +213 -0
  407. flowtask/services/tasks/manager.py +323 -0
  408. flowtask/services/tasks/service.py +275 -0
  409. flowtask/services/tasks/task_manager.py +376 -0
  410. flowtask/services/tasks/tasks.py +155 -0
  411. flowtask/storages/__init__.py +16 -0
  412. flowtask/storages/exceptions.py +12 -0
  413. flowtask/storages/files/__init__.py +8 -0
  414. flowtask/storages/files/abstract.py +29 -0
  415. flowtask/storages/files/filesystem.py +66 -0
  416. flowtask/storages/tasks/__init__.py +19 -0
  417. flowtask/storages/tasks/abstract.py +26 -0
  418. flowtask/storages/tasks/database.py +33 -0
  419. flowtask/storages/tasks/filesystem.py +108 -0
  420. flowtask/storages/tasks/github.py +119 -0
  421. flowtask/storages/tasks/memory.py +45 -0
  422. flowtask/storages/tasks/row.py +25 -0
  423. flowtask/tasks/__init__.py +0 -0
  424. flowtask/tasks/abstract.py +526 -0
  425. flowtask/tasks/command.py +118 -0
  426. flowtask/tasks/pile.py +486 -0
  427. flowtask/tasks/py.typed +0 -0
  428. flowtask/tasks/task.py +778 -0
  429. flowtask/template/__init__.py +161 -0
  430. flowtask/tests.py +257 -0
  431. flowtask/types/__init__.py +8 -0
  432. flowtask/types/typedefs.c +11347 -0
  433. flowtask/types/typedefs.cpython-39-x86_64-linux-gnu.so +0 -0
  434. flowtask/utils/__init__.py +24 -0
  435. flowtask/utils/constants.py +117 -0
  436. flowtask/utils/encoders.py +21 -0
  437. flowtask/utils/executor.py +112 -0
  438. flowtask/utils/functions.cpp +14280 -0
  439. flowtask/utils/functions.cpython-39-x86_64-linux-gnu.so +0 -0
  440. flowtask/utils/json.cpp +13349 -0
  441. flowtask/utils/json.cpython-39-x86_64-linux-gnu.so +0 -0
  442. flowtask/utils/mail.py +63 -0
  443. flowtask/utils/parseqs.c +13324 -0
  444. flowtask/utils/parserqs.cpython-39-x86_64-linux-gnu.so +0 -0
  445. flowtask/utils/stats.py +308 -0
  446. flowtask/utils/transformations.py +74 -0
  447. flowtask/utils/uv.py +12 -0
  448. flowtask/utils/validators.py +97 -0
  449. flowtask/version.py +11 -0
  450. flowtask-5.8.4.dist-info/LICENSE +201 -0
  451. flowtask-5.8.4.dist-info/METADATA +209 -0
  452. flowtask-5.8.4.dist-info/RECORD +470 -0
  453. flowtask-5.8.4.dist-info/WHEEL +6 -0
  454. flowtask-5.8.4.dist-info/entry_points.txt +3 -0
  455. flowtask-5.8.4.dist-info/top_level.txt +2 -0
  456. plugins/components/CreateQR.py +39 -0
  457. plugins/components/TestComponent.py +28 -0
  458. plugins/components/Use1.py +13 -0
  459. plugins/components/Workplace.py +117 -0
  460. plugins/components/__init__.py +3 -0
  461. plugins/sources/__init__.py +0 -0
  462. plugins/sources/get_populartimes.py +78 -0
  463. plugins/sources/google.py +150 -0
  464. plugins/sources/hubspot.py +679 -0
  465. plugins/sources/icims.py +679 -0
  466. plugins/sources/mobileinsight.py +501 -0
  467. plugins/sources/newrelic.py +262 -0
  468. plugins/sources/uap.py +268 -0
  469. plugins/sources/venu.py +244 -0
  470. 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