Changeset 345c476 for server/lib/gutenbach
- Timestamp:
- Jan 11, 2012, 8:36:27 PM (12 years ago)
- Branches:
- no-cups
- Children:
- a2b0582
- Parents:
- 09790fe
- git-author:
- Jessica B. Hamrick <jhamrick@…> (01/11/12 20:36:27)
- git-committer:
- Jessica B. Hamrick <jhamrick@…> (01/11/12 20:36:27)
- Location:
- server/lib/gutenbach/server
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
server/lib/gutenbach/server/job.py
r33ea505 r345c476 10 10 class GutenbachJob(object): 11 11 12 def __init__(self, job_id=None, creator=None, name=None): 12 def __init__(self, job_id=None, creator=None, name=None, 13 priority=None, document=None): 13 14 """Create an empty Gutenbach job. 14 15 … … 16 17 17 18 self.player = None 19 self.document = None 18 20 19 21 self.id = job_id 20 22 self.creator = creator 21 23 self.name = name 22 self.state = States.HELD 23 self.priority = 1 24 self.document = None 24 self.priority = priority 25 self._why_done = None 26 27 if document is not None: 28 self.spool(document) 25 29 26 30 def __repr__(self): … … 47 51 def id(self, val): 48 52 try: 49 self._id = int(val)53 self._id = max(int(val), -1) 50 54 except TypeError: 51 55 self._id = -1 56 57 @property 58 def priority(self): 59 return self._priority 60 @priority.setter 61 def priority(self, val): 62 try: 63 self._priority = max(int(val), 1) 64 except TypeError: 65 self._priority = 1 52 66 53 67 @property … … 90 104 91 105 @property 106 def is_valid(self): 107 """Whether the job is ready to be manipulated (spooled, 108 played, etc). Note that playing the job still requires it to 109 be spooled first. 110 111 """ 112 return self.id > 0 and \ 113 self.priority > 0 114 115 @property 116 def is_ready(self): 117 """Whether the job is ready to be played. 118 119 """ 120 return self.is_valid and \ 121 self.player is not None and \ 122 not self.player.is_playing and \ 123 not self._why_done == "cancelled" and \ 124 not self._why_done == "aborted" 125 126 @property 92 127 def is_playing(self): 93 return self.state == States.PROCESSING 94 95 @property 96 def is_ready(self): 97 return self.state == States.PENDING 98 99 @property 100 def is_finished(self): 101 return self.state != States.PENDING and \ 102 self.state != States.PROCESSING and \ 103 self.state != States.HELD 104 128 """Whether the job is currently playing (regardless of whether 129 it's paused). 130 131 """ 132 return self.is_valid and \ 133 self.player is not None and \ 134 self.player.is_playing 135 136 @property 137 def is_paused(self): 138 """Whether the job is currently paused. 139 140 """ 141 return self.is_valid and \ 142 self.player is not None and \ 143 self.player.is_paused 144 145 @property 146 def is_done(self): 147 return (self.is_valid and \ 148 self.player is not None and \ 149 self.player.is_done) or \ 150 (self._why_done == "cancelled" or \ 151 self._why_done == "aborted") 152 153 @property 154 def state(self): 155 if self.is_ready: 156 state = States.PENDING 157 elif self.is_playing and not self.is_paused: 158 state = States.PROCESSING 159 elif self.is_playing and self.is_paused: 160 state = States.STOPPED 161 elif self.is_done and self._why_done == "completed": 162 state = States.COMPLETE 163 elif self.is_done and self._why_done == "cancelled": 164 state = States.CANCELLED 165 elif self.is_done and self._why_done == "aborted": 166 state = States.ABORTED 167 else: 168 state = States.HELD 169 return state 170 105 171 ###################################################################### 106 172 ### Methods ### 107 173 ###################################################################### 108 174 109 def spool(self, document, username=None): 110 if self.state != States.HELD: 111 raise InvalidJobStateException(self.state) 112 175 def spool(self, document): 176 if not self.is_valid: 177 raise InvalidJobStateException(self.state) 113 178 self.document = document.name 114 179 self.player = Player(document) 115 self.creator = username116 self.state = States.PENDING117 118 180 logger.debug("document for job %d is '%s'" % (self.id, self.document)) 119 120 181 121 182 def play(self): … … 140 201 def _completed(): 141 202 logger.info("completed job %s" % str(self)) 142 self.state = States.COMPLETE 143 self.player = None 144 145 self.state = States.PROCESSING 203 self._why_done = "completed" 146 204 self.player.callback = _completed 147 205 self.player.start() … … 155 213 if not self.is_playing: 156 214 raise InvalidJobStateException(self.state) 157 158 215 self.player.mplayer_pause() 159 self.state = States.STOPPED160 216 161 217 def cancel(self): 162 def _canceled(): 163 logger.info("canceled job %s" % str(self)) 164 self.state = States.CANCELLED 165 self.player = None 218 def _cancelled(): 219 logger.info("cancelled job %s" % str(self)) 220 self._why_done = "cancelled" 166 221 167 222 if self.is_playing: 168 self.player.callback = _cancel ed223 self.player.callback = _cancelled 169 224 self.player.mplayer_stop() 170 elif self.is_ finished:171 raise InvalidJobStateException(self.state) 172 173 self.state = States.CANCELLED225 elif self.is_done and not self._why_done == "cancelled": 226 raise InvalidJobStateException(self.state) 227 else: 228 _cancelled() 174 229 175 230 def abort(self): 176 231 def _aborted(): 177 232 logger.info("aborted job %s" % str(self)) 178 self.state = States.ABORTED 179 self.player = None 233 self._why_done = "aborted" 180 234 181 235 if self.is_playing: 182 236 self.player.callback = _aborted 183 237 self.player.mplayer_stop() 184 elif self.is_ finished:185 raise InvalidJobStateException(self.state) 186 187 self.state = States.ABORTED188 189 238 elif self.is_done and not self._why_done == "aborted": 239 raise InvalidJobStateException(self.state) 240 else: 241 _aborted() 242 243 -
server/lib/gutenbach/server/player.py
r33ea505 r345c476 17 17 self.player = None 18 18 self._callback = None 19 self._paused = False 19 20 20 21 @property … … 23 24 playing = self.player and self.player.poll() is None 24 25 return playing 26 27 @property 28 def is_paused(self): 29 with self.lock: 30 paused = self.is_playing and self._paused 31 return paused 32 33 @property 34 def is_done(self): 35 with self.lock: 36 done = self.player and self.player.poll() is not None 37 return done 25 38 26 39 @property … … 41 54 self.callback() 42 55 43 self.fh.close()44 self.fh = None45 46 56 def mplayer_play(self): 57 if not self.isAlive(): 58 return 59 47 60 logger.info("playing file '%s'" % self.fh.name) 61 self._paused = False 48 62 49 63 # open mplayer … … 63 77 break 64 78 time.sleep(0.1) 65 79 66 80 logger.info("mplayer finished with code %d" % self.player.returncode) 67 81 … … 77 91 78 92 def mplayer_pause(self): 93 if not self.isAlive(): 94 return 95 79 96 with self.lock: 80 97 if self.is_playing: 81 98 self.player.stdin.write("pause\n") 99 self._paused = not(self._paused) 82 100 83 101 def mplayer_stop(self): 102 if not self.isAlive(): 103 return 104 84 105 with self.lock: 85 106 if self.is_playing: -
server/lib/gutenbach/server/printer.py
r33ea505 r345c476 101 101 if self.current_job is None: 102 102 self.start_job() 103 elif self.current_job.is_ finished:103 elif self.current_job.is_done: 104 104 self.complete_job() 105 105 except: … … 164 164 165 165 try: 166 if not self.current_job.is_ finished:166 if not self.current_job.is_done: 167 167 self.current_job.stop() 168 168 finally: … … 382 382 383 383 job = self.get_job(job_id) 384 job.spool(document , username=requesting_user_name)384 job.spool(document) 385 385 386 386 def send_uri(self):
Note: See TracChangeset
for help on using the changeset viewer.