#64 place mode and filtering of place modes in list views
This commit is contained in:
parent
49301afe51
commit
c9d83dfc2c
@ -69,7 +69,7 @@ class PlaceForm(forms.ModelForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = Place
|
model = Place
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
exclude = ['submitted_by', 'level']
|
exclude = ['submitted_by', 'level', 'mode']
|
||||||
widgets = {
|
widgets = {
|
||||||
'hero': widgets.SelectContent()
|
'hero': widgets.SelectContent()
|
||||||
}
|
}
|
||||||
@ -88,6 +88,11 @@ class PlaceForm(forms.ModelForm):
|
|||||||
widget=forms.NumberInput(attrs={'min':-180,'max': 180,'type': 'number', 'step': 'any'})
|
widget=forms.NumberInput(attrs={'min':-180,'max': 180,'type': 'number', 'step': 'any'})
|
||||||
)
|
)
|
||||||
|
|
||||||
|
draft = forms.BooleanField(
|
||||||
|
label=_('Save Place as draft'),
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
|
||||||
class PlaceImageForm(forms.ModelForm):
|
class PlaceImageForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = PlaceImage
|
model = PlaceImage
|
||||||
|
@ -82,9 +82,25 @@ class Explorer(models.Model):
|
|||||||
choices=EXPLORER_LEVELS
|
choices=EXPLORER_LEVELS
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_place_list_to_display(self):
|
||||||
|
'''
|
||||||
|
Gets the list of places to show on the homepage
|
||||||
|
and the list views
|
||||||
|
'''
|
||||||
|
if self.user.is_superuser:
|
||||||
|
return Place.objects.filter(mode='live')
|
||||||
|
|
||||||
|
return Place.objects.filter(
|
||||||
|
level__lte=self.level,
|
||||||
|
mode='live'
|
||||||
|
) | Place.objects.filter(
|
||||||
|
submitted_by=self,
|
||||||
|
mode='live'
|
||||||
|
)
|
||||||
|
|
||||||
def get_places_eligible_to_see(self):
|
def get_places_eligible_to_see(self):
|
||||||
if self.user.is_superuser:
|
if self.user.is_superuser:
|
||||||
return Place.objects.all()
|
return Place.objects.filter(mode='live')
|
||||||
return Place.objects.all().filter(level__lte=self.level) | self.places.all()
|
return Place.objects.all().filter(level__lte=self.level) | self.places.all()
|
||||||
|
|
||||||
def is_eligible_to_see(self, place):
|
def is_eligible_to_see(self, place):
|
||||||
|
@ -23,6 +23,13 @@ PLACE_LEVELS = (
|
|||||||
(5, 'Time Capsule')
|
(5, 'Time Capsule')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
PLACE_MODES = (
|
||||||
|
('live', 'live'),
|
||||||
|
('draft', 'draft'),
|
||||||
|
('review', 'review'),
|
||||||
|
('archive', 'archive')
|
||||||
|
)
|
||||||
|
|
||||||
class Place(Submittable, Taggable, Mapable):
|
class Place(Submittable, Taggable, Mapable):
|
||||||
"""
|
"""
|
||||||
Place defines a lost place (location, name, description etc.).
|
Place defines a lost place (location, name, description etc.).
|
||||||
@ -40,7 +47,7 @@ class Place(Submittable, Taggable, Mapable):
|
|||||||
hero = models.ForeignKey(
|
hero = models.ForeignKey(
|
||||||
'PlaceImage',
|
'PlaceImage',
|
||||||
on_delete=models.SET_NULL,
|
on_delete=models.SET_NULL,
|
||||||
null=True,
|
null=True,
|
||||||
blank=True,
|
blank=True,
|
||||||
related_name='place_heros'
|
related_name='place_heros'
|
||||||
)
|
)
|
||||||
@ -50,6 +57,12 @@ class Place(Submittable, Taggable, Mapable):
|
|||||||
choices=PLACE_LEVELS
|
choices=PLACE_LEVELS
|
||||||
)
|
)
|
||||||
|
|
||||||
|
mode = models.TextField(
|
||||||
|
default='live',
|
||||||
|
choices=PLACE_MODES,
|
||||||
|
verbose_name=_('Mode of Place Editing')
|
||||||
|
)
|
||||||
|
|
||||||
def get_hero_image(self):
|
def get_hero_image(self):
|
||||||
if self.hero:
|
if self.hero:
|
||||||
return self.hero
|
return self.hero
|
||||||
|
@ -39,8 +39,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{% translate 'Create' as action %}
|
{% translate 'Create' as action %}
|
||||||
<div class="LP-Form__Composition LP-Form__Composition--buttons">
|
<div class="LP-Form__Composition LP-Form__Composition--buttons">
|
||||||
|
{% include 'partials/form/inputField.html' with field=place_form.draft %}
|
||||||
{% include 'partials/form/submit.html' with referrer=request.META.HTTP_REFERER action=action %}
|
{% include 'partials/form/submit.html' with referrer=request.META.HTTP_REFERER action=action %}
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
@ -13,6 +13,7 @@ from django.utils.translation import gettext as _
|
|||||||
|
|
||||||
|
|
||||||
from lostplaces.models import Place
|
from lostplaces.models import Place
|
||||||
|
from lostplaces.models import PLACE_MODES
|
||||||
from lostplaces.views import (
|
from lostplaces.views import (
|
||||||
PlaceCreateView,
|
PlaceCreateView,
|
||||||
PlaceListView,
|
PlaceListView,
|
||||||
@ -154,6 +155,38 @@ class TestPlaceListView(GlobalTemplateTestCaseMixin, ViewTestCase):
|
|||||||
'Im a own place' in response.content.decode(),
|
'Im a own place' in response.content.decode(),
|
||||||
msg='Expecting the user to see places where their level is high enough'
|
msg='Expecting the user to see places where their level is high enough'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_place_mode_filter(self):
|
||||||
|
explorer = User.objects.get(username='testpeter').explorer
|
||||||
|
Place.objects.all().delete()
|
||||||
|
|
||||||
|
for mode in PLACE_MODES:
|
||||||
|
place = Place.objects.create(
|
||||||
|
name='Im a place in mode %s' % mode[0],
|
||||||
|
submitted_when=timezone.now(),
|
||||||
|
submitted_by=explorer,
|
||||||
|
location='Test town',
|
||||||
|
latitude=50.5,
|
||||||
|
longitude=7.0,
|
||||||
|
description='This is just a test, do not worry %s' % mode[0],
|
||||||
|
level=3,
|
||||||
|
mode=mode[0]
|
||||||
|
)
|
||||||
|
|
||||||
|
self.client.login(username='testpeter', password='Develop123')
|
||||||
|
response = self.client.get(reverse('place_list'))
|
||||||
|
|
||||||
|
for mode in PLACE_MODES:
|
||||||
|
if ('Im a place in mode %s' % mode[0]) in response.content.decode():
|
||||||
|
self.assertTrue(
|
||||||
|
mode[0] == 'live',
|
||||||
|
msg='Expecting only places in mode \'live\' to be listed, saw a place in mode %s' % mode[0]
|
||||||
|
)
|
||||||
|
elif mode[0] == 'live':
|
||||||
|
self.fail(
|
||||||
|
msg='Expecting at least one place in mode \'live\' to be listed'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestPlaceCreateView(ViewTestCase):
|
class TestPlaceCreateView(ViewTestCase):
|
||||||
view = PlaceCreateView
|
view = PlaceCreateView
|
||||||
|
@ -138,4 +138,10 @@ class LevelCapPlaceListView(ListView):
|
|||||||
model = Place
|
model = Place
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return self.request.user.explorer.get_places_eligible_to_see()
|
return self.request.user.explorer.get_place_list_to_display()
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super().get_context_data(**kwargs)
|
||||||
|
context['place_list'] = context.pop('object_list')
|
||||||
|
return context
|
||||||
|
|
@ -13,7 +13,7 @@ from django.utils.translation import gettext as _
|
|||||||
|
|
||||||
from lostplaces.forms import SignupVoucherForm, TagSubmitForm
|
from lostplaces.forms import SignupVoucherForm, TagSubmitForm
|
||||||
from lostplaces.models import Place, PhotoAlbum
|
from lostplaces.models import Place, PhotoAlbum
|
||||||
from lostplaces.views.base_views import IsAuthenticatedMixin
|
from lostplaces.views.base_views import IsAuthenticatedMixin, LevelCapPlaceListView
|
||||||
from lostplaces.common import redirect_referer_or
|
from lostplaces.common import redirect_referer_or
|
||||||
|
|
||||||
from lostplaces.views.base_views import (
|
from lostplaces.views.base_views import (
|
||||||
@ -29,17 +29,19 @@ class SignUpView(SuccessMessageMixin, CreateView):
|
|||||||
template_name = 'signup.html'
|
template_name = 'signup.html'
|
||||||
success_message = _('User created')
|
success_message = _('User created')
|
||||||
|
|
||||||
class HomeView(IsAuthenticatedMixin, View):
|
class HomeView(IsAuthenticatedMixin, LevelCapPlaceListView, View):
|
||||||
def get(self, request, *args, **kwargs):
|
template_name = 'home.html'
|
||||||
place_list = request.user.explorer.get_places_eligible_to_see()
|
|
||||||
context = {
|
def get_context_data(self, **kwargs):
|
||||||
'place_list': place_list,
|
context = super().get_context_data(**kwargs)
|
||||||
'mapping_config': {
|
place_list = context['place_list']
|
||||||
'all_points': place_list,
|
|
||||||
'map_center': Place.average_latlon(place_list)
|
context['mapping_config'] = {
|
||||||
}
|
'all_points': place_list,
|
||||||
|
'map_center': Place.average_latlon(place_list)
|
||||||
}
|
}
|
||||||
return render(request, 'home.html', context)
|
return context
|
||||||
|
|
||||||
|
|
||||||
def handle_no_permission(self):
|
def handle_no_permission(self):
|
||||||
place_list = Place.objects.filter(level=1)[:5]
|
place_list = Place.objects.filter(level=1)[:5]
|
||||||
|
Loading…
Reference in New Issue
Block a user