22
33import logging
44
5- from django .core .management import BaseCommand
5+ from django .core .management import BaseCommand , CommandError
66from rich .console import Console
77from rich .table import Table
88
@@ -68,6 +68,24 @@ def add_arguments(self, parser):
6868 dest = "contract_id" ,
6969 )
7070
71+ learners_parser = subparsers .add_parser (
72+ "learners" ,
73+ help = "List learners associated with an org or contract." ,
74+ )
75+ learners_parser .add_argument (
76+ "--org" ,
77+ "--organization" ,
78+ type = int ,
79+ help = "Filter by organization ID." ,
80+ dest = "organization_id" ,
81+ )
82+ learners_parser .add_argument (
83+ "--contract" ,
84+ type = int ,
85+ help = "Filter by contract ID." ,
86+ dest = "contract_id" ,
87+ )
88+
7189 return super ().add_arguments (parser )
7290
7391 def handle_list_orgs (self , * args , ** kwargs ): # noqa: ARG002
@@ -180,6 +198,33 @@ def handle_list_courseware(self, *args, **kwargs): # noqa: ARG002
180198
181199 self .console .print (courseware_table )
182200
201+ def handle_list_learners (self , * args , ** kwargs ): # noqa: ARG002
202+ """List learners associated with an org or contract."""
203+
204+ org_id = kwargs .pop ("organization_id" )
205+ contract_id = kwargs .pop ("contract_id" )
206+
207+ if org_id :
208+ obj = OrganizationPage .objects .get (id = org_id )
209+ elif contract_id :
210+ obj = ContractPage .objects .get (id = contract_id )
211+ else :
212+ msg = "Must provide either org or contract ID."
213+ raise CommandError (msg )
214+
215+ learners = obj .get_learners ()
216+
217+ learners_table = Table (title = f"Learners for { obj } " )
218+ learners_table .add_column ("Email" , justify = "right" )
219+ learners_table .add_column ("Name" , justify = "left" )
220+
221+ for learner in learners :
222+ learners_table .add_row (
223+ learner .email ,
224+ f"{ learner .first_name } { learner .last_name } " ,
225+ )
226+ self .console .print (learners_table )
227+
183228 def handle (self , * args , ** kwargs ): # noqa: ARG002
184229 """Handle the command."""
185230 self .console = Console ()
@@ -190,7 +235,10 @@ def handle(self, *args, **kwargs): # noqa: ARG002
190235 self .handle_list_contracts (** kwargs )
191236 elif subcommand == "courseware" :
192237 self .handle_list_courseware (** kwargs )
238+ elif subcommand == "learners" :
239+ self .handle_list_learners (** kwargs )
193240 else :
194- log .error ("Unknown subcommand: %s" , subcommand )
195- return 1
241+ msg = f"Unknown subcommand: { subcommand } "
242+ raise CommandError (msg )
243+
196244 return 0
0 commit comments