Skip to content
This repository has been archived by the owner on Oct 30, 2018. It is now read-only.

Commit

Permalink
Merge pull request #180 from bugzPDX/1097967
Browse files Browse the repository at this point in the history
Bug 1097967 - Add Regions Table to DB
  • Loading branch information
Peter Bengtsson committed Jan 27, 2015
2 parents 26d03cc + 28282ac commit a97017d
Show file tree
Hide file tree
Showing 14 changed files with 1,330 additions and 0 deletions.
345 changes: 345 additions & 0 deletions airmozilla/main/migrations/0054_auto__add_region.py

Large diffs are not rendered by default.

346 changes: 346 additions & 0 deletions airmozilla/main/migrations/0055_auto.py

Large diffs are not rendered by default.

357 changes: 357 additions & 0 deletions airmozilla/main/migrations/0056_auto.py

Large diffs are not rendered by default.

13 changes: 13 additions & 0 deletions airmozilla/main/models.py
Expand Up @@ -189,11 +189,24 @@ def __unicode__(self):
return self.name


class Region(models.Model):
"""Region of a video/stream/presentation/etc."""
name = models.CharField(max_length=300)
is_active = models.BooleanField(default=True)

class Meta:
ordering = ['name']

def __unicode__(self):
return self.name


class Location(models.Model):
"""Venue/location of a video/stream/presentation/etc."""
name = models.CharField(max_length=300)
timezone = models.CharField(max_length=250)
is_active = models.BooleanField(default=True)
regions = models.ManyToManyField(Region, blank=True)

class Meta:
ordering = ['name']
Expand Down
7 changes: 7 additions & 0 deletions airmozilla/manage/forms.py
Expand Up @@ -17,6 +17,7 @@
Event,
EventTweet,
Location,
Region,
Participant,
Tag,
Template,
Expand Down Expand Up @@ -480,6 +481,12 @@ class Meta:
fields = ('privacy', 'template', 'template_environment')


class RegionEditForm(BaseModelForm):

class Meta:
model = Region


class ApprovalForm(BaseModelForm):
class Meta:
model = Approval
Expand Down
4 changes: 4 additions & 0 deletions airmozilla/manage/templates/manage/locations.html
Expand Up @@ -11,6 +11,7 @@
<thead>
<tr>
<th>Name</th>
<th>Region(s)</th>
<th>Time zone</th>
<th style="width:200px">Events/Suggested events</th>
<th></th>
Expand All @@ -25,6 +26,9 @@
<span class="label label-default" title="Inactive location">Inactive</span>
{% endif %}
</td>
<td>{% for region in location.regions.all() %}
{{ region.name }}{% if not loop.last %}, {% endif %}
{% endfor %}</td>
<td>{{ location.timezone }}</td>
<td>
<span title="Events associated with this location">
Expand Down
2 changes: 2 additions & 0 deletions airmozilla/manage/templates/manage/manage_base.html
Expand Up @@ -38,6 +38,8 @@
perms.main.change_channel, ''),
('manage:locations', 'Locations', 'locations', 'glyphicon-globe',
perms.main.change_location, ''),
('manage:regions', 'Regions', 'regions', 'glyphicon-globe',
perms.main.change_region, ''),
('manage:templates', 'Video templates', 'templates', 'glyphicon-film',
perms.main.change_template, ''),
('manage:tags', 'Event tags', 'tags', 'glyphicon-tags',
Expand Down
19 changes: 19 additions & 0 deletions airmozilla/manage/templates/manage/region_edit.html
@@ -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 %}
9 changes: 9 additions & 0 deletions airmozilla/manage/templates/manage/region_new.html
@@ -0,0 +1,9 @@
{% extends 'manage/region_edit.html' %}

{% block manage_title %}
New region
{% endblock %}

{% block manage_content %}
{% include 'manage/_default_form.html' %}
{% endblock %}
54 changes: 54 additions & 0 deletions airmozilla/manage/templates/manage/regions.html
@@ -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 %}
19 changes: 19 additions & 0 deletions airmozilla/manage/tests/views/test_locations.py
Expand Up @@ -6,6 +6,7 @@

from airmozilla.main.models import (
Location,
Region,
Template,
Event,
LocationDefaultEnvironment
Expand All @@ -19,6 +20,24 @@ def test_locations(self):
response = self.client.get(reverse('manage:locations'))
eq_(response.status_code, 200)

location = Location.objects.create(name='SomeLocation')
response = self.client.get(reverse('manage:locations'))
eq_(response.status_code, 200)
eq_(location.name, 'SomeLocation')

def test_locations_regions(self):
"""Location management pages with regions return successfully."""
response = self.client.get(reverse('manage:locations'))
eq_(response.status_code, 200)

location = Location.objects.create(name='SomeLocation')
region = Region.objects.create(name='SomeRegion')
location.regions.add(region)
response = self.client.get(reverse('manage:locations'))
eq_(response.status_code, 200)
ok_('SomeLocation' in response.content)
ok_('SomeRegion' in response.content)

def test_location_new(self):
"""Adding new location works correctly."""
url = reverse('manage:location_new')
Expand Down
72 changes: 72 additions & 0 deletions airmozilla/manage/tests/views/test_regions.py
@@ -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)
7 changes: 7 additions & 0 deletions airmozilla/manage/urls.py
Expand Up @@ -13,6 +13,7 @@
groups,
channels,
locations,
regions,
templates,
tags,
recruitmentmessages,
Expand Down Expand Up @@ -154,6 +155,12 @@
url(r'^locations/tz/$', locations.location_timezone,
name='location_timezone'),
url(r'^locations/$', locations.locations, name='locations'),
url(r'^regions/new/$', regions.region_new, name='region_new'),
url(r'^regions/(?P<id>\d+)/$', regions.region_edit,
name='region_edit'),
url(r'^regions/remove/(?P<id>\d+)/$', regions.region_remove,
name='region_remove'),
url(r'^regions/$', regions.regions, name='regions'),
url(r'^approvals/$', approvals.approvals, name='approvals'),
url(r'^approvals/reconsider/$', approvals.approval_reconsider,
name='approval_reconsider'),
Expand Down
76 changes: 76 additions & 0 deletions airmozilla/manage/views/regions.py
@@ -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')

0 comments on commit a97017d

Please sign in to comment.