This repository has been archived by the owner on Oct 30, 2018. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #180 from bugzPDX/1097967
Bug 1097967 - Add Regions Table to DB
- Loading branch information
Showing
14 changed files
with
1,330 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
{% extends 'manage/regions.html' %} | ||
|
||
{% block manage_title %} | ||
Editing region "{{ region.name }}" | ||
{% endblock %} | ||
|
||
|
||
{% block content_class %}col-md-6{% endblock %} | ||
|
||
{% block manage_content %} | ||
|
||
{% include 'manage/_alert_form_errors.html' %} | ||
<form method="post" class="form-horizontal" role="form"> | ||
{{ csrf() }} | ||
{{ bootstrapform_horizontal(form) }} | ||
{% include 'manage/_form_buttons.html' %} | ||
</form> | ||
|
||
{% endblock %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
{% extends 'manage/region_edit.html' %} | ||
|
||
{% block manage_title %} | ||
New region | ||
{% endblock %} | ||
|
||
{% block manage_content %} | ||
{% include 'manage/_default_form.html' %} | ||
{% endblock %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
{% extends 'manage/manage_base.html' %} | ||
{% set page='regions' -%} | ||
|
||
{% block manage_title %} | ||
Regions | ||
{% endblock %} | ||
|
||
{% block manage_content %} | ||
<div>Note: You cannot create new locations with inactive regions.</div> | ||
<table class="table table-bordered table-striped"> | ||
<thead> | ||
<tr> | ||
<th>Name</th> | ||
<th>Locations</th> | ||
<th style="width:200px"></th> | ||
</tr> | ||
</thead> | ||
<tbody> | ||
{% for region in regions %} | ||
<tr> | ||
<td> | ||
{{ region.name }} | ||
{% if not region.is_active %} | ||
<span class="label label-default" title="Inactive region">Inactive</span> | ||
{% endif %} | ||
</td> | ||
<td> | ||
{{ region.location_set.all().count() }} | ||
</td> | ||
<td> | ||
<a class="btn btn-default btn-sm" href="{{ url('manage:region_edit', region.id) }}"> | ||
<i class="glyphicon glyphicon-edit"></i> | ||
Edit | ||
</a> | ||
<form method="post" class="confirm" | ||
action="{{ url('manage:region_remove', region.id) }}"> | ||
{{ csrf() }} | ||
<button class="btn btn-danger btn-sm" type="submit"> | ||
<i class="glyphicon glyphicon-trash"></i> | ||
Delete | ||
</button> | ||
</form> | ||
</td> | ||
</tr> | ||
{% endfor %} | ||
</tbody> | ||
</table> | ||
<p> | ||
<a class="btn btn-primary" href="{{ url('manage:region_new') }}"> | ||
<i class="glyphicon glyphicon-plus-sign"></i> | ||
New region | ||
</a> | ||
</p> | ||
{% endblock %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
from nose.tools import eq_, ok_ | ||
|
||
from funfactory.urlresolvers import reverse | ||
|
||
from airmozilla.main.models import ( | ||
Region, | ||
) | ||
from .base import ManageTestCase | ||
|
||
|
||
class TestRegions(ManageTestCase): | ||
def setUp(self): | ||
super(TestRegions, self).setUp() | ||
Region.objects.create(name='South America') | ||
|
||
def test_regions(self): | ||
"""Region management pages return successfully.""" | ||
response = self.client.get(reverse('manage:regions')) | ||
eq_(response.status_code, 200) | ||
|
||
Region.objects.create(name='New Region') | ||
response = self.client.get(reverse('manage:regions')) | ||
eq_(response.status_code, 200) | ||
ok_('New Region' in response.content) | ||
|
||
def test_region_new(self): | ||
"""Adding new region works correctly.""" | ||
url = reverse('manage:region_new') | ||
response = self.client.get(url) | ||
eq_(response.status_code, 200) | ||
|
||
response_ok = self.client.post(url, { | ||
'name': 'testing', | ||
}) | ||
self.assertRedirects(response_ok, reverse('manage:regions')) | ||
|
||
response_fail = self.client.post(url) | ||
eq_(response_fail.status_code, 200) | ||
ok_('This field is required' in response_fail.content) | ||
|
||
def test_region_remove(self): | ||
"""Removing a region works correctly and leaves associated locations | ||
with null regions.""" | ||
region = Region.objects.create( | ||
name="Something" | ||
) | ||
self._delete_test( | ||
region, | ||
'manage:region_remove', | ||
'manage:regions' | ||
) | ||
assert not Region.objects.filter(name="Something") | ||
|
||
def test_region_edit(self): | ||
"""Test region editor""" | ||
region = Region.objects.get(name='South America') | ||
url = reverse('manage:region_edit', kwargs={'id': region.id}) | ||
response = self.client.get(url) | ||
eq_(response.status_code, 200) | ||
ok_('South America' in response.content) | ||
|
||
response_ok = self.client.post(url, { | ||
'name': 'North America', | ||
}) | ||
self.assertRedirects(response_ok, reverse('manage:regions')) | ||
ok_(Region.objects.get(name='North America')) | ||
|
||
def test_regions_inactive(self): | ||
Region.objects.create(name='New Region', is_active=False) | ||
response = self.client.get(reverse('manage:regions')) | ||
eq_(response.status_code, 200) | ||
ok_("Inactive region" in response.content) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
from django.contrib import messages | ||
from django.shortcuts import render, redirect, get_object_or_404 | ||
from django.views.decorators.http import require_POST | ||
from django.db import transaction | ||
|
||
from airmozilla.main.models import ( | ||
Region, | ||
) | ||
from airmozilla.manage import forms | ||
|
||
from .decorators import ( | ||
staff_required, | ||
permission_required, | ||
cancel_redirect | ||
) | ||
|
||
|
||
@staff_required | ||
@permission_required('main.change_region') | ||
def regions(request): | ||
context = {} | ||
regions = Region.objects.all() | ||
context['regions'] = regions | ||
|
||
return render(request, 'manage/regions.html', context) | ||
|
||
|
||
@permission_required('main.change_region') | ||
@cancel_redirect('manage:regions') | ||
@transaction.commit_on_success | ||
def region_edit(request, id): | ||
region = get_object_or_404(Region, id=id) | ||
|
||
if request.method == 'POST': | ||
form = forms.RegionEditForm(request.POST, instance=region) | ||
if form.is_valid(): | ||
form.save() | ||
messages.info(request, 'Region "%s" saved.' % region) | ||
return redirect('manage:regions') | ||
else: | ||
form = forms.RegionEditForm(instance=region) | ||
|
||
context = { | ||
'form': form, | ||
'region': region, | ||
} | ||
|
||
return render(request, 'manage/region_edit.html', context) | ||
|
||
|
||
@staff_required | ||
@permission_required('main.add_region') | ||
@cancel_redirect('manage:events') | ||
@transaction.commit_on_success | ||
def region_new(request): | ||
if request.method == 'POST': | ||
form = forms.RegionEditForm(request.POST, instance=Region()) | ||
if form.is_valid(): | ||
form.save() | ||
messages.success(request, 'Region created.') | ||
return redirect('manage:regions') | ||
else: | ||
form = forms.RegionEditForm() | ||
return render(request, 'manage/region_new.html', {'form': form}) | ||
|
||
|
||
@require_POST | ||
@staff_required | ||
@permission_required('main.delete_region') | ||
@transaction.commit_on_success | ||
def region_remove(request, id): | ||
region = get_object_or_404(Region, id=id) | ||
region.delete() | ||
messages.info(request, 'Region "%s" removed.' % region.name) | ||
|
||
return redirect('manage:regions') |