예제 #1
0
    def test_routing(self):
        routed_view = route(GET=string_view, POST=dict_view)

        self.assertEqual("Hello World", routed_view(self.get_req))
        self.assertEqual({"Hello": "World"}, routed_view(self.post_req))

        with self.assertRaises(Http404):
            routed_view(self.put_req)
예제 #2
0
    def test_routing(self):
        routed_view = route(GET=string_view, POST=dict_view)

        self.assertEqual("Hello World", routed_view(self.get_req))
        self.assertEqual({"Hello": "World"}, routed_view(self.post_req))

        with self.assertRaises(Http404):
            routed_view(self.put_req)
예제 #3
0
# -*- coding: utf-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import division

from django_tinsel.decorators import json_api_call, route
from django_tinsel.utils import decorate as do

from treemap.decorators import instance_request

from stormwater import views

polygon_for_point = route(
    GET=do(instance_request, json_api_call, views.polygon_for_point))
예제 #4
0
logged_in_api_do = partial(do, csrf_exempt, set_api_version,
                           check_signature_and_require_login, json_api_call)

plots_closest_to_point_endpoint = instance_api_do(plots_closest_to_point)

instances_closest_to_point_endpoint = api_do(instances_closest_to_point)

public_instances_endpoint = api_do(public_instances)

instance_info_endpoint = instance_api_do(transform_instance_info_response,
                                         instance_info)

plots_endpoint = instance_api_do(
    route(GET=get_plot_list,
          POST=do(login_required, creates_instance_user,
                  transform_plot_update_dict, return_400_if_validation_errors,
                  update_or_create_plot)))

plot_endpoint = instance_api_do(
    route(GET=get_plot,
          ELSE=do(
              login_required, creates_instance_user,
              route(PUT=do(return_400_if_validation_errors,
                           update_or_create_plot),
                    DELETE=remove_plot))))

species_list_endpoint = instance_api_do(route(GET=species_list))

user_endpoint = api_do(
    route(GET=do(login_required, transform_user_response, user_info),
          POST=do(transform_user_request, return_400_if_validation_errors,
예제 #5
0
파일: routes.py 프로젝트: strk/nyc-trees
# -*- coding: utf-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import division

from django_tinsel.decorators import route, render_template
from django_tinsel.utils import decorate as do

from apps.home import views as v
from apps.core.decorators import individual_mapper_do


home_page = route(GET=do(render_template('home/home.html'),
                         v.home_page))

about_faq_page = route(GET=do(render_template('home/about_faq.html'),
                              v.about_faq_page))

retrieve_job_status = do(v.retrieve_job_status)

individual_mapper_instructions = individual_mapper_do(
    render_template('home/individual_mapper_instructions.html'),
    v.individual_mapper_instructions)

trusted_mapper_request_sent = individual_mapper_do(
    render_template('home/trusted_mapper_request_sent.html'),
    v.trusted_mapper_request_sent)
예제 #6
0
파일: urls.py 프로젝트: johnsonc/OTM2
# For "top level" URLs defined here, see treemap/tests/urls.py (RootUrlTests)

urlpatterns = patterns(
    '',
    (r'^robots.txt$', RedirectView.as_view(
        url='/static/robots.txt', permanent=True)),
    # Setting permanent=False in case we want to allow customizing favicons
    # per instance in the future
    (r'^favicon\.png$', RedirectView.as_view(
        url='/static/img/favicon.png', permanent=False)),
    url('^comments/', include('django.contrib.comments.urls')),
    url(r'^', include('geocode.urls')),
    url(r'^$', landing_view),
    url(r'^config/settings.js$', root_settings_js_view),
    url(r'^users/%s/$' % USERNAME_PATTERN,
        route(GET=user_view, PUT=update_user_view), name='user'),
    url(r'^users/%s/edits/$' % USERNAME_PATTERN,
        user_audits_view, name='user_audits'),
    url(r'^users/%s/photo/$' % USERNAME_PATTERN,
        upload_user_photo_view, name='user_photo'),
    url(r'^api/v(?P<version>\d+)/', include('api.urls')),
    # The profile view is handled specially by redirecting to
    # the page of the currently logged in user
    url(r'^accounts/profile/$', profile_to_user_view, name='profile'),
    url(r'^accounts/logout/$', 'django.contrib.auth.views.logout',
        {'next_page': '/'}),
    url(r'^accounts/forgot-username/$', forgot_username_view,
        name='forgot_username'),
    url(r'^accounts/', include('registration_backend.urls')),
    # Create a redirect view for setting the session language preference
    # https://docs.djangoproject.com/en/1.0/topics/i18n/#the-set-language-redirect-view  # NOQA
예제 #7
0
    misc_views.species_list)

compile_scss = do(
    require_http_method("GET"),
    string_to_response("text/css"),
    misc_views.compile_scss)

#####################################
# mapfeature
#####################################

add_map_feature = do(
    instance_request,
    route(
        GET=feature_views.render_map_feature_add,
        POST=do(
            json_api_edit,
            return_400_if_validation_errors,
            feature_views.add_map_feature)))

map_feature_detail = do(
    instance_request,
    route(
        GET=feature_views.render_map_feature_detail,
        ELSE=do(
            json_api_edit,
            return_400_if_validation_errors,
            route(
                PUT=feature_views.update_map_feature_detail,
                DELETE=feature_views.delete_map_feature))))

map_feature_accordion = do(
예제 #8
0
파일: views.py 프로젝트: gnowledge/OTM2
plots_closest_to_point_endpoint = instance_api_do(plots_closest_to_point)

instances_closest_to_point_endpoint = api_do(
    instances_closest_to_point)

public_instances_endpoint = api_do(public_instances)

instance_info_endpoint = instance_api_do(
    transform_instance_info_response,
    instance_info)

plots_endpoint = instance_api_do(
    route(GET=get_plot_list,
          POST=do(
              login_required,
              creates_instance_user,
              update_or_create_plot)))


plot_endpoint = instance_api_do(
    route(GET=get_plot,
          ELSE=do(login_required,
                  creates_instance_user,
                  route(
                      PUT=update_or_create_plot,
                      DELETE=remove_plot))))

species_list_endpoint = instance_api_do(
    route(GET=species_list))
예제 #9
0
파일: routes.py 프로젝트: azavea/nyc-trees
from django_tinsel.utils import decorate as do

from apps.users.views.group import group_list_page

from apps.core.decorators import user_must_have_online_training

from apps.home.training.decorators import render_flatpage

from apps.home.training import views as v

from apps.home.training.decorators import mark_user


groups_to_follow = route(
    GET=do(login_required,
           user_must_have_online_training,
           mark_user('training_finished_groups_to_follow'),
           render_template('home/groups_to_follow.html'),
           group_list_page))


training_list_page = route(GET=do(render_template('home/training.html'),
                                  v.training_list_page))

intro_quiz = do(login_required,
                route(GET=do(render_template('home/quiz_page.html'),
                             v.intro_quiz),
                      POST=do(render_template('home/quiz_complete_page.html'),
                              v.complete_quiz)))

training_instructions = route(GET=do(
    render_template('home/training_instructions.html'),
예제 #10
0
# For "top level" URLs defined here, see treemap/tests/urls.py (RootUrlTests)

urlpatterns = patterns(
    '',
    (r'^robots.txt$',
     RedirectView.as_view(url='/static/robots.txt', permanent=True)),
    # Setting permanent=False in case we want to allow customizing favicons
    # per instance in the future
    (r'^favicon\.png$',
     RedirectView.as_view(url='/static/img/favicon.png', permanent=False)),
    url('^comments/', include('django.contrib.comments.urls')),
    url(r'^', include('geocode.urls')),
    url(r'^$', landing_view),
    url(r'^config/settings.js$', root_settings_js_view),
    url(r'^users/%s/$' % USERNAME_PATTERN,
        route(GET=user_view, PUT=update_user_view),
        name='user'),
    url(r'^users/%s/edits/$' % USERNAME_PATTERN,
        user_audits_view,
        name='user_audits'),
    url(r'^users/%s/photo/$' % USERNAME_PATTERN,
        upload_user_photo_view,
        name='user_photo'),
    url(r'^api/v(?P<version>\d+)/', include('api.urls')),
    # The profile view is handled specially by redirecting to
    # the page of the currently logged in user
    url(r'^accounts/profile/$', profile_to_user_view, name='profile'),
    url(r'^accounts/logout/$', 'django.contrib.auth.views.logout',
        {'next_page': '/'}),
    url(r'^accounts/forgot-username/$',
        forgot_username_view,
예제 #11
0
from importer.views import list_imports
from manage_treemap.views import update_instance_fields_with_validator
from manage_treemap.views.roles import roles_list, roles_update, roles_create
from manage_treemap.views.udf import (udf_bulk_update, udf_create, udf_list,
                                      udf_delete_popup, udf_delete,
                                      udf_update_choice,
                                      remove_udf_notifications)
from manage_treemap.views.user_roles import (user_roles_list,
                                             update_user_roles,
                                             create_user_role,
                                             remove_invited_user_from_instance)
from treemap.decorators import (require_http_method, admin_instance_request,
                                return_400_if_validation_errors,
                                requires_feature)

admin_route = lambda **kwargs: admin_instance_request(route(**kwargs))

json_do = partial(do, json_api_call, return_400_if_validation_errors)

management = do(require_http_method('GET'), views.management_root)

admin_counts = admin_route(GET=do(json_api_call, views.admin_counts))

site_config = admin_route(GET=do(render_template('manage_treemap/basic.html'),
                                 views.site_config_basic_info),
                          PUT=json_do(update_instance_fields_with_validator,
                                      views.site_config_validator))

external_link = admin_route(GET=do(render_template('manage_treemap/link.html'),
                                   views.external_link),
                            PUT=json_do(views.update_external_link))
예제 #12
0
from exporter.views import begin_export_users
from importer.views import list_imports
from manage_treemap.views import update_instance_fields_with_validator
from manage_treemap.views.roles import roles_list, roles_update, roles_create
from manage_treemap.views.udf import (udf_bulk_update, udf_create, udf_list,
                                      udf_delete_popup, udf_delete,
                                      udf_update_choice,
                                      remove_udf_notifications)
from manage_treemap.views.user_roles import (
    user_roles_list, update_user_roles, create_user_role,
    remove_invited_user_from_instance)
from treemap.decorators import (require_http_method, admin_instance_request,
                                return_400_if_validation_errors)

admin_route = lambda **kwargs: admin_instance_request(route(**kwargs))

json_do = partial(do, json_api_call, return_400_if_validation_errors)

management = do(
    require_http_method('GET'),
    views.management_root)

admin_counts = admin_route(
    GET=do(json_api_call, views.admin_counts)
)

site_config = admin_route(
    GET=do(render_template('manage_treemap/basic.html'),
           views.site_config_basic_info),
    PUT=json_do(update_instance_fields_with_validator,
예제 #13
0
    def test_else(self):
        routed_view = route(GET=string_view, ELSE=dict_view)

        self.assertEqual("Hello World", routed_view(self.get_req))
        self.assertEqual({"Hello": "World"}, routed_view(self.post_req))
        self.assertEqual({"Hello": "World"}, routed_view(self.put_req))
예제 #14
0
# -*- coding: utf-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import division

from django_tinsel.decorators import json_api_call, route
from django_tinsel.utils import decorate as do

from treemap.decorators import instance_request

from stormwater import views


polygon_for_point = route(GET=do(
    instance_request, json_api_call, views.polygon_for_point))
예제 #15
0
파일: __init__.py 프로젝트: gapb/OTM2
boundary_autocomplete_view = do(json_api_call, instance_request,
                                boundary_autocomplete)

species_list_view = do(json_api_call, instance_request, species_list)

scss_view = do(require_http_method("GET"), string_to_response("text/css"),
               compile_scss)

#####################################
# mapfeature
#####################################

map_feature_add_view = do(
    instance_request,
    route(GET=render_map_feature_add,
          POST=do(json_api_edit, return_400_if_validation_errors,
                  add_map_feature)))

map_feature_detail_view = do(
    instance_request,
    route(GET=render_map_feature_detail,
          ELSE=do(
              json_api_edit, return_400_if_validation_errors,
              route(PUT=update_map_feature_detail,
                    DELETE=delete_map_feature))))

map_feature_accordion_view = do(
    instance_request,
    render_template('treemap/partials/map_feature_accordion.html'),
    map_feature_detail)
예제 #16
0
run_model_view = do(
    login_or_401,
    json_api_call,
    modeling_instance_request,
    run_model)


plan_view = do(
    login_or_401,
    modeling_instance_request,
    route(
        GET=do(json_api_call, get_plan),
        PUT=do(
            json_api_edit,
            return_400_if_validation_errors,
            update_plan),
        DELETE=do(
            render_template('modeling/partials/plans/plans.html'),
            delete_plan)))


plans_view = do(
    login_or_401,
    modeling_instance_request,
    route(
        GET=do(
            render_template('modeling/partials/plans/plans.html'),
            get_plans_context),
        POST=do(json_api_edit,
                return_400_if_validation_errors,
예제 #17
0
파일: routes.py 프로젝트: azavea/nyc-trees
from django.contrib.auth.decorators import login_required

from django_tinsel.decorators import route, render_template, json_api_call

from django_tinsel.utils import decorate as do

from apps.core.decorators import (user_must_have_online_training,
                                  group_request, group_admin_do)
from apps.event import views as v

#####################################
# EVENT ROUTES
#####################################

events_list_page = route(
    GET=do(
        render_template('event/event_list_page.html'),
        v.events_list_page))

events_list_feed = route(GET=do(json_api_call, v.events_list_feed))

future_events_geojson = route(GET=do(json_api_call, v.future_events_geojson))

#####################################
# GROUP ROUTES
#####################################

add_event = group_admin_do(render_template('event/add_event.html'),
                           route(GET=v.add_event_page,
                                 POST=v.add_event))

event_detail = do(group_request,
예제 #18
0
파일: routes.py 프로젝트: azavea/nyc-trees
def make_flatpage_route(name):
    return route(GET=do(
        login_required,
        render_flatpage('/%s/' % name)))
예제 #19
0
    def test_else(self):
        routed_view = route(GET=string_view, ELSE=dict_view)

        self.assertEqual("Hello World", routed_view(self.get_req))
        self.assertEqual({"Hello": "World"}, routed_view(self.post_req))
        self.assertEqual({"Hello": "World"}, routed_view(self.put_req))
예제 #20
0
파일: urls.py 프로젝트: gapb/OTM2
    url('^features/(?P<feature_id>\d+)/photo/(?P<photo_id>\d+)/'
        '(?P<action>(approve)|(reject))$',
        approve_or_reject_photo_view, name='approve_or_reject_photo'),
    url(r'^species/$', species_list_view, name="species_list_view"),
    url(r'^map/$', map_view, name='map'),

    url(r'^features/(?P<feature_id>\d+)/$',
        map_feature_detail_view, name='map_feature_detail'),
    url(r'^features/(?P<type>\w+)/$',
        map_feature_add_view, name='add_map_feature'),
    url(r'^features/(?P<feature_id>\d+)/(?P<edit>edit)$',
        edit_plot_detail_view, name='map_feature_detail_edit'),
    url(r'^features/(?P<feature_id>\d+)/popup$',
        map_feature_popup_view, name='map_feature_popup'),
    url(r'^features/(?P<feature_id>\d+)/trees/(?P<tree_id>\d+)/$',
        route(DELETE=delete_tree_view)),
    url(r'^features/(?P<feature_id>\d+)/sidebar$',
        get_map_feature_sidebar_view, name='map_feature_sidebar'),
    url(r'^features/(?P<feature_id>\d+)/photo$',
        add_map_feature_photo_endpoint, name='add_photo_to_map_feature'),
    url(r'^features/(?P<feature_id>\d+)/detail$',
        map_feature_accordion_view, name='map_feature_accordion'),
    url('^features/(?P<feature_id>\d+)/photo/(?P<photo_id>\d+)$',
        rotate_map_feature_photo_endpoint, name='rotate_photo'),

    url(r'^plots/$', route(POST=map_feature_add_view), name='add_plot'),
    url(r'^plots/(?P<feature_id>\d+)/eco$',
        get_plot_eco_view, name='plot_eco'),
    url(r'^plots/(?P<feature_id>\d+)/trees/(?P<tree_id>\d+)/eco$',
        get_plot_eco_view, name='tree_eco'),
    url(r'^plots/(?P<feature_id>\d+)/trees/(?P<tree_id>\d+)/$',
예제 #21
0
파일: routes.py 프로젝트: azavea/nyc-trees
from apps.login import views as v
from apps.login.backends import NycRegistrationView


#####################################
# ACCOUNTS ROUTES
#####################################

logout = do(v.logout)
password_reset = do(v.password_reset)

activation_complete = do(
    login_required,
    render_template('registration/activation_complete.html'),
    route(GET=v.activation_complete,
          POST=v.save_optional_info))

register = NycRegistrationView.as_view()

password_reset_impossible = route(
    GET=render_template('login/password_reset_impossible.html')())

#####################################
# LOGIN ROUTES
#####################################

forgot_username = do(
    render_template('login/forgot_username.html'),
    route(GET=v.forgot_username_page, POST=v.forgot_username))

forgot_username_sent = do(
예제 #22
0
파일: routes.py 프로젝트: strk/nyc-trees
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import last_modified

from django_tinsel.decorators import route, render_template, json_api_call
from django_tinsel.utils import decorate as do

from apps.core.decorators import (individual_mapper_do, group_request,
                                  census_admin_do, update_with)
from apps.survey import views as v
from apps.survey.layer_context import get_group_territory_modification_time

#####################################
# PROGRESS PAGE ROUTES
#####################################

progress_page = route(GET=do(render_template('survey/progress.html'),
                             v.progress_page))

progress_page_blockface_popup = route(
    GET=do(
        render_template('survey/partials/progress_page_blockface_popup.html'),
        v.progress_page_blockface_popup))

group_borders_geojson = do(
    last_modified(get_group_territory_modification_time),
    route(GET=json_api_call(v.group_borders_geojson)))

group_popup = route(GET=do(group_request,
                           render_template('survey/partials/group_popup.html'),
                           v.group_popup))

#####################################
예제 #23
0
파일: routes.py 프로젝트: azavea/nyc-trees
# -*- coding: utf-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import division

from django_tinsel.decorators import route, render_template

from apps.core.decorators import census_admin_do

from apps.census_admin import views as v


upload_group_polygons = census_admin_do(
    render_template('census_admin/upload_group_polygons.html'),
    route(GET=lambda x: {},
          POST=v.upload_group_polygons))
예제 #24
0
    url(r'^user/(?P<user_id>\d+)/photo$', update_profile_photo_endpoint,
        name='update_user_photo'),
    url(r'^user/(?P<user_id>\d+)/edits$', edits),

    url(r'^send-password-reset-email$', reset_password_endpoint),

    url('^locations/' + lat_lon_pattern + '/instances',
        instances_closest_to_point_endpoint),

    url('^instances', public_instances_endpoint),

    url(instance_pattern + r'/plots/(?P<plot_id>\d+)/tree/photo$',
        add_photo_endpoint),

    url(instance_pattern + r'/plots/(?P<plot_id>\d+)/tree$',
        route(DELETE=remove_current_tree_from_plot)),

    url(instance_pattern + r'/pending-edits/(?P<pending_edit_id>\d+)/approve',
        route(POST=approve_pending_edit)),

    url(instance_pattern + r'/pending-edits/(?P<pending_edit_id>\d+)/reject',
        route(POST=reject_pending_edit)),

    # OTM2/instance endpoints
    url(instance_pattern + '$', instance_info_endpoint),
    url(instance_pattern + '/species$', species_list_endpoint),
    url(instance_pattern + r'/plots$', plots_endpoint),
    url(instance_pattern + r'/plots/(?P<plot_id>\d+)$',
        plot_endpoint),
    url(instance_pattern + r'/locations/' + lat_lon_pattern + '/plots',
        plots_closest_to_point_endpoint),
예제 #25
0
파일: routes.py 프로젝트: strk/nyc-trees
from apps.login import views as v
from apps.login.backends import NycRegistrationView


#####################################
# ACCOUNTS ROUTES
#####################################

logout = do(v.logout)
password_reset = do(v.password_reset)

activation_complete = do(
    login_required,
    render_template('registration/activation_complete.html'),
    route(GET=v.activation_complete,
          POST=v.save_optional_info))

register = NycRegistrationView.as_view()

#####################################
# LOGIN ROUTES
#####################################

forgot_username = do(
    render_template('login/forgot_username.html'),
    route(GET=v.forgot_username_page, POST=v.forgot_username))

forgot_username_sent = do(
    render_template('login/forgot_username_complete.html'),
    v.forgot_username_sent)
예제 #26
0
파일: group.py 프로젝트: azavea/nyc-trees
from __future__ import division

from django.contrib.auth.decorators import login_required

from django_tinsel.decorators import route, render_template, json_api_call
from django_tinsel.utils import decorate as do

from apps.core.decorators import group_request, group_admin_do, census_admin_do

from apps.users.views import group as v


render_follow_detail = render_template('groups/partials/follow_detail.html')


group_list_page = route(GET=do(render_template('groups/list.html'),
                               v.group_list_page))

group_detail = route(GET=do(group_request,
                            render_template('groups/detail.html'),
                            v.group_detail))

group_edit = group_admin_do(render_template('groups/settings.html'),
                            route(GET=v.edit_group,
                                  POST=v.update_group_settings))

follow_group = do(
    login_required,
    group_request,
    route(GET=v.redirect_to_group_detail,
          POST=do(render_follow_detail, v.follow_group)))
예제 #27
0
파일: urls.py 프로젝트: lorenanicole/OTM2
    (r'^$', status_view),
    (r'^version$', version_view),
    url(r'^user$', user_endpoint, name='user_info'),
    url(r'^user/(?P<user_id>\d+)$', update_user_endpoint, name='update_user'),
    url(r'^user/(?P<user_id>\d+)/photo$',
        update_profile_photo_endpoint,
        name='update_user_photo'),
    (r'^user/(?P<user_id>\d+)/edits$', edits),
    (r'^send-password-reset-email$', reset_password_endpoint),
    ('^locations/' + lat_lon_pattern + '/instances',
     instances_closest_to_point_endpoint),
    ('^instances', public_instances_endpoint),
    (instance_pattern + r'/plots/(?P<plot_id>\d+)/tree/photo$',
     add_photo_endpoint),
    (instance_pattern + r'/plots/(?P<plot_id>\d+)/tree$',
     route(DELETE=remove_current_tree_from_plot)),
    (instance_pattern + r'/pending-edits/(?P<pending_edit_id>\d+)/approve',
     route(POST=approve_pending_edit)),
    (instance_pattern + r'/pending-edits/(?P<pending_edit_id>\d+)/reject',
     route(POST=reject_pending_edit)),

    # OTM2/instance endpoints
    (instance_pattern + '$', instance_info_endpoint),
    (instance_pattern + '/species$', species_list_endpoint),
    (instance_pattern + r'/plots$', plots_endpoint),
    (instance_pattern + r'/plots/(?P<plot_id>\d+)$', plot_endpoint),
    (instance_pattern + r'/locations/' + lat_lon_pattern + '/plots',
     plots_closest_to_point_endpoint),
    url(instance_pattern + r'/users.csv',
        export_users_csv_endpoint,
        name='user_csv'),
예제 #28
0
boundary_autocomplete = do(json_api_call, instance_request,
                           misc_views.boundary_autocomplete)

species_list = do(json_api_call, instance_request, misc_views.species_list)

compile_scss = do(require_http_method("GET"), string_to_response("text/css"),
                  misc_views.compile_scss)

#####################################
# mapfeature
#####################################

add_map_feature = do(
    instance_request,
    route(GET=feature_views.render_map_feature_add,
          POST=do(json_api_edit, return_400_if_validation_errors,
                  feature_views.add_map_feature)))

map_feature_detail = do(
    instance_request,
    route(GET=feature_views.render_map_feature_detail,
          ELSE=do(
              json_api_edit, return_400_if_validation_errors,
              route(PUT=feature_views.update_map_feature_detail,
                    DELETE=feature_views.delete_map_feature))))

map_feature_accordion = do(
    instance_request,
    render_template('treemap/partials/map_feature_accordion.html'),
    feature_views.context_map_feature_detail)
예제 #29
0
파일: user.py 프로젝트: strk/nyc-trees
from django.contrib.auth.decorators import login_required

from django_tinsel.decorators import route, render_template
from django_tinsel.utils import decorate as do

from apps.users.views import user as v
from apps.core.decorators import (user_must_have_field_training,
                                  user_must_have_online_training)


render_user_template = render_template('users/profile.html')
render_settings_template = render_template('users/settings.html')

user_detail_redirect = do(login_required,
                          route(GET=v.user_detail_redirect))

user_profile_settings = do(
    login_required,
    render_settings_template,
    route(GET=v.profile_settings,
          POST=v.update_profile_settings))

achievements = do(route(GET=do(render_template('users/achievement.html'),
                               v.achievements_page)))

user_detail = route(
    GET=do(render_user_template, v.user_detail),
    POST=do(login_required, render_user_template, v.set_privacy))

request_individual_mapper_status = do(