Skip to content
Snippets Groups Projects
Commit cf78c49f authored by Todd Dembrey's avatar Todd Dembrey
Browse files

Add the ability to filter by active submission states

parent 4f99941d
No related branches found
No related tags found
No related merge requests found
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
<a href="{% url 'funds:submission' submission.id %}">{{ submission.title }}</a> <a href="{% url 'funds:submission' submission.id %}">{{ submission.title }}</a>
{% include "funds/includes/status_bar.html" with workflow=submission.workflow status=submission.status %} {% include "funds/includes/status_bar.html" with workflow=submission.workflow status=submission.status %}
</div> </div>
{% empty %}
No active submissions
{% endfor %} {% endfor %}
</div> </div>
<div class="wrapper wrapper--large wrapper--inner-space-medium"> <div class="wrapper wrapper--large wrapper--inner-space-medium">
......
...@@ -19,7 +19,7 @@ class ApplicantDashboardView(SingleTableView): ...@@ -19,7 +19,7 @@ class ApplicantDashboardView(SingleTableView):
return self.model.objects.filter(user=self.request.user) return self.model.objects.filter(user=self.request.user)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
my_active_submissions = self.object_list my_active_submissions = self.object_list.active()
return super().get_context_data( return super().get_context_data(
my_active_submissions=my_active_submissions, my_active_submissions=my_active_submissions,
......
...@@ -39,7 +39,8 @@ from opentech.apply.users.groups import STAFF_GROUP_NAME ...@@ -39,7 +39,8 @@ from opentech.apply.users.groups import STAFF_GROUP_NAME
from .blocks import CustomFormFieldsBlock, MustIncludeFieldBlock, REQUIRED_BLOCK_NAMES from .blocks import CustomFormFieldsBlock, MustIncludeFieldBlock, REQUIRED_BLOCK_NAMES
from .edit_handlers import FilteredFieldPanel, ReadOnlyPanel, ReadOnlyInlinePanel from .edit_handlers import FilteredFieldPanel, ReadOnlyPanel, ReadOnlyInlinePanel
from .admin_forms import WorkflowFormAdminForm from .admin_forms import WorkflowFormAdminForm
from .workflow import SingleStage, DoubleStage from .forms import WorkflowFormAdminForm
from .workflow import SingleStage, DoubleStage, active_statuses
WORKFLOW_CLASS = { WORKFLOW_CLASS = {
...@@ -417,6 +418,8 @@ class LabForm(AbstractRelatedForm): ...@@ -417,6 +418,8 @@ class LabForm(AbstractRelatedForm):
class JSONOrderable(models.QuerySet): class JSONOrderable(models.QuerySet):
json_field = None
def order_by(self, *field_names): def order_by(self, *field_names):
def build_json_order_by(field): def build_json_order_by(field):
if field.replace('-', '') not in REQUIRED_BLOCK_NAMES: if field.replace('-', '') not in REQUIRED_BLOCK_NAMES:
...@@ -427,12 +430,19 @@ class JSONOrderable(models.QuerySet): ...@@ -427,12 +430,19 @@ class JSONOrderable(models.QuerySet):
field = field[1:] field = field[1:]
else: else:
descending = False descending = False
return OrderBy(RawSQL("LOWER(form_data->>%s)", (field,)), descending=descending) return OrderBy(RawSQL(f'LOWER({self.json_field}->>%s)', (field,)), descending=descending)
field_ordering = [build_json_order_by(field) for field in field_names] field_ordering = [build_json_order_by(field) for field in field_names]
return super().order_by(*field_ordering) return super().order_by(*field_ordering)
class ApplicationSubmissionQueryset(JSONOrderable):
json_field = 'form_data'
def active(self):
return self.filter(status__in=active_statuses)
class ApplicationSubmission(WorkflowHelpers, AbstractFormSubmission): class ApplicationSubmission(WorkflowHelpers, AbstractFormSubmission):
field_template = 'funds/includes/submission_field.html' field_template = 'funds/includes/submission_field.html'
...@@ -447,7 +457,7 @@ class ApplicationSubmission(WorkflowHelpers, AbstractFormSubmission): ...@@ -447,7 +457,7 @@ class ApplicationSubmission(WorkflowHelpers, AbstractFormSubmission):
# Workflow inherited from WorkflowHelpers # Workflow inherited from WorkflowHelpers
status = models.CharField(max_length=254) status = models.CharField(max_length=254)
objects = JSONOrderable.as_manager() objects = ApplicationSubmissionQueryset.as_manager()
@property @property
def status_name(self): def status_name(self):
...@@ -461,6 +471,10 @@ class ApplicationSubmission(WorkflowHelpers, AbstractFormSubmission): ...@@ -461,6 +471,10 @@ class ApplicationSubmission(WorkflowHelpers, AbstractFormSubmission):
def phase(self): def phase(self):
return self.workflow.current(self.status) return self.workflow.current(self.status)
@property
def active(self):
return self.status in active_statuses
def ensure_user_has_account(self): def ensure_user_has_account(self):
if self.user and self.user.is_authenticated(): if self.user and self.user.is_authenticated():
self.form_data['email'] = self.user.email self.form_data['email'] = self.user.email
......
...@@ -30,8 +30,9 @@ class SubmissionsTable(tables.Table): ...@@ -30,8 +30,9 @@ class SubmissionsTable(tables.Table):
def render_user(self, value): def render_user(self, value):
return value.get_full_name() return value.get_full_name()
def render_status_name(self, value): def render_status_name(self, value, record):
return mark_safe(f'<span>{ value }</span>') state = 'class="not-active"' if not record.active else ''
return mark_safe(f'<span { state }>{ value }</span>')
def get_used_rounds(request): def get_used_rounds(request):
......
from collections import defaultdict from collections import defaultdict
import copy import copy
import itertools
from typing import Dict, Iterable, Iterator, List, Sequence, Type, Union from typing import Dict, Iterable, Iterator, List, Sequence, Type, Union
...@@ -226,10 +227,12 @@ class Phase: ...@@ -226,10 +227,12 @@ class Phase:
name: str = '' name: str = ''
public_name: str = '' public_name: str = ''
def __init__(self, name: str='', public_name: str ='') -> None: def __init__(self, name: str='', public_name: str ='', active: bool=True) -> None:
if name: if name:
self.name = name self.name = name
self.active = active
if public_name: if public_name:
self.public_name = public_name self.public_name = public_name
elif not self.public_name: elif not self.public_name:
...@@ -329,9 +332,9 @@ class DiscussionWithNextPhase(Phase): ...@@ -329,9 +332,9 @@ class DiscussionWithNextPhase(Phase):
actions = [NextPhaseAction('Open Review'), reject_action] actions = [NextPhaseAction('Open Review'), reject_action]
rejected = Phase(name='Rejected') rejected = Phase(name='Rejected', active=False)
accepted = Phase(name='Accepted') accepted = Phase(name='Accepted', active=False)
class RequestStage(Stage): class RequestStage(Stage):
...@@ -377,3 +380,7 @@ class DoubleStage(Workflow): ...@@ -377,3 +380,7 @@ class DoubleStage(Workflow):
statuses = set(phase.name for phase in Phase.__subclasses__()) statuses = set(phase.name for phase in Phase.__subclasses__())
status_options = [(slugify(opt), opt) for opt in statuses] status_options = [(slugify(opt), opt) for opt in statuses]
active_statuses = set(
str(phase) for phase in itertools.chain(SingleStage([None]), DoubleStage([None, None])) if phase.active
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment