diff --git a/commcare_connect/opportunity/tables.py b/commcare_connect/opportunity/tables.py index 670a61ad..b7858109 100644 --- a/commcare_connect/opportunity/tables.py +++ b/commcare_connect/opportunity/tables.py @@ -16,7 +16,13 @@ ) -class LearnStatusTable(tables.Table): +class OrgContextTable(tables.Table): + def __init__(self, *args, **kwargs): + self.org_slug = kwargs.pop("org_slug", None) + super().__init__(*args, **kwargs) + + +class LearnStatusTable(OrgContextTable): display_name = columns.Column(verbose_name="Name") learn_progress = columns.Column(verbose_name="Modules Completed") assessment_count = columns.Column(verbose_name="Number of Attempts") @@ -30,10 +36,6 @@ class Meta: orderable = False empty_text = "No learn progress for users." - def __init__(self, *args, **kwargs): - self.org_slug = kwargs.pop("org_slug", None) - super().__init__(*args, **kwargs) - def render_details(self, record): url = reverse( "opportunity:user_learn_progress", @@ -49,7 +51,7 @@ def show_warning(record): return "" -class UserVisitTable(tables.Table): +class UserVisitTable(OrgContextTable): # export only columns visit_id = columns.Column("Visit ID", accessor="xform_id", visible=False) username = columns.Column("Username", accessor="user__username", visible=False) @@ -63,13 +65,14 @@ class UserVisitTable(tables.Table): entity_id = columns.Column("Entity ID", accessor="entity_id", visible=False) entity_name = columns.Column("Entity Name", accessor="entity_name") flag_reason = columns.Column("Flags", accessor="flag_reason", empty_values=({}, None)) - details = columns.LinkColumn( - "opportunity:visit_verification", - verbose_name="", - text="Review", - attrs={"a": {"class": "btn btn-sm btn-primary"}}, - args=[utils.A("opportunity__organization__slug"), utils.A("pk")], - ) + details = columns.Column(verbose_name="", empty_values=()) + + def render_details(self, record): + url = reverse( + "opportunity:visit_verification", + kwargs={"org_slug": self.org_slug, "pk": record.pk}, + ) + return mark_safe(f'Review') def render_flag_reason(self, value): short = [flag[1] for flag in value.get("flags")] @@ -92,15 +95,17 @@ class Meta: row_attrs = {"class": show_warning} -class OpportunityPaymentTable(tables.Table): +class OpportunityPaymentTable(OrgContextTable): display_name = columns.Column(verbose_name="Name") username = columns.Column(accessor="user__username", visible=False) - view_payments = columns.LinkColumn( - "opportunity:user_payments_table", - verbose_name="", - text="View Details", - args=[utils.A("opportunity__organization__slug"), utils.A("opportunity__id"), utils.A("pk")], - ) + view_payments = columns.Column(verbose_name="", empty_values=()) + + def render_view_payments(self, record): + url = reverse( + "opportunity:user_payments_table", + kwargs={"org_slug": self.org_slug, "opp_id": record.opportunity.id, "pk": record.pk}, + ) + return mark_safe(f'View Details') class Meta: model = OpportunityAccess @@ -132,7 +137,7 @@ class BooleanAggregateColumn(columns.BooleanColumn, AggregateColumn): pass -class UserStatusTable(tables.Table): +class UserStatusTable(OrgContextTable): display_name = columns.Column(verbose_name="Name", footer="Total", empty_values=()) username = columns.Column(accessor="opportunity_access__user__username", visible=False) claimed = AggregateColumn(verbose_name="Job Claimed", accessor="job_claimed") @@ -165,10 +170,6 @@ class Meta: empty_text = "No users invited for this opportunity." orderable = False - def __init__(self, *args, **kwargs): - self.org_slug = kwargs.pop("org_slug", None) - super().__init__(*args, **kwargs) - def render_display_name(self, record): if record.opportunity_access is None: return record.phone_number @@ -200,7 +201,7 @@ def render_last_visit_date(self, record, value): return date_with_time_popup(self, value) -class PaymentUnitTable(tables.Table): +class PaymentUnitTable(OrgContextTable): deliver_units = columns.Column("Deliver Units") details = columns.Column(verbose_name="", empty_values=()) @@ -210,10 +211,6 @@ class Meta: empty_text = "No payment units for this opportunity." orderable = False - def __init__(self, *args, **kwargs): - self.org_slug = kwargs.pop("org_slug", None) - super().__init__(*args, **kwargs) - def render_deliver_units(self, record): deliver_units = "".join([f"
  • {d.name}
  • " for d in record.deliver_units.all()]) return mark_safe(f"") @@ -226,7 +223,7 @@ def render_details(self, record): return mark_safe(f'Edit') -class DeliverStatusTable(tables.Table): +class DeliverStatusTable(OrgContextTable): display_name = columns.Column(verbose_name="Name of the User", footer="Total") username = columns.Column(accessor="user__username", visible=False) payment_unit = columns.Column("Name of Payment Unit") @@ -254,10 +251,6 @@ class Meta: "incomplete", ) - def __init__(self, *args, **kwargs): - self.org_slug = kwargs.pop("org_slug", None) - super().__init__(*args, **kwargs) - def render_details(self, record): url = reverse( "opportunity:user_visits_list", diff --git a/commcare_connect/opportunity/views.py b/commcare_connect/opportunity/views.py index c576dfd7..b0b32253 100644 --- a/commcare_connect/opportunity/views.py +++ b/commcare_connect/opportunity/views.py @@ -128,6 +128,13 @@ def get_opportunity_or_404(pk, org_slug): raise Http404("Opportunity not found.") +class OrgContextSingleTableView(SingleTableView): + def get_table_kwargs(self): + kwargs = super().get_table_kwargs() + kwargs["org_slug"] = self.request.org.slug + return kwargs + + class OpportunityList(OrganizationUserMixin, ListView): model = Opportunity paginate_by = 10 @@ -292,7 +299,7 @@ def get_context_data(self, object, **kwargs): return context -class OpportunityLearnStatusTableView(OrganizationUserMixin, SingleTableView): +class OpportunityLearnStatusTableView(OrganizationUserMixin, OrgContextSingleTableView): model = OpportunityAccess paginate_by = 25 table_class = LearnStatusTable @@ -303,13 +310,8 @@ def get_queryset(self): opportunity = get_opportunity_or_404(org_slug=self.request.org.slug, pk=opportunity_id) return OpportunityAccess.objects.filter(opportunity=opportunity).order_by("user__name") - def get_table_kwargs(self): - kwargs = super().get_table_kwargs() - kwargs["org_slug"] = self.request.org.slug - return kwargs - -class OpportunityPaymentTableView(OrganizationUserMixin, SingleTableView): +class OpportunityPaymentTableView(OrganizationUserMixin, OrgContextSingleTableView): model = OpportunityAccess paginate_by = 25 table_class = OpportunityPaymentTable @@ -463,7 +465,7 @@ def add_budget_existing_users(request, org_slug=None, pk=None): ) -class OpportunityUserStatusTableView(OrganizationUserMixin, SingleTableView): +class OpportunityUserStatusTableView(OrganizationUserMixin, OrgContextSingleTableView): model = OpportunityAccess paginate_by = 25 table_class = UserStatusTable @@ -475,11 +477,6 @@ def get_queryset(self): access_objects = get_annotated_opportunity_access(opportunity) return access_objects - def get_table_kwargs(self): - kwargs = super().get_table_kwargs() - kwargs["org_slug"] = self.request.org.slug - return kwargs - @org_member_required def export_users_for_payment(request, **kwargs): @@ -614,7 +611,7 @@ def edit_payment_unit(request, org_slug=None, opp_id=None, pk=None): ) -class OpportunityPaymentUnitTableView(OrganizationUserMixin, SingleTableView): +class OpportunityPaymentUnitTableView(OrganizationUserMixin, OrgContextSingleTableView): model = PaymentUnit paginate_by = 25 table_class = PaymentUnitTable @@ -625,11 +622,6 @@ def get_queryset(self): opportunity = get_opportunity_or_404(org_slug=self.kwargs["org_slug"], pk=opportunity_id) return PaymentUnit.objects.filter(opportunity=opportunity).order_by("name") - def get_table_kwargs(self): - kwargs = super().get_table_kwargs() - kwargs["org_slug"] = self.request.org.slug - return kwargs - @org_member_required def export_user_status(request, **kwargs): @@ -646,7 +638,7 @@ def export_user_status(request, **kwargs): return redirect(f"{redirect_url}?export_task_id={result.id}") -class OpportunityDeliverStatusTable(OrganizationUserMixin, SingleTableView): +class OpportunityDeliverStatusTable(OrganizationUserMixin, OrgContextSingleTableView): model = OpportunityAccess paginate_by = 25 table_class = DeliverStatusTable @@ -658,11 +650,6 @@ def get_queryset(self): access_objects = get_annotated_opportunity_access_deliver_status(opportunity) return access_objects - def get_table_kwargs(self): - kwargs = super().get_table_kwargs() - kwargs["org_slug"] = self.request.org.slug - return kwargs - @org_member_required def export_deliver_status(request, **kwargs):