PKDevTools 0.13.20250213.233__tar.gz → 0.13.20250214.235__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/DBManager.py +80 -0
  2. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/NSEMarketStatus.py +1 -1
  3. pkdevtools-0.13.20250214.235/PKDevTools/classes/__init__.py +1 -0
  4. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools.egg-info/PKG-INFO +2 -2
  5. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKG-INFO +2 -2
  6. pkdevtools-0.13.20250213.233/PKDevTools/classes/__init__.py +0 -1
  7. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/LICENSE +0 -0
  8. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/LICENSE.txt +0 -0
  9. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/README.txt +0 -0
  10. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/__init__.py +0 -0
  11. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/Archiver.py +0 -0
  12. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/ColorText.py +0 -0
  13. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/Committer.py +0 -0
  14. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/CookieHelper.py +0 -0
  15. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/Environment.py +0 -0
  16. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/Fetcher.py +0 -0
  17. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/FunctionTimeouts.py +0 -0
  18. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/GmailReader.py +0 -0
  19. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/MarketHours.py +0 -0
  20. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/MenuOptions.py +0 -0
  21. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/OutputControls.py +0 -0
  22. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/PKDateUtilities.py +0 -0
  23. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/PKGitFolderDownloader.py +0 -0
  24. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/PKJoinableQueue.py +0 -0
  25. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/PKMultiProcessorClient.py +0 -0
  26. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/PKPickler.py +0 -0
  27. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/PKTimer.py +0 -0
  28. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/Pikey.py +0 -0
  29. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/Singleton.py +0 -0
  30. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/SuppressOutput.py +0 -0
  31. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/System.py +0 -0
  32. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/Telegram.py +0 -0
  33. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/UserSubscriptions.py +0 -0
  34. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/Utils.py +0 -0
  35. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/WorkflowManager.py +0 -0
  36. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/githubutilities.py +0 -0
  37. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/log.py +0 -0
  38. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/multiprocessing_logging.py +0 -0
  39. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/pubsub/__init__.py +0 -0
  40. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/pubsub/events.py +0 -0
  41. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/pubsub/publisher.py +0 -0
  42. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/pubsub/subscriber.py +0 -0
  43. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/squash.py +0 -0
  44. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/classes/updater.py +0 -0
  45. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/release.md +0 -0
  46. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools/requirements.txt +0 -0
  47. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools.egg-info/SOURCES.txt +0 -0
  48. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools.egg-info/dependency_links.txt +0 -0
  49. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools.egg-info/entry_points.txt +0 -0
  50. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools.egg-info/not-zip-safe +0 -0
  51. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools.egg-info/requires.txt +0 -0
  52. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/PKDevTools.egg-info/top_level.txt +0 -0
  53. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/README.md +0 -0
  54. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/setup.cfg +0 -0
  55. {pkdevtools-0.13.20250213.233 → pkdevtools-0.13.20250214.235}/setup.py +0 -0
@@ -555,3 +555,83 @@ class DBManager:
555
555
  self.conn.close()
556
556
  self.conn = None
557
557
  return success1 and success2
