test and lint

This commit is contained in:
Rachid Mrad 2024-08-23 21:15:42 -04:00
parent a7c801739d
commit c1df03d831
No known key found for this signature in database
6 changed files with 274 additions and 46 deletions

View file

@ -19,3 +19,4 @@ from .user_profile import UserProfileView, FinishProfileSetupView
from .health import *
from .index import *
from .portfolios import *
from .transfer_user import TransferUserView

View file

@ -15,57 +15,60 @@ from registrar.models.verified_by_staff import VerifiedByStaff
logger = logging.getLogger(__name__)
class TransferUserView(View):
"""Transfer user methods that set up the transfer_user template and handle the forms on it."""
JOINS = [
(DomainRequest, 'creator'),
(DomainInformation, 'creator'),
(Portfolio, 'creator'),
(DomainRequest, 'investigator'),
(UserDomainRole, 'user'),
(VerifiedByStaff, 'requestor'),
(DomainRequest, "creator"),
(DomainInformation, "creator"),
(Portfolio, "creator"),
(DomainRequest, "investigator"),
(UserDomainRole, "user"),
(VerifiedByStaff, "requestor"),
]
USER_FIELDS = ['portfolio', 'portfolio_roles', 'portfolio_additional_permissions']
USER_FIELDS = ["portfolio", "portfolio_roles", "portfolio_additional_permissions"]
def get(self, request, user_id):
"""current_user referes to the 'source' user where the button that redirects to this view was clicked.
other_users exclude current_user and populate a dropdown, selected_user is the selection in the dropdown.
This also querries the relevant domains and domain requests, and the admin context needed for the sidenav."""
current_user = get_object_or_404(User, pk=user_id)
other_users = User.objects.exclude(pk=user_id).order_by('first_name', 'last_name') # Exclude the current user from the dropdown
other_users = User.objects.exclude(pk=user_id).order_by(
"first_name", "last_name"
) # Exclude the current user from the dropdown
# Get the default admin site context, needed for the sidenav
admin_context = site.each_context(request)
context = {
'current_user': current_user,
'other_users': other_users,
'logged_in_user': request.user,
"current_user": current_user,
"other_users": other_users,
"logged_in_user": request.user,
**admin_context, # Include the admin context
'current_user_domains': self.get_domains(current_user),
'current_user_domain_requests': self.get_domain_requests(current_user)
"current_user_domains": self.get_domains(current_user),
"current_user_domain_requests": self.get_domain_requests(current_user),
}
selected_user_id = request.GET.get('selected_user')
selected_user_id = request.GET.get("selected_user")
if selected_user_id:
selected_user = get_object_or_404(User, pk=selected_user_id)
context['selected_user'] = selected_user
context['selected_user_domains'] = self.get_domains(selected_user)
context['selected_user_domain_requests'] = self.get_domain_requests(selected_user)
context["selected_user"] = selected_user
context["selected_user_domains"] = self.get_domains(selected_user)
context["selected_user_domain_requests"] = self.get_domain_requests(selected_user)
return render(request, 'admin/transfer_user.html', context)
return render(request, "admin/transfer_user.html", context)
def post(self, request, user_id):
"""This handles the transfer from selected_user to current_user then deletes selected_user.
NOTE: We have a ticket to refactor this into a more solid lookup for related fields in #2645"""
current_user = get_object_or_404(User, pk=user_id)
selected_user_id = request.POST.get('selected_user')
selected_user_id = request.POST.get("selected_user")
selected_user = get_object_or_404(User, pk=selected_user_id)
try:
@ -89,53 +92,52 @@ class TransferUserView(View):
except Exception as e:
messages.error(request, f"An error occurred during the transfer: {e}")
return redirect('admin:registrar_user_change', object_id=user_id)
return redirect("admin:registrar_user_change", object_id=user_id)
@classmethod
def update_joins_and_log(cls, model_class, field_name, old_user, new_user, change_logs):
def update_joins_and_log(cls, model_class, field_name, selected_user, current_user, change_logs):
"""
Helper function to update the user join fields for a given model and log the changes.
"""
filter_kwargs = {field_name: old_user}
filter_kwargs = {field_name: selected_user}
updated_objects = model_class.objects.filter(**filter_kwargs)
for obj in updated_objects:
# Check for duplicate UserDomainRole before updating
if model_class == UserDomainRole:
if model_class.objects.filter(user=new_user, domain=obj.domain).exists():
if model_class.objects.filter(user=current_user, domain=obj.domain).exists():
continue # Skip the update to avoid a duplicate
# Update the field on the object and save it
setattr(obj, field_name, new_user)
setattr(obj, field_name, current_user)
obj.save()
# Log the change
cls.log_change(obj, field_name, old_user, new_user, change_logs)
cls.log_change(obj, field_name, selected_user, current_user, change_logs)
@classmethod
def transfer_user_fields_and_log(cls, old_user, new_user, change_logs):
def transfer_user_fields_and_log(cls, selected_user, current_user, change_logs):
"""
Transfers portfolio fields from the old_user to the new_user.
Transfers portfolio fields from the selected_user to the current_user.
Logs the changes for each transferred field.
NOTE: This will be refactored in #2644
"""
for field in cls.USER_FIELDS:
old_value = getattr(old_user, field, None)
field_value = getattr(selected_user, field, None)
if old_value:
setattr(new_user, field, old_value)
cls.log_change(new_user, field, old_value, old_value, change_logs)
if field_value:
setattr(current_user, field, field_value)
cls.log_change(current_user, field, field_value, field_value, change_logs)
new_user.save()
current_user.save()
@classmethod
def log_change(cls, obj, field_name, old_value, new_value, change_logs):
def log_change(cls, obj, field_name, field_value, new_value, change_logs):
"""Logs the change for a specific field on an object"""
log_entry = f'Changed {field_name} from "{old_value}" to "{new_value}" on {obj}'
log_entry = f'Changed {field_name} from "{field_value}" to "{new_value}" on {obj}'
logger.info(log_entry)
# Collect the related object for the success message
@ -149,10 +151,10 @@ class TransferUserView(View):
domains = Domain.objects.filter(id__in=domain_ids)
return domains
@classmethod
def get_domain_requests(cls, user):
"""A simplified version of domain_requests_json"""
domain_requests = DomainRequest.objects.filter(creator=user)
return domain_requests
return domain_requests