Beispiel #1
0
 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)
Beispiel #2
0
 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))
Beispiel #3
0
 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)
Beispiel #4
0
 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")
Beispiel #5
0
    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
Beispiel #6
0
    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.")
Beispiel #7
0
 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.")