diff options
Diffstat (limited to 'chimere/views.py')
| -rw-r--r-- | chimere/views.py | 102 |
1 files changed, 75 insertions, 27 deletions
diff --git a/chimere/views.py b/chimere/views.py index f48a3b1..18039b7 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -29,6 +29,8 @@ from itertools import groupby import re from django.conf import settings +from django.contrib.auth import authenticate, login, logout +from django.contrib.auth.forms import AuthenticationForm from django.contrib.gis.geos import GEOSGeometry from django.contrib.gis.gdal.error import OGRException from django.contrib.gis.measure import D @@ -69,11 +71,12 @@ def get_base_uri(request): return base_uri #TODO: convert to requestcontext -def get_base_response(map_name=""): +def get_base_response(request, map_name="", edit=False): """ Get the base url """ - base_response_dct = {'media_path':settings.MEDIA_URL,} + base_response_dct = {'media_path':settings.MEDIA_URL, + 'is_authenticated':request.user.is_authenticated()} base_url = reverse("chimere:index") if not base_url.startswith('/'): base_url = '/' + base_url @@ -85,18 +88,39 @@ def get_base_response(map_name=""): base_url += '/' base_url += map_name + '/' base_response_dct['extra_url'] = base_url - map = None + map_filter = {'available':True} if map_name: - try: - map = Map.objects.get(urn=map_name, available=True) - except ObjectDoesNotExist: - return None, redirect(reverse('chimere:index')) + map_filter['urn'] = map_name else: - try: - map = Map.objects.get(default=True) - map_name = map.urn - except ObjectDoesNotExist: - pass + map_filter['default'] = True + filters = [{'public_write':True}, + {'public_propose':True}, + ] if edit else [ + {'public_read':True}] + if base_response_dct['is_authenticated']: + filters += [{'mapusers__user':request.user, 'mapusers__write':True}, + {'mapusers__user':request.user, 'mapusers__propose':True}, + ] if edit else [ + {'mapusers__user':request.user, 'mapusers__read':True},] + query = None + for fltr in filters: + fltr.update(map_filter) + if not query: + query = Q(**fltr) + else: + query = query | Q(**fltr) + map = None + try: + map = Map.objects.get(query) + map_name = map.urn + except ObjectDoesNotExist: + if map_name: + return None, redirect(reverse('chimere:index')) + + if edit and map: + base_response_dct['can_write'] = bool(map.public_write or + Map.objects.filter(pk=map.pk, mapusers__user=request.user, + mapusers__write=True).count()) base_response_dct['map'] = map base_response_dct['map_name'] = map_name @@ -134,6 +158,11 @@ def getShareNetwork(request, map_name='', marker=None): share_networks.append((network[0], network[1] % net_dct, network[2])) return share_networks, net_dct + +def logout_view(request): + logout(request) + return redirect(reverse('chimere:index')) + def index(request, map_name=None, default_map=None, simple=False, get_response=False): """ @@ -147,9 +176,28 @@ def index(request, map_name=None, default_map=None, simple=False, request.session['last_visit'] != today: request.session['last_visit'] = today news_visible = True - response_dct, redir = get_base_response(map_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir + + if request.POST: + auth_form = AuthenticationForm(None, request.POST) + invalid_msg = _(u"Invalid user or password.") + if auth_form.is_valid(): + user = authenticate( + username=auth_form.cleaned_data['username'], + password=auth_form.cleaned_data['password']) + if user is not None and user.is_active: + login(request, user) + return redirect(reverse('chimere:index')) + else: + response_dct['auth_form'] = auth_form + else: + response_dct['auth_form'] = AuthenticationForm() + + if not response_dct['map']: + return render_to_response('chimere/no_map.html', response_dct, + context_instance=RequestContext(request)) # don't mess with permalink zoomout = True if request.GET and 'lat' in request.GET \ @@ -197,7 +245,7 @@ def get_edit_page(redirect_url, item_cls, item_form, Edition page """ def func(request, map_name="", item_id=None, cat_type=['M']): - response_dct, redir = get_base_response(map_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir, None, None if 'map_name' in response_dct: @@ -284,7 +332,7 @@ def get_edit_page(redirect_url, item_cls, item_form, f.save(marker) base_uri = get_base_uri(request) notifySubmission(base_uri, item) - response_dct = get_base_response(map_name) + response_dct = get_base_response(request, map_name) return redirect(redirect_url + '-item', map_name + '/' if map_name else '', item.ref_item.pk, 'submited'), None, subcategories @@ -346,7 +394,7 @@ def edit(request, map_name="", item_id=None, submited=False): context_instance=RequestContext(request)) def uploadFile(request, category_id='', map_name=''): - response_dct, redir = get_base_response(map_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir Form = FileForm if not category_id else FullFileForm @@ -455,7 +503,7 @@ def submited(request, map_name="", action=""): """ Successful submission page """ - response_dct, redir = get_base_response(map_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir response_dct.update({'actions':actions(response_dct['map_name']), @@ -467,7 +515,7 @@ def charte(request, map_name=""): """ Affichage de la charte """ - response_dct, redir = get_base_response(map_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir response_dct.update({'actions':actions(response_dct['map_name']), @@ -496,7 +544,7 @@ def contactus(request, map_name=""): msg = _(u"Temporary error. Renew your message later.") else: form = ContactForm() - response_dct, redir = get_base_response(map_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir response_dct.update({'actions':actions(response_dct['map_name']), @@ -513,7 +561,7 @@ def extraPage(request, map_name="", page_id=""): page = Page.objects.get(available=True, mnemonic=page_id) except ObjectDoesNotExist: return redirect(reverse('chimere:index')) - response_dct, redir = get_base_response(map_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir response_dct.update({'actions':actions(response_dct['map_name']), @@ -534,7 +582,7 @@ def getDetail(request, map_name, marker_id): status__in=['A', 'S'])[0] except (ValueError, IndexError): return HttpResponse('no results') - response_dct, redir = get_base_response(map_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir response_dct['marker'] = marker @@ -564,7 +612,7 @@ def getDescriptionDetail(request, map_name, category_id): category = Category.objects.filter(id=int(category_id))[0] except (ValueError, IndexError): return HttpResponse('no results') - response_dct, redir = get_base_response(map_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir response_dct['category'] = category @@ -650,7 +698,7 @@ def get_all_categories(request, map_name=None): ''' Get all available categories in JSON ''' - context_data, redir = get_base_response(map_name) + context_data, redir = get_base_response(request, map_name) map = context_data["map"] subcategories = [] if map: @@ -669,7 +717,7 @@ def get_available_categories(request, map_name=None, map=None, status='A', ''' Get category menu for a designed map ''' - context_data, redir = get_base_response(map_name) + context_data, redir = get_base_response(request, map_name) map = context_data["map"] if redir: return redir @@ -731,7 +779,7 @@ def getTinyfiedUrl(request, parameters, map_name=''): urn = TinyUrl.getUrnByParameters(parameters) except: return {} - response_dct, redir = get_base_response(map_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir url = reverse('chimere:tiny', args=[(response_dct['map_name'] \ @@ -757,7 +805,7 @@ def redirectFromTinyURN(request, map_name='', tiny_urn=''): Redirect from a tiny Urn """ parameters = '?' + TinyUrl.getParametersByUrn(tiny_urn) - response_dct, redir = get_base_response(map_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir return HttpResponseRedirect(response_dct['extra_url'] + parameters) @@ -836,7 +884,7 @@ def rss(request, map_name=''): ''' Redirect to RSS subscription page ''' - response_dct, redir = get_base_response(map_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir response_dct.update({'actions':actions(response_dct['map_name']), |
