Example #1
0
def profile_directory_path(request=None):
    """
    Returns the path to the directory containing the profiles
    """
    try:
        profiles_dir = request.registry.settings['lmkp.profiles_dir']
    except KeyError:
        raise Exception(
            'No profile directory specified! There is no profile directory '
            '(lmkp.profiles_dir) specified in the application''s .ini file!')

    prefix = get_customization_name(request=request)

    # Check if such a folder exists
    profiles_path = os.path.join(
        os.path.dirname(__file__), 'customization', prefix, 'profiles',
        profiles_dir)
    if not os.path.exists(profiles_path):
        raise Exception(
            'Profile directory not found! The folder for the profile (%s) is '
            'not found. Make sure it is situated at '
            'lmkp/customization/%s/profiles/%s.' % (profiles_dir, prefix,
            profiles_dir))

    return profiles_path
Example #2
0
def locale_profile_directory_path(request):
    """
    Returns the absolute path to the profile .yaml file, based on params
    _PROFILE_ or cookie _PROFILE_
    """

    profiles_dir = request.registry.settings['lmkp.profiles_dir']
    prefix = get_customization_name(request=request)

    profiles_path = os.path.join(
        os.path.dirname(__file__), 'customization', prefix, 'profiles',
        profiles_dir)

    if '_PROFILE_' in request.params:
        p = os.path.join(profiles_path, request.params['_PROFILE_'])
        if os.path.exists(p):
            return p
    elif '_PROFILE_' in request.cookies:
        p = os.path.join(profiles_path, request.cookies['_PROFILE_'])
        if os.path.exists(p):
            return p

    return profiles_path
