{
    "cells": [
        {
            "cell_type": "code",
            "execution_count": null,
            "source": [
                "%pip install servicestack\r\n",
                "\r\n",
                "\r\n",
                "\r\n",
                "import datetime\r\n",
                "import decimal\r\n",
                "from marshmallow.fields import *\r\n",
                "from servicestack import *\r\n",
                "from typing import *\r\n",
                "from dataclasses import dataclass, field\r\n",
                "from dataclasses_json import dataclass_json, LetterCase, Undefined, config\r\n",
                "from enum import Enum, IntEnum\r\n",
                "\r\n",
                "\r\n",
                "class TechnologyTier(str, Enum):\r\n",
                "    PROGRAMMING_LANGUAGE = 'ProgrammingLanguage'\r\n",
                "    CLIENT = 'Client'\r\n",
                "    HTTP = 'Http'\r\n",
                "    SERVER = 'Server'\r\n",
                "    DATA = 'Data'\r\n",
                "    SOFTWARE_INFRASTRUCTURE = 'SoftwareInfrastructure'\r\n",
                "    OPERATING_SYSTEM = 'OperatingSystem'\r\n",
                "    HARDWARE_INFRASTRUCTURE = 'HardwareInfrastructure'\r\n",
                "    THIRD_PARTY_SERVICES = 'ThirdPartyServices'\r\n",
                "\r\n",
                "\r\n",
                "@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)\r\n",
                "@dataclass\r\n",
                "class TechnologyBase:\r\n",
                "    id: int = 0\r\n",
                "    name: Optional[str] = None\r\n",
                "    vendor_name: Optional[str] = None\r\n",
                "    vendor_url: Optional[str] = None\r\n",
                "    product_url: Optional[str] = None\r\n",
                "    logo_url: Optional[str] = None\r\n",
                "    description: Optional[str] = None\r\n",
                "    created: datetime.datetime = datetime.datetime(1, 1, 1)\r\n",
                "    created_by: Optional[str] = None\r\n",
                "    last_modified: datetime.datetime = datetime.datetime(1, 1, 1)\r\n",
                "    last_modified_by: Optional[str] = None\r\n",
                "    owner_id: Optional[str] = None\r\n",
                "    slug: Optional[str] = None\r\n",
                "    logo_approved: bool = False\r\n",
                "    is_locked: bool = False\r\n",
                "    tier: Optional[TechnologyTier] = None\r\n",
                "    last_status_update: Optional[datetime.datetime] = None\r\n",
                "    organization_id: Optional[int] = None\r\n",
                "    comments_post_id: Optional[int] = None\r\n",
                "    view_count: int = 0\r\n",
                "    fav_count: int = 0\r\n",
                "\r\n",
                "\r\n",
                "@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)\r\n",
                "@dataclass\r\n",
                "class Technology(TechnologyBase):\r\n",
                "    pass\r\n",
                "\r\n",
                "\r\n",
                "@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)\r\n",
                "@dataclass\r\n",
                "class TechnologyView:\r\n",
                "    id: Optional[int] = None\r\n",
                "    name: Optional[str] = None\r\n",
                "    vendor_name: Optional[str] = None\r\n",
                "    vendor_url: Optional[str] = None\r\n",
                "    product_url: Optional[str] = None\r\n",
                "    logo_url: Optional[str] = None\r\n",
                "    description: Optional[str] = None\r\n",
                "    created: Optional[datetime.datetime] = None\r\n",
                "    created_by: Optional[str] = None\r\n",
                "    last_modified: Optional[datetime.datetime] = None\r\n",
                "    last_modified_by: Optional[str] = None\r\n",
                "    owner_id: Optional[str] = None\r\n",
                "    slug: Optional[str] = None\r\n",
                "    logo_approved: Optional[bool] = None\r\n",
                "    is_locked: Optional[bool] = None\r\n",
                "    tier: Optional[TechnologyTier] = None\r\n",
                "    last_status_update: Optional[datetime.datetime] = None\r\n",
                "    organization_id: Optional[int] = None\r\n",
                "    comments_post_id: Optional[int] = None\r\n",
                "    view_count: Optional[int] = None\r\n",
                "    fav_count: Optional[int] = None\r\n",
                "\r\n",
                "\r\n",
                "# @Route(\"/technology/search\")\r\n",
                "# @AutoQueryViewer(DefaultSearchField=\"Tier\", DefaultSearchText=\"Data\", DefaultSearchType=\"=\", Description=\"Explore different Technologies\", IconUrl=\"octicon:database\", Title=\"Find Technologies\")\r\n",
                "@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)\r\n",
                "@dataclass\r\n",
                "class FindTechnologies(QueryDb2[Technology, TechnologyView], IReturn[QueryResponse[TechnologyView]], IGet):\r\n",
                "    ids: Optional[List[int]] = None\r\n",
                "    name: Optional[str] = None\r\n",
                "    vendor_name: Optional[str] = None\r\n",
                "    name_contains: Optional[str] = None\r\n",
                "    vendor_name_contains: Optional[str] = None\r\n",
                "    description_contains: Optional[str] = None\r\n",
                "\r\n",
                "\r\n",
                "\r\n",
                "from IPython.core.display import display, HTML\r\n",
                "\r\n",
                "client = JsonServiceClient(\"https://techstacks.io\")\r\n"
            ],
            "outputs": [],
            "metadata": {}
        },