| 1 | 1 |  | from plugin.models import SchedulerTask, SchedulerJob | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 | 1 |  | from plugin.preferences.options.core.base.base import Option | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 | 1 |  | import logging | 
            
                                                                                                            
                            
            
                                    
            
            
                | 5 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 6 | 1 |  | log = logging.getLogger(__name__) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 7 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 8 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 9 | 1 |  | class SchedulerOption(Option): | 
                            
                    |  |  |  | 
                                                                                        
                                                                                     | 
            
                                                                                                            
                            
            
                                    
            
            
                | 10 | 1 |  |     def __init__(self, preferences, task=None, job=None): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 11 | 1 |  |         super(SchedulerOption, self).__init__(preferences, job) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 12 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 13 | 1 |  |         self._task = task | 
            
                                                                                                            
                            
            
                                    
            
            
                | 14 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 15 | 1 |  |     @property | 
            
                                                                                                            
                            
            
                                    
            
            
                | 16 |  |  |     def value(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 17 |  |  |         if self._option is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 18 |  |  |             log.warn('Tried to retrieve value from an option without "get()"') | 
            
                                                                                                            
                            
            
                                    
            
            
                | 19 |  |  |             return None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 20 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 21 |  |  |         return self._option.trigger | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 22 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 23 | 1 |  |     def get(self, account=None): | 
            
                                                                        
                            
            
                                    
            
            
                | 24 |  |  |         # Verify get() call is valid | 
            
                                                                        
                            
            
                                    
            
            
                | 25 |  |  |         if self.scope == 'account': | 
            
                                                                        
                            
            
                                    
            
            
                | 26 |  |  |             if account is None: | 
            
                                                                        
                            
            
                                    
            
            
                | 27 |  |  |                 raise ValueError('Account option requires the "account" parameter') | 
            
                                                                        
                            
            
                                    
            
            
                | 28 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 29 |  |  |             if not self._validate_account(account): | 
            
                                                                        
                            
            
                                    
            
            
                | 30 |  |  |                 raise ValueError('Invalid value for "account" parameter: %r' % account) | 
            
                                                                        
                            
            
                                    
            
            
                | 31 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 32 |  |  |         if self.scope == 'server' and account is not None: | 
            
                                                                        
                            
            
                                    
            
            
                | 33 |  |  |             raise ValueError("Server option can't be called with the \"account\" parameter") | 
            
                                                                        
                            
            
                                    
            
            
                | 34 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 35 |  |  |         # Get/Create `SchedulerTask` | 
            
                                                                        
                            
            
                                    
            
            
                | 36 |  |  |         task, _ = SchedulerTask.get_or_create( | 
            
                                                                        
                            
            
                                    
            
            
                | 37 |  |  |             key=self.key | 
            
                                                                        
                            
            
                                    
            
            
                | 38 |  |  |         ) | 
            
                                                                        
                            
            
                                    
            
            
                | 39 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 40 |  |  |         # Get/Create `SchedulerJob` | 
            
                                                                        
                            
            
                                    
            
            
                | 41 |  |  |         job, _ = SchedulerJob.get_or_create( | 
            
                                                                        
                            
            
                                    
            
            
                | 42 |  |  |             account=account or 0, | 
            
                                                                        
                            
            
                                    
            
            
                | 43 |  |  |             task=task, | 
            
                                                                        
                            
            
                                    
            
            
                | 44 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 45 |  |  |             defaults={ | 
            
                                                                        
                            
            
                                    
            
            
                | 46 |  |  |                 'trigger': self.default | 
            
                                                                        
                            
            
                                    
            
            
                | 47 |  |  |             } | 
            
                                                                        
                            
            
                                    
            
            
                | 48 |  |  |         ) | 
            
                                                                        
                            
            
                                    
            
            
                | 49 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 50 |  |  |         if job.trigger and job.due_at is None: | 
                            
                    |  |  |  | 
                                                                                        
                                                                                     | 
            
                                                                        
                            
            
                                    
            
            
                | 51 |  |  |             job.due_at = self.get_next(job) | 
            
                                                                        
                            
            
                                    
            
            
                | 52 |  |  |             job.save() | 
            
                                                                        
                            
            
                                    
            
            
                | 53 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 54 |  |  |         return self._clone(task, job) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 55 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 56 | 1 |  |     def update(self, value, account=None, emit=True): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 57 |  |  |         if self.scope == 'account': | 
            
                                                                                                            
                            
            
                                    
            
            
                | 58 |  |  |             if account is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 59 |  |  |                 raise ValueError('Account option requires the "account" parameter') | 
            
                                                                                                            
                            
            
                                    
            
            
                | 60 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 61 |  |  |             if not self._validate_account(account): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 62 |  |  |                 raise ValueError('Invalid value for "account" parameter: %r' % account) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 63 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 64 |  |  |         if self.scope == 'server' and account is not None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 65 |  |  |             raise ValueError("Server option can't be called with the \"account\" parameter") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 66 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 67 |  |  |         # Get/Create `SchedulerTask` | 
            
                                                                                                            
                            
            
                                    
            
            
                | 68 |  |  |         task, _ = SchedulerTask.get_or_create( | 
            
                                                                                                            
                            
            
                                    
            
            
                | 69 |  |  |             key=self.key | 
            
                                                                                                            
                            
            
                                    
            
            
                | 70 |  |  |         ) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 71 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 72 |  |  |         # Get/Create `SchedulerJob` | 
            
                                                                                                            
                            
            
                                    
            
            
                | 73 |  |  |         job, _ = SchedulerJob.get_or_create( | 
            
                                                                                                            
                            
            
                                    
            
            
                | 74 |  |  |             account=account or 0, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 75 |  |  |             task=task | 
            
                                                                                                            
                            
            
                                    
            
            
                | 76 |  |  |         ) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 77 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 78 |  |  |         # Update job | 
            
                                                                                                            
                            
            
                                    
            
            
                | 79 |  |  |         self.update_trigger(job, value) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 80 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 81 |  |  |         # Emit database change to handler (if enabled) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 82 |  |  |         if emit: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 83 |  |  |             self._preferences.on_database_changed(self.key, value, account=account) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 84 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 85 | 1 |  |     def update_trigger(self, job, value): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 86 |  |  |         if job.trigger == value: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 87 |  |  |             # Trigger hasn't changed | 
            
                                                                                                            
                            
            
                                    
            
            
                | 88 |  |  |             return | 
            
                                                                                                            
                            
            
                                    
            
            
                | 89 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 90 |  |  |         # Update `trigger` and `due_at` properties | 
            
                                                                                                            
                            
            
                                    
            
            
                | 91 |  |  |         job.trigger = value | 
            
                                                                                                            
                            
            
                                    
            
            
                | 92 |  |  |         job.due_at = self.get_next(job) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 93 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 94 |  |  |         # Save changes | 
            
                                                                                                            
                            
            
                                    
            
            
                | 95 |  |  |         job.save() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 96 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 97 | 1 |  |     @classmethod | 
            
                                                                                                            
                            
            
                                    
            
            
                | 98 |  |  |     def get_next(cls, job): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 99 |  |  |         if job.trigger is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 100 |  |  |             return None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 101 |  |  |  | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 102 |  |  |         return job.next_at() | 
            
                                                        
            
                                    
            
            
                | 103 |  |  |  | 
            
                        
Methods which raise
NotImplementedErrorshould be overridden in concrete child classes.