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):