|
| 1 | +from datetime import datetime |
| 2 | + |
| 3 | +from defusedxml import ElementTree |
| 4 | +from defusedxml.ElementTree import fromstring, tostring |
| 5 | +from typing import Callable, List, Optional |
| 6 | + |
| 7 | +from .exceptions import UnpopulatedPropertyError |
| 8 | +from .user_item import UserItem |
| 9 | +from .view_item import ViewItem |
| 10 | +from .workbook_item import WorkbookItem |
| 11 | +from ..datetime_helpers import parse_datetime |
| 12 | + |
| 13 | + |
| 14 | +class CustomViewItem(object): |
| 15 | + def __init__(self, id: Optional[str] = None, name: Optional[str] = None) -> None: |
| 16 | + self._content_url: Optional[str] = None # ? |
| 17 | + self._created_at: Optional["datetime"] = None |
| 18 | + self._id: Optional[str] = id |
| 19 | + self._image: Optional[Callable[[], bytes]] = None |
| 20 | + self._name: Optional[str] = name |
| 21 | + self._shared: Optional[bool] = False |
| 22 | + self._updated_at: Optional["datetime"] = None |
| 23 | + |
| 24 | + self._owner: Optional[UserItem] = None |
| 25 | + self._view: Optional[ViewItem] = None |
| 26 | + self._workbook: Optional[WorkbookItem] = None |
| 27 | + |
| 28 | + def __repr__(self: "CustomViewItem"): |
| 29 | + view_info = "" |
| 30 | + if self._view: |
| 31 | + view_info = " view='{}'".format(self._view.name or self._view.id or "unknown") |
| 32 | + wb_info = "" |
| 33 | + if self._workbook: |
| 34 | + wb_info = " workbook='{}'".format(self._workbook.name or self._workbook.id or "unknown") |
| 35 | + owner_info = "" |
| 36 | + if self._owner: |
| 37 | + owner_info = " owner='{}'".format(self._owner.name or self._owner.id or "unknown") |
| 38 | + return "<CustomViewItem id={} name=`{}`{}{}{}>".format(self.id, self.name, view_info, wb_info, owner_info) |
| 39 | + |
| 40 | + def _set_image(self, image): |
| 41 | + self._image = image |
| 42 | + |
| 43 | + @property |
| 44 | + def content_url(self) -> Optional[str]: |
| 45 | + return self._content_url |
| 46 | + |
| 47 | + @property |
| 48 | + def created_at(self) -> Optional["datetime"]: |
| 49 | + return self._created_at |
| 50 | + |
| 51 | + @property |
| 52 | + def id(self) -> Optional[str]: |
| 53 | + return self._id |
| 54 | + |
| 55 | + @property |
| 56 | + def image(self) -> bytes: |
| 57 | + if self._image is None: |
| 58 | + error = "View item must be populated with its png image first." |
| 59 | + raise UnpopulatedPropertyError(error) |
| 60 | + return self._image() |
| 61 | + |
| 62 | + @property |
| 63 | + def name(self) -> Optional[str]: |
| 64 | + return self._name |
| 65 | + |
| 66 | + @name.setter |
| 67 | + def name(self, value: str): |
| 68 | + self._name = value |
| 69 | + |
| 70 | + @property |
| 71 | + def shared(self) -> Optional[bool]: |
| 72 | + return self._shared |
| 73 | + |
| 74 | + @shared.setter |
| 75 | + def shared(self, value: bool): |
| 76 | + self._shared = value |
| 77 | + |
| 78 | + @property |
| 79 | + def updated_at(self) -> Optional["datetime"]: |
| 80 | + return self._updated_at |
| 81 | + |
| 82 | + @property |
| 83 | + def owner(self) -> Optional[UserItem]: |
| 84 | + return self._owner |
| 85 | + |
| 86 | + @owner.setter |
| 87 | + def owner(self, value: UserItem): |
| 88 | + self._owner = value |
| 89 | + |
| 90 | + @property |
| 91 | + def workbook(self) -> Optional[WorkbookItem]: |
| 92 | + return self._workbook |
| 93 | + |
| 94 | + @property |
| 95 | + def view(self) -> Optional[ViewItem]: |
| 96 | + return self._view |
| 97 | + |
| 98 | + @classmethod |
| 99 | + def from_response(cls, resp, ns, workbook_id="") -> Optional["CustomViewItem"]: |
| 100 | + item = cls.list_from_response(resp, ns, workbook_id) |
| 101 | + if not item or len(item) == 0: |
| 102 | + return None |
| 103 | + else: |
| 104 | + return item[0] |
| 105 | + |
| 106 | + @classmethod |
| 107 | + def list_from_response(cls, resp, ns, workbook_id="") -> List["CustomViewItem"]: |
| 108 | + return cls.from_xml_element(fromstring(resp), ns, workbook_id) |
| 109 | + |
| 110 | + """ |
| 111 | + <customView |
| 112 | + id="37d015c6-bc28-4c88-989c-72c0a171f7aa" |
| 113 | + name="New name 2" |
| 114 | + createdAt="2016-02-03T23:35:09Z" |
| 115 | + updatedAt="2022-09-28T23:56:01Z" |
| 116 | + shared="false"> |
| 117 | + <view id="8e33ff19-a7a4-4aa5-9dd8-a171e2b9c29f" name="circle"/> |
| 118 | + <workbook id="2fbe87c9-a7d8-45bf-b2b3-877a26ec9af5" name="marks and viz types 2"/> |
| 119 | + <owner id="cdfe8548-84c8-418e-9b33-2c0728b2398a" name="workgroupuser"/> |
| 120 | + </customView> |
| 121 | + """ |
| 122 | + |
| 123 | + @classmethod |
| 124 | + def from_xml_element(cls, parsed_response, ns, workbook_id="") -> List["CustomViewItem"]: |
| 125 | + all_view_items = list() |
| 126 | + all_view_xml = parsed_response.findall(".//t:customView", namespaces=ns) |
| 127 | + for custom_view_xml in all_view_xml: |
| 128 | + cv_item = cls() |
| 129 | + view_elem: ElementTree = custom_view_xml.find(".//t:view", namespaces=ns) |
| 130 | + workbook_elem: str = custom_view_xml.find(".//t:workbook", namespaces=ns) |
| 131 | + owner_elem: str = custom_view_xml.find(".//t:owner", namespaces=ns) |
| 132 | + cv_item._created_at = parse_datetime(custom_view_xml.get("createdAt", None)) |
| 133 | + cv_item._updated_at = parse_datetime(custom_view_xml.get("updatedAt", None)) |
| 134 | + cv_item._content_url = custom_view_xml.get("contentUrl", None) |
| 135 | + cv_item._id = custom_view_xml.get("id", None) |
| 136 | + cv_item._name = custom_view_xml.get("name", None) |
| 137 | + |
| 138 | + if owner_elem is not None: |
| 139 | + parsed_owners = UserItem.from_response_as_owner(tostring(custom_view_xml), ns) |
| 140 | + if parsed_owners and len(parsed_owners) > 0: |
| 141 | + cv_item._owner = parsed_owners[0] |
| 142 | + |
| 143 | + if view_elem is not None: |
| 144 | + parsed_views = ViewItem.from_response(tostring(custom_view_xml), ns) |
| 145 | + if parsed_views and len(parsed_views) > 0: |
| 146 | + cv_item._view = parsed_views[0] |
| 147 | + |
| 148 | + if workbook_id: |
| 149 | + cv_item._workbook = WorkbookItem(workbook_id) |
| 150 | + elif workbook_elem is not None: |
| 151 | + parsed_workbooks = WorkbookItem.from_response(tostring(custom_view_xml), ns) |
| 152 | + if parsed_workbooks and len(parsed_workbooks) > 0: |
| 153 | + cv_item._workbook = parsed_workbooks[0] |
| 154 | + |
| 155 | + all_view_items.append(cv_item) |
| 156 | + return all_view_items |
0 commit comments