Restructure the code and implement a printing queue #29
88
src/task.py
Normal file
88
src/task.py
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
# Here we define the types of tasks
|
||||||
|
# We are using Abstract Base Classes,
|
||||||
|
# like this we can define types of tasks ( text, images, ... )
|
||||||
|
# that all work with the same basic options
|
||||||
|
|
||||||
|
# The tasks are going to be injected into a Queue.
|
||||||
|
# It's a usefull way of storing information in our
|
||||||
|
# program, while making sure that things are indeed printed.
|
||||||
|
# It's also a way to prevent two concurrent connexions creating
|
||||||
|
# a access conflict on a single printer, like two people wanting
|
||||||
|
# to print at the same time.
|
||||||
|
|
||||||
|
# We can also delay and store printing tasks until a printer becomes
|
||||||
|
# available if none is online.
|
||||||
|
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
## See https://docs.python.org/3/library/abc.html to learn more about this
|
||||||
|
|
||||||
|
# from dataclasses import dataclass
|
||||||
|
from enum import Enum
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
## You can expand this if you want to take other types of tasks into account
|
||||||
|
class TaskType(Enum):
|
||||||
|
TEXT = "text"
|
||||||
|
IMAGE = "image"
|
||||||
|
CUT = "cut"
|
||||||
|
|
||||||
|
|
||||||
|
class PrintTask(ABC):
|
||||||
|
"""
|
||||||
|
A print task holds information about what we are looking to print.
|
||||||
|
"""
|
||||||
|
def __init__(self, task_type):
|
||||||
|
self.task_id = self._generate_id()
|
||||||
|
self.task_type = task_type
|
||||||
|
self.status = "pending" # pending, processing, completed, failed
|
||||||
|
|
||||||
|
print("Created a new " + str(self.task_type) + " with ID " + self.task_id)
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_print_data(self):
|
||||||
|
"""Return data formatted for printer"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _generate_id(self):
|
||||||
|
# Generate unique task ID
|
||||||
|
return str(uuid.uuid4())
|
||||||
|
|
||||||
|
|
||||||
|
class TextTask(PrintTask):
|
||||||
|
"""
|
||||||
|
This tasks represents a texte content, and it's signature.
|
||||||
|
"""
|
||||||
|
def __init__(self, content, signature):
|
||||||
|
super().__init__(TaskType.TEXT)
|
||||||
|
self.content = content
|
||||||
|
self.signature = signature
|
||||||
|
|
||||||
|
def get_print_data(self):
|
||||||
|
return { "txt": self.content, "sign": self.signature }
|
||||||
|
|
||||||
|
class ImageTask(PrintTask):
|
||||||
|
"""
|
||||||
|
This tasks represents a image content ( in the form of it's path ), and it's signature.
|
||||||
|
"""
|
||||||
|
def __init__(self, image_path, signature, process):
|
||||||
|
super().__init__(TaskType.IMAGE)
|
||||||
|
self.image_path = image_path
|
||||||
|
self.signature = signature
|
||||||
|
self.process = process
|
||||||
|
|
||||||
|
def get_print_data(self):
|
||||||
|
# Return image data in printer-compatible format
|
||||||
|
return { "img": self.image_path, "sign": self.signature, "process" : self.process }
|
||||||
|
|
||||||
|
class CutTask(PrintTask):
|
||||||
|
"""
|
||||||
|
This class activates the cutter on the printer if it exists
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__(TaskType.CUT)
|
||||||
|
|
||||||
|
# There is no print data,
|
||||||
|
# the task existence in itself is indication of what to do
|
||||||
|
def get_print_data(self):
|
||||||
|
return None
|
||||||
Reference in New Issue
Block a user