# Copyright (c) 2010-2024 fastpyxl
from __future__ import annotations
from fastpyxl.typed_serialisable.base import Serialisable
from fastpyxl.typed_serialisable.errors import FieldValidationError
from fastpyxl.typed_serialisable.fields import AliasField, Field
from fastpyxl.descriptors.excel import ExtensionList
from .data_source import NumFmt
from .descriptors import num_fmt_from_value
from .shapes import GraphicalProperties
from .text import RichText, Text
from .layout import Layout
def _trendline_type(v):
if v is None:
return None
allowed = frozenset({"exp", "linear", "log", "movingAvg", "poly", "power"})
if v not in allowed:
raise FieldValidationError(f"trendlineType rejected value {v!r}")
return v
[docs]
class TrendlineLabel(Serialisable):
tagname = "trendlineLbl"
layout: Layout | None = Field.element(expected_type=Layout, allow_none=True, default=None)
tx: Text | None = Field.element(expected_type=Text, allow_none=True, default=None)
numFmt: NumFmt | None = Field.element(
expected_type=NumFmt,
allow_none=True,
converter=num_fmt_from_value, default=None,
)
spPr: GraphicalProperties | None = Field.element(
expected_type=GraphicalProperties, allow_none=True, default=None
)
graphicalProperties = AliasField("spPr", default=None)
txPr: RichText | None = Field.element(expected_type=RichText, allow_none=True, default=None)
textProperties = AliasField("txPr", default=None)
extLst: ExtensionList | None = Field.element(
expected_type=ExtensionList, allow_none=True, serialize=False, default=None
)
xml_order = ("layout", "tx", "numFmt", "spPr", "txPr")
def __init__(
self,
layout=None,
tx=None,
numFmt=None,
spPr=None,
txPr=None,
extLst=None,
):
self.layout = layout
self.tx = tx
self.numFmt = num_fmt_from_value(numFmt) if numFmt is not None else None
self.spPr = spPr
self.txPr = txPr
self.extLst = extLst
[docs]
class Trendline(Serialisable):
tagname = "trendline"
name: str | None = Field.attribute(expected_type=str, allow_none=True, default=None)
spPr: GraphicalProperties | None = Field.element(
expected_type=GraphicalProperties, allow_none=True, default=None
)
graphicalProperties = AliasField("spPr", default=None)
trendlineType: str | None = Field.nested_value(
expected_type=str,
allow_none=True,
converter=_trendline_type, default=None,
)
order: int | None = Field.nested_value(expected_type=int, allow_none=True, default=None)
period: int | None = Field.nested_value(expected_type=int, allow_none=True, default=None)
forward: float | None = Field.nested_value(expected_type=float, allow_none=True, default=None)
backward: float | None = Field.nested_value(expected_type=float, allow_none=True, default=None)
intercept: float | None = Field.nested_value(expected_type=float, allow_none=True, default=None)
dispRSqr: bool | None = Field.nested_bool(allow_none=True, default=None)
dispEq: bool | None = Field.nested_bool(allow_none=True, default=None)
trendlineLbl: TrendlineLabel | None = Field.element(
expected_type=TrendlineLabel, allow_none=True, default=None
)
extLst: ExtensionList | None = Field.element(
expected_type=ExtensionList, allow_none=True, serialize=False, default=None
)
xml_order = (
"spPr",
"trendlineType",
"order",
"period",
"forward",
"backward",
"intercept",
"dispRSqr",
"dispEq",
"trendlineLbl",
)
def __init__(
self,
name=None,
spPr=None,
trendlineType="linear",
order=None,
period=None,
forward=None,
backward=None,
intercept=None,
dispRSqr=None,
dispEq=None,
trendlineLbl=None,
extLst=None,
):
self.name = name
self.spPr = spPr
self.trendlineType = trendlineType
self.order = order
self.period = period
self.forward = forward
self.backward = backward
self.intercept = intercept
self.dispRSqr = dispRSqr
self.dispEq = dispEq
self.trendlineLbl = trendlineLbl
self.extLst = extLst