Example #3
0
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """

    # Used when called through Tests
    if "settings" in settings:
        settings = settings["settings"]

    engine = engine_from_config(settings, "sqlalchemy.")
    DBSession.configure(bind=engine)

    # Transform the list of valid file mime extensions from the ini file into a
    # python dict.
    # http://pyramid.readthedocs.org/en/latest/narr/environment.html#adding-a-
    # custom-setting
    file_mime_extensions = {}
    for fme in aslist(settings.get("lmkp.file_mime_extensions", {}), False):
        fme_entry = fme.split(" ")
        if len(fme_entry) != 2:
            continue
        file_mime_extensions[fme_entry[0]] = fme_entry[1]
    settings["lmkp.file_mime_extensions"] = file_mime_extensions

    _update_admin_user(DBSession, settings)

    # Customization: Determine the name of the customization
    customization = get_customization_name(settings=settings)

    # Authentication policy
    authnPolicy = CustomAuthenticationPolicy("9ZbfPv Ez-eV8LeTJVNjUhQf FXWBBi_cWKn2fqnpz3PA", callback=group_finder)
    # Authorization policy
    authzPolicy = ACLAuthorizationPolicy()

    session_factory = session_factory_from_settings(settings)

    config = Configurator(
        settings=settings, root_factory="lmkp.models.rootfactory.RootFactory", session_factory=session_factory
    )
    config.set_authentication_policy(authnPolicy)
    config.set_authorization_policy(authzPolicy)

    config.include("pyramid_beaker")

    config.include("pyramid_mako")
    config.include("pyramid_chameleon")

    # Add the directories that include the translations, also include the
    # translation directory for the customization
    config.add_translation_dirs("lmkp:locale/", "colander:locale/", "deform:locale/")
    if customization is not None:
        config.add_translation_dirs("customization/%s/locale/" % customization)

    # Add event subscribers
    config.add_subscriber(add_renderer_globals, BeforeRender)
    config.add_subscriber(add_localizer, NewRequest)

    config.add_subscriber(add_user, NewRequest)

    config.include("pyramid_mailer")

    # Add papyrus includes
    config.include(papyrus.includeme)
    config.include("pyramid_handlers")

    # Renderers
    config.add_renderer("geojson", GeoJsonRenderer())
    config.add_renderer("csv", CSVRenderer())
    config.add_renderer("json", JsonRenderer())
    config.add_renderer("javascript", JavaScriptRenderer())

    # Static views
    config.add_static_view("static", "static", cache_max_age=3600)
    config.add_static_view("formstatic", "deform:static")

    # Customization: Add the static customization folder as view
    if customization is not None:
        config.add_static_view("custom", "customization/%s/static" % customization, cache_max_age=3600)

    # Main views
    config.add_route("index", "/")
    config.add_route("administration", "/administration")
    config.add_route("map_view", "/map")
    config.add_route("grid_view", "/grid")
    config.add_route("about_view", "/about")
    config.add_route("faq_view", "/faq")
    config.add_route("showcases_view", "/showcases")
    config.add_route("partners_view", "/partners")

    # Login / Logout
    config.add_route("login", "/login", request_method="POST")
    config.add_route("login_json", "/login/json", request_method="POST")
    config.add_route("login_form", "/login", request_method="GET")
    config.add_route("reset", "/reset", request_method="POST")
    config.add_route("reset_form", "/reset", request_method="GET")
    config.add_route("logout", "/logout")

    # Translation
    config.add_route("yaml_translate_activities", "/config/scan/activities")
    config.add_route("yaml_add_activity_fields", "/config/add/activities")
    config.add_route("yaml_translate_stakeholders", "/config/scan/stakeholders")
    config.add_route("yaml_add_stakeholder_fields", "/config/add/stakeholders")

    # Configuration
    config.add_route("config", "/config/form/{parameter}")
    config.add_route("config_geomtaggroups", "/config/geometrytaggroups")

    # Profiles
    config.add_route("profile_cambodia", "/cambodia")
    config.add_route("profile_laos", "/laos")
    config.add_route("profile_peru", "/peru")
    config.add_route("profile_madagascar", "/madagascar")
    config.add_route("profile_myanmar", "/myanmar")
    config.add_route("profile_global", "/global")

    # Evaluation
    config.add_route("evaluation", "/evaluation", request_method="POST")

    # Charts
    config.add_route("charts_view", "/charts")
    config.add_route("charts_overview", "/charts/overview")
    config.add_route("charts_no_slash", "/charts/{type}*params")
    config.add_route("charts", "/charts/{type}/*params")

    """
    Activities
    """
    # Activities controllers with an api once similar to Papyrus
    # Order matters!

    # Creates a new activity
    config.add_route("activities_create", "/activities", request_method="POST")

    # Reviews a pending activity
    config.add_route("activities_review", "/activities/review", request_method="POST")

    # Read one (special cases)
    config.add_route("activities_read_one_active", "/activities/active/{output}/{uid}")
    config.add_route("activities_read_one_public", "/activities/public/{output}/{uid}")

    # By Stakeholder
    config.add_route("activities_bystakeholders", "/activities/bystakeholders/{output}/{uids}")
    config.add_route("activities_bystakeholders_public", "/activities/bystakeholders/public/{output}/{uids}")

    # Read many
    config.add_route("activities_public_read_many", "/activities/public/{output}")
    config.add_route("activities_read_many", "/activities/{output}")

    # Read one
    config.add_route("activities_read_one", "/activities/{output}/{uid}")

    # Read one history
    config.add_route("activities_read_one_history", "/activities/history/{output}/{uid}")

    """
    Stakeholders
    """
    # Stakeholders controllers, similar as Activities above
    # Order matters!

    # Creates a new stakeholder
    config.add_route("stakeholders_create", "/stakeholders", request_method="POST")

    # Reviews a pending stakeholder
    config.add_route("stakeholders_review", "/stakeholders/review", request_method="POST")

    # Read one (special cases)
    config.add_route("stakeholders_read_one_active", "/stakeholders/active/{output}/{uid}")
    config.add_route("stakeholders_read_one_public", "/stakeholders/public/{output}/{uid}")

    # By Activities
    config.add_route("stakeholders_byactivities_all", "/stakeholders/byactivities/{output}")
    config.add_route("stakeholders_byactivities_all_public", "/stakeholders/byactivities/public/{output}")
    config.add_route("stakeholders_byactivities", "/stakeholders/byactivities/{output}/{uids}")
    config.add_route("stakeholders_byactivities_public", "/stakeholders/byactivities/public/{output}/{uids}")

    # Read many
    config.add_route("stakeholders_read_many", "/stakeholders/{output}")
    config.add_route("stakeholders_read_many_public", "/stakeholders/public/{output}")

    # Read one
    config.add_route("stakeholders_read_one", "/stakeholders/{output}/{uid}")

    # Read one history
    config.add_route("stakeholders_read_one_history", "/stakeholders/history/{output}/{uid}")

    """
    Comments
    """
    # Returns a JSON representation of comments to an object
    config.add_route("comments_sitekey", "/comments/sitekey/{uid}")
    config.add_route("comments_all", "/comments/{object}/{uid}")
    # Adds a comment
    config.add_route("comment_add", "/comments/add")
    # Deletes a comment
    config.add_route("comment_delete", "/comments/delete")

    """
    Moderation
    """
    # Moderation overview
    config.add_route("moderation_html", "/moderation")

    """
    Files
    """
    # Embedded form to upload a file
    config.add_route("file_upload_form_embedded", "/files/form")
    config.add_route("file_upload_json_response", "/files/form/json", request_method="POST")
    # Show or download a file
    config.add_route("file_view", "/files/{action}/{identifier}")

    """
    Download
    """
    config.add_route("download", "/download")

    """
    Translation
    """
    # A controller that returns the translation needed in the ExtJS user
    # interface
    config.add_route("ui_translation", "/lang")
    # Return a json with all available languages from DB
    config.add_route("language_store", "/lang/all")
    # Try to add or edit a translation
    config.add_route("edit_translation", "/lang/edit")
    # Scan the directory of translation files
    config.add_route("translation_files", "/translation/files")
    # Do a batch translation based on a file
    config.add_route("translation_batch", "/translation/batch")
    # Extract the translatable strings of the database
    config.add_route("extractDatabaseTranslation", "/translation/extract/{type}")

    config.add_route("context_layers", "/app/view/layers.js")
    # Return a json with all available profiles from disk
    config.add_route("profile_store", "/profiles/all")

    # An user profile page (maybe not needed anymore?)
    # [inserted ../profile/.. to link, otherwise could be conflicting with
    # some usernames ('update', 'json')]
    # A json representation of user information
    config.add_route("user_profile_json", "/users/json/{userid}")
    # Updates the information of a user
    config.add_route("user_update", "/users/update", request_method="POST")
    # Add a new user
    config.add_route("add_user", "/users/add", request_method="POST")

    config.add_route("user_self_registration", "/users/register")
    config.add_route("user_activation", "/users/activate")
    config.add_route("user_account", "/users/account")
    config.add_route("user_approve", "/users/approve")

    config.add_route("form_clear_session", "/form/clearsession/{item}/{attr}")

    # A WMS proxy
    config.add_route("wms_proxy", "/geoserver/lo/wms", request_method="GET")
    config.add_route("simple_proxy", "/proxy", request_method="GET")

    # Changeset protocol, query the changeset
    config.add_route("changesets_read", "/changesets")

    # Show a list of latest changesets
    config.add_route("changesets_read_latest", "/changesets/latest/{output}")
    # Show a list of changesets by a user
    config.add_route("changesets_read_byuser", "/changesets/{username}/{output}")

    # A route to the sitemap.xml
    config.add_route("sitemap", "/sitemap.xml")

    # Add a route to search locations
    config.add_route("location_search", "/search")

    # A route for ajax queries to get values for a given key
    config.add_route("filterValues", "/json/filtervalues")

    # Error views
    config.add_forbidden_view(forbidden_view)
    config.add_notfound_view(notfound_view)

    config.scan()
    return config.make_wsgi_app()
Example #4
0
def add_localizer(event):
    """
    Thanks to Alexandre Bourget:
    http://blog.abourget.net/2011/1/13/pyramid-and-mako:-how-to-do-i18n-the-
        pylons-way/
    """
    request = event.request
    localizer = get_localizer(request)

    # Create the customized TranslationFactory
    tsf_custom = TranslationStringFactory(get_customization_name(request=request))

    def auto_translate(string):
        # Try to translate the string within the [custom] domain
        translation = localizer.translate(tsf_custom(string))
        if (
            isinstance(string, TranslationString)
            and translation != string.interpolate()
            or not isinstance(string, TranslationString)
            and translation != string
        ):
            return translation

        # If no translation found, try to translate the string within the
        # 'lmkp' domain.
        translation = localizer.translate(tsf(string))
        if (
            isinstance(string, TranslationString)
            and translation != string.interpolate()
            or not isinstance(string, TranslationString)
            and translation != string
        ):
            return translation

        # If no translation found, try to translate the string within the
        # 'deform' domain.
        translation = localizer.translate(tsf_deform(string))
        if (
            isinstance(string, TranslationString)
            and translation != string.interpolate()
            or not isinstance(string, TranslationString)
            and translation != string
        ):
            return translation

        # If no translation found, try to translate the string within the
        # 'colander' domain.
        translation = localizer.translate(tsf_colander(string))
        if (
            isinstance(string, TranslationString)
            and translation != string.interpolate()
            or not isinstance(string, TranslationString)
            and translation != string
        ):
            return translation

        # If no translation was found, return the string as it is.
        if isinstance(string, TranslationString):
            # If it it is a TranslationString, return it interpolated
            return string.interpolate()
        return string

    request.localizer = localizer
    request.translate = auto_translate