Files
marcocosta10000 6b3b6541a7 feat: add psagentai agent with deployment and configuration
Initial project setup including the main agent script, configuration
files, profile JSON state, systemd service unit, startup script,
deployment documentation, and Python dependencies.

Includes .env, venv/, and __pycache__/ which should likely be
excluded via .gitignore to avoid committing secrets and artifacts.
2026-10-25 17:05:13 -03:00

81 lines
2.7 KiB
Python

"""The proxy class for an image part, and related objects."""
from __future__ import annotations
import hashlib
from typing import TYPE_CHECKING
from docx.image.image import Image
from docx.opc.part import Part
from docx.shared import Emu, Inches
if TYPE_CHECKING:
from docx.opc.package import OpcPackage
from docx.opc.packuri import PackURI
class ImagePart(Part):
"""An image part.
Corresponds to the target part of a relationship with type RELATIONSHIP_TYPE.IMAGE.
"""
def __init__(
self, partname: PackURI, content_type: str, blob: bytes, image: Image | None = None
):
super(ImagePart, self).__init__(partname, content_type, blob)
self._image = image
@property
def default_cx(self):
"""Native width of this image, calculated from its width in pixels and
horizontal dots per inch (dpi)."""
px_width = self.image.px_width
horz_dpi = self.image.horz_dpi
width_in_inches = px_width / horz_dpi
return Inches(width_in_inches)
@property
def default_cy(self):
"""Native height of this image, calculated from its height in pixels and
vertical dots per inch (dpi)."""
px_height = self.image.px_height
horz_dpi = self.image.horz_dpi
height_in_emu = int(round(914400 * px_height / horz_dpi))
return Emu(height_in_emu)
@property
def filename(self):
"""Filename from which this image part was originally created.
A generic name, e.g. 'image.png', is substituted if no name is available, for
example when the image was loaded from an unnamed stream. In that case a default
extension is applied based on the detected MIME type of the image.
"""
if self._image is not None:
return self._image.filename
return "image.%s" % self.partname.ext
@classmethod
def from_image(cls, image: Image, partname: PackURI):
"""Return an |ImagePart| instance newly created from `image` and assigned
`partname`."""
return ImagePart(partname, image.content_type, image.blob, image)
@property
def image(self) -> Image:
if self._image is None:
self._image = Image.from_blob(self.blob)
return self._image
@classmethod
def load(cls, partname: PackURI, content_type: str, blob: bytes, package: OpcPackage):
"""Called by ``docx.opc.package.PartFactory`` to load an image part from a
package being opened by ``Document(...)`` call."""
return cls(partname, content_type, blob)
@property
def sha1(self):
"""SHA1 hash digest of the blob of this image part."""
return hashlib.sha1(self.blob).hexdigest()