Skip to content
Snippets Groups Projects
Unverified Commit 609f463f authored by Todd Dembrey's avatar Todd Dembrey Committed by GitHub
Browse files

Merge pull request #121 from OpenTechFund/feature/149-add-submissions-view

Feature/149 add submissions view
parents ba48105a df4838d8
No related branches found
No related tags found
No related merge requests found
{% extends "base-apply.html" %} {% extends "base-apply.html" %}
{% load render_table from django_tables2 %}
{% block title %}OTF Dashboard{% endblock %} {% block title %}OTF Dashboard{% endblock %}
{% block content %} {% block content %}
<div class="wrapper wrapper--breakout wrapper--admin"> <div class="wrapper wrapper--breakout wrapper--admin">
<div class="wrapper wrapper--large wrapper--search"> <div class="wrapper wrapper--large wrapper--search">
{% block page_header %} {% block page_header %}
<div> <div>
<h3 class="heading heading--no-margin">Received Submissions</h3> <h3 class="heading heading--no-margin">Dashboard</h3>
<h5>Track and explore recent submissions</h5> <h5>There is nothing here yet.</h5>
<a class="link--underlined" href="{% url "funds:submissions" %}">View all submissions</a>
</div> </div>
{% endblock %} {% endblock %}
{% include "dashboard/includes/search.html" %}
</div> </div>
</div> </div>
<div class="wrapper wrapper--large wrapper--top-bottom-inner-space">
{% if object_list|length > 0 or active_filters %}
<div class="button button--filters button--contains-icons js-open-filters">Filter By</div>
<div class="wrapper wrapper--filters js-filter-wrapper">
<div class="wrapper wrapper--filters-header">
<div class="js-clear-filters">Clear</div>
<div>Filter by</div>
<div class="js-close-filters">Close</div>
</div>
<form action="" method="get" class="form form--filters">
<ul class="form__filters select2 js-filter-list">
{{ filter.form.as_ul }}
<button class="button button--primary" type="submit" value="Filter">Filter</button>
</ul>
</form>
</div>
{% endif %}
{% render_table table %}
</div>
{% endblock %}
{% block extra_js %}
{{ filter.form.media }}
{% endblock %} {% endblock %}
from django.conf.urls import url from django.conf.urls import url
from .views import DashboardView, SearchView from .views import DashboardView
urlpatterns = [ urlpatterns = [
url(r'^$', DashboardView.as_view(), name="dashboard"), url(r'^$', DashboardView.as_view(), name="dashboard"),
url(r'^search$', SearchView.as_view(), name="search"),
] ]
from django_filters.views import FilterView from django.views.generic import TemplateView
from django_tables2.views import SingleTableMixin
from .tables import DashboardTable, SubmissionFilter, SubmissionFilterAndSearch
class DashboardView(TemplateView):
class DashboardView(SingleTableMixin, FilterView):
template_name = 'dashboard/dashboard.html' template_name = 'dashboard/dashboard.html'
table_class = DashboardTable
filterset_class = SubmissionFilter
def get_context_data(self, **kwargs):
active_filters = self.filterset.data
return super().get_context_data(active_filters=active_filters, **kwargs)
class SearchView(SingleTableMixin, FilterView):
template_name = 'dashboard/search.html'
table_class = DashboardTable
filterset_class = SubmissionFilterAndSearch
def get_context_data(self, **kwargs):
search_term = self.request.GET.get('query')
# We have more data than just 'query'
active_filters = len(self.filterset.data) > 1
return super().get_context_data(
search_term=search_term,
active_filters=active_filters,
**kwargs,
)
...@@ -13,7 +13,7 @@ from opentech.apply.funds.workflow import status_options ...@@ -13,7 +13,7 @@ from opentech.apply.funds.workflow import status_options
from .widgets import Select2MultiCheckboxesWidget from .widgets import Select2MultiCheckboxesWidget
class DashboardTable(tables.Table): class SubmissionsTable(tables.Table):
title = tables.LinkColumn('funds:submission', args=[A('pk')], orderable=True) title = tables.LinkColumn('funds:submission', args=[A('pk')], orderable=True)
submit_time = tables.DateColumn(verbose_name="Submitted") submit_time = tables.DateColumn(verbose_name="Submitted")
status_name = tables.Column(verbose_name="Status") status_name = tables.Column(verbose_name="Status")
...@@ -25,7 +25,7 @@ class DashboardTable(tables.Table): ...@@ -25,7 +25,7 @@ class DashboardTable(tables.Table):
model = ApplicationSubmission model = ApplicationSubmission
fields = ('title', 'status_name', 'stage', 'page', 'round', 'submit_time') fields = ('title', 'status_name', 'stage', 'page', 'round', 'submit_time')
sequence = ('title', 'status_name', 'stage', 'page', 'round', 'lead', 'submit_time') sequence = ('title', 'status_name', 'stage', 'page', 'round', 'lead', 'submit_time')
template = "dashboard/tables/table.html" template = 'funds/tables/table.html'
def render_user(self, value): def render_user(self, value):
return value.get_full_name() return value.get_full_name()
...@@ -48,7 +48,7 @@ def get_round_leads(request): ...@@ -48,7 +48,7 @@ def get_round_leads(request):
return User.objects.filter(round__isnull=False).distinct() return User.objects.filter(round__isnull=False).distinct()
class Select2CheckboxWidgetMixin: class Select2CheckboxWidgetMixin(filters.Filter):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
label = kwargs.get('label') label = kwargs.get('label')
kwargs.setdefault('widget', Select2MultiCheckboxesWidget(attrs={'data-placeholder': label})) kwargs.setdefault('widget', Select2MultiCheckboxesWidget(attrs={'data-placeholder': label}))
......
<form action="{% url 'dashboard:search' %}" method="get" role="search" class="form form--header-search-desktop"> <form action="{% url 'funds:search' %}" method="get" role="search" class="form form--header-search-desktop">
<button class="button button--search" type="submit" aria-label="Search"> <button class="button button--search" type="submit" aria-label="Search">
<svg class="icon icon--magnifying-glass icon--search"><use xlink:href="#magnifying-glass"></use></svg> <svg class="icon icon--magnifying-glass icon--search"><use xlink:href="#magnifying-glass"></use></svg>
</button> </button>
......
{% extends "base-apply.html" %}
{% load render_table from django_tables2 %}
{% block title %}Submissions{% endblock %}
{% block content %}
<div class="wrapper wrapper--breakout wrapper--admin">
<div class="wrapper wrapper--large wrapper--search">
{% block page_header %}
<div>
<h3 class="heading heading--no-margin">Received Submissions</h3>
<h5>Track and explore recent submissions</h5>
</div>
{% endblock %}
{% include "funds/includes/search.html" %}
</div>
</div>
<div class="wrapper wrapper--large wrapper--top-bottom-inner-space">
{% if object_list|length > 0 or active_filters %}
<div class="button button--filters button--contains-icons js-open-filters">Filter By</div>
<div class="wrapper wrapper--filters js-filter-wrapper">
<div class="wrapper wrapper--filters-header">
<div class="js-clear-filters">Clear</div>
<div>Filter by</div>
<div class="js-close-filters">Close</div>
</div>
<form action="" method="get" class="form form--filters">
<ul class="form__filters select2 js-filter-list">
{{ filter.form.as_ul }}
<button class="button button--primary" type="submit" value="Filter">Filter</button>
</ul>
</form>
</div>
{% endif %}
{% render_table table %}
</div>
{% endblock %}
{% block extra_js %}
{{ filter.form.media }}
{% endblock %}
{% extends "dashboard/dashboard.html" %} {% extends "funds/submissions.html" %}
{% block page_header %} {% block page_header %}
<div class="wrapper wrapper--medium"> <div class="wrapper wrapper--medium">
......
from django.conf.urls import url from django.conf.urls import url
from .views import SubmissionDetailView, demo_workflow from .views import SubmissionSearchView, SubmissionDetailView, SubmissionListView, demo_workflow
urlpatterns = [ urlpatterns = [
url(r'^demo/(?P<wf_id>[1-2])/$', demo_workflow, name="workflow_demo"), url(r'^demo/(?P<wf_id>[1-2])/$', demo_workflow, name="workflow_demo"),
url(r'^submission/(?P<pk>\d+)/$', SubmissionDetailView.as_view(), name="submission"), url(r'^submissions/$', SubmissionListView.as_view(), name="submissions"),
url(r'^submissions/(?P<pk>\d+)/$', SubmissionDetailView.as_view(), name="submission"),
url(r'^search$', SubmissionSearchView.as_view(), name="search"),
] ]
...@@ -2,10 +2,44 @@ from django import forms ...@@ -2,10 +2,44 @@ from django import forms
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
from django.views.generic import DetailView from django.views.generic import DetailView
from django_filters.views import FilterView
from django_tables2.views import SingleTableMixin
from .models import ApplicationSubmission from .models import ApplicationSubmission
from .tables import SubmissionsTable, SubmissionFilter, SubmissionFilterAndSearch
from .workflow import SingleStage, DoubleStage from .workflow import SingleStage, DoubleStage
class SubmissionListView(SingleTableMixin, FilterView):
template_name = 'funds/submissions.html'
table_class = SubmissionsTable
filterset_class = SubmissionFilter
def get_context_data(self, **kwargs):
active_filters = self.filterset.data
return super().get_context_data(active_filters=active_filters, **kwargs)
class SubmissionSearchView(SingleTableMixin, FilterView):
template_name = 'funds/submissions_search.html'
table_class = SubmissionsTable
filterset_class = SubmissionFilterAndSearch
def get_context_data(self, **kwargs):
search_term = self.request.GET.get('query')
# We have more data than just 'query'
active_filters = len(self.filterset.data) > 1
return super().get_context_data(
search_term=search_term,
active_filters=active_filters,
**kwargs,
)
class SubmissionDetailView(DetailView): class SubmissionDetailView(DetailView):
model = ApplicationSubmission model = ApplicationSubmission
...@@ -19,6 +53,8 @@ class SubmissionDetailView(DetailView): ...@@ -19,6 +53,8 @@ class SubmissionDetailView(DetailView):
workflows = [SingleStage, DoubleStage] workflows = [SingleStage, DoubleStage]
# Workflow Demo Views
class BasicSubmissionForm(forms.Form): class BasicSubmissionForm(forms.Form):
who_are_you = forms.CharField() who_are_you = forms.CharField()
......
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