source: server/lib/gutenbach/server/job.py @ 34a4e5d

no-cups
Last change on this file since 34a4e5d was 34a4e5d, checked in by Jessica B. Hamrick <jhamrick@…>, 12 years ago

Cancelling jobs work

  • Property mode set to 100644
File size: 7.0 KB
Line 
1from . import InvalidJobStateException, MissingDataException
2from .player import Player
3from gutenbach.ipp import JobStates as States
4import os
5import gutenbach.ipp as ipp
6import logging
7
8# initialize logger
9logger = logging.getLogger(__name__)
10
11class Job(object):
12
13    # for IPP
14    attributes = [
15        "job-id",
16        "job-name",
17        "job-originating-user-name",
18        "job-k-octets",
19        "job-state",
20        "job-printer-uri"
21    ]
22
23    def __init__(self, job_id=-1, printer=None, creator=None, name=None, size=None):
24        """Create an empty Gutenbach job.
25
26        """
27
28        self.printer = printer
29        self.player = None
30
31        self.id = job_id
32        self.creator = creator
33        self.name = name
34        self.size = size
35        self.state = States.HELD
36        self.priority = 1
37
38        self.document_name = None
39        self.document_format = None
40        self.document_natural_language = None
41        self.compression = None
42   
43    def __repr__(self):
44        return str(self)
45
46    def __str__(self):
47        return "<Job %d '%s'>" % (self.id, self.name)
48
49    def __cmp__(self, other):
50        return cmp(self.priority, other.priority)
51
52    ######################################################################
53    ###                          Properties                            ###
54    ######################################################################
55
56    @property
57    def id(self):
58        """Unique job identifier.  Should be a positive integer,
59        except when unassigned, when it defaults to -1.
60       
61        """
62        return self._id
63    @id.setter
64    def id(self, val):
65        try:
66            self._id = int(val)
67        except TypeError:
68            self._id = -1
69
70    @property
71    def uri(self):
72        return self.uris[0]
73
74    @property
75    def uris(self):
76        return ["ipp://localhost/jobs/%d" % self.id,
77                "ipp://localhost:8000/jobs/%d" % self.id]
78
79    @property
80    def creator(self):
81        """The user who created the job; analogous to the IPP
82        requesting-user-name.
83
84        """
85        return self._creator
86    @creator.setter
87    def creator(self, val):
88        if val is None:
89            self._creator = ""
90        else:
91            self._creator = str(val)
92
93    @property
94    def name(self):
95        """The job's name.
96
97        """
98        return self._name
99    @name.setter
100    def name(self, val):
101        if val is None:
102            self._name = ""
103        else:
104            self._name = str(val)
105
106    @property
107    def size(self):
108        """The size of the job in bytes.
109
110        """
111        return self._size
112    @size.setter
113    def size(self, val):
114        try:
115            self._size = int(val)
116        except TypeError:
117            self._size = 0
118
119    @property
120    def is_playing(self):
121        return self.state == States.PROCESSING
122
123    @property
124    def is_ready(self):
125        return self.state == States.PENDING
126
127    @property
128    def is_finished(self):
129        return self.state != States.PENDING and \
130               self.state != States.PROCESSING and \
131               self.state != States.HELD
132       
133    ######################################################################
134    ###                            Methods                             ###
135    ######################################################################
136
137    def play(self):
138        """Non-blocking play function.
139
140        """
141       
142        # make sure the job is waiting to be played and that it's
143        # valid
144        if self.state != States.PENDING:
145            raise InvalidJobStateException(self.state)
146       
147        # and set the state to processing if we're good to go
148        logger.info("playing job %s" % str(self))
149        self.state = States.PROCESSING
150        self.player.callback = self._completed
151        self.player.start()
152
153    def pause(self):
154        if self.is_playing:
155            self.player.mplayer_pause()
156            self.state = States.STOPPED
157
158    def cancel(self):
159        if self.is_playing:
160            self.player.callback = self._canceled
161            self.player.mplayer_stop()
162        self.state = States.CANCELLED
163
164    def abort(self):
165        if self.is_playing:
166            self.player.callback = self._aborted
167            self.player.mplayer_stop()
168        self.state = states.ABORTED
169
170    def _completed(self):
171        logger.info("completed job %s" % str(self))
172        self.state = States.COMPLETE
173        self.player = None
174
175    def _canceled(self):
176        logger.info("canceled job %s" % str(self))
177        self.state = States.CANCELLED
178        self.player = None
179
180    def _aborted(self):
181        logger.info("aborted job %s" % str(self))
182        self.state = States.ABORTED
183        self.player = None
184
185    ######################################################################
186    ###                        IPP Attributes                          ###
187    ######################################################################
188
189    @property
190    def job_id(self):
191        return ipp.JobId(self.id)
192
193    @property
194    def job_name(self):
195        return ipp.JobName(self.name)
196
197    @property
198    def job_originating_user_name(self):
199        return ipp.JobOriginatingUserName(self.creator)
200
201    @property
202    def job_k_octets(self):
203        return ipp.JobKOctets(self.size)
204
205    @property
206    def job_state(self):
207        return ipp.JobState(self.state)
208
209    @property
210    def job_printer_uri(self):
211        return ipp.JobPrinterUri(self.printer.uri)
212
213
214    ######################################################################
215    ###                        IPP Operations                          ###
216    ######################################################################
217
218    def cancel_job(self):
219        pass
220
221    def send_document(self, document, document_name=None,
222                      document_format=None, document_natural_language=None,
223                      requesting_user_name=None, compression=None,
224                      last_document=None):
225
226        if self.state != States.HELD:
227            raise InvalidJobStateException(self.state)
228
229        self.player = Player(document)
230
231        if self.size == 0:
232            self.size = os.path.getsize(document.name)
233       
234        self.document_name = str(document_name)
235        self.document_format = str(document_format)
236        self.document_natural_language = str(document_natural_language)
237        self.creator = str(requesting_user_name)
238        self.compression = str(compression)
239        self.state = States.PENDING
240
241        logger.debug("document for job %d is '%s'" % (self.id, self.document_name))
242
243    def send_uri(self):
244        pass
245
246    def get_job_attributes(self, requested_attributes=None):
247        if requested_attributes is None:
248            requested = self.attributes
249        else:
250            requested = [a for a in self.attributes if a in requested_attributes]
251
252        _attributes = [attr.replace("-", "_") for attr in requested]
253        attributes = [getattr(self, attr) for attr in _attributes]
254        return attributes
255
256    def set_job_attributes(self):
257        pass
258
259    def restart_job(self):
260        pass
261
262    def promote_job(self):
263        pass
Note: See TracBrowser for help on using the repository browser.