def handle_requests_for_review(self, ticket): """Handles review requests""" if "close" in self.switches: resolve_ticket(self.caller.player_ob, ticket, self.rhs) self.msg("You have marked the rfr as closed.") else: self.view_pitch(ticket)
def approve_pitch(self, pitch): """Approves a pitch. Closes the ticket and changes its status and that of the owner""" resolve_ticket(self.caller.player_ob, pitch, self.rhs) plot = pitch.plot plot.usage = Plot.PLAYER_RUN_PLOT plot.save() for pc in plot.dompc_involvement.filter(admin_status=PCPlotInvolvement.SUBMITTER): pc.admin_status = PCPlotInvolvement.OWNER pc.save() self.msg("You have approved the pitch. %s is now active with %s as the owner." % (pitch.plot, pitch.submitting_player))
def close_ticket(self, ticket): """Closes a ticket""" if not self.rhs: raise CommandError("You must provide a result.") update = ticket.goal_update if update.result: raise CommandError( "Update already has a result written. Close the ticket with @job." ) update.result = self.rhs update.save() resolve_ticket(self.caller.player_ob, ticket, "Result: %s" % self.rhs) self.msg("You have closed the ticket and set the result to: %s" % self.rhs)
def test_cmd_lore(self): from server.utils.helpdesk_api import resolve_ticket self.setup_cmd(lore_commands.CmdLoreSearch, self.account) default_display = "Main Categories:\n\n\nculture stuff, religion stuff" self.call_cmd("", default_display) self.call_cmd("foo", "No matches for either a category or entry by that name in the knowledge base.") self.call_cmd("religion stuff", 'religion stuff\nDescription: religion desc\n' 'Subcategories: faith stuff, god stuff\nEntries: priests') self.call_cmd("skald", 'skald\nCategory: god stuff\nQuestion: who dis\nAnswer: newgod') self.call_cmd("/search dis", "Matches for 'dis':\nEntries: archfiends, skald") self.call_cmd("/search asfd", "No matches found for 'asfd'.") self.call_cmd("/request sdf", "You must specify both a category and a " "title for the entry created by your question.") self.call_cmd("/request asdf/asdf", "No category by that title.") self.call_cmd("/request religion stuff/priests", "There is already an entry with that title.") self.call_cmd("/request religion stuff/gongs", "You must enter a question about " "lore or theme for staff to answer.") self.call_cmd("/request religion stuff/gongs=how u gong fish?", "You have new informs. Use @inform 1 to read them.|" "You have created ticket 1, asking: how u gong fish?") ticket = self.queue.ticket_set.first() self.assertEqual(ticket.title, "gongs") item = resolve_ticket(self.account2, ticket, "rly hard") self.assertEqual(item.title, "gongs") self.assertEqual(item.category, self.cat1) self.assertEqual(item.question, "how u gong fish?") self.assertEqual(item.answer, "rly hard")
def close_ticket(self, number, reason): caller = self.caller if not reason: caller.msg("Usage: <#>=<Reason>") return ticket = self.get_ticket_from_args(number) if not ticket: return if helpdesk_api.resolve_ticket(caller, ticket, reason, by_submitter=True): caller.msg(f"You have successfully closed ticket #{ticket.id}.") else: caller.msg(f"Failed to close ticket #{ticket.id}.") return
def func(self): """Implement the command""" caller = self.caller args = self.args switches = self.switches if not args and not switches or (set(switches) & set(self.query_open_switches)): # list all open tickets self.display_open_tickets() return if args and (not switches or 'old' in switches): # list individual ticket specified by args # ticket = [ticket_id, playob, request_string, date_submit, gm_ob, gm_notes, date_answer, optional_title] try: ticknum = int(args) except ValueError: self.display_open_tickets() caller.msg("Usage: Argument must be a ticket number.") return try: ticket = Ticket.objects.get(id=ticknum) except Ticket.DoesNotExist: self.display_open_tickets() caller.msg("No ticket found by that number.") return caller.msg(ticket.display()) return if 'old' in switches and not args: # list closed tickets # closed & resolved tickets, assigned to current user tickets_closed_resolved = Ticket.objects.select_related( 'queue').filter( status__in=[Ticket.CLOSED_STATUS, Ticket.RESOLVED_STATUS ]).filter(queue__in=self.queues_from_args) joblist = list(tickets_closed_resolved) if not joblist: caller.msg("No closed tickets.") return # get 20 most recent joblist = joblist[-20:] table = prettytable.PrettyTable( ["{w#", "{wPlayer", "{wRequest", "{wQueue"]) for ticket in joblist: table.add_row([ str(ticket.id), str(ticket.submitting_player), str(ticket.title)[:20], ticket.queue.slug ]) caller.msg("{wClosed Tickets:{n\n%s" % table) return if 'moreold' in switches: # list closed tickets tickets_closed_resolved = Ticket.objects.select_related( 'queue').filter( status__in=[Ticket.CLOSED_STATUS, Ticket.RESOLVED_STATUS] ).filter(queue__in=self.queues_from_args).filter( id__gte=self.lhslist[0], id__lte=self.lhslist[1]) joblist = list(tickets_closed_resolved) if not joblist: caller.msg("No closed tickets.") return table = prettytable.PrettyTable( ["{w#", "{wPlayer", "{wRequest", "{wQueue"]) for ticket in joblist: table.add_row([ str(ticket.id), str(ticket.submitting_player), str(ticket.title)[:20], ticket.queue.slug ]) caller.msg("{wClosed Tickets:{n\n%s" % table) return try: ticket = Ticket.objects.get(id=self.lhs) except (ValueError, Ticket.DoesNotExist): self.msg("No ticket found by that number.") return if 'close' in switches: # Closing a ticket. Check formatting first lhs = self.lhs rhs = self.rhs if not args or not lhs or not rhs: caller.msg("Usage: @job/close <#>=<GM Notes>") return try: numticket = int(lhs) except ValueError: caller.msg("Must give a number for the open ticket.") return if helpdesk_api.resolve_ticket(caller, numticket, rhs): caller.msg("Ticket successfully closed.") return else: caller.msg("Ticket closure failed for unknown reason.") return if 'assign' in switches: player = self.caller.search(self.rhs) if not player: return ticket.assigned_to = player ticket.save() inform_staff("{w%s has assigned ticket %s to %s." % (caller, ticket.id, player)) return if 'followup' in switches or 'update' in switches or "follow" in switches: lhs = self.lhs rhs = self.rhs if not lhs or not rhs: caller.msg("Usage: @job/followup <#>=<msg>") return if helpdesk_api.add_followup(caller, ticket, rhs): caller.msg("Followup added.") return caller.msg("Error in followup.") return if 'move' in switches: if not self.lhs or not self.rhs: self.msg("Usage: @job/move <#>=<msg>") return try: queue = Queue.objects.get(slug__iexact=self.rhs) except Queue.DoesNotExist: self.msg("Queue must be one of the following: %s" % ", ".join(ob.slug for ob in Queue.objects.all())) return ticket.queue = queue ticket.save() self.msg("Ticket %s is now in queue %s." % (ticket.id, queue)) return if 'delete' in switches or 'del' in switches: if ticket.queue.slug == "Story": self.msg( "Cannot delete a storyaction. Please move it to a different queue first." ) return ticket.delete() self.msg("Ticket #%s deleted." % self.lhs) return if 'priority' in switches: try: ticket.priority = int(self.rhs) except (TypeError, ValueError): self.msg("Must be a number.") ticket.save() self.msg("Ticket new priority is %s." % self.rhs) return if 'approve' in switches: pass if 'deny' in switches: pass caller.msg("Invalid switch for @job.")
def decline_pitch(self, pitch): """Declines a pitch. Deletes it and closes the ticket""" resolve_ticket(self.caller.player_ob, pitch, self.rhs) pitch.plot.delete() self.msg("You have declined the pitch.")