data loads now

This commit is contained in:
CocoByte 2024-09-22 22:07:44 -06:00
parent 7bd0b06e70
commit d7fa9e8894
No known key found for this signature in database
GPG key ID: BBFAA2526384C97F
9 changed files with 154 additions and 66 deletions

View file

@ -1872,17 +1872,17 @@ class MembersTable extends LoadTableBase {
loadTable(page, sortBy = this.currentSortBy, order = this.currentOrder, scroll = this.scrollToTable, status = this.currentStatus, searchTerm =this.currentSearchTerm, portfolio = this.portfolioValue) {
// --------- SEARCH
// let searchParams = new URLSearchParams(
// {
// "page": page,
// "sort_by": sortBy,
// "order": order,
// "status": status,
// "search_term": searchTerm
// }
// );
// if (portfolio)
// searchParams.append("portfolio", portfolio)
let searchParams = new URLSearchParams(
{
"page": page,
"sort_by": sortBy,
"order": order,
"status": status,
"search_term": searchTerm
}
);
if (portfolio)
searchParams.append("portfolio", portfolio)
// --------- FETCH DATA
@ -1896,8 +1896,8 @@ class MembersTable extends LoadTableBase {
if (!baseUrlValue) {
return;
}
let url = `${baseUrlValue}?${searchParams.toString()}`
let url = `${baseUrlValue}?${searchParams.toString()}` //TODO: uncomment for search function
fetch(url)
.then(response => response.json())
.then(data => {
@ -1913,17 +1913,21 @@ class MembersTable extends LoadTableBase {
const memberList = document.querySelector('.members__table tbody');
memberList.innerHTML = '';
data.members.forEach(member => {
// const actionUrl = domain.action_url;
if (data.members)
{
data.members.forEach(member => {
// const actionUrl = domain.action_url;
const member_name = member.name;
const last_active = member.last_active;
const row = document.createElement('tr');
row.innerHTML = `
<th scope="row" role="rowheader" data-label="member name">
TEMP -- member ID
${member_name}
</th>
<td data-sort-value="${member.id}" data-label="ID">
${member.id}
<td data-sort-value="${last_active}" data-label="name">
${last_active}
</td>
`;
@ -1939,6 +1943,26 @@ class MembersTable extends LoadTableBase {
memberList.appendChild(row);
});
}
else
{
//TODO: error message?
const row = document.createElement('tr');
row.innerHTML = `
<th scope="row" role="rowheader" data-label="member name">
ERROR
</th>
<td data-sort-value="test" data-label="name">
ERROR
</td>
`;
memberList.appendChild(row);
}
// initialize tool tips immediately after the associated DOM elements are added
initializeTooltips();

View file

@ -22,18 +22,20 @@ from registrar.views.report_views import (
ExportDataTypeUser,
)
from registrar.views.domain_request import Step
# --jsons
from registrar.views.domain_requests_json import get_domain_requests_json
from registrar.views.transfer_user import TransferUserView
from registrar.views.domains_json import get_domains_json
from registrar.views.portfolio_members_json import get_portfolio_members_json
from registrar.views.utility.api_views import (
get_senior_official_from_federal_agency_json,
get_federal_and_portfolio_types_from_federal_agency_json,
)
from registrar.views.domains_json import get_domains_json
from registrar.views.domain_request import Step
from registrar.views.transfer_user import TransferUserView
from registrar.views.utility import always_404
from api.views import available, get_current_federal, get_current_full
DOMAIN_REQUEST_NAMESPACE = views.DomainRequestWizard.URL_NAMESPACE
domain_request_urls = [
path("", views.DomainRequestWizard.as_view(), name=""),
@ -280,7 +282,7 @@ urlpatterns = [
),
path("get-domains-json/", get_domains_json, name="get_domains_json"),
path("get-domain-requests-json/", get_domain_requests_json, name="get_domain_requests_json"),
path("get-portfolio-members-json/", get_domains_json, name="get_portfolio_members_json"),
path("get-portfolio-members-json/", get_portfolio_members_json, name="get_portfolio_members_json"),
]
# Djangooidc strips out context data from that context, so we define a custom error

View file

@ -68,6 +68,9 @@ class Command(BaseCommand):
if parse_domains or both:
self.handle_portfolio_domains(portfolio, federal_agency)
if parse_domains or both:
self.handle_portfolio_members(portfolio, federal_agency)
def create_or_modify_portfolio(self, federal_agency):
"""Creates or modifies a portfolio record based on a federal agency."""
portfolio_args = {
@ -253,3 +256,12 @@ class Command(BaseCommand):
DomainInformation.objects.bulk_update(domain_infos, ["portfolio", "sub_organization"])
message = f"Added portfolio '{portfolio}' to {len(domain_infos)} domains"
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, message)
def handle_portfolio_members(self, portfolio: Portfolio, federal_agency: FederalAgency):
"""
Associate portfolio with members for a federal agency.
Updates all relevant member records.
"""
# TODO: future ticket?

View file

@ -7,7 +7,6 @@ from django.db.models.manager import BaseManager
from typing import List
from registrar.utility.enums import LogCode
logger = logging.getLogger(__name__)

View file

@ -17,7 +17,7 @@
TODO: future ticket?
=====================
-->
<!-- <div class="section-outlined__search {% if portfolio %} mobile:grid-col-12 desktop:grid-col-6{% endif %}">
<div class="section-outlined__search {% if portfolio %} mobile:grid-col-12 desktop:grid-col-6{% endif %}">
<section aria-label="Members search component" class="margin-top-2">
<form class="usa-search usa-search--small" method="POST" role="search">
{% csrf_token %}
@ -27,7 +27,7 @@
</svg>
Reset
</button>
<label class="usa-sr-only" for="members__search-field">Search by domain name</label>
<label class="usa-sr-only" for="members__search-field">Search by member name</label>
<input
class="usa-input"
id="members__search-field"
@ -44,7 +44,7 @@
</button>
</form>
</section>
</div> -->
</div>
<!-- ---------- Export as CSV ---------- -->
{% if portfolio_members_count and portfolio_members_count > 0 %}
<!--

View file

@ -6,6 +6,10 @@ from django.contrib.auth.decorators import login_required
from django.urls import reverse
from django.db.models import Q
#---Logger
import logging
from venv import logger
from registrar.management.commands.utility.terminal_helper import TerminalColors, TerminalHelper
logger = logging.getLogger(__name__)
@ -49,6 +53,8 @@ def get_domain_ids_from_request(request):
Otherwise, return domain ids associated with request.user.
"""
portfolio = request.GET.get("portfolio")
# TODO: delete me
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, f'domain portfolio = {portfolio}')
if portfolio:
current_user: User = request.user
if current_user.is_org_user(request) and current_user.has_view_all_domains_portfolio_permission(portfolio):

View file

@ -1,13 +1,17 @@
from django.http import JsonResponse
from django.core.paginator import Paginator
from registrar.models import DomainRequest
from django.utils.dateformat import format
from django.contrib.auth.decorators import login_required
from django.urls import reverse
from django.db.models import Q
from registrar.models.user import User
from registrar.models.user_portfolio_permission import UserPortfolioPermission
#---Logger
import logging
from venv import logger
from registrar.management.commands.utility.terminal_helper import TerminalColors, TerminalHelper
logger = logging.getLogger(__name__)
# DEVELOPER'S NOTE (9-20-24):
# The way this works is first we get a list of "member" objects
@ -27,41 +31,60 @@ def get_portfolio_members_json(request):
"""Given the current request,
get all members that are associated with the given portfolio"""
member_ids = get_member_ids_from_request(request)
unfiltered_total = member_ids.count()
objects = get_member_objects_from_request(request)
if(objects is not None):
member_ids = objects.values_list("id", flat=True)
unfiltered_total = member_ids.count()
objects = UserPortfolioPermission.objects.filter(id__in=member_ids)
unfiltered_total = objects.count()
# objects = apply_search(objects, request)
# objects = apply_status_filter(objects, request)
# objects = apply_sorting(objects, request)
# objects = apply_search(objects, request)
# objects = apply_status_filter(objects, request)
# objects = apply_sorting(objects, request)
paginator = Paginator(objects, 10)
page_number = request.GET.get("page", 1)
page_obj = paginator.get_page(page_number)
members = [
serialize_members(request, member, request.user) for member in page_obj.object_list
]
paginator = Paginator(objects, 10)
page_number = request.GET.get("page", 1)
page_obj = paginator.get_page(page_number)
members = [
serialize_members(request, member, request.user) for member in page_obj.object_list
]
return JsonResponse(
{
"members": members, # "domain_requests": domain_requests, TODO: DELETE ME!
"has_next": page_obj.has_next(),
"has_previous": page_obj.has_previous(),
"page": page_obj.number,
"num_pages": paginator.num_pages,
"total": paginator.count,
"unfiltered_total": unfiltered_total,
}
)
return JsonResponse(
{
"members": members, # "domain_requests": domain_requests, TODO: DELETE ME!
"has_next": page_obj.has_next(),
"has_previous": page_obj.has_previous(),
"page": page_obj.number,
"num_pages": paginator.num_pages,
"total": paginator.count,
"unfiltered_total": unfiltered_total,
}
)
else:
# TODO: clean this up -- this was added to handle NoneType error (test with http://localhost:8080/get-portfolio-members-json/)
# Perhaps this is why domain_requests_json does the wierd thing where it returns deomain request ids, then re-fetches the objects...
# Or maybe an assumption was made wherein we assume there will never be zero entries returned??
return JsonResponse(
{
"members": [], # "domain_requests": domain_requests, TODO: DELETE ME!
"has_next": False,
"has_previous": False,
"page": 0,
"num_pages": 0,
"total": 0,
"unfiltered_total": 0,
}
)
def get_member_ids_from_request(request):
def get_member_objects_from_request(request):
"""Given the current request,
get all members that are associated with the given portfolio"""
portfolio = request.GET.get("portfolio")
# filter_condition = Q(creator=request.user)
# portfolio = request.GET.get("portfolio") #TODO: WHY DOESN"T THIS WORK?? It is empty
# TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, f'portfolio = {portfolio}') # TODO: delete me
portfolio = request.session.get("portfolio")
if portfolio:
# TODO: Permissions??
# if request.user.is_org_user(request) and request.user.has_view_all_requests_portfolio_permission(portfolio):
@ -69,10 +92,15 @@ def get_member_ids_from_request(request):
# else:
# filter_condition = Q(portfolio=portfolio, creator=request.user)
member_ids = UserPortfolioPermission.objects.filter(
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, "getting permissions") # TODO: delete me
permissions = UserPortfolioPermission.objects.filter(
portfolio=portfolio
).values_list("user__id", flat=True)
return member_ids
)
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, f'permissions {permissions}') # TODO: delete me
members = User.objects.filter(portfolio_permissions__in=permissions)
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKCYAN, f'members {members}') # TODO: delete me
return members
# def apply_search(queryset, request):
@ -175,9 +203,8 @@ def serialize_members(request, member, user):
# ------- SERIALIZE
return {
"id": member.id,
# "name": ??,
# "last_active": ??,
"name": member.get_formatted_name(),
"last_active": member.id,
# ("manage icon...maybe svg_icon??")
}

View file

@ -21,6 +21,12 @@ from django.views.generic.edit import FormMixin
logger = logging.getLogger(__name__)
#---Logger
import logging
from venv import logger
from registrar.management.commands.utility.terminal_helper import TerminalColors, TerminalHelper
logger = logging.getLogger(__name__)
class PortfolioDomainsView(PortfolioDomainsPermissionView, View):
template_name = "portfolio_domains.html"
@ -48,9 +54,14 @@ class PortfolioMembersView(PortfolioMembersPermissionView, View):
def get(self, request):
"""Add additional context data to the template."""
if self.request.user.is_authenticated:
request.session["new_request"] = True
# We can override the base class. This view only needs this item.
context = {}
portfolio = self.request.session.get("portfolio")
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, f'PortfolioMembersView portfolio = {portfolio}')
if portfolio:
# # ------ Gets admin members
@ -79,7 +90,7 @@ class PortfolioMembersView(PortfolioMembersPermissionView, View):
all_members = User.objects.filter(id__in=member_ids)
context["portfolio_members"] = all_members
context["portfolio_members_count"] = all_members.count()
return render(request, "portfolio_members.html")
return render(request, "portfolio_members.html", context)
class PortfolioNoDomainsView(NoPortfolioDomainsPermissionView, View):
"""Some users have access to the underlying portfolio, but not any domains.

View file

@ -15,6 +15,13 @@ import logging
logger = logging.getLogger(__name__)
# TODO: delete me
import logging
from venv import logger
from registrar.management.commands.utility.terminal_helper import TerminalColors, TerminalHelper
logger = logging.getLogger(__name__)
class OrderableFieldsMixin:
"""
Mixin to add multi-field ordering capabilities to a Django ModelAdmin on admin_order_field.