Skip to content

ValueError: 'EnterpriseCustomer' instance needs to have a primary key value before this relationship can be used. when setting default_language on create #2333

@tramck

Description

@tramck

Environment:

Python version: 3.11
Open edX version: redwood
Enterprise version: 4.17.4

Issue

When creating an Enterprise Customer via django-admin and setting the Learner Default Language field, the enterprise_customer.enterprise_customer_users relationship is accessed prior to the enterprise customer instance being created which triggers an uncaught exception: ValueError: 'EnterpriseCustomer' instance needs to have a primary key value before this relationship can be used.

Stack Trace

 Traceback (most recent call last):                                                                                              
   File "/openedx/venv/lib/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner                        
     response = get_response(request)                                                                                            
                ^^^^^^^^^^^^^^^^^^^^^                                                                                            
   File "/openedx/venv/lib/python3.11/site-packages/django/core/handlers/base.py", line 197, in _get_response                    
     response = wrapped_callback(request, *callback_args, **callback_kwargs)                                                     
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                     
   File "/opt/pyenv/versions/3.11.8/lib/python3.11/contextlib.py", line 81, in inner                                             
     return func(*args, **kwds)                                                                                                  
            ^^^^^^^^^^^^^^^^^^^                                                                                                  
   File "/openedx/venv/lib/python3.11/site-packages/newrelic/hooks/framework_django.py", line 529, in wrapper                    
     return wrapped(*args, **kwargs)                                                                                             
            ^^^^^^^^^^^^^^^^^^^^^^^^                                                                                             
   File "/openedx/venv/lib/python3.11/site-packages/django/contrib/admin/options.py", line 688, in wrapper                       
     return self.admin_site.admin_view(view)(*args, **kwargs)                                                                    
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                    
   File "/openedx/venv/lib/python3.11/site-packages/django/utils/decorators.py", line 134, in _wrapper_view                      
     response = view_func(request, *args, **kwargs)                                                                              
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                              
   File "/openedx/venv/lib/python3.11/site-packages/django/views/decorators/cache.py", line 62, in _wrapper_view_func            
     response = view_func(request, *args, **kwargs)                                                                              
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                              
   File "/openedx/venv/lib/python3.11/site-packages/django/contrib/admin/sites.py", line 242, in inner                           
     return view(request, *args, **kwargs)                                                                                       
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                       
   File "/openedx/venv/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1886, in add_view                     
     return self.changeform_view(request, None, form_url, extra_context)                                                         
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                         
   File "/openedx/venv/lib/python3.11/site-packages/django/utils/decorators.py", line 46, in _wrapper                            
     return bound_method(*args, **kwargs)                                                                                        
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                        
   File "/openedx/venv/lib/python3.11/site-packages/django/utils/decorators.py", line 134, in _wrapper_view                      
     response = view_func(request, *args, **kwargs)                                                                              
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                              
   File "/openedx/venv/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1747, in changeform_view              
     return self._changeform_view(request, object_id, form_url, extra_context)                                                   
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                   
   File "/openedx/venv/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1798, in _changeform_view             
     self.save_model(request, new_object, form, not add)                                                                         
   File "/openedx/venv/lib/python3.11/site-packages/simple_history/admin.py", line 228, in save_model                            
     super().save_model(request, obj, form, change)                                                                              
   File "/openedx/venv/lib/python3.11/site-packages/django/contrib/admin/options.py", line 1227, in save_model                   
     obj.save()                                                                                                                  
   File "/openedx/venv/lib/python3.11/site-packages/model_utils/models.py", line 37, in save                                     
     super().save(*args, **kwargs)                                                                                               
   File "/openedx/venv/lib/python3.11/site-packages/django/db/models/base.py", line 814, in save                                 
     self.save_base(                                                                                                             
   File "/openedx/venv/lib/python3.11/site-packages/django/db/models/base.py", line 861, in save_base                            
     pre_save.send(                                                                                                              
   File "/openedx/venv/lib/python3.11/site-packages/django/dispatch/dispatcher.py", line 176, in send                            
     return [                                                                                                                    
            ^                                                                                                                    
   File "/openedx/venv/lib/python3.11/site-packages/django/dispatch/dispatcher.py", line 177, in <listcomp>                      
     (receiver, receiver(signal=self, sender=sender, **named))                                                                   
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                    
   File "/openedx/venv/lib/python3.11/site-packages/enterprise/signals.py", line 110, in update_lang_pref_of_all_learners        
     unset_language_of_all_enterprise_learners(instance)                                                                         
   File "/openedx/venv/lib/python3.11/site-packages/enterprise/utils.py", line 2230, in unset_language_of_all_enterprise_learners
     user_ids = list(enterprise_customer.enterprise_customer_users.values_list('user_id', flat=True))                            
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                             
   File "/openedx/venv/lib/python3.11/site-packages/django/db/models/manager.py", line 87, in manager_method                     
     return getattr(self.get_queryset(), name)(*args, **kwargs)                                                                  
                    ^^^^^^^^^^^^^^^^^^^                                                                                          
   File "/openedx/venv/lib/python3.11/site-packages/django/db/models/fields/related_descriptors.py", line 718, in get_queryset   
     raise ValueError(                                                                                                           
 ValueError: 'EnterpriseCustomer' instance needs to have a primary key value before this relationship can be used.      

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions