diff options
author | Rogelio Mita <rogeliomita@activitycentral.com> | 2013-04-16 20:12:46 (GMT) |
---|---|---|
committer | Rogelio Mita <rogeliomita@activitycentral.com> | 2013-04-16 20:12:46 (GMT) |
commit | cf9c2e3bda0e3ba20eb107db9da655052e89bbf0 (patch) | |
tree | aff3e45e75af2da9c8e04617ec10eaed9b7d686f /webapp | |
parent | 19c6ab15a2eacf059a8fac1cf193ac16feb62197 (diff) |
Sociologist rol separation
Diffstat (limited to 'webapp')
25 files changed, 262 insertions, 56 deletions
diff --git a/webapp/custom_admin/admin.py b/webapp/custom_admin/admin.py index ae403cc..567d0b6 100644 --- a/webapp/custom_admin/admin.py +++ b/webapp/custom_admin/admin.py @@ -6,7 +6,7 @@ from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin class UserAdmin(DjangoUserAdmin): fieldsets = ( - (None, {'fields': ('username', 'password', 'is_active')}), + (None, {'fields': ('username', 'password', 'is_active', 'is_staff')}), (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), (_('Important dates'), {'fields': ('last_login', 'date_joined')}), ) @@ -18,6 +18,7 @@ class UserAdmin(DjangoUserAdmin): def has_delete_permission(self, request, obj=None): return False + admin.site.unregister(Group) admin.site.unregister(User) admin.site.disable_action('delete_selected') diff --git a/webapp/polls/templates/poll-form.html b/webapp/polls/templates/poll-form.html index 8edb0a0..b81d911 100644 --- a/webapp/polls/templates/poll-form.html +++ b/webapp/polls/templates/poll-form.html @@ -80,7 +80,7 @@ (function($){ var url = { - form_submit: '{% if poll.id %}{% url polls:edit poll.id %}{% else %}{% url polls:add %}{% endif %}?continue=true', + form_submit: '{% if poll.id %}{% url sociologist:poll_edit poll.id %}{% else %}{% url sociologist:poll_add %}{% endif %}?continue=true', }; var form; diff --git a/webapp/polls/views.py b/webapp/polls/views.py index 21882ab..4db1718 100644 --- a/webapp/polls/views.py +++ b/webapp/polls/views.py @@ -18,7 +18,6 @@ from django.contrib import messages from django.core.files.uploadedfile import InMemoryUploadedFile from django.shortcuts import render_to_response from django.conf import settings -from django.utils.decorators import method_decorator from utils.forms import BadFormValidation from utils.data_structure import dict_merge @@ -26,7 +25,6 @@ from utils.data_structure import dict_merge from polls.models import WIDGET_TYPES, Structure, Poll, PollResult from polls.forms import PollAddForm from pollster.models import Pollster -from pollster.decorators import pollster_required __all__ = [ @@ -117,14 +115,14 @@ class PollFormView(FormView): if self.request.GET.get('continue', None): return HttpResponseRedirect( reverse( - 'polls:structure.builder', + 'sociologist:structure.builder', kwargs={'poll_id': str(poll.id)} ) ) else: return HttpResponseRedirect( reverse( - 'polls:edit', + 'sociologist:poll_edit', kwargs={'id': str(poll.id)} ) ) @@ -137,13 +135,6 @@ class PollListView(ListView): template_name = "poll-list.html" context_object_name = "polls" - def dispatch(self, *args, **kwargs): - - if args[0].user.is_pollster: - return HttpResponseRedirect(reverse('pollsters:assigned_polls')) - - return super(PollListView, self).dispatch(*args, **kwargs) - def get_queryset(self, *args, **kwargs): user = self.request.user return [ @@ -154,20 +145,20 @@ class PollListView(ListView): 'action_edit': { 'disabled': "disabled" if not user.is_superuser else "", 'url': reverse( - 'polls:edit', kwargs={'id': str(poll.id)} + 'sociologist:poll_edit', kwargs={'id': str(poll.id)} ), }, 'action_structure_builder': { 'disabled': "disabled" if not poll.is_open() else "", 'url': reverse( - 'polls:structure.builder', + 'sociologist:structure.builder', kwargs={'poll_id': str(poll.id)} ) }, 'action_download': { 'disabled': "disabled" if poll.is_open() else "", 'url': reverse( - 'polls:download', + 'sociologist:poll_download', kwargs={'poll_id': str(poll.id)} ), }, @@ -241,7 +232,7 @@ class StructureFormView(TemplateView): return HttpResponseRedirect( reverse( - 'polls:structure.builder', + 'sociologist:structure.builder', kwargs={"poll_id": str(self.poll.id)} ) ) @@ -301,15 +292,6 @@ class UnploadPollResultFormView(TemplateView): template_name = "poll-result-form.html" - def get(self, request, *args, **kwargs): - context = self.get_context_data() - - return self.render_to_response(context) - - @method_decorator(pollster_required) - def dispatch(self, *args, **kwargs): - return super(UnploadPollResultFormView, self).dispatch(*args, **kwargs) - def post(self, request, *args, **kwargs): context = self.get_context_data() diff --git a/webapp/pollster/templates/pollster-assigned-polls.html b/webapp/pollster/templates/pollster-assigned-polls.html index 8c0bd15..0878699 100644 --- a/webapp/pollster/templates/pollster-assigned-polls.html +++ b/webapp/pollster/templates/pollster-assigned-polls.html @@ -37,7 +37,7 @@ <td>{{ poll.name|capfirst }}</td> <td>{% if poll.get_result %}Existe resultado, no visualizable en esta version{% else %}No hay resultados aún.{% endif %}</td> <td> - <a class="btn" href="{% url polls:download poll_id=poll.id %}"> + <a class="btn" href="{% url sociologist:poll_download poll_id=poll.id %}"> <i class="icon-download-alt"></i> Descargar encuesta </a> </td> diff --git a/webapp/pollster/urls.py b/webapp/pollster/urls.py index 240e39c..2e081a0 100644 --- a/webapp/pollster/urls.py +++ b/webapp/pollster/urls.py @@ -1,20 +1,18 @@ from django.conf.urls.defaults import patterns, url +from django.views.generic.base import RedirectView from pollster.views import * +from polls.views import * urlpatterns = patterns('', - # Pollster - url(r'^$', PollsterListView.as_view(), name="list"), - url(r'^new/$', PollsterFormView.as_view(), name="new"), + # Polls + url(r'^$', RedirectView.as_view(url='assigned_polls/'), name="index"), url( r'^assigned_polls/$', PollsterAssignedPollsListView.as_view(), name="assigned_polls" ), - url( - r'^poll_assignment/(?P<id>[0-9A-Fa-f]{24})/$', - PollAsignationFormView.as_view(), - name="poll_assignment" - ), + url(r'^upload_result/$', + UnploadPollResultFormView.as_view(), name="upload_result"), ) diff --git a/webapp/pollster/views.py b/webapp/pollster/views.py index 8685769..e1c3792 100644 --- a/webapp/pollster/views.py +++ b/webapp/pollster/views.py @@ -80,7 +80,7 @@ class PollsterListView(ListView): 'username': pe.get_user().username, 'email': pe.get_user().email, 'action_assign': reverse( - 'pollsters:poll_assignment', kwargs={'id': str(pe.id)}) + 'sociologist:poll_assignment', kwargs={'id': str(pe.id)}) } for pe in Pollster.all() ] @@ -104,7 +104,7 @@ class PollsterFormView(FormView): msg = u'El encuestador fué guardado con éxito.' messages.add_message(self.request, messages.SUCCESS, msg) - return HttpResponseRedirect(reverse('pollsters:list')) + return HttpResponseRedirect(reverse('sociologist:pollster_list')) return self.form_invalid(form) @@ -148,6 +148,6 @@ class PollAsignationFormView(FormView): msg = u'Se realizaron las asignaciones correctamente.' messages.add_message(self.request, messages.SUCCESS, msg) - return HttpResponseRedirect(reverse('pollsters:list')) + return HttpResponseRedirect(reverse('sociologist:pollster_list')) return self.form_invalid(form) diff --git a/webapp/sociologist/__init__.py b/webapp/sociologist/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/webapp/sociologist/__init__.py diff --git a/webapp/sociologist/decorators.py b/webapp/sociologist/decorators.py new file mode 100644 index 0000000..9967945 --- /dev/null +++ b/webapp/sociologist/decorators.py @@ -0,0 +1,16 @@ +from functools import wraps + +from django.http import Http404 + +from utils.decorators import user_account_required + + +def sociologist_required(view_function): + @wraps(view_function) + @user_account_required + def decorator(*args, **kwargs): + if args[0].user.is_sociologist: + return view_function(*args, **kwargs) + else: + raise Http404() + return decorator diff --git a/webapp/sociologist/fixtures/initial_data.json b/webapp/sociologist/fixtures/initial_data.json new file mode 100644 index 0000000..c9e3699 --- /dev/null +++ b/webapp/sociologist/fixtures/initial_data.json @@ -0,0 +1,10 @@ +[ + { + "pk": 2, + "model": "auth.group", + "fields": { + "name": "sociologist", + "permissions": [] + } + } +]
\ No newline at end of file diff --git a/webapp/sociologist/middlewares/__init__.py b/webapp/sociologist/middlewares/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/webapp/sociologist/middlewares/__init__.py diff --git a/webapp/sociologist/middlewares/sociologist.py b/webapp/sociologist/middlewares/sociologist.py new file mode 100644 index 0000000..b9d3cf2 --- /dev/null +++ b/webapp/sociologist/middlewares/sociologist.py @@ -0,0 +1,38 @@ +from django.conf import settings + + +def path_start_with(query, path): + matched = False + try: + # check if the url is in the path + matched = path.index( + ('%s' if query[0] == '/' else '/%s') % query + ) == 0 + except ValueError: + pass + return matched + + +IGNORE_REQUEST_PATHS = ( + '/favicon.ico', + settings.STATIC_URL, + settings.MEDIA_URL, + '/admin/' +) + + +class SociologistMiddleware(object): + + def process_request(self, request): + + for ignore in IGNORE_REQUEST_PATHS: + if path_start_with(ignore, request.path): + return None + + user = request.user + is_sociologist = user.is_authenticated() and (user.groups.filter( + name='sociologist').exists() or user.is_superuser or user.is_staff) + + setattr(request.user, 'is_sociologist', is_sociologist) + + return None diff --git a/webapp/sociologist/models.py b/webapp/sociologist/models.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/webapp/sociologist/models.py diff --git a/webapp/sociologist/poll_urls.py b/webapp/sociologist/poll_urls.py new file mode 100644 index 0000000..628452b --- /dev/null +++ b/webapp/sociologist/poll_urls.py @@ -0,0 +1,23 @@ +from django.conf.urls.defaults import patterns, url + +from polls.views import * + + +urlpatterns = patterns( + '', + + # Poll CRUD + url(r'^$', PollListView.as_view(), name="poll_list"), + url(r'^add/$', PollFormView.as_view(), name="poll_add"), + url(r'^edit/(?P<id>[0-9A-Fa-f]{24})/$', + PollFormView.as_view(), name="poll_edit"), + + # Poll structure CRUD + url(r'^structure/(?P<poll_id>[0-9A-Fa-f]{24})/$', + StructureFormView.as_view(), name="structure.builder"), + url(r'^download/(?P<poll_id>[0-9A-Fa-f]{24})/$', + 'polls.views.download_poll', name="poll_download"), + + url(r'^option/thumb/(?P<poll_id>[0-9A-Fa-f]{24})/(?P<img_name>.*)/$', + 'polls.views.opt_thumb'), +) diff --git a/webapp/sociologist/pollster_urls.py b/webapp/sociologist/pollster_urls.py new file mode 100644 index 0000000..faccbf6 --- /dev/null +++ b/webapp/sociologist/pollster_urls.py @@ -0,0 +1,17 @@ +from django.conf.urls.defaults import patterns, url + +from pollster.views import * + + +urlpatterns = patterns( + '', + + # Pollster CRUD + url(r'^$', PollsterListView.as_view(), name="pollster_list"), + url(r'^new/$', PollsterFormView.as_view(), name="pollster_new"), + url( + r'^poll_assignment/(?P<id>[0-9A-Fa-f]{24})/$', + PollAsignationFormView.as_view(), + name="poll_assignment" + ), +) diff --git a/webapp/sociologist/tests/__init__.py b/webapp/sociologist/tests/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/webapp/sociologist/tests/__init__.py diff --git a/webapp/sociologist/tests/middleware_tests.py b/webapp/sociologist/tests/middleware_tests.py new file mode 100644 index 0000000..7c4b447 --- /dev/null +++ b/webapp/sociologist/tests/middleware_tests.py @@ -0,0 +1,67 @@ +from django.contrib.auth.models import Group, User + +from django.test.client import RequestFactory + +from utils.test import MongoTestCase + +from sociologist.middlewares.sociologist import SociologistMiddleware + + +class PollsterTests(MongoTestCase): + + def test_is_sociologist_when_is_superuser(self): + + user = User.objects.create_user(username="username") + user.is_superuser = True + + request = RequestFactory().get('/') + setattr(request, 'user', user) + + middleare = SociologistMiddleware() + + middleare.process_request(request) + + self.assertTrue(user.is_sociologist) + + def test_is_sociologist_when_is_in_sociologist_group(self): + + sociologist_group = Group.objects.get(name='sociologist') + user = User.objects.create_user(username="username") + + user.groups.add(sociologist_group) + + request = RequestFactory().get('/') + setattr(request, 'user', user) + + middleare = SociologistMiddleware() + + middleare.process_request(request) + + self.assertTrue(user.is_sociologist) + + def test_is_sociologist_when_is_staff(self): + + user = User.objects.create_user(username="username") + + user.is_staff = True + + request = RequestFactory().get('/') + setattr(request, 'user', user) + + middleare = SociologistMiddleware() + + middleare.process_request(request) + + self.assertTrue(user.is_sociologist) + + def test_is_not_sociologist(self): + user = User.objects.create_user(username="username") + + request = RequestFactory().get('/') + setattr(request, 'user', user) + + middleare = SociologistMiddleware() + + middleare.process_request(request) + + self.assertFalse(user.is_sociologist) diff --git a/webapp/sociologist/tests/sociologist_tests.py b/webapp/sociologist/tests/sociologist_tests.py new file mode 100644 index 0000000..40a471d --- /dev/null +++ b/webapp/sociologist/tests/sociologist_tests.py @@ -0,0 +1,15 @@ +from django.contrib.auth.models import Group + +from utils.test import MongoTestCase + + +class PollsterTests(MongoTestCase): + + def setUp(self): + self.sociologist_group = Group.objects.get(name='sociologist') + + def test_group(self): + sociologist_group = Group.objects.filter(name='sociologist') + + self.assertEqual(1, len(sociologist_group)) + self.assertEqual(sociologist_group[0].name, sociologist_group[0].name) diff --git a/webapp/sociologist/urls.py b/webapp/sociologist/urls.py new file mode 100644 index 0000000..fbc133a --- /dev/null +++ b/webapp/sociologist/urls.py @@ -0,0 +1,13 @@ +from django.conf.urls.defaults import patterns, url, include +from django.views.generic.base import RedirectView + +from pollster.views import * + + +urlpatterns = patterns('', + url(r'^$', RedirectView.as_view(url='polls/'), name="index"), + # Polls + url(r'^polls/', include('sociologist.poll_urls')), + # Pollsters + url(r'^pollsters/', include('sociologist.pollster_urls')), +) diff --git a/webapp/sociologist/views.py b/webapp/sociologist/views.py new file mode 100644 index 0000000..60f00ef --- /dev/null +++ b/webapp/sociologist/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/webapp/utils/decorators.py b/webapp/utils/decorators.py index f6726ad..1ac8f85 100644 --- a/webapp/utils/decorators.py +++ b/webapp/utils/decorators.py @@ -10,7 +10,8 @@ from django.contrib.auth.decorators import login_required __all__ = [ 'decorator_include', - 'user_account_required' + 'user_account_required', + 'superuser_required', ] diff --git a/webapp/webapp/settings.py b/webapp/webapp/settings.py index 2c4c88c..b79429e 100644 --- a/webapp/webapp/settings.py +++ b/webapp/webapp/settings.py @@ -93,12 +93,17 @@ TEMPLATE_LOADERS = ( ) MIDDLEWARE_CLASSES = ( + # Django middlewares 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', + + # Sociologist and Pollster user rol middlewares + 'sociologist.middlewares.sociologist.SociologistMiddleware', 'pollster.middlewares.pollster.PollsterMiddleware', + # Uncomment the next line for simple clickjacking protection: # 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) @@ -129,6 +134,7 @@ INSTALLED_APPS = ( # Project 'polls', 'pollster', + 'sociologist', 'custom_admin', 'accounts', 'utils', diff --git a/webapp/webapp/templates/admin/base_site.html b/webapp/webapp/templates/admin/base_site.html index 65696c0..5bd2b25 100644 --- a/webapp/webapp/templates/admin/base_site.html +++ b/webapp/webapp/templates/admin/base_site.html @@ -14,6 +14,6 @@ {% block nav-global %} <ul id="nav-global"> - <span><a href="{% url polls:list %}"><i class="icon-chevron-left icon-white"></i> Volver a encuestas.</a></span> + <span><a href="{% url sociologist:poll_list %}"><i class="icon-chevron-left icon-white"></i> Volver a encuestas.</a></span> </ul> {% endblock %} diff --git a/webapp/webapp/templates/base-main.html b/webapp/webapp/templates/base-main.html index 4306f9d..ba7d1ac 100644 --- a/webapp/webapp/templates/base-main.html +++ b/webapp/webapp/templates/base-main.html @@ -55,22 +55,22 @@ <div class="nav-collapse collapse"> <ul class="nav"> - {% if not user.is_pollster %} - {% url polls:list as polls_list_url %} - <li class="{% if request.path == polls_list_url %}active{% endif %}"> - <a href="{{ polls_list_url }}"><i class="icon-white icon-list-alt"></i> Listado de encuestas</a> + {% if user.is_sociologist %} + {% url sociologist:poll_list as poll_list_url %} + <li class="{% if request.path == poll_list_url %}active{% endif %}"> + <a href="{{ poll_list_url }}"><i class="icon-white icon-list-alt"></i> Listado de encuestas</a> </li> - {% url polls:add as polls_add_url %} - <li class="{% if request.path == polls_add_url %}active{% endif %}"> - <a href="{{ polls_add_url }}"><i class="icon-white icon-plus"></i> Nueva encuesta</a> + {% url sociologist:poll_add as poll_add_url %} + <li class="{% if request.path == poll_add_url %}active{% endif %}"> + <a href="{{ poll_add_url }}"><i class="icon-white icon-plus"></i> Nueva encuesta</a> </li> <li class="dropdown {% if 'pollsters' in request.path %}active{% endif %}"> <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="icon-white icon-group"></i> Encuestadores <b class="caret"></b></a> <ul class="dropdown-menu"> - <li><a href="{% url pollsters:list %}"><i class="icon-list-alt"></i> Listado/Asginación</a></li> - <li><a href="{% url pollsters:new %}"><i class="icon-plus"></i> Nuevo</a></li> + <li><a href="{% url sociologist:pollster_list %}"><i class="icon-list-alt"></i> Listado/Asginación</a></li> + <li><a href="{% url sociologist:pollster_new %}"><i class="icon-plus"></i> Nuevo</a></li> </ul> </li> {% endif %} @@ -81,7 +81,7 @@ <a href="{{ assigned_polls_url }}"><i class="icon-list"></i> Mis encuestas</a> </li> - {% url polls:upload_result as upload_result_url %} + {% url pollsters:upload_result as upload_result_url %} <li class="{% if request.path == upload_result_url %}active{% endif %}"> <a href="{{ upload_result_url }}"><i class="icon-white icon-upload"></i> Subir resultado</a> </li> diff --git a/webapp/webapp/urls.py b/webapp/webapp/urls.py index dddeae0..a7ca1d3 100644 --- a/webapp/webapp/urls.py +++ b/webapp/webapp/urls.py @@ -1,20 +1,22 @@ import os from django.conf.urls.defaults import patterns, include, url -from django.views.generic.base import RedirectView from django.conf import settings from utils.decorators import * +from sociologist.decorators import sociologist_required +from pollster.decorators import pollster_required urlpatterns = patterns('', - url(r'^admin/', include('custom_admin.urls')), url(r'^accounts/', include('accounts.urls', namespace="accounts")), + url(r'^admin/', decorator_include(superuser_required, 'custom_admin.urls')), + url(r'^manager/', decorator_include( + sociologist_required, 'sociologist.urls', namespace="sociologist")), url(r'^polls/', decorator_include( - user_account_required, 'polls.urls', namespace="polls")), - url(r'^$', RedirectView.as_view(url='polls/')), - url(r'^pollsters/', decorator_include( - user_account_required, 'pollster.urls', namespace="pollsters")), + pollster_required, 'pollster.urls', namespace="pollsters")), + + url(r'^$', 'webapp.views.roles_redirection', name="index"), ) if settings.DEBUG: diff --git a/webapp/webapp/views.py b/webapp/webapp/views.py new file mode 100644 index 0000000..dc80291 --- /dev/null +++ b/webapp/webapp/views.py @@ -0,0 +1,16 @@ +from django.http import HttpResponseRedirect, Http404 +from django.core.urlresolvers import reverse + +from utils.decorators import * + + +@user_account_required +def roles_redirection(request): + + if request.user.is_pollster: + return HttpResponseRedirect(reverse('pollsters:index')) + + if request.user.is_sociologist: + return HttpResponseRedirect(reverse('sociologist:index')) + + raise Http404() |