
        {
            "cell_type": "code",
            "execution_count": 9,
            "source": [
                "response = client.send(FindTechnologies(\r\n",
                "    ids=[1, 2, 4, 6],\r\n",
                "    vendor_name=\"Google\",\r\n",
                "    take=10,\r\n",
                "    fields=\"Id, Name, VendorName, Tier, FavCount, ViewCount\"))\r\n"
            ],
            "outputs": [],
            "metadata": {}
        },
        {
            "cell_type": "code",
            "execution_count": 10,
            "source": [
                "display(HTML(htmldump(response)))\r\n"
            ],
            "outputs": [
                {
                    "output_type": "display_data",
                    "data": {
                        "text/plain": [
                            "<IPython.core.display.HTML object>"
                        ],
                        "text/html": [
                            "<table><tbody><tr><th>offset</th><td>0</td></tr><tr><th>total</th><td>19</td></tr><tr><th>results</th><td><table>\n",
                            "<thead><tr><th>id</th><th>name</th><th>vendorName</th><th>tier</th><th>viewCount</th><th>favCount</th></tr></head>\n",
                            "<tbody>\n",
                            "<tr><td>1</td><td>ServiceStack</td><td>ServiceStack</td><td>Server</td><td>4204</td><td>5</td></tr><tr><td>2</td><td>PostgreSQL</td><td>PostgreSQL</td><td>Data</td><td>2291</td><td>4</td></tr><tr><td>4</td><td>Windows Server 2012</td><td>Microsoft</td><td>OperatingSystem</td><td>878</td><td>1</td></tr><tr><td>6</td><td>AWS RDS</td><td>Amazon</td><td>Data</td><td>625</td><td>1</td></tr><tr><td>7</td><td>AngularJS</td><td>Google</td><td>Client</td><td>5012</td><td>1</td></tr><tr><td>13</td><td>Google Closure Library</td><td>Google</td><td>Client</td><td>390</td><td>1</td></tr><tr><td>15</td><td>Dart</td><td>Google</td><td>ProgrammingLanguage</td><td>320</td><td>2</td></tr><tr><td>18</td><td>Go</td><td>Google</td><td>ProgrammingLanguage</td><td>3865</td><td>2</td></tr><tr><td>57</td><td>LevelDB</td><td>Google</td><td>Data</td><td>325</td><td>1</td></tr><tr><td>61</td><td>Firebase</td><td>Google</td><td>Data</td><td>722</td><td>1</td></tr>\n",
                            "</tbody>\n",
                            "</table></td></tr></tbody></table>"
                        ]
                    },
                    "metadata": {}
                }
            ],
            "metadata": {}
        },
        {
            "cell_type": "code",
            "execution_count": 11,
            "source": [
                "printtable(response.results)\r\n"
            ],
            "outputs": [
                {
                    "output_type": "stream",
                    "name": "stdout",
                    "text": [
                        "+-----------------------------------------------------------------------------------------+\n",
                        "| id |          name          |  vendorName  |        tier         | viewCount | favCount |\n",
                        "|-----------------------------------------------------------------------------------------|\n",
                        "|  1 | ServiceStack           | ServiceStack | Server              |      4204 |        5 |\n",
                        "|  2 | PostgreSQL             | PostgreSQL   | Data                |      2291 |        4 |\n",
                        "|  4 | Windows Server 2012    | Microsoft    | OperatingSystem     |       878 |        1 |\n",
                        "|  6 | AWS RDS                | Amazon       | Data                |       625 |        1 |\n",
                        "|  7 | AngularJS              | Google       | Client              |      5012 |        1 |\n",
                        "| 13 | Google Closure Library | Google       | Client              |       390 |        1 |\n",
                        "| 15 | Dart                   | Google       | ProgrammingLanguage |       320 |        2 |\n",
                        "| 18 | Go                     | Google       | ProgrammingLanguage |      3865 |        2 |\n",
                        "| 57 | LevelDB                | Google       | Data                |       325 |        1 |\n",
                        "| 61 | Firebase               | Google       | Data                |       722 |        1 |\n",
                        "+-----------------------------------------------------------------------------------------+\n"
                    ]
                }
            ],
            "metadata": {}
        },
        {
            "cell_type": "code",
            "execution_count": null,
            "source": [],
            "outputs": [],
            "metadata": {}
        }
    ],
    "metadata": {
        "kernelspec": {
            "name": "python3",
            "display_name": "Python 3.9.6 64-bit"
        },
        "language_info": {
            "codemirror_mode": {
                "name": "ipython",
                "version": 3
            },
            "file_extension": ".py",
            "mimetype": "text/x-python",
            "name": "python",
            "nbconvert_exporter": "python",
            "pygments_lexer": "ipython3",
            "version": "3.9.6"
        },
        "interpreter": {
            "hash": "63fd5069d213b44bf678585dea6b12cceca9941eaf7f819626cde1f2670de90d"
        }
    },
    "nbformat": 4,
    "nbformat_minor": 2
}