Skip to content
Snippets Groups Projects
Commit 4a244e0c authored by George Hickman's avatar George Hickman Committed by Todd Dembrey
Browse files

Add Project Page Skeleton (#1354)

* Add Project detail page skeleton
* Add project block to submission detail page
* Add basic access tests for ProjectDetailView
parent 5b9ff275
No related branches found
No related tags found
No related merge requests found
......@@ -35,6 +35,10 @@
</div>
{% endblock %}
{% block project %}
{% include 'funds/includes/project_block.html' %}
{% endblock %}
{% block screening_status %}
{% include 'funds/includes/screening_status_block.html' %}
{% endblock %}
......
......@@ -104,6 +104,11 @@
{% endblock %}
{% endif %}
{% if request.user.is_apply_staff and object.project %}
{% block project %}
{% endblock %}
{% endif %}
{% block determination %}
{% include 'determinations/includes/applicant_determination_block.html' with submission=object %}
{% endblock %}
......
<div class="sidebar__inner">
<h5>Project</h5>
<p>
<a href="{% url 'apply:projects:detail' pk=object.project.id %}">{{ object.project.name }}</a>
</p>
</div>
from django.urls import include, path
from opentech.apply.projects.urls import urlpatterns as projects_urls
from .views import (
RevisionCompareView,
RevisionListView,
......@@ -81,5 +83,6 @@ rounds_urls = ([
urlpatterns = [
path('submissions/', include(submission_urls)),
path('rounds/', include(rounds_urls)),
path('projects/', include((projects_urls, 'projects'))),
path('api/', include(api_urls)),
]
{% extends "base-apply.html" %}
{% load static %}
{% block title %}{{ object.title }}{% endblock %}
{% block body_class %}{% endblock %}
{% block content %}
<div class="admin-bar">
<div class="admin-bar__inner">
<h1 class="beta heading heading--no-margin heading--bold">{{ object.name }}</h1>
{# {% status_bar object.workflow object.phase request.user same_stage=True%} #}
<div class="tabs js-tabs">
<div class="tabs__container">
<a class="tab__item" href="#details" data-tab="tab-1">
Details
</a>
<a class="tab__item" href="#communications" data-tab="tab-2">
Communications
</a>
<a class="tab__item" href="#activity-feed" data-tab="tab-3">
Activity Feed
</a>
</div>
</div>
</div>
</div>
<div class="wrapper wrapper--large wrapper--tabs js-tabs-content">
<div class="tabs__content" id="tab-1">
<div class="wrapper wrapper--sidebar">
<article class="wrapper--sidebar--inner">
<header class="heading heading--submission-meta heading-text zeta">
<span>Last edit: <strong>{{ object.updated_at.timestamp.date }} by {{ object.updated_by }}</strong></span>
{# {% if request.user|has_edit_perm:object %} #}
{% if request.user %}
<a class="link link--edit-submission is-active" href="#">
Edit
<svg class="icon icon--pen"><use xlink:href="#pen"></use></svg>
</a>
{% else %}
<span class="link link--edit-submission">
Edit
<svg class="icon icon--padlock"><use xlink:href="#padlock"></use></svg>
</span>
{% endif %}
</header>
<h3>Project Information</h3>
<div class="grid grid--proposal-info">
<div>
<h5>Proposed start date</h5>
<p>13 August 2019</p>
</div>
<div>
<h5>Project Proposed end date</h5>
<p>25 January 2020</p>
</div>
<div>
<h5>Legal name</h5>
<p>The Company</p>
</div>
<div>
<h5>Email</h5>
<a href="mailto:joe@lorumipsum.com">Joe@lorumipsum.com</a>
</div>
</div>
{% include "application_projects/includes/supporting_documents.html" %}
</article>
<aside class="sidebar">
{% if mobile %}
<a class="js-actions-toggle button button--white button--full-width button--actions">Actions to take</a>
{% endif %}
<div class="js-actions-sidebar sidebar__inner sidebar__inner--light-blue sidebar__inner--actions {% if mobile %}sidebar__inner--mobile{% endif %}">
<h5>Actions to take</h5>
<a data-fancybox
data-src="#send-for-approval"
class="button button--bottom-space button--primary button--full-width"
href="#">
Send for approval
</a>
<a data-fancybox
data-src="#ready-for-contracting"
class="button button--primary button--full-width"
href="#">
Ready for contracting
</a>
<p class="sidebar__separator">Assign</p>
<a data-fancybox
data-src="#update-program-manager"
class="button button--bottom-space button--white button--full-width"
href="#">
Program Manager
</a>
<a data-fancybox
data-src="#update-meta-categories"
class="button button--bottom-space button--white button--full-width"
href="#">
Meta Categories
</a>
</div>
<div class="sidebar__inner">
<h5>Meta Categories</h5>
<p>Meta Category</p>
<p>Meta Category</p>
<p>Meta Category</p>
</div>
</aside>
</div>
</div>
{# Tab 2 #}
<div class="tabs__content" id="tab-2">
<div class="feed">
{% include "activity/include/comment_form.html" %}
{% include "activity/include/comment_list.html" with editable=True %}
</div>
</div>
{# Tab 3 #}
<div class="tabs__content" id="tab-3">
<div class="feed">
{% include "activity/include/action_list.html" %}
</div>
</div>
</div>
{% endblock content %}
{% block extra_js %}
<script src="{% static 'js/apply/tabs.js' %}"></script>
{% endblock %}
from django.core.exceptions import PermissionDenied
from django.test import RequestFactory, TestCase
from opentech.apply.users.tests.factories import (ReviewerFactory,
StaffFactory,
SuperUserFactory,
UserFactory)
from ..views import ProjectDetailView
from .factories import ProjectFactory
class TestProjectDetailView(TestCase):
def setUp(self):
self.factory = RequestFactory()
self.project = ProjectFactory()
def test_reviewer_does_not_have_access(self):
request = self.factory.get('/projects/1/')
request.user = ReviewerFactory()
with self.assertRaises(PermissionDenied):
ProjectDetailView.as_view()(request, pk=self.project.pk)
def test_staff_user_has_access(self):
request = self.factory.get('/projects/1/')
request.user = StaffFactory()
response = ProjectDetailView.as_view()(request, pk=self.project.pk)
self.assertEqual(response.status_code, 200)
def test_super_user_has_access(self):
request = self.factory.get('/projects/1/')
request.user = SuperUserFactory()
response = ProjectDetailView.as_view()(request, pk=self.project.pk)
self.assertEqual(response.status_code, 200)
def test_user_does_not_have_access(self):
request = self.factory.get('/projects/1/')
request.user = UserFactory()
with self.assertRaises(PermissionDenied):
ProjectDetailView.as_view()(request, pk=self.project.pk)
from django.urls import path
from .views import ProjectDetailView
urlpatterns = [
path('<int:pk>/', ProjectDetailView.as_view(), name='detail'),
]
from django.utils.decorators import method_decorator
from django.views.generic import DetailView
from opentech.apply.users.decorators import staff_required
from .models import Project
@method_decorator(staff_required, name='dispatch')
class ProjectDetailView(DetailView):
model = Project
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