558
+
559
+ def removeScannerJob(self,userID, scanId):
560
+ """
561
+ Removes scanId from scannerJobs column in alertsubscriptions
562
+
563
+ Removes userID from the users column in scannerJobs
564
+
565
+ Deletes the row in scannerJobs if no more userIds are left
566
+ """
567
+ try:
568
+ success = False
569
+ # Step 1: Remove job from user's alertsubscriptions table
570
+ query_alertsubscriptions = """
571
+ UPDATE alertsubscriptions
572
+ SET scannerJobs =
573
+ CASE
574
+ WHEN scannerJobs = ? THEN '' -- If the only job, set to empty string
575
+ ELSE
576
+ TRIM(
577
+ REPLACE(
578
+ REPLACE(
579
+ ';' || scannerJobs || ';', -- Add extra delimiters to prevent partial replacements
580
+ ';' || ? || ';',
581
+ ';'
582
+ ),
583
+ ';;', ';' -- Fix extra semicolons
584
+ ),
585
+ ';'
586
+ ) -- Trim leading/trailing semicolon
587
+ END
588
+ WHERE userId = ?;
589
+ """
590
+ result = self.connection().execute(query_alertsubscriptions, (scanId,scanId,userID))
591
+ if result.rows_affected > 0:
592
+ default_logger().debug(f"User: {userID} removed {scanId} from alertsubscriptions!")
593
+ success = True
594
+ if success:
595
+ # Step 2: Remove userId from scannerJobs table
596
+ query_scanner_jobs = """
597
+ UPDATE scannerJobs
598
+ SET users =
599
+ CASE
600
+ WHEN users = ? THEN '' -- If the only user, set to empty string
601
+ ELSE
602
+ TRIM(
603
+ REPLACE(
604
+ REPLACE(
605
+ ';' || users || ';',
606
+ ';' || ? || ';',
607
+ ';'
608
+ ),
609
+ ';;', ';'
610
+ ),
611
+ ';'
612
+ ) -- Trim leading/trailing semicolon
613
+ END
614
+ WHERE scannerId = ?;
615
+ """
616
+ result = self.connection().execute(query_scanner_jobs, (str(userID),str(userID),scanId))
617
+ if result.rows_affected > 0:
618
+ default_logger().debug(f"User: {userID} removed {scanId} from scannerJobs!")
619
+ success = True
620
+ if success:
621
+ # Step 3: Delete row from scannerJobs if users column is empty
622
+ query_delete_empty = """
623
+ DELETE FROM scannerJobs WHERE scannerId = ? AND (users IS NULL OR users = '');
624
+ """
625
+ result = self.connection().execute(query_delete_empty, (scanId,))
626
+ if result.rows_affected > 0:
627
+ default_logger().debug(f"{scanId} deleted from scannerJobs by User: {userID} !")
628
+ success = True
629
+ except Exception as e: # pragma: no cover
630
+ print(f"Could not removeScannerJob: {scanId} for UserID: {userID}\n{e}")
631
+ default_logger().debug(e, exc_info=True)
632
+ pass
633
+ finally:
634
+ if self.conn is not None:
635
+ self.conn.close()
636
+ self.conn = None
637
+ return success
@@ -86,7 +86,7 @@ class NSEMarketStatus(SingletonMixin, metaclass=SingletonType):
86
86
  return shouldFetch, next_bell, filePath, modifiedDateTime
87
87
 
88
88
  def getNextBell(self):
89
- if not 'pytest' in sys.modules:
89
+ if 'unittest' in sys.modules or any("pytest" in arg for arg in sys.argv):
90
90
  return '2025-02-14T09:15:00+05:30'
91
91
 
92
92
  next_bell = self.marketStatus.get("next_bell")
@@ -0,0 +1 @@
1
+ VERSION='0.13.20250214.235'
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: PKDevTools
3
- Version: 0.13.20250213.233
3
+ Version: 0.13.20250214.235
4
4
  Summary: A general day-to-day toolset for PKScreener repos
5
5
  Home-page: https://github.com/pkjmesra/PKDevTools
6
- Download-URL: https://github.com/pkjmesra/PKDevTools/archive/v0.13.20250213.233.zip
6
+ Download-URL: https://github.com/pkjmesra/PKDevTools/archive/v0.13.20250214.235.zip
7
7
  Author: pkjmesra
8
8
  Author-email: pkjmesra@gmail.com
9
9
  License: OSI Approved (MIT)
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: PKDevTools
3
- Version: 0.13.20250213.233
3
+ Version: 0.13.20250214.235
4
4
  Summary: A general day-to-day toolset for PKScreener repos
5
5
  Home-page: https://github.com/pkjmesra/PKDevTools
6
- Download-URL: https://github.com/pkjmesra/PKDevTools/archive/v0.13.20250213.233.zip
6
+ Download-URL: https://github.com/pkjmesra/PKDevTools/archive/v0.13.20250214.235.zip
7
7
  Author: pkjmesra
8
8
  Author-email: pkjmesra@gmail.com
9
9
  License: OSI Approved (MIT)
@@ -1 +0,0 @@
1
- VERSION='0.13.20250213.233'