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.
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-312-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-312-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-312-x86_64-linux-gnu.so +0 -0
  377. flowtask/parsers/json.c +11968 -0
  378. flowtask/parsers/json.cpython-312-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-312-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-312-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-312-x86_64-linux-gnu.so +0 -0
  440. flowtask/utils/json.cpp +13349 -0
  441. flowtask/utils/json.cpython-312-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-312-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,156 @@
1
+ import asyncio
2
+ from collections.abc import Callable
3
+ import pandas as pd
4
+ from flowtask.components.Azure import Azure
5
+ from flowtask.exceptions import ComponentError
6
+
7
+
8
+ class MS365Usage(Azure):
9
+ """
10
+ MS365Usage
11
+
12
+ Overview
13
+
14
+ The MS365Usage class is a component for retrieving Microsoft 365 usage reports via the Microsoft Graph API.
15
+ It extends the Azure class and supports various report types such as M365, Teams, SharePoint, OneDrive, and Yammer.
16
+
17
+ .. table:: Properties
18
+ :widths: auto
19
+
20
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
21
+ | Name | Required | Description |
22
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
23
+ | report_type | No | The type of report to retrieve, defaults to "M365". |
24
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
25
+ | usage_method | No | The usage method for the report, defaults to "UserDetail". |
26
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
27
+ | _report | Yes | The specific report endpoint to use based on the report type and usage method. |
28
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
29
+ | period | No | The period for the report, defaults to "D7". |
30
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
31
+ | format | No | The format of the report, defaults to "text/csv". |
32
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
33
+ | method | Yes | The HTTP method to use for the API request, set to "GET". |
34
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
35
+ | download | Yes | Flag indicating if a file download is required, set to False. |
36
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
37
+ | url | Yes | The formatted URL for the API request. |
38
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
39
+ | app | Yes | The MSAL app instance for authentication. |
40
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
41
+ | token_type | Yes | The type of authentication token. |
42
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
43
+ | auth | Yes | Dictionary containing the authentication details. |
44
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
45
+
46
+ Return
47
+
48
+ The methods in this class manage the retrieval and processing of Microsoft 365 usage reports, including initialization,
49
+ API request execution, and result handling.
50
+
51
+
52
+
53
+ Example:
54
+
55
+ ```yaml
56
+ MS365Usage:
57
+ period: D7
58
+ report_type: Yammer
59
+ usage_method: UserDetail
60
+ credentials:
61
+ client_id: OFFICE_365_REPORT_ID
62
+ client_secret: OFFICE_365_REPORT_SECRET
63
+ tenant_id: AZURE_ADFS_TENANT_ID
64
+ ```
65
+
66
+ """ # noqa: E501
67
+ def __init__(
68
+ self,
69
+ loop: asyncio.AbstractEventLoop = None,
70
+ job: Callable = None,
71
+ stat: Callable = None,
72
+ **kwargs,
73
+ ):
74
+ self.report_type = kwargs.pop("report_type", "M365")
75
+ self.usage_method = kwargs.pop("usage_method", "UserDetail")
76
+ if self.report_type == 'M365':
77
+ self._report = 'getM365App'
78
+ elif self.report_type == 'Teams':
79
+ self._report = 'getTeamsUserActivity'
80
+ if self.usage_method == 'DeviceUserDetails':
81
+ self._report = 'getTeamsDeviceUsage'
82
+ self.usage_method = 'UserDetail'
83
+ elif self.usage_method == 'DeviceUserCounts':
84
+ self._report = 'getTeamsDeviceUsage'
85
+ elif self.usage_method == 'DeviceDistributionUserCounts':
86
+ self._report = 'getTeamsDeviceUsage'
87
+ self.usage_method = 'DistributionUserCounts'
88
+ elif self.report_type == 'SharePoint':
89
+ self._report = 'getSharePointActivity'
90
+ elif self.report_type == 'OneDrive':
91
+ self._report = 'getOneDriveActivity'
92
+ elif self.report_type == 'Yammer':
93
+ self._report = 'getYammerActivity'
94
+ if self.usage_method == 'DeviceUserDetails':
95
+ self._report = 'getYammerDeviceUsage'
96
+ self.usage_method = 'UserDetail'
97
+ elif self.usage_method == 'DeviceUserCounts':
98
+ self._report = 'getYammerDeviceUsage'
99
+ elif self.usage_method == 'DeviceDistributionUserCounts':
100
+ self._report = 'getYammerDeviceUsage'
101
+ self.usage_method = 'DistributionUserCounts'
102
+ else:
103
+ self._report = 'getM365App'
104
+ self.period = kwargs.pop("period", "D7")
105
+ self.format = kwargs.pop("format", "text/csv")
106
+ super().__init__(loop=loop, job=job, stat=stat, **kwargs)
107
+ self.as_dataframe: bool = True # Forcing return a Dataframe
108
+
109
+ async def start(self, **kwargs):
110
+ await super().start(**kwargs)
111
+
112
+ self.method = "GET"
113
+ self.download = False
114
+ self.as_binary = False
115
+ self.accept = 'application/octet-stream'
116
+
117
+ _base_url = "https://graph.microsoft.com/v1.0/reports/{report}{usage_method}(period='{period}')?$format={format}" # noqa: E501
118
+ self.url = _base_url.format(
119
+ report=self._report,
120
+ usage_method=self.usage_method,
121
+ period=self.period,
122
+ format=self.format
123
+ )
124
+ return True
125
+
126
+ async def run(self):
127
+ """Run Azure Connection for getting Users Info."""
128
+ self._logger.info(f"<{__name__}>:")
129
+ self.set_apikey()
130
+
131
+ try:
132
+ result, error = await self.async_request(self.url, self.method)
133
+ if error:
134
+ raise ComponentError(
135
+ f"Error getting {self.usage_method} from API: {error}"
136
+ )
137
+ except Exception as ex:
138
+ raise ComponentError(
139
+ f"Error getting {self.usage_method} from API: {ex}"
140
+ ) from ex
141
+ if self.as_dataframe is True:
142
+ df = await self.from_csv(result, sep=',', header=0)
143
+ print(df)
144
+ self._result = df
145
+ else:
146
+ # returned as text
147
+ self._result = result
148
+ return self._result
149
+
150
+ async def close(self):
151
+ pass
152
+
153
+ def set_apikey(self):
154
+ self.app = self.get_msal_app()
155
+ token, self.token_type = self.get_token()
156
+ self.auth["apikey"] = token
@@ -0,0 +1,320 @@
1
+ from collections.abc import Callable
2
+ import asyncio
3
+ from collections import defaultdict
4
+ from datetime import datetime, timedelta, timezone
5
+ from bs4 import BeautifulSoup
6
+ import pandas as pd
7
+ from msgraph.generated.models.chat_message import (
8
+ ChatMessage
9
+ )
10
+ from msgraph.generated.models.chat import Chat
11
+ from .flow import FlowComponent
12
+ from ..interfaces.AzureGraph import AzureGraph
13
+ from ..exceptions import ComponentError, DataNotFound, ConfigError
14
+
15
+
16
+ class MSTeamsMessages(AzureGraph, FlowComponent):
17
+ def __init__(
18
+ self,
19
+ loop: asyncio.AbstractEventLoop = None,
20
+ job: Callable = None,
21
+ stat: Callable = None,
22
+ **kwargs,
23
+ ):
24
+ self.channel_id: str = kwargs.pop('channel_id', None)
25
+ self.team_id: str = kwargs.pop('team_id', None)
26
+ self.chat_id: str = kwargs.pop('chat_id', None)
27
+ self.chat_name: str = kwargs.pop('chat_name', None)
28
+ self.program_name: str = kwargs.get('program_name', None)
29
+ self._weeks: int = kwargs.get('weeks', 1)
30
+ self.start_time: str = kwargs.pop('start_time', None)
31
+ self.end_time: str = kwargs.pop('end_time', None)
32
+ self.as_dataframe: bool = kwargs.get('as_dataframe', False)
33
+ super().__init__(
34
+ loop=loop, job=job, stat=stat, **kwargs
35
+ )
36
+ if self.program_name is None:
37
+ self.program_name = self._program
38
+
39
+ async def start(self, **kwargs):
40
+ await super().start(**kwargs)
41
+ self.processing_credentials()
42
+ if not self.team_id:
43
+ raise ConfigError(
44
+ "Must Provide a *team_id* Attribute."
45
+ )
46
+ # Processing Channel and Team:
47
+ self.team_id = self.mask_replacement(self.team_id)
48
+ self.channel_id = self.mask_replacement(self.channel_id)
49
+ self.chat_id = self.mask_replacement(self.chat_id)
50
+ # Processing the start time and end time:
51
+ if self.start_time:
52
+ self.start_time = self.mask_replacement(self.start_time)
53
+ if isinstance(self.start_time, str):
54
+ # convert to datetime with Z
55
+ self.start_time = datetime.strptime(
56
+ self.start_time, "%Y-%m-%dT%H:%M:%S.%fZ"
57
+ )
58
+ else:
59
+ # One Week Ago.
60
+ self.start_time = (
61
+ datetime.now(tz=timezone.utc) - timedelta(weeks=self._weeks)
62
+ ).isoformat()
63
+ if self.end_time:
64
+ self.end_time = self.mask_replacement(self.end_time)
65
+ if isinstance(self.end_time, str):
66
+ # convert to datetime with Z
67
+ self.end_time = datetime.strptime(
68
+ self.end_time, "%Y-%m-%dT%H:%M:%S.%fZ"
69
+ )
70
+ else:
71
+ self.end_time = datetime.now(tz=timezone.utc).isoformat() # Current time
72
+ return True
73
+
74
+ def _clean_html(self, content: str) -> str:
75
+ """Helper to strip HTML tags using BeautifulSoup.
76
+
77
+ Example:
78
+
79
+ ```yaml
80
+ MSTeamsMessages:
81
+ comments: Extracting MS Teams Chat Messages
82
+ team_id: MS_TEAMS_DEFAULT_TEAMS_ID
83
+ chat_name: National HA Team Chat
84
+ program_name: Hisense
85
+ weeks: 6
86
+ as_dataframe: true
87
+ ```
88
+
89
+ """
90
+ # Quick check: if no angle brackets, it's probably not HTML
91
+ if content is None:
92
+ return ''
93
+ if "<" in content or ">" in content:
94
+ soup = BeautifulSoup(content, 'html.parser')
95
+ return soup.get_text()
96
+ else:
97
+ return content.strip()
98
+
99
+ def _extract_reactions(self, reactions) -> list:
100
+ """
101
+ Takes a list of ChatMessageReaction objects
102
+ and returns a list of dict with the relevant info.
103
+ """
104
+ parsed = []
105
+ if not reactions:
106
+ return parsed # no reactions
107
+ for r in reactions:
108
+ reaction_type = getattr(r, 'reaction_type', None)
109
+ # "like" flag
110
+ is_like = (reaction_type == 'like')
111
+
112
+ # By default, Graph might not provide a direct UPN,
113
+ # so we store whatever we have in user.id, user.display_name, etc.
114
+ user_id = None
115
+ user_display_name = None
116
+ user_identity_type = None
117
+ if r.user and r.user.user:
118
+ user_id = r.user.user.id
119
+ user_display_name = r.user.user.display_name
120
+ # For example: TeamworkUserIdentityType.AadUser, etc.
121
+ user_identity_type = str(r.user.user.user_identity_type)
122
+
123
+ parsed.append({
124
+ "created_date_time": r.created_date_time,
125
+ "display_name": r.display_name, # Sometimes “like”, “heart”, etc.
126
+ "reaction_type": reaction_type, # e.g. "like", "heart", ...
127
+ "like": is_like, # boolean
128
+ "user_id": user_id,
129
+ "user_display_name": user_display_name,
130
+ "user_identity_type": user_identity_type,
131
+ })
132
+ return parsed
133
+
134
+ def _process_messages(self, messages: list) -> list:
135
+ msgs = []
136
+ default_datetime = datetime(1970, 1, 1, tzinfo=timezone.utc)
137
+
138
+ for message in messages:
139
+ # ----------------------------------------------------------------
140
+ # ChatMessage
141
+ # ----------------------------------------------------------------
142
+ if isinstance(message, ChatMessage):
143
+ # extracting info from message:
144
+ user_id, user_display = None, None
145
+ user_identity_type = None
146
+ user = {}
147
+ if message.from_ and message.from_.user:
148
+ user_id = message.from_.user.id
149
+ user_display = message.from_.user.display_name
150
+ user_identity_type = str(message.from_.user.user_identity_type)
151
+ if message.from_:
152
+ usr = message.from_.user
153
+ user = {
154
+ "sender_id": usr.id,
155
+ "sender_name": usr.display_name
156
+ }
157
+ content = str(message.body.content) if message.body else ""
158
+ stripped_content = self._clean_html(content)
159
+
160
+ reply_to_id = getattr(message, 'reply_to_id', None)
161
+ # Extract Reactions
162
+ reactions_data = self._extract_reactions(getattr(message, 'reactions', []))
163
+
164
+ msg = {
165
+ "message_id": message.id,
166
+ "sender_id": user_id,
167
+ "sender_name": user_display,
168
+ "sender_identity_type": user_identity_type, # e.g. "aadUser"
169
+ **user,
170
+ "chat_id": message.chat_id,
171
+ "created_date": message.created_date_time,
172
+ "policy_violation": message.policy_violation,
173
+ "content": content,
174
+ "text": stripped_content,
175
+ "reply_to_id": reply_to_id,
176
+ "reactions": reactions_data,
177
+ }
178
+ msgs.append(msg)
179
+ elif isinstance(message, Chat):
180
+ # ----------------------------------------------------------------
181
+ # Chat
182
+ # ----------------------------------------------------------------
183
+ # get the additional data from Chat:
184
+ data = message.additional_data
185
+ chat_id = message.additional_data.get('chatId')
186
+ from_data = data.get('from')
187
+ user_data = from_data.get('user', {}) if from_data else {}
188
+ user_id = user_data.get('id')
189
+ user_display = user_data.get('displayName')
190
+ user_identity_type = user_data.get('user_identity_type', None)
191
+ # extracting user from message Chat
192
+ user = {}
193
+ if data.get('from'):
194
+ usr = data.get('from')['user']
195
+ user = {
196
+ "sender_id": str(usr.get('id', None)),
197
+ "sender_name": usr.get('displayName', None)
198
+ }
199
+ content = None
200
+ if message.additional_data and message.additional_data.get('body') and message.additional_data['body'].get('content'):
201
+ content = str(message.additional_data['body'].get('content', None))
202
+ stripped_content = self._clean_html(content)
203
+ created_time = default_datetime
204
+ if message.additional_data and message.additional_data.get('createdDateTime'):
205
+ created_time = message.additional_data['createdDateTime']
206
+ msg = {
207
+ "message_id": message.id,
208
+ "sender_id": user_id,
209
+ "sender_name": user_display,
210
+ **user,
211
+ "chat_id": chat_id,
212
+ "created_date": created_time,
213
+ "policy_violation": '',
214
+ "content": content,
215
+ "text": stripped_content,
216
+ "reply_to_id": None,
217
+ "reactions": [], # Chat object might not have reaction info
218
+ }
219
+ msgs.append(msg)
220
+ elif isinstance(message, dict):
221
+ # ----------------------------------------------------------------
222
+ # dict-based message
223
+ # ----------------------------------------------------------------
224
+ chat_id = message.get('id', None)
225
+ sender_name = message.get('from', {}).get('user', {}).get('displayName', 'Unknown')
226
+ from_user = message.get('from', {}).get('user', {})
227
+ user_id = from_user.get('id', 'Unknown')
228
+ user_display = from_user.get('displayName', 'Unknown')
229
+ user_identity_type = from_user.get('user_identity_type', None)
230
+ # extracting user from message Chat
231
+ user = {
232
+ "sender_id": message.get('from', {}).get('user', {}).get('id', 'Unknown'),
233
+ "sender_name": sender_name
234
+ }
235
+ content = str(message.get('body', {}).get('content', ''))
236
+ created_time = message.get('createdDateTime', default_datetime)
237
+ print(f"[{created_time}] {sender_name}: {content}")
238
+ # content = str(message.body.content) if message.body else ""
239
+ stripped_content = self._clean_html(content)
240
+ reply_to_id = message.get('replyToId', None)
241
+ msg = {
242
+ "message_id": message.get('id', None),
243
+ "sender_id": user_id,
244
+ "sender_name": user_display or sender_name,
245
+ "sender_identity_type": user_identity_type,
246
+ **user,
247
+ "chat_id": chat_id,
248
+ "content": content,
249
+ "text": stripped_content,
250
+ "created_date": created_time if created_time else default_datetime,
251
+ "policy_violation": '',
252
+ "reply_to_id": reply_to_id,
253
+ "reactions": [], # Chat object might not have reaction info
254
+ }
255
+ msgs.append(msg)
256
+ else:
257
+ self._logger.error(
258
+ f'Unable to parse Message: {message}: {type(message)}'
259
+ )
260
+ continue
261
+ return msgs
262
+
263
+ async def run(self):
264
+ async with self.open() as client:
265
+ try:
266
+ if self.chat_name is not None:
267
+ # Find chat id by name:
268
+ chat = await client.find_chat_by_name(self.chat_name)
269
+ messages = await client.get_chat_messages(
270
+ chat_id=chat.id,
271
+ start_time=self.start_time,
272
+ end_time=self.end_time
273
+ )
274
+ elif self.chat_id is not None:
275
+ # Using the chat Id for extracting chat messages:
276
+ messages = await client.get_chat_messages(
277
+ chat_id=self.chat_id,
278
+ start_time=self.start_time,
279
+ end_time=self.end_time
280
+ )
281
+ elif self.channel_id is not None:
282
+ messages = await client.get_msteams_channel_messages(
283
+ team_id=self.team_id,
284
+ channel_id=self.channel_id,
285
+ start_time=self.start_time,
286
+ end_time=self.end_time
287
+ )
288
+ if not messages:
289
+ raise DataNotFound(
290
+ f"Found no messages on MS Team {self.team_id}:{self.channel_id}"
291
+ )
292
+ # Processing the messages:
293
+ msgs = self._process_messages(messages)
294
+ df = pd.DataFrame(msgs)
295
+ if self.as_dataframe is True:
296
+ # Adding program, channel name to dataframe:
297
+ df['program'] = self.program_name
298
+ if self.chat_name:
299
+ df['chat_name'] = self.chat_name
300
+ if self.channel_id:
301
+ df['channel_id'] = self.channel_id
302
+ # Convert to Created Date
303
+ df['created_date'] = df['created_date'].replace(pd.NaT, None)
304
+ # return only the dataframe:
305
+ self._result = df
306
+ return self._result
307
+ self._result = {
308
+ "data": df,
309
+ "messages": msgs,
310
+ "raw_messages": messages
311
+ }
312
+ self.add_metric('NUM_MESSAGES', len(messages))
313
+ return self._result
314
+ except Exception as exc:
315
+ self._logger.error(
316
+ f"Error getting Teams Channel Messages: {exc}"
317
+ )
318
+ raise ComponentError(
319
+ f"Error getting Teams Channel Messages: {exc}"
320
+ )