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
RevLine 
[eee389a]1from . import InvalidJobStateException, MissingDataException
2from .player import Player
[b01b6d1]3from gutenbach.ipp import JobStates as States
[776a659]4import os
[793432f]5import gutenbach.ipp as ipp
[ee8e6d0]6import logging
[d04a689]7
8# initialize logger
9logger = logging.getLogger(__name__)
[776a659]10
11class Job(object):
12
[1a63bf7]13    # for IPP
[b2e077a]14    attributes = [
15        "job-id",
16        "job-name",
17        "job-originating-user-name",
18        "job-k-octets",
19        "job-state",
20        "job-printer-uri"
[1a63bf7]21    ]
[b2e077a]22
[b01b6d1]23    def __init__(self, job_id=-1, printer=None, creator=None, name=None, size=None):
24        """Create an empty Gutenbach job.
[e58af05]25
[776a659]26        """
[ee8e6d0]27
[b01b6d1]28        self.printer = printer
29        self.player = None
[ee8e6d0]30
[b01b6d1]31        self.id = job_id
32        self.creator = creator
33        self.name = name
34        self.size = size
[eee389a]35        self.state = States.HELD
36        self.priority = 1
[ee8e6d0]37
[e58af05]38        self.document_name = None
[b01b6d1]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)
[e58af05]48
[eee389a]49    def __cmp__(self, other):
50        return cmp(self.priority, other.priority)
51
[b01b6d1]52    ######################################################################
53    ###                          Properties                            ###
54    ######################################################################
[1a63bf7]55
[b01b6d1]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):
[1a63bf7]65        try:
[b01b6d1]66            self._id = int(val)
67        except TypeError:
68            self._id = -1
69
70    @property
[34a4e5d]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
[b01b6d1]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.
[1a63bf7]109
[b01b6d1]110        """
[eee389a]111        return self._size
[b01b6d1]112    @size.setter
113    def size(self, val):
[ee8e6d0]114        try:
[b01b6d1]115            self._size = int(val)
116        except TypeError:
117            self._size = 0
118
[eee389a]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):
[34a4e5d]129        return self.state != States.PENDING and \
130               self.state != States.PROCESSING and \
131               self.state != States.HELD
[eee389a]132       
[b01b6d1]133    ######################################################################
134    ###                            Methods                             ###
135    ######################################################################
136
137    def play(self):
[eee389a]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
[b01b6d1]148        logger.info("playing job %s" % str(self))
[eee389a]149        self.state = States.PROCESSING
150        self.player.callback = self._completed
[d21198f]151        self.player.start()
[eee389a]152
153    def pause(self):
[34a4e5d]154        if self.is_playing:
[eee389a]155            self.player.mplayer_pause()
[34a4e5d]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
[eee389a]163
[34a4e5d]164    def abort(self):
165        if self.is_playing:
166            self.player.callback = self._aborted
[eee389a]167            self.player.mplayer_stop()
[34a4e5d]168        self.state = states.ABORTED
[eee389a]169
170    def _completed(self):
171        logger.info("completed job %s" % str(self))
172        self.state = States.COMPLETE
[b01b6d1]173        self.player = None
174
[eee389a]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
[1a63bf7]184
[b01b6d1]185    ######################################################################
186    ###                        IPP Attributes                          ###
187    ######################################################################
[776a659]188
189    @property
[b2e077a]190    def job_id(self):
[b01b6d1]191        return ipp.JobId(self.id)
[b2e077a]192
193    @property
194    def job_name(self):
[793432f]195        return ipp.JobName(self.name)
[776a659]196
[b2e077a]197    @property
198    def job_originating_user_name(self):
[ee8e6d0]199        return ipp.JobOriginatingUserName(self.creator)
[776a659]200
[b2e077a]201    @property
202    def job_k_octets(self):
[ee8e6d0]203        return ipp.JobKOctets(self.size)
[b2e077a]204
205    @property
206    def job_state(self):
[eee389a]207        return ipp.JobState(self.state)
[b2e077a]208
209    @property
210    def job_printer_uri(self):
[793432f]211        return ipp.JobPrinterUri(self.printer.uri)
[b2e077a]212
[b01b6d1]213
214    ######################################################################
215    ###                        IPP Operations                          ###
216    ######################################################################
217
218    def cancel_job(self):
219        pass
220
[eee389a]221    def send_document(self, document, document_name=None,
222                      document_format=None, document_natural_language=None,
223                      requesting_user_name=None, compression=None,
[b01b6d1]224                      last_document=None):
225
[eee389a]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)
[b01b6d1]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)
[eee389a]239        self.state = States.PENDING
[b01b6d1]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:
[ee8e6d0]248            requested = self.attributes
[b01b6d1]249        else:
250            requested = [a for a in self.attributes if a in requested_attributes]
[776a659]251
[b01b6d1]252        _attributes = [attr.replace("-", "_") for attr in requested]
253        attributes = [getattr(self, attr) for attr in _attributes]
254        return attributes
[776a659]255
[b01b6d1]256    def set_job_attributes(self):
257        pass
[776a659]258
[b01b6d1]259    def restart_job(self):
260        pass
[776a659]261
[b01b6d1]262    def promote_job(self):
263        pass
Note: See TracBrowser for help on using the repository browser.