platform 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +21 -0
- data/.rspec +2 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +191 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +5 -0
- data/Rakefile +37 -0
- data/app/assets/images/platform/.gitkeep +0 -0
- data/app/assets/images/platform/accept.png +0 -0
- data/app/assets/images/platform/action_tab_bkgd.gif +0 -0
- data/app/assets/images/platform/action_tab_white_bkgd.gif +0 -0
- data/app/assets/images/platform/add.png +0 -0
- data/app/assets/images/platform/apps/app_icon.gif +0 -0
- data/app/assets/images/platform/apps/app_logo.gif +0 -0
- data/app/assets/images/platform/arrow_down.gif +0 -0
- data/app/assets/images/platform/arrow_down.png +0 -0
- data/app/assets/images/platform/arrow_down_grey.png +0 -0
- data/app/assets/images/platform/arrow_right.gif +0 -0
- data/app/assets/images/platform/arrow_up.png +0 -0
- data/app/assets/images/platform/arrow_up_grey.png +0 -0
- data/app/assets/images/platform/bullet_go.png +0 -0
- data/app/assets/images/platform/buttons.png +0 -0
- data/app/assets/images/platform/cancel.png +0 -0
- data/app/assets/images/platform/clipboard_icon.gif +0 -0
- data/app/assets/images/platform/close.gif +0 -0
- data/app/assets/images/platform/cross.png +0 -0
- data/app/assets/images/platform/default_app_icon.gif +0 -0
- data/app/assets/images/platform/default_app_logo.gif +0 -0
- data/app/assets/images/platform/delete.png +0 -0
- data/app/assets/images/platform/disk.png +0 -0
- data/app/assets/images/platform/exclamation.png +0 -0
- data/app/assets/images/platform/eye.png +0 -0
- data/app/assets/images/platform/eye_not.png +0 -0
- data/app/assets/images/platform/field_sprite.gif +0 -0
- data/app/assets/images/platform/find.png +0 -0
- data/app/assets/images/platform/globe.gif +0 -0
- data/app/assets/images/platform/help.png +0 -0
- data/app/assets/images/platform/help/app_reg.png +0 -0
- data/app/assets/images/platform/help/app_reg_ext.png +0 -0
- data/app/assets/images/platform/help/app_reg_web.png +0 -0
- data/app/assets/images/platform/help/auth_desktop.png +0 -0
- data/app/assets/images/platform/help/auth_iframe.png +0 -0
- data/app/assets/images/platform/help/auth_iphone.png +0 -0
- data/app/assets/images/platform/help/auth_web.png +0 -0
- data/app/assets/images/platform/help/authorize.png +0 -0
- data/app/assets/images/platform/help/ext.png +0 -0
- data/app/assets/images/platform/help/login.png +0 -0
- data/app/assets/images/platform/help/login_desktop.png +0 -0
- data/app/assets/images/platform/help/login_iphone.png +0 -0
- data/app/assets/images/platform/help/login_web.png +0 -0
- data/app/assets/images/platform/help2.png +0 -0
- data/app/assets/images/platform/information.png +0 -0
- data/app/assets/images/platform/keyboard.png +0 -0
- data/app/assets/images/platform/language_selector_arrow.gif +0 -0
- data/app/assets/images/platform/left_quote.png +0 -0
- data/app/assets/images/platform/lightning.png +0 -0
- data/app/assets/images/platform/loading.gif +0 -0
- data/app/assets/images/platform/loading2.gif +0 -0
- data/app/assets/images/platform/loading3.gif +0 -0
- data/app/assets/images/platform/loading_animation.gif +0 -0
- data/app/assets/images/platform/loading_large.gif +0 -0
- data/app/assets/images/platform/lock.png +0 -0
- data/app/assets/images/platform/lock_add.png +0 -0
- data/app/assets/images/platform/lock_delete.png +0 -0
- data/app/assets/images/platform/lock_open.png +0 -0
- data/app/assets/images/platform/medals/bronze.png +0 -0
- data/app/assets/images/platform/medals/gold.png +0 -0
- data/app/assets/images/platform/medals/runner.png +0 -0
- data/app/assets/images/platform/medals/silver.png +0 -0
- data/app/assets/images/platform/minus_node.png +0 -0
- data/app/assets/images/platform/oauth/perm_tile.gif +0 -0
- data/app/assets/images/platform/oauth/right_grey.png +0 -0
- data/app/assets/images/platform/pencil.png +0 -0
- data/app/assets/images/platform/photo_silhouette.gif +0 -0
- data/app/assets/images/platform/pixel.gif +0 -0
- data/app/assets/images/platform/platform.png +0 -0
- data/app/assets/images/platform/platform2.png +0 -0
- data/app/assets/images/platform/platform3.png +0 -0
- data/app/assets/images/platform/platform4.png +0 -0
- data/app/assets/images/platform/platform5.png +0 -0
- data/app/assets/images/platform/plus.png +0 -0
- data/app/assets/images/platform/plus_node.png +0 -0
- data/app/assets/images/platform/random.png +0 -0
- data/app/assets/images/platform/random2.png +0 -0
- data/app/assets/images/platform/rating_star0.png +0 -0
- data/app/assets/images/platform/rating_star05.png +0 -0
- data/app/assets/images/platform/rating_star1.png +0 -0
- data/app/assets/images/platform/rating_stars.gif +0 -0
- data/app/assets/images/platform/rating_stars.psd +0 -0
- data/app/assets/images/platform/reply.png +0 -0
- data/app/assets/images/platform/right_quote.png +0 -0
- data/app/assets/images/platform/rotating_world.gif +0 -0
- data/app/assets/images/platform/script.png +0 -0
- data/app/assets/images/platform/script_edit.png +0 -0
- data/app/assets/images/platform/script_gear.png +0 -0
- data/app/assets/images/platform/site_sprite.gif +0 -0
- data/app/assets/images/platform/spinner.gif +0 -0
- data/app/assets/images/platform/star.png +0 -0
- data/app/assets/images/platform/table_edit.png +0 -0
- data/app/assets/images/platform/table_gear.png +0 -0
- data/app/assets/images/platform/table_multiple.png +0 -0
- data/app/assets/images/platform/thumb_down.png +0 -0
- data/app/assets/images/platform/thumb_up.png +0 -0
- data/app/assets/images/platform/top_left_stem.png +0 -0
- data/app/assets/images/platform/top_right_stem.png +0 -0
- data/app/assets/images/platform/translate_icn.gif +0 -0
- data/app/assets/images/platform/treeview/diffDoc.gif +0 -0
- data/app/assets/images/platform/treeview/diffFolder.gif +0 -0
- data/app/assets/images/platform/treeview/ftv2blank.gif +0 -0
- data/app/assets/images/platform/treeview/ftv2doc.gif +0 -0
- data/app/assets/images/platform/treeview/ftv2folderclosed.gif +0 -0
- data/app/assets/images/platform/treeview/ftv2folderopen.gif +0 -0
- data/app/assets/images/platform/treeview/ftv2lastnode.gif +0 -0
- data/app/assets/images/platform/treeview/ftv2link.gif +0 -0
- data/app/assets/images/platform/treeview/ftv2mlastnode.gif +0 -0
- data/app/assets/images/platform/treeview/ftv2mnode.gif +0 -0
- data/app/assets/images/platform/treeview/ftv2node.gif +0 -0
- data/app/assets/images/platform/treeview/ftv2plastnode.gif +0 -0
- data/app/assets/images/platform/treeview/ftv2pnode.gif +0 -0
- data/app/assets/images/platform/treeview/ftv2vertline.gif +0 -0
- data/app/assets/images/platform/wizard.png +0 -0
- data/app/assets/images/platform/world_link.png +0 -0
- data/app/assets/javascripts/platform/api_explorer.js +628 -0
- data/app/assets/javascripts/platform/application.js +9 -0
- data/app/assets/javascripts/platform/ftiens4.js +1197 -0
- data/app/assets/javascripts/platform/jsdk.js +539 -0
- data/app/assets/javascripts/platform/platform.js +447 -0
- data/app/assets/javascripts/platform/shortcut.js +223 -0
- data/app/assets/javascripts/platform/ua.js +147 -0
- data/app/assets/stylesheets/platform/api_explorer.css.scss +140 -0
- data/app/assets/stylesheets/platform/application.css.scss +6 -0
- data/app/assets/stylesheets/platform/components.css.scss +208 -0
- data/app/assets/stylesheets/platform/layout.css.scss +119 -0
- data/app/assets/stylesheets/platform/oauth.css +51 -0
- data/app/assets/stylesheets/platform/platform.css.scss +311 -0
- data/app/controllers/platform/admin/apps_controller.rb +99 -0
- data/app/controllers/platform/admin/base_controller.rb +60 -0
- data/app/controllers/platform/admin/categories_controller.rb +132 -0
- data/app/controllers/platform/admin/clientsdk_controller.rb +30 -0
- data/app/controllers/platform/admin/developers_controller.rb +30 -0
- data/app/controllers/platform/admin/exceptions_controller.rb +30 -0
- data/app/controllers/platform/admin/forum_controller.rb +34 -0
- data/app/controllers/platform/admin/metrics_controller.rb +42 -0
- data/app/controllers/platform/api/apps_controller.rb +40 -0
- data/app/controllers/platform/api/base_controller.rb +541 -0
- data/app/controllers/platform/apps_controller.rb +142 -0
- data/app/controllers/platform/base_controller.rb +127 -0
- data/app/controllers/platform/developer/api_explorer_controller.rb +56 -0
- data/app/controllers/platform/developer/apps_controller.rb +161 -0
- data/app/controllers/platform/developer/base_controller.rb +51 -0
- data/app/controllers/platform/developer/blog_controller.rb +29 -0
- data/app/controllers/platform/developer/dashboard_controller.rb +63 -0
- data/app/controllers/platform/developer/forum_controller.rb +85 -0
- data/app/controllers/platform/developer/help_controller.rb +113 -0
- data/app/controllers/platform/developer/info_controller.rb +41 -0
- data/app/controllers/platform/developer/registration_controller.rb +39 -0
- data/app/controllers/platform/developer/resources_controller.rb +30 -0
- data/app/controllers/platform/forum_controller.rb +74 -0
- data/app/controllers/platform/oauth_controller.rb +421 -0
- data/app/controllers/platform/ratings_controller.rb +61 -0
- data/app/helpers/platform/admin/categories_helper.rb +54 -0
- data/app/helpers/platform/apps_helper.rb +26 -0
- data/app/helpers/platform/developer/dashboard_helper.rb +42 -0
- data/app/helpers/platform/developer/help_helper.rb +45 -0
- data/app/helpers/platform_helper.rb +26 -0
- data/app/models/platform/application.rb +394 -0
- data/app/models/platform/application_category.rb +34 -0
- data/app/models/platform/application_developer.rb +30 -0
- data/app/models/platform/application_filter.rb +30 -0
- data/app/models/platform/application_log.rb +32 -0
- data/app/models/platform/application_log_filter.rb +34 -0
- data/app/models/platform/application_metric.rb +58 -0
- data/app/models/platform/application_metric_filter.rb +34 -0
- data/app/models/platform/application_permission.rb +30 -0
- data/app/models/platform/application_permission_filter.rb +30 -0
- data/app/models/platform/application_usage_metric.rb +58 -0
- data/app/models/platform/application_usage_metric_filter.rb +34 -0
- data/app/models/platform/application_user.rb +45 -0
- data/app/models/platform/application_user_filter.rb +34 -0
- data/app/models/platform/base_filter.rb +46 -0
- data/app/models/platform/category.rb +64 -0
- data/app/models/platform/daily_application_metric.rb +31 -0
- data/app/models/platform/developer.rb +45 -0
- data/app/models/platform/developer_filter.rb +26 -0
- data/app/models/platform/forum_message.rb +35 -0
- data/app/models/platform/forum_message_filter.rb +26 -0
- data/app/models/platform/forum_topic.rb +38 -0
- data/app/models/platform/forum_topic_filter.rb +26 -0
- data/app/models/platform/logged_exception.rb +290 -0
- data/app/models/platform/logged_exception_filter.rb +58 -0
- data/app/models/platform/media/image.rb +26 -0
- data/app/models/platform/media/media.rb +58 -0
- data/app/models/platform/monthly_application_metric.rb +31 -0
- data/app/models/platform/oauth/access_token.rb +57 -0
- data/app/models/platform/oauth/client_token.rb +38 -0
- data/app/models/platform/oauth/oauth_model_methods.rb +41 -0
- data/app/models/platform/oauth/oauth_token.rb +57 -0
- data/app/models/platform/oauth/oauth_token_filter.rb +34 -0
- data/app/models/platform/oauth/refresh_token.rb +47 -0
- data/app/models/platform/oauth/request_token.rb +50 -0
- data/app/models/platform/permission.rb +27 -0
- data/app/models/platform/rating.rb +43 -0
- data/app/models/platform/rating_filter.rb +30 -0
- data/app/models/platform/rollup_log.rb +27 -0
- data/app/models/platform/rollup_log_filter.rb +30 -0
- data/app/models/platform/total_application_metric.rb +40 -0
- data/app/models/platform/weekly_application_metric.rb +31 -0
- data/app/views/platform/admin/apps/_categories.html.erb +17 -0
- data/app/views/platform/admin/apps/_categories_scripts.html.erb +17 -0
- data/app/views/platform/admin/apps/_tabs.html.erb +25 -0
- data/app/views/platform/admin/apps/index.html.erb +32 -0
- data/app/views/platform/admin/apps/permissions.html.erb +7 -0
- data/app/views/platform/admin/apps/ratings.html.erb +7 -0
- data/app/views/platform/admin/apps/tokens.html.erb +18 -0
- data/app/views/platform/admin/apps/users.html.erb +7 -0
- data/app/views/platform/admin/apps/view.html.erb +170 -0
- data/app/views/platform/admin/categories/_tabs.html.erb +22 -0
- data/app/views/platform/admin/categories/category_assigner.html.erb +9 -0
- data/app/views/platform/admin/categories/category_assigner_tree.html.erb +81 -0
- data/app/views/platform/admin/categories/index.html.erb +106 -0
- data/app/views/platform/admin/categories/items.html.erb +153 -0
- data/app/views/platform/admin/categories/lb_update_application_category.html.erb +54 -0
- data/app/views/platform/admin/categories/lb_update_category.html.erb +64 -0
- data/app/views/platform/admin/categories/tree.html.erb +64 -0
- data/app/views/platform/admin/clientsdk/index.html.erb +89 -0
- data/app/views/platform/admin/common/_footer.html.erb +1 -0
- data/app/views/platform/admin/common/_header.html.erb +32 -0
- data/app/views/platform/admin/common/_lightbox_buttons.html.erb +5 -0
- data/app/views/platform/admin/common/_paginator.html.erb +20 -0
- data/app/views/platform/admin/developers/_tabs.html.erb +22 -0
- data/app/views/platform/admin/developers/index.html.erb +7 -0
- data/app/views/platform/admin/exceptions/_tabs.html.erb +22 -0
- data/app/views/platform/admin/exceptions/index.html.erb +7 -0
- data/app/views/platform/admin/forum/_tabs.html.erb +22 -0
- data/app/views/platform/admin/forum/index.html.erb +7 -0
- data/app/views/platform/admin/forum/messages.html.erb +7 -0
- data/app/views/platform/admin/metrics/_tabs.html.erb +25 -0
- data/app/views/platform/admin/metrics/application_log.html.erb +7 -0
- data/app/views/platform/admin/metrics/index.html.erb +9 -0
- data/app/views/platform/admin/metrics/rollup_log.html.erb +7 -0
- data/app/views/platform/admin/metrics/usage.html.erb +7 -0
- data/app/views/platform/apps/_actions_module.html.erb +3 -0
- data/app/views/platform/apps/_app_footer.html.erb +8 -0
- data/app/views/platform/apps/_app_header.html.erb +25 -0
- data/app/views/platform/apps/_apps_module.html.erb +42 -0
- data/app/views/platform/apps/_authorize_form.html.erb +11 -0
- data/app/views/platform/apps/_categories_module.html.erb +11 -0
- data/app/views/platform/apps/_featured_apps_module.html.erb +40 -0
- data/app/views/platform/apps/_left.html.erb +20 -0
- data/app/views/platform/apps/_monthly_users_module.html.erb +8 -0
- data/app/views/platform/apps/_paginator.html.erb +13 -0
- data/app/views/platform/apps/_rank_module.html.erb +18 -0
- data/app/views/platform/apps/_search_apps_module.html.erb +35 -0
- data/app/views/platform/apps/canvas_app.html.erb +15 -0
- data/app/views/platform/apps/index.html.erb +86 -0
- data/app/views/platform/apps/view.html.erb +71 -0
- data/app/views/platform/apps/xd.html.erb +11 -0
- data/app/views/platform/common/_footer.html.erb +1 -0
- data/app/views/platform/common/_header.html.erb +4 -0
- data/app/views/platform/common/_paginator.html.erb +32 -0
- data/app/views/platform/common/_scripts.html.erb +7 -0
- data/app/views/platform/common/_user_login.html.erb +11 -0
- data/app/views/platform/developer/api_explorer/history.html.erb +31 -0
- data/app/views/platform/developer/api_explorer/index.html.erb +134 -0
- data/app/views/platform/developer/api_explorer/oauth_lander.html.erb +4 -0
- data/app/views/platform/developer/api_explorer/options.html.erb +44 -0
- data/app/views/platform/developer/apps/_form.html.erb +340 -0
- data/app/views/platform/developer/apps/create_version.html.erb +19 -0
- data/app/views/platform/developer/apps/edit.html.erb +21 -0
- data/app/views/platform/developer/apps/index.html.erb +375 -0
- data/app/views/platform/developer/apps/new.html.erb +20 -0
- data/app/views/platform/developer/blog/index.html.erb +7 -0
- data/app/views/platform/developer/common/_footer.html.erb +1 -0
- data/app/views/platform/developer/common/_header.html.erb +34 -0
- data/app/views/platform/developer/dashboard/_apps_info.html.erb +84 -0
- data/app/views/platform/developer/dashboard/_discussions.html.erb +68 -0
- data/app/views/platform/developer/dashboard/_header.html.erb +12 -0
- data/app/views/platform/developer/dashboard/_reviews.html.erb +53 -0
- data/app/views/platform/developer/dashboard/_statistics.html.erb +105 -0
- data/app/views/platform/developer/dashboard/index.html.erb +85 -0
- data/app/views/platform/developer/dashboard/settings.html.erb +23 -0
- data/app/views/platform/developer/forum/_message.html.erb +17 -0
- data/app/views/platform/developer/forum/_messages.html.erb +14 -0
- data/app/views/platform/developer/forum/_new_message.html.erb +28 -0
- data/app/views/platform/developer/forum/_new_topic.html.erb +39 -0
- data/app/views/platform/developer/forum/index.html.erb +89 -0
- data/app/views/platform/developer/forum/topic.html.erb +28 -0
- data/app/views/platform/developer/help/_footer.html.erb +4 -0
- data/app/views/platform/developer/help/_header.html.erb +95 -0
- data/app/views/platform/developer/help/_navigation.html.erb +99 -0
- data/app/views/platform/developer/help/api.html.erb +120 -0
- data/app/views/platform/developer/help/credits.html.erb +77 -0
- data/app/views/platform/developer/help/index.html.erb +19 -0
- data/app/views/platform/developer/help/license.html.erb +586 -0
- data/app/views/platform/developer/help/oauth_app_login.html.erb +177 -0
- data/app/views/platform/developer/help/oauth_client_side.html.erb +264 -0
- data/app/views/platform/developer/help/oauth_desktop.html.erb +191 -0
- data/app/views/platform/developer/help/oauth_extensions.html.erb +342 -0
- data/app/views/platform/developer/help/oauth_intro.html.erb +371 -0
- data/app/views/platform/developer/help/oauth_mobile.html.erb +292 -0
- data/app/views/platform/developer/help/oauth_server_side.html.erb +603 -0
- data/app/views/platform/developer/help/oauth_trusted_client.html.erb +202 -0
- data/app/views/platform/developer/help/reference.html.erb +42 -0
- data/app/views/platform/developer/help/sdk_ios.html.erb +31 -0
- data/app/views/platform/developer/help/sdk_js.html.erb +202 -0
- data/app/views/platform/developer/info/_basic_info.html.erb +74 -0
- data/app/views/platform/developer/info/_header.html.erb +12 -0
- data/app/views/platform/developer/info/index.html.erb +23 -0
- data/app/views/platform/developer/registration/index.html.erb +134 -0
- data/app/views/platform/developer/resources/index.html.erb +23 -0
- data/app/views/platform/forum/_message.html.erb +17 -0
- data/app/views/platform/forum/_messages.html.erb +14 -0
- data/app/views/platform/forum/_new_message.html.erb +26 -0
- data/app/views/platform/forum/_new_topic.html.erb +38 -0
- data/app/views/platform/forum/_topic.html.erb +18 -0
- data/app/views/platform/forum/_topics.html.erb +74 -0
- data/app/views/platform/login/index.html.erb +31 -0
- data/app/views/platform/login/register.html.erb +55 -0
- data/app/views/platform/oauth/_authorization_box.html.erb +75 -0
- data/app/views/platform/oauth/_authorization_popup.html.erb +38 -0
- data/app/views/platform/oauth/_authorize_form.html.erb +11 -0
- data/app/views/platform/oauth/auth_failed.html.erb +0 -0
- data/app/views/platform/oauth/auth_success.html.erb +0 -0
- data/app/views/platform/oauth/authorize_desktop.html.erb +76 -0
- data/app/views/platform/oauth/authorize_failure_iframe.html.erb +1 -0
- data/app/views/platform/oauth/authorize_failure_mobile.html.erb +24 -0
- data/app/views/platform/oauth/authorize_failure_popup.html.erb +24 -0
- data/app/views/platform/oauth/authorize_failure_web.html.erb +1 -0
- data/app/views/platform/oauth/authorize_iframe.html.erb +16 -0
- data/app/views/platform/oauth/authorize_mobile.html.erb +1 -0
- data/app/views/platform/oauth/authorize_popup.html.erb +1 -0
- data/app/views/platform/oauth/authorize_success_iframe.html.erb +1 -0
- data/app/views/platform/oauth/authorize_success_mobile.html.erb +24 -0
- data/app/views/platform/oauth/authorize_success_popup.html.erb +24 -0
- data/app/views/platform/oauth/authorize_success_web.html.erb +1 -0
- data/app/views/platform/oauth/authorize_web.html.erb +3 -0
- data/app/views/platform/oauth/xd.html.erb +13 -0
- data/app/views/platform/ratings/_list.html.erb +30 -0
- data/app/views/platform/ratings/_new.html.erb +70 -0
- data/app/views/platform/ratings/_rating.html.erb +17 -0
- data/config/platform/config.yml +133 -0
- data/config/platform/data/default_applications.yml +39 -0
- data/config/platform/data/default_categories.yml +56 -0
- data/config/platform/data/default_permissions.yml +0 -0
- data/config/platform/site/features.yml +66 -0
- data/config/routes.rb +59 -0
- data/db/migrate/20110602232141_create_platform_tables.rb +262 -0
- data/docs/Classes.graffle +7315 -0
- data/docs/Classes.pdf +0 -0
- data/lib/generators/platform/platform_generator.rb +56 -0
- data/lib/generators/platform/templates/db/create_platform_tables.rb +262 -0
- data/lib/generators/platform/templates/layouts/platform.html.erb +49 -0
- data/lib/generators/platform/templates/layouts/platform_admin.html.erb +60 -0
- data/lib/platform.rb +6 -0
- data/lib/platform/api/already_jsoned_string.rb +9 -0
- data/lib/platform/api/proxy.rb +45 -0
- data/lib/platform/api/proxy/base.rb +62 -0
- data/lib/platform/cache.rb +78 -0
- data/lib/platform/config.rb +666 -0
- data/lib/platform/engine.rb +5 -0
- data/lib/platform/exception.rb +27 -0
- data/lib/platform/extensions/action_controller_extension.rb +65 -0
- data/lib/platform/extensions/action_view_extension.rb +168 -0
- data/lib/platform/extensions/object_extension.rb +51 -0
- data/lib/platform/helper.rb +33 -0
- data/lib/platform/logger.rb +62 -0
- data/lib/platform/railtie.rb +52 -0
- data/lib/platform/random_password_generator.rb +76 -0
- data/lib/platform/simple_string_permissions.rb +40 -0
- data/lib/platform/version.rb +3 -0
- data/lib/tasks/platform.rake +119 -0
- data/platform.gemspec +45 -0
- data/script/rails +6 -0
- data/spec/config/config_spec.rb +10 -0
- data/spec/dummy_app.rb +52 -0
- data/spec/models/application_spec.rb +53 -0
- data/spec/models/developer_spec.rb +23 -0
- data/spec/spec_helper.rb +29 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +7 -0
- data/test/dummy/app/assets/stylesheets/admin.css +200 -0
- data/test/dummy/app/assets/stylesheets/application.css +47 -0
- data/test/dummy/app/assets/stylesheets/components.css.scss +211 -0
- data/test/dummy/app/assets/stylesheets/layout.css.scss +143 -0
- data/test/dummy/app/controllers/admin/admins_controller.rb +7 -0
- data/test/dummy/app/controllers/admin/base_controller.rb +12 -0
- data/test/dummy/app/controllers/admin/bookmarks_controller.rb +7 -0
- data/test/dummy/app/controllers/admin/users_controller.rb +19 -0
- data/test/dummy/app/controllers/api/base_controller.rb +5 -0
- data/test/dummy/app/controllers/api/bookmarks_controller.rb +35 -0
- data/test/dummy/app/controllers/api/users_controller.rb +19 -0
- data/test/dummy/app/controllers/application_controller.rb +31 -0
- data/test/dummy/app/controllers/home_controller.rb +7 -0
- data/test/dummy/app/controllers/login_controller.rb +65 -0
- data/test/dummy/app/helpers/application_helper.rb +9 -0
- data/test/dummy/app/helpers/home_helper.rb +2 -0
- data/test/dummy/app/mailers/.gitkeep +0 -0
- data/test/dummy/app/models/.gitkeep +0 -0
- data/test/dummy/app/models/admin.rb +4 -0
- data/test/dummy/app/models/admin_filter.rb +7 -0
- data/test/dummy/app/models/bookmark.rb +7 -0
- data/test/dummy/app/models/user.rb +34 -0
- data/test/dummy/app/views/admin/admins/index.html.erb +7 -0
- data/test/dummy/app/views/admin/bookmarks/index.html.erb +5 -0
- data/test/dummy/app/views/admin/users/index.html.erb +10 -0
- data/test/dummy/app/views/demo/index.rhtml +108 -0
- data/test/dummy/app/views/demo/tokens.rhtml +35 -0
- data/test/dummy/app/views/home/index.html.erb +43 -0
- data/test/dummy/app/views/layouts/_footer.html.erb +16 -0
- data/test/dummy/app/views/layouts/_header.html.erb +22 -0
- data/test/dummy/app/views/layouts/admin.html.erb +97 -0
- data/test/dummy/app/views/layouts/application.html.erb +25 -0
- data/test/dummy/app/views/layouts/minimal.html.erb +37 -0
- data/test/dummy/app/views/layouts/popup.html.erb +43 -0
- data/test/dummy/app/views/login/index.html.erb +34 -0
- data/test/dummy/app/views/login/register.html.erb +51 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +51 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +30 -0
- data/test/dummy/config/environments/production.rb +60 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/platform/api/0/bookmark.yml +18 -0
- data/test/dummy/config/platform/api/0/user.yml +17 -0
- data/test/dummy/config/platform/api/1/bookmark.yml +58 -0
- data/test/dummy/config/platform/api/1/user.yml +36 -0
- data/test/dummy/config/platform/config.yml +135 -0
- data/test/dummy/config/platform/data/default_applications.yml +39 -0
- data/test/dummy/config/platform/data/default_categories.yml +56 -0
- data/test/dummy/config/platform/data/default_permissions.yml +0 -0
- data/test/dummy/config/platform/site/features.yml +66 -0
- data/test/dummy/config/platform/site/sample_apps.yml +100 -0
- data/test/dummy/config/routes.rb +30 -0
- data/test/dummy/config/tr8n/config.yml +247 -0
- data/test/dummy/config/tr8n/data/ip_locations.csv +93460 -0
- data/test/dummy/config/tr8n/rules/default_date_rules.yml +20 -0
- data/test/dummy/config/tr8n/rules/default_gender_list_rules.yml +82 -0
- data/test/dummy/config/tr8n/rules/default_gender_rules.yml +20 -0
- data/test/dummy/config/tr8n/rules/default_language_cases.yml +272 -0
- data/test/dummy/config/tr8n/rules/default_list_rules.yml +19 -0
- data/test/dummy/config/tr8n/rules/default_numeric_rules.yml +42 -0
- data/test/dummy/config/tr8n/rules/default_value_rules.yml +18 -0
- data/test/dummy/config/tr8n/site/default_glossary.yml +18 -0
- data/test/dummy/config/tr8n/site/default_languages.yml +1591 -0
- data/test/dummy/config/tr8n/site/features.yml +111 -0
- data/test/dummy/config/tr8n/site/shortcuts.yml +55 -0
- data/test/dummy/config/tr8n/site/sitemap.json +42 -0
- data/test/dummy/config/tr8n/tokens/data.yml +19 -0
- data/test/dummy/config/tr8n/tokens/decorations.yml +19 -0
- data/test/dummy/config/will_filter/config.yml +99 -0
- data/test/dummy/db/migrate/20101207014543_create_users.rb +23 -0
- data/test/dummy/db/migrate/20110113223509_create_admins.rb +15 -0
- data/test/dummy/db/migrate/20110930041143_create_will_filter_filters.rb +15 -0
- data/test/dummy/db/migrate/20110930041150_create_tr8n_tables.rb +350 -0
- data/test/dummy/db/migrate/20111004075531_create_platform_tables.rb +262 -0
- data/test/dummy/db/migrate/20111012055603_create_bookmarks.rb +10 -0
- data/test/dummy/db/schema.rb +683 -0
- data/test/dummy/lib/assets/.gitkeep +0 -0
- data/test/dummy/lib/platform/api/bookmark_proxy_0.rb +12 -0
- data/test/dummy/lib/platform/api/bookmark_proxy_1.rb +12 -0
- data/test/dummy/lib/platform/api/user_proxy_0.rb +12 -0
- data/test/dummy/lib/platform/api/user_proxy_1.rb +12 -0
- data/test/dummy/log/.gitkeep +0 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test/fixtures/documents.yml +11 -0
- data/test/dummy/test/unit/document_test.rb +7 -0
- metadata +886 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2011 Michael Berkovich
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
class Platform::RatingsController < Platform::BaseController
|
|
25
|
+
|
|
26
|
+
def submit_app_rating
|
|
27
|
+
app = Platform::Application.find(params[:app_id])
|
|
28
|
+
|
|
29
|
+
if request.post?
|
|
30
|
+
rating = Platform::Rating.find_or_create(app, Platform::Config.current_user)
|
|
31
|
+
|
|
32
|
+
rating_value = params[:rating_value].to_i
|
|
33
|
+
if rating_value < 0 or rating_value > 5
|
|
34
|
+
trfe("Invalid application rating value")
|
|
35
|
+
return redirect_to_source
|
|
36
|
+
end
|
|
37
|
+
rating.value = rating_value
|
|
38
|
+
|
|
39
|
+
rating.comment = params[:rating_comment].blank? ? nil : params[:rating_comment]
|
|
40
|
+
rating.save
|
|
41
|
+
|
|
42
|
+
app.update_rank!
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
redirect_to_source
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def delete_app_rating
|
|
49
|
+
rating = Platform::Rating.find(params[:rating_id])
|
|
50
|
+
|
|
51
|
+
if rating and rating.user_id == Platform::Config.current_user.id
|
|
52
|
+
rating.destroy
|
|
53
|
+
rating.object.update_rank!
|
|
54
|
+
else
|
|
55
|
+
trfe("Invalid application rating")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
redirect_to_source
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2011 Michael Berkovich, Geni Inc
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
module Platform::Admin::CategoriesHelper
|
|
25
|
+
|
|
26
|
+
def generate_tree(html, parent, parent_name, checkboxes=false)
|
|
27
|
+
parent.children.each_with_index do |child, index|
|
|
28
|
+
name = "#{parent_name}_#{index}"
|
|
29
|
+
child_name = child.name.gsub("'", "\\'")
|
|
30
|
+
action = "javascript:openSubCategory(\"#{child.id}\", \"#{child_name}\");"
|
|
31
|
+
action = "" if checkboxes
|
|
32
|
+
checkbox_action = "onClick='assignCategory(this)'"
|
|
33
|
+
|
|
34
|
+
html << "#{name} = insFld(#{parent_name}, gFld(' <span class=tree_item>#{child_name.gsub("'", "\\'")}</span>', '#{action}'))"
|
|
35
|
+
html << "#{name}.xID = '#{child.id}'"
|
|
36
|
+
if checkboxes and child.children.size == 0
|
|
37
|
+
html << "#{name}.prependHTML = \"<td valign=middle align=left width=40px><input #{checkbox_action} type=checkbox id='check_#{child.id}'></td>\""
|
|
38
|
+
end
|
|
39
|
+
generate_tree(html, child, name, checkboxes)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def generate_categories_javascript(root, checkboxes=false)
|
|
44
|
+
html = []
|
|
45
|
+
action = "javascript:openSubCategory(\"#{root.id}\", \"#{root.name}\");"
|
|
46
|
+
action = "" if checkboxes
|
|
47
|
+
html << "foldersTree = gFld(' <span class=tree_root>#{root.name.gsub("'", "\\'")}</span>', '#{action}')"
|
|
48
|
+
html << "foldersTree.treeID = 'categoriesTree'"
|
|
49
|
+
html << "foldersTree.xID = '#{root.id}'"
|
|
50
|
+
generate_tree(html, root, "foldersTree", checkboxes)
|
|
51
|
+
html.join("; \n").html_safe
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2011 Michael Berkovich
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
module Platform::AppsHelper
|
|
25
|
+
|
|
26
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2011 Michael Berkovich
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
module Platform::Developer::DashboardHelper
|
|
25
|
+
|
|
26
|
+
def daily_active_users_chart(developer)
|
|
27
|
+
values = [100, 200, 500]
|
|
28
|
+
names = ["Not Translated", "Translated", "Pending Approval"]
|
|
29
|
+
colors = ['FF0000', '00FF00', 'FFFF00']
|
|
30
|
+
chart_url = "https://chart.googleapis.com/chart?cht=p3&chs=350x80&chd=t:#{values.join(',')}&chl=#{names.join('|')}&chco=#{colors.join('|')}"
|
|
31
|
+
image_tag(chart_url)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def daily_new_users_chart(app)
|
|
35
|
+
values = [100, 200, 500]
|
|
36
|
+
names = ["Not Translated", "Translated", "Pending Approval"]
|
|
37
|
+
colors = ['FF0000', '00FF00', 'FFFF00']
|
|
38
|
+
chart_url = "https://chart.googleapis.com/chart?cht=p3&chs=350x80&chd=t:#{values.join(',')}&chl=#{names.join('|')}&chco=#{colors.join('|')}"
|
|
39
|
+
image_tag(chart_url)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2011 Michael Berkovich
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
module Platform::Developer::HelpHelper
|
|
25
|
+
|
|
26
|
+
def documentation_field_type_tag(field)
|
|
27
|
+
return field[:type] if simple_field?(field[:type])
|
|
28
|
+
if field[:type] == "Array"
|
|
29
|
+
return "Array of #{field[:array_type].pluralize}".html_safe if simple_field?(field[:array_type])
|
|
30
|
+
return "Array of #{documentation_field_link_tag(field[:array_type].pluralize, field[:array_type])}".html_safe
|
|
31
|
+
end
|
|
32
|
+
documentation_field_link_tag(field[:type], field[:type])
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def documentation_field_link_tag(name, type)
|
|
36
|
+
link_to(name, :controller => "/platform/developer/help", :action => :api, :path => type.underscore)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def simple_field?(type)
|
|
42
|
+
["String", "Number", "Boolean", "Array or String", "Hash", "Binary"].include?(type)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2011 Michael Berkovich
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
module PlatformHelper
|
|
25
|
+
|
|
26
|
+
end
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2011 Michael Berkovich
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
class Platform::Application < ActiveRecord::Base
|
|
25
|
+
set_table_name :platform_applications
|
|
26
|
+
|
|
27
|
+
# useful methods - should be public
|
|
28
|
+
include Platform::SimpleStringPermissions
|
|
29
|
+
acts_as_tree :order => "version"
|
|
30
|
+
|
|
31
|
+
belongs_to :developer, :class_name => "Platform::Developer"
|
|
32
|
+
has_many :application_developers, :class_name => "Platform::ApplicationDeveloper", :dependent => :destroy
|
|
33
|
+
has_many :application_metrics, :class_name => "Platform::ApplicationMetric", :dependent => :destroy
|
|
34
|
+
has_many :application_users, :class_name => "Platform::ApplicationUser", :dependent => :destroy
|
|
35
|
+
has_many :application_logs, :class_name => "Platform::ApplicationLog", :dependent => :destroy
|
|
36
|
+
|
|
37
|
+
has_many :tokens, :class_name => "Platform::Oauth::OauthToken", :dependent => :destroy
|
|
38
|
+
has_many :access_tokens, :class_name => "Platform::Oauth::AccessToken", :dependent => :destroy
|
|
39
|
+
has_many :refresh_tokens, :class_name => "Platform::Oauth::RefreshToken", :dependent => :destroy
|
|
40
|
+
|
|
41
|
+
has_many :application_categories, :class_name => "Platform::ApplicationCategory", :dependent => :destroy
|
|
42
|
+
has_many :categories, :class_name => "Platform::Category", :through => :application_categories
|
|
43
|
+
|
|
44
|
+
belongs_to :icon, :class_name => Platform::Config.site_media_class, :foreign_key => "icon_id"
|
|
45
|
+
belongs_to :logo, :class_name => Platform::Config.site_media_class, :foreign_key => "logo_id"
|
|
46
|
+
|
|
47
|
+
validates_presence_of :name, :key, :secret
|
|
48
|
+
validates_uniqueness_of :key
|
|
49
|
+
before_validation :generate_keys
|
|
50
|
+
|
|
51
|
+
URL_REGEX = /\Ahttp(s?):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i
|
|
52
|
+
validates_format_of :url, :with => URL_REGEX, :allow_blank=>true
|
|
53
|
+
validates_format_of :support_url, :with => URL_REGEX, :allow_blank=>true
|
|
54
|
+
validates_format_of :callback_url, :with => URL_REGEX, :allow_blank=>true
|
|
55
|
+
validates_format_of :support_url, :with => URL_REGEX, :allow_blank=>true
|
|
56
|
+
validates_format_of :privacy_policy_url, :with => URL_REGEX, :allow_blank=>true
|
|
57
|
+
validates_format_of :terms_of_service_url, :with => URL_REGEX, :allow_blank=>true
|
|
58
|
+
validates_format_of :canvas_url, :with => URL_REGEX, :allow_blank=>true
|
|
59
|
+
|
|
60
|
+
attr_accessor :token_callback_url
|
|
61
|
+
|
|
62
|
+
acts_as_state_machine :initial => :new
|
|
63
|
+
|
|
64
|
+
state :new
|
|
65
|
+
state :submitted
|
|
66
|
+
state :approved
|
|
67
|
+
state :rejected
|
|
68
|
+
state :blocked
|
|
69
|
+
state :deprecated
|
|
70
|
+
|
|
71
|
+
event :submit do
|
|
72
|
+
transitions :from => :new, :to => :submitted
|
|
73
|
+
transitions :from => :rejected, :to => :submitted
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
event :deprecate do
|
|
77
|
+
transitions :from => :approved, :to => :deprecated
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
event :block do
|
|
81
|
+
transitions :from => :new, :to => :blocked
|
|
82
|
+
transitions :from => :submitted, :to => :blocked
|
|
83
|
+
transitions :from => :approved, :to => :blocked
|
|
84
|
+
transitions :from => :rejected, :to => :blocked
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
event :unblock do
|
|
88
|
+
transitions :from => :blocked, :to => :new
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
event :approve do
|
|
92
|
+
transitions :from => :new, :to => :approved
|
|
93
|
+
transitions :from => :submitted, :to => :approved
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
event :reject do
|
|
97
|
+
transitions :from => :submitted, :to => :rejected
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def self.for(client_id)
|
|
101
|
+
app = Platform::Application.find_by_id(client_id) if client_id.to_s.match(/^[\d]+$/)
|
|
102
|
+
app || Platform::Application.find_by_key(client_id)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def self.find_token(token_key)
|
|
106
|
+
token = Platform::Oauth::OauthToken.find_by_token(token_key, :include => :application)
|
|
107
|
+
if token && token.authorized?
|
|
108
|
+
token
|
|
109
|
+
else
|
|
110
|
+
nil
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def last_token_for_user(user)
|
|
115
|
+
Platform::Oauth::OauthToken.find(:first, :conditions => ["application_id = ? and user_id = ?", self.id, user.id], :order => "updated_at desc")
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def valid_tokens_for_user(user)
|
|
119
|
+
Platform::Oauth::OauthToken.find(:all, :conditions => ["application_id = ? and user_id = ? and invalidated_at is null", self.id, user.id], :order => "created_at desc")
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def rate_limited(value=true)
|
|
123
|
+
set_permission(:no_rate_limit, !value)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def rate_limited!(value=true)
|
|
127
|
+
rate_limited(value)
|
|
128
|
+
save!
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def rate_limited?
|
|
132
|
+
! has_permission?(:no_rate_limit)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Ticket 19135
|
|
136
|
+
def allow_grant_type_password(value=true)
|
|
137
|
+
set_permission(:grant_type_password, value)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Ticket 19135
|
|
141
|
+
def allow_grant_type_password!(value=true)
|
|
142
|
+
allow_grant_type_password(value)
|
|
143
|
+
save!
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# Ticket 19135
|
|
147
|
+
def allow_grant_type_password?
|
|
148
|
+
has_permission?(:grant_type_password)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def allow_grant_type_client_credentials?
|
|
152
|
+
true # for now, all applications have a right to get client_token
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Ticket 19180
|
|
156
|
+
def allow_unlimited_models(value=true)
|
|
157
|
+
set_permission(:unlimited_models, value)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Ticket 19180
|
|
161
|
+
def allow_unlimited_models!(value=true)
|
|
162
|
+
allow_unlimited_models(value)
|
|
163
|
+
save!
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Ticket 19180
|
|
167
|
+
def allow_unlimited_models?
|
|
168
|
+
has_permission?(:unlimited_models)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Ticket 19507
|
|
172
|
+
def allow_add_without_premium(value=true)
|
|
173
|
+
set_permission(:add_without_premium, value)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Ticket 19507
|
|
177
|
+
def allow_add_without_premium!(value=true)
|
|
178
|
+
allow_add_without_premium(value)
|
|
179
|
+
save!
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# Ticket 19507
|
|
183
|
+
def allow_add_without_premium?
|
|
184
|
+
has_permission?(:add_without_premium)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# If your application requires passing in extra parameters handle it here
|
|
188
|
+
def create_request_token(params={})
|
|
189
|
+
Platform::Oauth::RequestToken.create(params.merge(:application => self))
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def create_access_token(params={})
|
|
193
|
+
access_token = Platform::Oauth::AccessToken.create(params.merge(:application => self))
|
|
194
|
+
Platform::ApplicationUser.touch(self, access_token.user)
|
|
195
|
+
access_token
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def create_refresh_token(params={})
|
|
199
|
+
Platform::Oauth::RefreshToken.create(params.merge(:application => self))
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def create_client_token(params={})
|
|
203
|
+
Platform::Oauth::ClientToken.create(params.merge(:application => self))
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def admin_link
|
|
207
|
+
"#{DEFAULT_SITE_LINK}/admin/applications/view/#{id}"
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def self.permissions
|
|
211
|
+
[:no_rate_limit, :grant_type_password, :unlimited_models, :add_without_premium]
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def icon_url
|
|
215
|
+
return Platform::Config.default_app_icon unless icon
|
|
216
|
+
if Platform::Config.site_media_enabled?
|
|
217
|
+
Platform::Config.icon_url(icon)
|
|
218
|
+
else
|
|
219
|
+
icon.url
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def store_icon(file)
|
|
224
|
+
if Platform::Config.site_media_enabled?
|
|
225
|
+
update_attributes(:icon => Platform::Config.create_media(file))
|
|
226
|
+
else
|
|
227
|
+
self.icon = Platform::Media::Image.create
|
|
228
|
+
self.icon.write(file, :size => 16)
|
|
229
|
+
self.save
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
def logo_url
|
|
234
|
+
return Platform::Config.default_app_logo unless logo
|
|
235
|
+
if Platform::Config.site_media_enabled?
|
|
236
|
+
Platform::Config.logo_url(logo)
|
|
237
|
+
else
|
|
238
|
+
logo.url
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def store_logo(file)
|
|
243
|
+
if Platform::Config.site_media_enabled?
|
|
244
|
+
update_attributes(:logo => Platform::Config.create_media(file))
|
|
245
|
+
else
|
|
246
|
+
self.logo = Platform::Media::Image.create
|
|
247
|
+
self.logo.write(file, :size => 75)
|
|
248
|
+
self.save
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def short_description
|
|
253
|
+
return description if description.blank? or description.length < 400
|
|
254
|
+
"#{description[0..400]}..."
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def app_url
|
|
258
|
+
return url if canvas_name.blank?
|
|
259
|
+
"http://#{Platform::Config.site_base_url}/platform/apps/#{canvas_name}"
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
def short_name
|
|
263
|
+
return name if name.length < 15
|
|
264
|
+
"#{name[0..15]}..."
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def update_rank!
|
|
268
|
+
total_rank = (rating_count == 0) ? 0 : (rating_sum/rating_count)
|
|
269
|
+
self.update_attributes(:rank => total_rank)
|
|
270
|
+
total_rank
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
def developed_by?(dev = Platform::Config.current_developer)
|
|
274
|
+
self.developer == dev
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def rating_count
|
|
278
|
+
@rating_count ||= Platform::Rating.count(:id, :conditions => ["object_type = ? and object_id = ?", self.class.name, self.id])
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def rating_sum
|
|
282
|
+
@rating_sum ||= Platform::Rating.sum(:value, :conditions => ["object_type = ? and object_id = ?", self.class.name, self.id])
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
def reset_secret!
|
|
286
|
+
update_attributes(:secret => Platform::Helper.generate_key(40)[0,40])
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
def authorize_user(user = Platform::Config.current_user)
|
|
290
|
+
Platform::ApplicationUser.touch(self, user)
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
def authorized_user?(user = Platform::Config.current_user)
|
|
294
|
+
not Platform::ApplicationUser.find(:first, :conditions => ["application_id = ? and user_id = ?", self.id, user.id]).nil?
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def deauthorize_user(user = Platform::Config.current_user)
|
|
298
|
+
valid_tokens_for_user(user).each do |token|
|
|
299
|
+
token.invalidate!
|
|
300
|
+
end
|
|
301
|
+
app_user = Platform::ApplicationUser.for(self, user)
|
|
302
|
+
app_user.destroy if app_user
|
|
303
|
+
|
|
304
|
+
# ping the deauthorization url - maybe that should be done in a task
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
# grant type password apps should require signature
|
|
308
|
+
def requires_signature?
|
|
309
|
+
false
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
def last_monthly_metric
|
|
313
|
+
@last_monthly_metric ||= Platform::MonthlyApplicationMetric.find(:first, :conditions => ["application_id = ?", id], :order => "interval desc")
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
def last_total_metric
|
|
317
|
+
@last_total_metric ||= Platform::TotalApplicationMetric.find(:first, :conditions => ["application_id = ?", id], :order => "interval desc")
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def recently_updated_reviews
|
|
321
|
+
@recently_updated_reviews ||= Platform::Rating.find(:all, :conditions => ["object_type = ? and object_id = ?", 'Platform::Application', self.id], :order => "updated_at desc", :limit => 5)
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
def recently_updated_discussions
|
|
325
|
+
@recently_updated_discussions ||= Platform::ForumTopic.find(:all, :conditions => ["subject_type = ? and subject_id = ?", 'Platform::Application', self.id], :order => "updated_at desc", :limit => 5)
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
############################################################################
|
|
330
|
+
#### Category Management Methods
|
|
331
|
+
############################################################################
|
|
332
|
+
|
|
333
|
+
def category_names
|
|
334
|
+
categories.collect{|cat| cat.name}.join(", ")
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
def add_category(cat)
|
|
338
|
+
cat = Platform::Category.find_by_keyword(cat) if cat.is_a?(String)
|
|
339
|
+
return nil if not cat
|
|
340
|
+
|
|
341
|
+
Platform::ApplicationCategory.find_or_create(self, cat)
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
def add_categories(catigories)
|
|
345
|
+
catigories.each do |cat|
|
|
346
|
+
add_category(cat)
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def remove_category(cat)
|
|
351
|
+
cat = Platform::Category.find_by_keyword(cat) if cat.is_a?(String)
|
|
352
|
+
return nil if not cat
|
|
353
|
+
|
|
354
|
+
app_cat = Platform::ApplicationCategory.find_by_application_id_and_category_id(self.id, cat.id)
|
|
355
|
+
app_cat.destroy if app_cat
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
def remove_categories(categories)
|
|
359
|
+
categories.each do |cat|
|
|
360
|
+
remove_category(cat)
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
def self.featured_for_category(category, page = 1, per_page = 20)
|
|
365
|
+
self.where("platform_applications.state='approved' and platform_application_categories.category_id = ? and platform_application_categories.featured = ?", category.id, true).joins(:categories).order("platform_application_categories.position asc").page(page).per(per_page)
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
def self.regular_for_category(category, page = 1, per_page = 20)
|
|
369
|
+
self.where("platform_applications.state='approved' and platform_application_categories.category_id = ? and (platform_application_categories.featured is null or platform_application_categories.featured = ?)", category.id, false).joins(:categories).order("platform_application_categories.position asc").page(page).per(per_page)
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
def versioned_name
|
|
373
|
+
@versioned_name ||= begin
|
|
374
|
+
"#{name} #{version}"
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
protected
|
|
379
|
+
|
|
380
|
+
def generate_keys
|
|
381
|
+
self.key = Platform::Helper.generate_key(40)[0,40] if key.nil?
|
|
382
|
+
self.secret = Platform::Helper.generate_key(40)[0,40] if secret.nil?
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
# after_create :notify_admins
|
|
386
|
+
# def notify_admins
|
|
387
|
+
# return unless Registry.api.admin_email?
|
|
388
|
+
# return unless Platform::Config.current_user
|
|
389
|
+
#
|
|
390
|
+
# message = "#{Platform::Config.current_user.name} (#{Platform::Config.current_user.admin_link}) has created an app called #{name} (#{admin_link})."
|
|
391
|
+
# SystemNotifier.deliver_to_admin(message, :subject => 'Client Application Created', :to => Registry.api.admin_email)
|
|
392
|
+
# end
|
|
393
|
+
|
|
394
|
+
end
|