Spaces:
Running
Running
| from copy import deepcopy | |
| from typing import Dict, List, Optional, Union | |
| DEFAULT_STATE = { | |
| "ticket_queue": [], | |
| "ticket_counter": 1, | |
| "current_user": None, | |
| } | |
| class TicketAPI: | |
| """ | |
| A class representing the Ticket API for managing support tickets. | |
| This class provides methods for creating, retrieving, and managing | |
| support tickets within a ticketing system. It maintains a queue of | |
| tickets and handles ticket-related operations such as creation, | |
| status updates, and retrieval. | |
| Attributes: | |
| ticket_queue (List[Dict[str, Union[int, str]]]): A list of ticket dictionaries. | |
| ticket_counter (int): A counter for generating unique ticket IDs. | |
| current_user (Optional[str]): The currently authenticated user. | |
| """ | |
| def __init__(self): | |
| """ | |
| Initialize the TicketAPI instance. | |
| """ | |
| self.ticket_queue: List[Dict[str, Union[int, str]]] | |
| self.ticket_counter: int | |
| self.current_user: Optional[str] | |
| self._api_description = "This tool belongs to the ticketing system that is part of a company, which allows users to create, view, and manage support business tickets." | |
| def _load_scenario(self, scenario: dict, long_context=False) -> None: | |
| """ | |
| Load a scenario into the ticket queue. | |
| Args: | |
| scenario (Dict): A dictionary containing ticket data. | |
| """ | |
| DEFAULT_STATE_COPY = deepcopy(DEFAULT_STATE) | |
| self.ticket_queue = scenario.get("ticket_queue", DEFAULT_STATE_COPY["ticket_queue"]) | |
| self.ticket_counter = scenario.get( | |
| "ticket_counter", DEFAULT_STATE_COPY["ticket_counter"] | |
| ) | |
| self.current_user = scenario.get("current_user", DEFAULT_STATE_COPY["current_user"]) | |
| def create_ticket( | |
| self, title: str, description: str = "", priority: int = 1 | |
| ) -> Dict[str, Union[int, str]]: | |
| """ | |
| Create a ticket in the system and queue it. | |
| Args: | |
| title (str): Title of the ticket. | |
| description (str): Description of the ticket. Defaults to an empty string. | |
| priority (int): Priority of the ticket, from 1 to 5. Defaults to 1. 5 is the highest priority. | |
| Returns: | |
| id (int): Unique identifier of the ticket. | |
| title (str): Title of the ticket. | |
| description (str): Description of the ticket. | |
| status (str): Current status of the ticket. | |
| priority (int): Priority level of the ticket. | |
| """ | |
| if not self.current_user: | |
| return {"error": "User not authenticated. Please log in to create a ticket."} | |
| if priority < 1 or priority > 5: | |
| return {"error": "Invalid priority. Priority must be between 1 and 5."} | |
| ticket = { | |
| "id": self.ticket_counter, | |
| "title": title, | |
| "description": description, | |
| "status": "Open", | |
| "priority": priority, | |
| "created_by": self.current_user, | |
| } | |
| self.ticket_queue.append(ticket) | |
| self.ticket_counter += 1 | |
| return ticket | |
| def get_ticket(self, ticket_id: int) -> Dict[str, Union[int, str]]: | |
| """ | |
| Get a specific ticket by its ID. | |
| Args: | |
| ticket_id (int): ID of the ticket to retrieve. | |
| Returns: | |
| id (int): Unique identifier of the ticket. | |
| title (str): Title of the ticket. | |
| description (str): Description of the ticket. | |
| status (str): Current status of the ticket. | |
| priority (int): Priority level of the ticket. | |
| created_by (str): Username of the ticket creator. | |
| """ | |
| ticket = self._find_ticket(ticket_id) | |
| if not ticket: | |
| return {"error": f"Ticket with ID {ticket_id} not found."} | |
| return ticket | |
| def close_ticket(self, ticket_id: int) -> Dict[str, str]: | |
| """ | |
| Close a ticket. | |
| Args: | |
| ticket_id (int): ID of the ticket to be closed. | |
| Returns: | |
| status (str): Status of the close operation. | |
| """ | |
| ticket = self._find_ticket(ticket_id) | |
| if not ticket: | |
| return {"error": f"Ticket with ID {ticket_id} not found."} | |
| if ticket["status"] == "Closed": | |
| return {"error": f"Ticket with ID {ticket_id} is already closed."} | |
| ticket["status"] = "Closed" | |
| return {"status": f"Ticket {ticket_id} has been closed successfully."} | |
| def resolve_ticket(self, ticket_id: int, resolution: str) -> Dict[str, str]: | |
| """ | |
| Resolve a ticket with a resolution. | |
| Args: | |
| ticket_id (int): ID of the ticket to be resolved. | |
| resolution (str): Resolution details for the ticket. | |
| Returns: | |
| status (str): Status of the resolve operation. | |
| """ | |
| ticket = self._find_ticket(ticket_id) | |
| if not ticket: | |
| return {"error": f"Ticket with ID {ticket_id} not found."} | |
| if ticket["status"] == "Resolved": | |
| return {"error": f"Ticket with ID {ticket_id} is already resolved."} | |
| ticket["status"] = "Resolved" | |
| ticket["resolution"] = resolution | |
| return {"status": f"Ticket {ticket_id} has been resolved successfully."} | |
| def edit_ticket( | |
| self, ticket_id: int, updates: Dict[str, Optional[Union[str, int]]] | |
| ) -> Dict[str, str]: | |
| """ | |
| Modify the details of an existing ticket. | |
| Args: | |
| ticket_id (int): ID of the ticket to be changed. | |
| updates (Dict): Dictionary containing the fields to be updated. | |
| - title (str) : [Optional] New title for the ticket. | |
| - description (str): [Optional] New description for the ticket. | |
| - status (str): [Optional] New status for the ticket. | |
| - priority (int): [Optional] New priority for the ticket. | |
| Returns: | |
| status (str): Status of the update operation. | |
| """ | |
| ticket = self._find_ticket(ticket_id) | |
| if not ticket: | |
| return {"error": f"Ticket with ID {ticket_id} not found."} | |
| valid_fields = {"title", "description", "status", "priority"} | |
| invalid_fields = set(updates.keys()) - valid_fields | |
| if invalid_fields: | |
| return {"error": f"Invalid fields for update: {', '.join(invalid_fields)}"} | |
| for key, value in updates.items(): | |
| if value is not None: | |
| ticket[key] = value | |
| return {"status": f"Ticket {ticket_id} has been updated successfully."} | |
| def _find_ticket(self, ticket_id: int) -> Optional[Dict[str, Union[int, str]]]: | |
| """ | |
| Find a ticket by its ID. | |
| Args: | |
| ticket_id (int): ID of the ticket to find. | |
| Returns: | |
| id (int): Unique identifier of the ticket. | |
| title (str): Title of the ticket. | |
| description (str): Description of the ticket. | |
| status (str): Current status of the ticket. | |
| priority (int): Priority level of the ticket. | |
| created_by (str): Username of the ticket creator. | |
| """ | |
| for ticket in self.ticket_queue: | |
| if ticket["id"] == ticket_id: | |
| return ticket | |
| return None | |
| def ticket_login(self, username: str, password: str) -> Dict[str, bool]: | |
| """ | |
| Authenticate a user for ticket system. | |
| Args: | |
| username (str): Username of the user. | |
| password (str): Password of the user. | |
| Returns: | |
| success (bool): True if login was successful, False otherwise. | |
| """ | |
| # In a real system, you would validate the credentials against a database | |
| if username and password: # Simplified authentication | |
| self.current_user = username | |
| return {"success": True} | |
| return {"success": False} | |
| def ticket_get_login_status(self) -> Dict[str, bool]: | |
| """ | |
| Get the username of the currently authenticated user. | |
| Returns: | |
| username (bool): True if a user is logged in, False otherwise. | |
| """ | |
| return {"username": bool(self.current_user)} | |
| def logout(self) -> Dict[str, bool]: | |
| """ | |
| Log out the current user. | |
| Returns: | |
| success (bool): True if logout was successful, False otherwise. | |
| """ | |
| if self.current_user: | |
| self.current_user = None | |
| return {"success": True} | |
| return {"success": False} | |
| def get_user_tickets( | |
| self, status: Optional[str] = None | |
| ) -> List[Dict[str, Union[int, str]]]: | |
| """ | |
| Get all tickets created by the current user, optionally filtered by status. | |
| Args: | |
| status (str): [Optional] Status to filter tickets by. If None, return all tickets. | |
| Returns: | |
| id (int): Unique identifier of the ticket. | |
| title (str): Title of the ticket. | |
| description (str): Description of the ticket. | |
| status (str): Current status of the ticket. | |
| priority (int): Priority level of the ticket. | |
| created_by (str): Username of the ticket | |
| """ | |
| if not self.current_user: | |
| return [{"error": "User not authenticated. Please log in to view tickets."}] | |
| user_tickets = [ | |
| ticket | |
| for ticket in self.ticket_queue | |
| if ticket["created_by"] == self.current_user | |
| ] | |
| if status: | |
| user_tickets = [ | |
| ticket | |
| for ticket in user_tickets | |
| if ticket["status"].lower() == status.lower() | |
| ] | |
| return user_tickets | |