Commit ba1e746fd98eb48a88a17281373a0bab5196e3f1

Authored by Victor Costa
1 parent f644224e

rails3: fix profile members management

app/models/environment.rb.orig 0 → 100644
@@ -0,0 +1,938 @@ @@ -0,0 +1,938 @@
  1 +# A Environment is like a website to be hosted in the platform. It may
  2 +# contain multiple Profile's and can be identified by several different
  3 +# domains.
  4 +class Environment < ActiveRecord::Base
  5 +
  6 +<<<<<<< HEAD
  7 + attr_accessible :name, :is_default, :signup_welcome_text_subject, :signup_welcome_text_body, :terms_of_use, :message_for_disabled_enterprise, :news_amount_by_folder, :default_language, :languages, :description, :organization_approval_method, :enabled_plugins, :enabled_features, :enabled_blocks, :redirection_after_login, :redirection_after_signup, :contact_email, :theme, :reports_lower_bound, :noreply_email, :signup_welcome_screen_body
  8 +=======
  9 + attr_accessible :name, :is_default, :signup_welcome_text_subject, :signup_welcome_text_body, :terms_of_use, :message_for_disabled_enterprise, :news_amount_by_folder, :default_language, :languages, :description, :organization_approval_method, :enabled_plugins, :enabled_features, :disabled_blocks, :redirection_after_login, :redirection_after_signup, :contact_email, :theme, :reports_lower_bound
  10 +>>>>>>> rails3_AI3163-enable_disable_blocks
  11 +
  12 + has_many :users
  13 +
  14 + self.partial_updates = false
  15 +
  16 + has_many :tasks, :dependent => :destroy, :as => 'target'
  17 +
  18 + IDENTIFY_SCRIPTS = /(php[0-9s]?|[sp]htm[l]?|pl|py|cgi|rb)/
  19 +
  20 + def self.verify_filename(filename)
  21 + filename += '.txt' if File.extname(filename) =~ IDENTIFY_SCRIPTS
  22 + filename
  23 + end
  24 +
  25 + PERMISSIONS['Environment'] = {
  26 + 'view_environment_admin_panel' => N_('View environment admin panel'),
  27 + 'edit_environment_features' => N_('Edit environment features'),
  28 + 'edit_environment_design' => N_('Edit environment design'),
  29 + 'manage_environment_categories' => N_('Manage environment categories'),
  30 + 'manage_environment_roles' => N_('Manage environment roles'),
  31 + 'manage_environment_validators' => N_('Manage environment validators'),
  32 + 'manage_environment_users' => N_('Manage environment users'),
  33 + 'manage_environment_templates' => N_('Manage environment templates'),
  34 + 'manage_environment_licenses' => N_('Manage environment licenses'),
  35 + 'manage_environment_trusted_sites' => N_('Manage environment trusted sites'),
  36 + 'edit_appearance' => N_('Edit appearance'),
  37 + }
  38 +
  39 + module Roles
  40 + def self.admin(env_id)
  41 + Role.find_by_key_and_environment_id('environment_administrator', env_id)
  42 + end
  43 + end
  44 +
  45 + after_create :create_roles
  46 + def create_roles
  47 + Role.create!(
  48 + :key => 'environment_administrator',
  49 + :name => N_('Environment Administrator'),
  50 + :environment => self,
  51 + :permissions => PERMISSIONS[Environment.name].keys + PERMISSIONS[Profile.name].keys
  52 + )
  53 + Role.create!(
  54 + :key => 'profile_admin',
  55 + :name => N_('Profile Administrator'),
  56 + :environment => self,
  57 + :permissions => PERMISSIONS[Profile.name].keys
  58 + )
  59 + # members for enterprises, communities etc
  60 + Role.create!(
  61 + :key => "profile_member",
  62 + :name => N_('Member'),
  63 + :environment => self,
  64 + :permissions => [
  65 + 'invite_members',
  66 + ]
  67 + )
  68 + # moderators for enterprises, communities etc
  69 + Role.create!(
  70 + :key => 'profile_moderator',
  71 + :name => N_('Moderator'),
  72 + :environment => self,
  73 + :permissions => [
  74 + 'manage_memberships',
  75 + 'edit_profile_design',
  76 + 'manage_products',
  77 + 'manage_friends',
  78 + 'perform_task'
  79 + ]
  80 + )
  81 + end
  82 +
  83 + def add_admin(user)
  84 + self.affiliate(user, Environment::Roles.admin(self.id))
  85 + end
  86 +
  87 + def remove_admin(user)
  88 + self.disaffiliate(user, Environment::Roles.admin(self.id))
  89 + end
  90 +
  91 + def admins
  92 + Person.members_of(self).all(:conditions => ['role_assignments.role_id = ?', Environment::Roles.admin(self).id])
  93 + end
  94 +
  95 + # returns the available features for a Environment, in the form of a
  96 + # hash, with pairs in the form <tt>'feature_name' => 'Feature name'</tt>.
  97 + def self.available_features
  98 + {
  99 + 'disable_asset_articles' => _('Disable search for articles '),
  100 + 'disable_asset_enterprises' => _('Disable search for enterprises'),
  101 + 'disable_asset_people' => _('Disable search for people'),
  102 + 'disable_asset_communities' => _('Disable search for communities'),
  103 + 'disable_asset_products' => _('Disable search for products'),
  104 + 'disable_asset_events' => _('Disable search for events'),
  105 + 'disable_categories' => _('Disable categories'),
  106 + 'disable_header_and_footer' => _('Disable header/footer editing by users'),
  107 + 'disable_gender_icon' => _('Disable gender icon'),
  108 + 'disable_categories_menu' => _('Disable the categories menu'),
  109 + 'disable_select_city_for_contact' => _('Disable state/city select for contact form'),
  110 + 'disable_contact_person' => _('Disable contact for people'),
  111 + 'disable_contact_community' => _('Disable contact for groups/communities'),
  112 +
  113 + 'products_for_enterprises' => _('Enable products for enterprises'),
  114 + 'enterprise_registration' => _('Enterprise registration'),
  115 + 'enterprise_activation' => _('Enable activation of enterprises'),
  116 + 'enterprises_are_disabled_when_created' => _('Enterprises are disabled when created'),
  117 + 'enterprises_are_validated_when_created' => _('Enterprises are validated when created'),
  118 +
  119 + 'media_panel' => _('Media panel in WYSIWYG editor'),
  120 + 'select_preferred_domain' => _('Select preferred domains per profile'),
  121 + 'use_portal_community' => _('Use the portal as news source for front page'),
  122 + 'user_themes' => _('Allow users to create their own themes'),
  123 + 'search_in_home' => _("Display search form in home page"),
  124 +
  125 + 'cant_change_homepage' => _("Don't allow users to change which article to use as homepage"),
  126 + 'display_header_footer_explanation' => _("Display explanation about header and footer"),
  127 + 'articles_dont_accept_comments_by_default' => _("Articles don't accept comments by default"),
  128 + 'organizations_are_moderated_by_default' => _("Organizations have moderated publication by default"),
  129 + 'enable_organization_url_change' => _("Allow organizations to change their URL"),
  130 + 'admin_must_approve_new_communities' => _("Admin must approve creation of communities"),
  131 + 'show_balloon_with_profile_links_when_clicked' => _('Show a balloon with profile links when a profile image is clicked'),
  132 + 'xmpp_chat' => _('XMPP/Jabber based chat'),
  133 + 'show_zoom_button_on_article_images' => _('Show a zoom link on all article images'),
  134 + 'captcha_for_logged_users' => _('Ask captcha when a logged user comments too'),
  135 + 'skip_new_user_email_confirmation' => _('Skip e-mail confirmation for new users'),
  136 + 'send_welcome_email_to_new_users' => _('Send welcome e-mail to new users'),
  137 + 'allow_change_of_redirection_after_login' => _('Allow users to set the page to redirect after login'),
  138 + 'display_my_communities_on_user_menu' => _('Display on menu the list of communities the user can manage'),
  139 + 'display_my_enterprises_on_user_menu' => _('Display on menu the list of enterprises the user can manage')
  140 + }
  141 + end
  142 +
  143 + def self.login_redirection_options
  144 + {
  145 + 'keep_on_same_page' => _('Stays on the same page the user was before login.'),
  146 + 'site_homepage' => _('Redirects the user to the environment homepage.'),
  147 + 'user_profile_page' => _('Redirects the user to his profile page.'),
  148 + 'user_homepage' => _('Redirects the user to his homepage.'),
  149 + 'user_control_panel' => _('Redirects the user to his control panel.')
  150 + }
  151 + end
  152 + validates_inclusion_of :redirection_after_login, :in => Environment.login_redirection_options.keys, :allow_nil => true
  153 +
  154 + def self.signup_redirection_options
  155 + {
  156 + 'keep_on_same_page' => _('Stays on the same page the user was before signup.'),
  157 + 'site_homepage' => _('Redirects the user to the environment homepage.'),
  158 + 'user_profile_page' => _('Redirects the user to his profile page.'),
  159 + 'user_homepage' => _('Redirects the user to his homepage.'),
  160 + 'user_control_panel' => _('Redirects the user to his control panel.')
  161 + }
  162 + end
  163 + validates_inclusion_of :redirection_after_signup, :in => Environment.signup_redirection_options.keys, :allow_nil => true
  164 +
  165 +
  166 + # #################################################
  167 + # Relationships and applied behaviour
  168 + # #################################################
  169 +
  170 + acts_as_having_boxes
  171 +
  172 + after_create do |env|
  173 + 3.times do
  174 + env.boxes << Box.new
  175 + end
  176 +
  177 + # main area
  178 + env.boxes[0].blocks << MainBlock.new
  179 +
  180 + # "left" area
  181 + env.boxes[1].blocks << LoginBlock.new
  182 + # TODO EnvironmentStatisticsBlock is DEPRECATED and will be removed from
  183 + # the Noosfero core soon, see ActionItem3045
  184 + env.boxes[1].blocks << EnvironmentStatisticsBlock.new
  185 + env.boxes[1].blocks << RecentDocumentsBlock.new
  186 +
  187 + # "right" area
  188 + env.boxes[2].blocks << CommunitiesBlock.new(:limit => 6)
  189 + env.boxes[2].blocks << PeopleBlock.new(:limit => 6)
  190 + end
  191 +
  192 + # One Environment can be reached by many domains
  193 + has_many :domains, :as => :owner
  194 + has_many :profiles, :dependent => :destroy
  195 +
  196 + has_many :organizations
  197 + has_many :enterprises
  198 + has_many :products, :through => :enterprises
  199 + has_many :people
  200 + has_many :communities
  201 + has_many :licenses
  202 +
  203 + has_many :categories
  204 + has_many :display_categories, :class_name => 'Category', :conditions => 'display_color is not null and parent_id is null', :order => 'display_color'
  205 +
  206 + has_many :product_categories, :conditions => { :type => 'ProductCategory'}
  207 + has_many :regions
  208 + has_many :states
  209 + has_many :cities
  210 +
  211 + has_many :roles, :dependent => :destroy
  212 +
  213 + has_many :qualifiers
  214 + has_many :certifiers
  215 +
  216 + has_many :mailings, :class_name => 'EnvironmentMailing', :foreign_key => :source_id, :as => 'source'
  217 +
  218 + acts_as_accessible
  219 +
  220 + has_many :units, :order => 'position'
  221 + has_many :production_costs, :as => :owner
  222 +
  223 + def superior_intances
  224 + [self, nil]
  225 + end
  226 + # #################################################
  227 + # Attributes
  228 + # #################################################
  229 +
  230 + # store the Environment settings as YAML-serialized Hash.
  231 + acts_as_having_settings :field => :settings
  232 +
  233 + # the environment's terms of use: every user must accept them before registering.
  234 + settings_items :terms_of_use, :type => String
  235 +
  236 + # the environment's terms of enterprise use: every enterprise member must accept them before
  237 + # registering or activating enterprises.
  238 + settings_items :terms_of_enterprise_use, :type => String
  239 +
  240 + # returns the approval method used for this environment. Possible values are:
  241 + #
  242 + # Defaults to <tt>:admim</tt>.
  243 + settings_items :organization_approval_method, :type => Symbol, :default => :admin
  244 +
  245 + # Whether this environment should force having 'www.' in its domain name or
  246 + # not. Defauls to false.
  247 + #
  248 + # Sets the value of #force_www. <tt>value</tt> must be a boolean.
  249 + #
  250 + # See also #default_hostname
  251 + settings_items :force_www, :default => false
  252 +
  253 + settings_items :message_for_friend_invitation, :type => String
  254 + def message_for_friend_invitation
  255 + settings[:message_for_member_invitation] || InviteFriend.mail_template
  256 + end
  257 +
  258 + settings_items :message_for_member_invitation, :type => String
  259 + def message_for_member_invitation
  260 + settings[:message_for_member_invitation] || InviteMember.mail_template
  261 + end
  262 +
  263 + settings_items :min_signup_delay, :type => Integer, :default => 3 #seconds
  264 + settings_items :activation_blocked_text, :type => String
  265 + settings_items :message_for_disabled_enterprise, :type => String,
  266 + :default => _('This enterprise needs to be enabled.')
  267 + settings_items :location, :type => String
  268 + settings_items :layout_template, :type => String, :default => 'default'
  269 + settings_items :homepage, :type => String
  270 + settings_items :description, :type => String, :default => '<div style="text-align: center"><a href="http://noosfero.org/"><img src="/images/noosfero-network.png" alt="Noosfero"/></a></div>'
  271 + settings_items :local_docs, :type => Array, :default => []
  272 + settings_items :news_amount_by_folder, :type => Integer, :default => 4
  273 + settings_items :help_message_to_add_enterprise, :type => String, :default => ''
  274 + settings_items :tip_message_enterprise_activation_question, :type => String, :default => ''
  275 +
  276 + settings_items :currency_unit, :type => String, :default => '$'
  277 + settings_items :currency_separator, :type => String, :default => '.'
  278 + settings_items :currency_delimiter, :type => String, :default => ','
  279 +
  280 + settings_items :trusted_sites_for_iframe, :type => Array, :default => %w[
  281 + developer.myspace.com
  282 + itheora.org
  283 + maps.google.com
  284 + platform.twitter.com
  285 + player.vimeo.com
  286 + stream.softwarelivre.org
  287 + tv.softwarelivre.org
  288 + www.facebook.com
  289 + www.flickr.com
  290 + www.gmodules.com
  291 + www.youtube.com
  292 + ] + ('a' .. 'z').map{|i| "#{i}.yimg.com"}
  293 +
  294 + settings_items :enabled_plugins, :type => Array, :default => []
  295 +
  296 + settings_items :disabled_blocks, :type => Array, :default => []
  297 +
  298 + settings_items :search_hints, :type => Hash, :default => {}
  299 +
  300 + # Set to return http forbidden to host not on the allow origin list bellow
  301 + settings_items :restrict_to_access_control_origins, :default => false
  302 + # Set this according to http://www.w3.org/TR/cors/. Headers are set at every response
  303 + # For multiple domains acts as suggested in http://stackoverflow.com/questions/1653308/access-control-allow-origin-multiple-origin-domains
  304 + settings_items :access_control_allow_origin, :type => Array, :default => []
  305 + settings_items :access_control_allow_methods, :type => String
  306 +
  307 + settings_items :signup_welcome_screen_body, :type => String
  308 +
  309 + def has_custom_welcome_screen?
  310 + settings[:signup_welcome_screen_body].present?
  311 + end
  312 +
  313 + def news_amount_by_folder=(amount)
  314 + settings[:news_amount_by_folder] = amount.to_i
  315 + end
  316 +
  317 + # Enables a feature identified by its name
  318 + def enable(feature, must_save=true)
  319 + self.settings["#{feature}_enabled".to_sym] = true
  320 + self.save! if must_save
  321 + end
  322 +
  323 + def enable_plugin(plugin)
  324 + self.enabled_plugins += [plugin.to_s]
  325 + self.enabled_plugins.uniq!
  326 + self.save!
  327 + end
  328 +
  329 + # Disables a feature identified by its name
  330 + def disable(feature, must_save=true)
  331 + self.settings["#{feature}_enabled".to_sym] = false
  332 + self.save! if must_save
  333 + end
  334 +
  335 + def disable_plugin(plugin)
  336 + self.enabled_plugins.delete(plugin.to_s)
  337 + self.save!
  338 + end
  339 +
  340 + # Tells if a feature, identified by its name, is enabled
  341 + def enabled?(feature)
  342 + self.settings["#{feature}_enabled".to_sym] == true
  343 + end
  344 + def disabled?(feature)
  345 + !self.enabled?(feature)
  346 + end
  347 +
  348 + def plugin_enabled?(plugin)
  349 + enabled_plugins.include?(plugin.to_s)
  350 + end
  351 +
  352 + def block_disabled?(block)
  353 + disabled_blocks.include?(block.to_s)
  354 + end
  355 +
  356 + # enables the features identified by <tt>features</tt>, which is expected to
  357 + # be an Enumarable object containing the identifiers of the desired features.
  358 + # Passing <tt>nil</tt> is the same as passing an empty Array.
  359 + def enabled_features=(features)
  360 + features ||= []
  361 + self.class.available_features.keys.each do |feature|
  362 + if features.include? feature
  363 + self.enable(feature)
  364 + else
  365 + self.disable(feature)
  366 + end
  367 + end
  368 + end
  369 +
  370 + def enabled_features
  371 + features = self.class.available_features
  372 + features.delete_if{ |k, v| !self.enabled?(k) }
  373 + end
  374 +
  375 + DEFAULT_FEATURES = %w(
  376 + disable_asset_products
  377 + disable_gender_icon
  378 + products_for_enterprises
  379 + disable_select_city_for_contact
  380 + enterprise_registration
  381 + media_panel
  382 + organizations_are_moderated_by_default
  383 + show_balloon_with_profile_links_when_clicked
  384 + show_zoom_button_on_article_images
  385 + use_portal_community
  386 + )
  387 +
  388 + before_create :enable_default_features
  389 + def enable_default_features
  390 + DEFAULT_FEATURES.each do |feature|
  391 + enable(feature, false)
  392 + end
  393 + end
  394 +
  395 + # returns <tt>true</tt> if this Environment has terms of use to be
  396 + # accepted by users before registration.
  397 + def has_terms_of_use?
  398 + ! self.terms_of_use.blank?
  399 + end
  400 +
  401 + # returns <tt>true</tt> if this Environment has terms of enterprise use to be
  402 + # accepted by users before registration or activation of enterprises.
  403 + def has_terms_of_enterprise_use?
  404 + ! self.terms_of_enterprise_use.blank?
  405 + end
  406 +
  407 + # Sets the organization_approval_method. Only accepts the following values:
  408 + #
  409 + # * <tt>:admin</tt>: organization registration must be approved by the
  410 + # environment administrator.
  411 + # * <tt>:region</tt>: organization registering must be approved by some other
  412 + # organization asssigned as validator to the Region the new organization
  413 + # belongs to.
  414 + # * <tt>:none</tt>: organization registration is approved by default.
  415 + #
  416 + # Trying to set organization_approval_method to any other value will raise an
  417 + # ArgumentError.
  418 + #
  419 + # The value passed as argument is converted to a Symbol before being actually
  420 + # set to this setting.
  421 + def organization_approval_method=(value)
  422 + actual_value = value.to_sym
  423 +
  424 + accepted_values = %w[
  425 + admin
  426 + region
  427 + none
  428 + ].map(&:to_sym)
  429 + raise ArgumentError unless accepted_values.include?(actual_value)
  430 +
  431 + self.settings[:organization_approval_method] = actual_value
  432 + end
  433 +
  434 + def custom_person_fields
  435 + self.settings[:custom_person_fields].nil? ? {} : self.settings[:custom_person_fields]
  436 + end
  437 +
  438 + def custom_person_fields=(values)
  439 + if values['schooling'] && values['schooling']['active'] == 'true'
  440 + schooling_status = values['schooling']
  441 + end
  442 +
  443 + self.settings[:custom_person_fields] = values.delete_if { |key, value| ! Person.fields.include?(key)}
  444 + self.settings[:custom_person_fields].each_pair do |key, value|
  445 + if value['required'] == 'true'
  446 + self.settings[:custom_person_fields][key]['active'] = 'true'
  447 + self.settings[:custom_person_fields][key]['signup'] = 'true'
  448 + end
  449 + if value['signup'] == 'true'
  450 + self.settings[:custom_person_fields][key]['active'] = 'true'
  451 + end
  452 + end
  453 +
  454 + if schooling_status
  455 + self.settings[:custom_person_fields]['schooling_status'] = schooling_status
  456 + end
  457 + end
  458 +
  459 + def custom_person_field(field, status)
  460 + if (custom_person_fields[field] && custom_person_fields[field][status] == 'true')
  461 + return true
  462 + end
  463 + false
  464 + end
  465 +
  466 + def active_person_fields
  467 + (custom_person_fields.delete_if { |key, value| !custom_person_field(key, 'active')}).keys || []
  468 + end
  469 +
  470 + def required_person_fields
  471 + required_fields = []
  472 + active_person_fields.each do |field|
  473 + required_fields << field if custom_person_fields[field]['required'] == 'true'
  474 + end
  475 + required_fields
  476 + end
  477 +
  478 + def signup_person_fields
  479 + signup_fields = []
  480 + active_person_fields.each do |field|
  481 + signup_fields << field if custom_person_fields[field]['signup'] == 'true'
  482 + end
  483 + signup_fields
  484 + end
  485 +
  486 + def invitation_mail_template(profile)
  487 + if profile.person?
  488 + message_for_friend_invitation
  489 + else
  490 + message_for_member_invitation
  491 + end
  492 + end
  493 +
  494 + def custom_enterprise_fields
  495 + self.settings[:custom_enterprise_fields].nil? ? {} : self.settings[:custom_enterprise_fields]
  496 + end
  497 +
  498 + def custom_enterprise_fields=(values)
  499 + self.settings[:custom_enterprise_fields] = values.delete_if { |key, value| ! Enterprise.fields.include?(key)}
  500 + self.settings[:custom_enterprise_fields].each_pair do |key, value|
  501 + if value['required'] == 'true'
  502 + self.settings[:custom_enterprise_fields][key]['active'] = 'true'
  503 + self.settings[:custom_enterprise_fields][key]['signup'] = 'true'
  504 + end
  505 + if value['signup'] == 'true'
  506 + self.settings[:custom_enterprise_fields][key]['active'] = 'true'
  507 + end
  508 + end
  509 + end
  510 +
  511 + def custom_enterprise_field(field, status)
  512 + if (custom_enterprise_fields[field] && custom_enterprise_fields[field][status] == 'true')
  513 + return true
  514 + end
  515 + false
  516 + end
  517 +
  518 + def active_enterprise_fields
  519 + (custom_enterprise_fields.delete_if { |key, value| !custom_enterprise_field(key, 'active')}).keys || []
  520 + end
  521 +
  522 + def required_enterprise_fields
  523 + required_fields = []
  524 + active_enterprise_fields.each do |field|
  525 + required_fields << field if custom_enterprise_fields[field]['required'] == 'true'
  526 + end
  527 + required_fields
  528 + end
  529 +
  530 + def signup_enterprise_fields
  531 + signup_fields = []
  532 + active_enterprise_fields.each do |field|
  533 + signup_fields << field if custom_enterprise_fields[field]['signup'] == 'true'
  534 + end
  535 + signup_fields
  536 + end
  537 +
  538 + def custom_community_fields
  539 + self.settings[:custom_community_fields].nil? ? {} : self.settings[:custom_community_fields]
  540 + end
  541 + def custom_community_fields=(values)
  542 + self.settings[:custom_community_fields] = values.delete_if { |key, value| ! Community.fields.include?(key) }
  543 + self.settings[:custom_community_fields].each_pair do |key, value|
  544 + if value['required'] == 'true'
  545 + self.settings[:custom_community_fields][key]['active'] = 'true'
  546 + self.settings[:custom_community_fields][key]['signup'] = 'true'
  547 + end
  548 + if value['signup'] == 'true'
  549 + self.settings[:custom_community_fields][key]['active'] = 'true'
  550 + end
  551 + end
  552 + end
  553 +
  554 + def custom_community_field(field, status)
  555 + if (custom_community_fields[field] && custom_community_fields[field][status] == 'true')
  556 + return true
  557 + end
  558 + false
  559 + end
  560 +
  561 + def active_community_fields
  562 + (custom_community_fields.delete_if { |key, value| !custom_community_field(key, 'active')}).keys
  563 + end
  564 +
  565 + def required_community_fields
  566 + required_fields = []
  567 + active_community_fields.each do |field|
  568 + required_fields << field if custom_community_fields[field]['required'] == 'true'
  569 + end
  570 + required_fields
  571 + end
  572 +
  573 + def signup_community_fields
  574 + signup_fields = []
  575 + active_community_fields.each do |field|
  576 + signup_fields << field if custom_community_fields[field]['signup'] == 'true'
  577 + end
  578 + signup_fields
  579 + end
  580 +
  581 + serialize :signup_welcome_text, Hash
  582 + def signup_welcome_text
  583 + self[:signup_welcome_text] ||= {}
  584 + end
  585 +
  586 + def signup_welcome_text_subject
  587 + self.signup_welcome_text[:subject]
  588 + end
  589 +
  590 + def signup_welcome_text_subject=(subject)
  591 + self.signup_welcome_text[:subject] = subject
  592 + end
  593 +
  594 + def signup_welcome_text_body
  595 + self.signup_welcome_text[:body]
  596 + end
  597 +
  598 + def signup_welcome_text_body=(body)
  599 + self.signup_welcome_text[:body] = body
  600 + end
  601 +
  602 + def has_signup_welcome_text?
  603 + signup_welcome_text && !signup_welcome_text_body.blank?
  604 + end
  605 +
  606 + # #################################################
  607 + # Validations
  608 + # #################################################
  609 +
  610 + # <tt>name</tt> is mandatory
  611 + validates_presence_of :name
  612 +
  613 + # only one environment can be the default one
  614 + validates_uniqueness_of :is_default, :if => (lambda do |environment| environment.is_default? end), :message => N_('Only one Virtual Community can be the default one')
  615 +
  616 + validates_format_of :contact_email, :noreply_email, :with => Noosfero::Constants::EMAIL_FORMAT, :allow_blank => true
  617 +
  618 + xss_terminate :only => [ :message_for_disabled_enterprise ], :with => 'white_list', :on => 'validation'
  619 +
  620 + validates_presence_of :theme
  621 + validates_numericality_of :reports_lower_bound, :allow_nil => false, :only_integer => true, :greater_than_or_equal_to => 0
  622 +
  623 + include WhiteListFilter
  624 + filter_iframes :message_for_disabled_enterprise
  625 + def iframe_whitelist
  626 + trusted_sites_for_iframe
  627 + end
  628 +
  629 + # #################################################
  630 + # Business logic in general
  631 + # #################################################
  632 +
  633 + # the default Environment.
  634 + def self.default
  635 + self.find(:first, :conditions => [ 'is_default = ?', true ] )
  636 + end
  637 +
  638 + # returns an array with the top level categories for this environment.
  639 + def top_level_categories
  640 + Category.top_level_for(self)
  641 + end
  642 +
  643 + # Returns the hostname of the first domain associated to this environment.
  644 + #
  645 + # If #force_www is true, adds 'www.' at the beginning of the hostname. If the
  646 + # environment has not associated domains, returns 'localhost'.
  647 + def default_hostname(email_hostname = false)
  648 + domain = 'localhost'
  649 + unless self.domains(true).empty?
  650 + domain = (self.domains.find_by_is_default(true) || self.domains.find(:first, :order => 'id')).name
  651 + domain = email_hostname ? domain : (force_www ? ('www.' + domain) : domain)
  652 + end
  653 + domain
  654 + end
  655 +
  656 + def admin_url
  657 + { :controller => 'admin_panel', :action => 'index' }
  658 + end
  659 +
  660 + def top_url
  661 + url = 'http://'
  662 + url << (Noosfero.url_options.key?(:host) ? Noosfero.url_options[:host] : default_hostname)
  663 + url << ':' << Noosfero.url_options[:port].to_s if Noosfero.url_options.key?(:port)
  664 + url
  665 + end
  666 +
  667 + def to_s
  668 + self.name || '?'
  669 + end
  670 +
  671 + has_many :articles, :through => :profiles
  672 + def recent_documents(limit = 10, options = {}, pagination = true)
  673 + self.articles.recent(limit, options, pagination)
  674 + end
  675 +
  676 + has_many :events, :through => :profiles, :source => :articles, :class_name => 'Event'
  677 +
  678 + has_many :tags, :through => :articles
  679 +
  680 + def tag_counts
  681 + articles.tag_counts.inject({}) do |memo,tag|
  682 + memo[tag.name] = tag.count
  683 + memo
  684 + end
  685 + end
  686 +
  687 + def themes
  688 + if settings[:themes]
  689 + Theme.system_themes.select { |theme| settings[:themes].include?(theme.id) }
  690 + else
  691 + []
  692 + end
  693 + end
  694 +
  695 + def themes=(values)
  696 + settings[:themes] = values
  697 + end
  698 +
  699 + def add_themes(values)
  700 + if settings[:themes].nil?
  701 + self.themes = values
  702 + else
  703 + settings[:themes] += values
  704 + end
  705 + end
  706 +
  707 + def update_theme(theme)
  708 + self.theme = theme
  709 + self.save!
  710 + end
  711 +
  712 + def update_layout_template(template)
  713 + self.layout_template = template
  714 + self.save!
  715 + end
  716 +
  717 + before_create do |env|
  718 + env.settings[:themes] ||= %w[
  719 + aluminium
  720 + butter
  721 + chameleon
  722 + chocolate
  723 + noosfero
  724 + orange
  725 + plum
  726 + scarletred
  727 + skyblue
  728 + ]
  729 + end
  730 +
  731 + def community_template
  732 + template = Community.find_by_id settings[:community_template_id]
  733 + template if template && template.is_template
  734 + end
  735 +
  736 + def community_template=(value)
  737 + settings[:community_template_id] = value.id
  738 + end
  739 +
  740 + def person_template
  741 + template = Person.find_by_id settings[:person_template_id]
  742 + template if template && template.is_template
  743 + end
  744 +
  745 + def person_template=(value)
  746 + settings[:person_template_id] = value.id
  747 + end
  748 +
  749 + def enterprise_template
  750 + template = Enterprise.find_by_id settings[:enterprise_template_id]
  751 + template if template && template.is_template
  752 + end
  753 +
  754 + def enterprise_template=(value)
  755 + settings[:enterprise_template_id] = value.id
  756 + end
  757 +
  758 + def inactive_enterprise_template
  759 + template = Enterprise.find_by_id settings[:inactive_enterprise_template_id]
  760 + template if template && template.is_template
  761 + end
  762 +
  763 + def inactive_enterprise_template=(value)
  764 + settings[:inactive_enterprise_template_id] = value.id
  765 + end
  766 +
  767 + def replace_enterprise_template_when_enable
  768 + settings[:replace_enterprise_template_when_enable] || false
  769 + end
  770 +
  771 + def replace_enterprise_template_when_enable=(value)
  772 + settings[:replace_enterprise_template_when_enable] = value
  773 + end
  774 +
  775 + def portal_community
  776 + Community[settings[:portal_community_identifier]]
  777 + end
  778 +
  779 + def portal_community=(value)
  780 + settings[:portal_community_identifier] = value.nil? ? nil : value.identifier
  781 + end
  782 +
  783 + def unset_portal_community!
  784 + self.portal_community=nil
  785 + self.portal_folders=nil
  786 + self.news_amount_by_folder=nil
  787 + self.disable('use_portal_community')
  788 + self.save
  789 + end
  790 +
  791 + def is_portal_community?(profile)
  792 + portal_community == profile
  793 + end
  794 +
  795 + def portal_folders
  796 + (settings[:portal_folders] || []).map{|fid| portal_community.articles.find(:first, :conditions => { :id => fid }) }.compact
  797 + end
  798 +
  799 + def portal_folders=(folders)
  800 + settings[:portal_folders] = folders ? folders.map(&:id) : nil
  801 + end
  802 +
  803 + def portal_news_cache_key(language='en')
  804 + "home-page-news/#{cache_key}-#{language}"
  805 + end
  806 +
  807 + def notification_emails
  808 + [noreply_email.blank? ? nil : noreply_email].compact + admins.map(&:email)
  809 + end
  810 +
  811 + after_create :create_templates
  812 +
  813 + def create_templates
  814 + prefix = self.name.to_slug + '_'
  815 +
  816 + enterprise_template = Enterprise.new(
  817 + :name => 'Enterprise template',
  818 + :identifier => prefix + 'enterprise_template'
  819 + )
  820 +
  821 + inactive_enterprise_template = Enterprise.new(
  822 + :name => 'Inactive Enterprise template',
  823 + :identifier => prefix + 'inactive_enterprise_template'
  824 + )
  825 +
  826 + community_template = Community.new(
  827 + :name => 'Community template',
  828 + :identifier => prefix + 'community_template'
  829 + )
  830 +
  831 + [
  832 + enterprise_template,
  833 + inactive_enterprise_template,
  834 + community_template
  835 + ].each do |profile|
  836 + profile.is_template = true
  837 + profile.visible = false
  838 + profile.environment = self
  839 + profile.save!
  840 + end
  841 +
  842 + pass = Digest::MD5.hexdigest rand.to_s
  843 + user = User.new(:login => (prefix + 'person_template'), :email => (prefix + 'template@template.noo'), :password => pass, :password_confirmation => pass)
  844 + user.environment = self
  845 + user.save!
  846 +
  847 + person_template = user.person
  848 + person_template.name = "Person template"
  849 + person_template.is_template = true
  850 + person_template.visible = false
  851 + person_template.save!
  852 +
  853 + self.enterprise_template = enterprise_template
  854 + self.inactive_enterprise_template = inactive_enterprise_template
  855 + self.community_template = community_template
  856 + self.person_template = person_template
  857 + self.save!
  858 + end
  859 +
  860 + after_create :create_default_licenses
  861 + def create_default_licenses
  862 + [
  863 + { :name => 'CC (by)', :url => 'http://creativecommons.org/licenses/by/3.0/legalcode'},
  864 + { :name => 'CC (by-nd)', :url => 'http://creativecommons.org/licenses/by-nd/3.0/legalcode'},
  865 + { :name => 'CC (by-sa)', :url => 'http://creativecommons.org/licenses/by-sa/3.0/legalcode'},
  866 + { :name => 'CC (by-nc)', :url => 'http://creativecommons.org/licenses/by-nc/3.0/legalcode'},
  867 + { :name => 'CC (by-nc-nd)', :url => 'http://creativecommons.org/licenses/by-nc-nd/3.0/legalcode'},
  868 + { :name => 'CC (by-nc-sa)', :url => 'http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode'},
  869 + { :name => 'Free Art', :url => 'http://artlibre.org/licence/lal/en'},
  870 + { :name => 'GNU FDL', :url => 'http://www.gnu.org/licenses/fdl-1.3.txt'},
  871 + ].each do |data|
  872 + license = License.new(data)
  873 + license.environment = self
  874 + license.save!
  875 + end
  876 + end
  877 +
  878 + def highlighted_products_with_image(options = {})
  879 + Product.find(:all, {:conditions => {:highlighted => true, :profile_id => self.enterprises.find(:all, :select => :id) }, :joins => :image}.merge(options))
  880 + end
  881 +
  882 + settings_items :home_cache_in_minutes, :type => :integer, :default => 5
  883 + settings_items :general_cache_in_minutes, :type => :integer, :default => 15
  884 + settings_items :profile_cache_in_minutes, :type => :integer, :default => 15
  885 +
  886 + def image_galleries
  887 + portal_community ? portal_community.image_galleries : []
  888 + end
  889 +
  890 + serialize :languages
  891 +
  892 + before_validation do |environment|
  893 + environment.default_language = nil if environment.default_language.blank?
  894 + end
  895 +
  896 + validate :default_language_available
  897 + validate :languages_available
  898 +
  899 + def locales
  900 + if languages.present?
  901 + languages.inject({}) {|r, l| r.merge({l => Noosfero.locales[l]})}
  902 + else
  903 + Noosfero.locales
  904 + end
  905 + end
  906 +
  907 + def default_locale
  908 + default_language || Noosfero.default_locale
  909 + end
  910 +
  911 + def available_locales
  912 + locales_list = locales.keys
  913 + # move English to the beginning
  914 + if locales_list.include?('en')
  915 + locales_list = ['en'] + (locales_list - ['en']).sort
  916 + end
  917 + locales_list
  918 + end
  919 +
  920 + private
  921 +
  922 + def default_language_available
  923 + if default_language.present? && !available_locales.include?(default_language)
  924 + errors.add(:default_language, _('is not available.'))
  925 + end
  926 + end
  927 +
  928 + def languages_available
  929 + if languages.present?
  930 + languages.each do |language|
  931 + if !Noosfero.available_locales.include?(language)
  932 + errors.add(:languages, _('have unsupported languages.'))
  933 + break
  934 + end
  935 + end
  936 + end
  937 + end
  938 +end
app/views/profile_members/_members_list.html.erb
@@ -17,9 +17,9 @@ @@ -17,9 +17,9 @@
17 <%= button_without_text :edit, _('Edit'), :action => 'change_role', :id => m %> 17 <%= button_without_text :edit, _('Edit'), :action => 'change_role', :id => m %>
18 <%= button_to_remote_without_text(:remove, _('Remove'), 18 <%= button_to_remote_without_text(:remove, _('Remove'),
19 :update => 'members-list', 19 :update => 'members-list',
20 - :loading => j('$("members-list").addClassName("loading")'),  
21 - :success => j("$('tr-#{m.identifier}').show()"),  
22 - :complete => j('$("members-list").removeClassName("loading")'), 20 + :loading => "$('members-list').addClassName('loading')",
  21 + :success => "$('tr-#{m.identifier}').show()",
  22 + :complete => "$('members-list').removeClassName('loading')",
23 :url => { :id => m }.merge(remove_action)) if m != user %> 23 :url => { :id => m }.merge(remove_action)) if m != user %>
24 </div> 24 </div>
25 </td> 25 </td>