mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-07-25 20:18:38 +02:00
data loads now
This commit is contained in:
parent
7bd0b06e70
commit
d7fa9e8894
9 changed files with 154 additions and 66 deletions
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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?
|
||||
|
||||
|
|
|
@ -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__)
|
||||
|
||||
|
||||
|
|
|
@ -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 %}
|
||||
<!--
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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??")
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue