Commit 8d4c86eaa2f89eccf9b2c9e3e457604688506aa8
Committed by
Luciano Prestes
1 parent
f73553ab
Exists in
refactor_software_communities
software-communities: refactoring namespaces
Signed-off-by: Luciano Prestes Cavalcanti <lucianopcbr@gmail.com> Signed-off-by: Rodrigo Souto <rodrigo@colivre.coop.br>
Showing
59 changed files
with
1491 additions
and
1488 deletions
Show diff stats
src/noosfero-spb/software_communities/lib/categories_and_tags_block.rb
| ... | ... | @@ -1,29 +0,0 @@ |
| 1 | -class CategoriesAndTagsBlock < Block | |
| 2 | - | |
| 3 | - attr_accessible :show_name | |
| 4 | - | |
| 5 | - settings_items :show_name, :type => :boolean, :default => false | |
| 6 | - | |
| 7 | - def self.description | |
| 8 | - _('Categories and Tags') | |
| 9 | - end | |
| 10 | - | |
| 11 | - def help | |
| 12 | - _('This block displays the categories and tags of a software.') | |
| 13 | - end | |
| 14 | - | |
| 15 | - def content(args={}) | |
| 16 | - block = self | |
| 17 | - s = show_name | |
| 18 | - lambda do |object| | |
| 19 | - render( | |
| 20 | - :file => 'blocks/categories_and_tags', | |
| 21 | - :locals => { :block => block, :show_name => s } | |
| 22 | - ) | |
| 23 | - end | |
| 24 | - end | |
| 25 | - | |
| 26 | - def cacheable? | |
| 27 | - false | |
| 28 | - end | |
| 29 | -end |
src/noosfero-spb/software_communities/lib/categories_software_block.rb
| ... | ... | @@ -1,35 +0,0 @@ |
| 1 | -class CategoriesSoftwareBlock < Block | |
| 2 | - | |
| 3 | - attr_accessible :show_name | |
| 4 | - | |
| 5 | - settings_items :show_name, :type => :boolean, :default => false | |
| 6 | - | |
| 7 | - def self.description | |
| 8 | - _('Categories Softwares') | |
| 9 | - end | |
| 10 | - | |
| 11 | - def help | |
| 12 | - _('This block displays the categories and the amount of softwares for | |
| 13 | - each category.') | |
| 14 | - end | |
| 15 | - | |
| 16 | - def content(args={}) | |
| 17 | - block = self | |
| 18 | - s = show_name | |
| 19 | - | |
| 20 | - software_category = Category.find_by_name("Software") | |
| 21 | - categories = [] | |
| 22 | - categories = software_category.children.sort if software_category | |
| 23 | - | |
| 24 | - lambda do |object| | |
| 25 | - render( | |
| 26 | - :file => 'blocks/categories_software', | |
| 27 | - :locals => { :block => block, :show_name => s, :categories => categories } | |
| 28 | - ) | |
| 29 | - end | |
| 30 | - end | |
| 31 | - | |
| 32 | - def cacheable? | |
| 33 | - false | |
| 34 | - end | |
| 35 | -end |
src/noosfero-spb/software_communities/lib/create_software.rb
| ... | ... | @@ -1,115 +0,0 @@ |
| 1 | -class CreateSoftware < Task | |
| 2 | - include Rails.application.routes.url_helpers | |
| 3 | - | |
| 4 | - validates_presence_of :requestor_id, :target_id | |
| 5 | - validates_presence_of :name, :finality | |
| 6 | - | |
| 7 | - attr_accessible :name, :finality, :repository_link, :requestor, :environment, | |
| 8 | - :reject_explanation, :license_info, :identifier, :target | |
| 9 | - | |
| 10 | - alias :environment :target | |
| 11 | - alias :environment= :target= | |
| 12 | - | |
| 13 | - DATA_FIELDS = ['name', 'identifier', 'finality', 'license_info', 'repository_link'] | |
| 14 | - DATA_FIELDS.each do |field| | |
| 15 | - settings_items field.to_sym | |
| 16 | - end | |
| 17 | - | |
| 18 | - def perform | |
| 19 | - software_template = SoftwareHelper.software_template | |
| 20 | - template_id = software_template.blank? ? nil : software_template.id | |
| 21 | - | |
| 22 | - identifier = self.identifier | |
| 23 | - identifier ||= self.name.to_slug | |
| 24 | - | |
| 25 | - community = Community.create!(:name => self.name, | |
| 26 | - :identifier => identifier, | |
| 27 | - :template_id => template_id) | |
| 28 | - | |
| 29 | - community.environment = self.environment | |
| 30 | - community.add_admin(self.requestor) | |
| 31 | - | |
| 32 | - software = SoftwareInfo.create!(:finality => self.finality, | |
| 33 | - :repository_link => self.repository_link, :community_id => community.id, | |
| 34 | - :license_info => self.license_info) | |
| 35 | - end | |
| 36 | - | |
| 37 | - def title | |
| 38 | - _("New software") | |
| 39 | - end | |
| 40 | - | |
| 41 | - def subject | |
| 42 | - name | |
| 43 | - end | |
| 44 | - | |
| 45 | - def information | |
| 46 | - message = _('%{requestor} wants to create software %{subject} with') | |
| 47 | - if finality.blank? | |
| 48 | - { :message => message + _(' no finality.') } | |
| 49 | - else | |
| 50 | - { :message => message + _(' this finality:<p><em>%{finality}</em></p>'), | |
| 51 | - :variables => {:finality => finality} } | |
| 52 | - end | |
| 53 | - end | |
| 54 | - | |
| 55 | - def reject_details | |
| 56 | - true | |
| 57 | - end | |
| 58 | - | |
| 59 | - # tells if this request was rejected | |
| 60 | - def rejected? | |
| 61 | - self.status == Task::Status::CANCELLED | |
| 62 | - end | |
| 63 | - | |
| 64 | - # tells if this request was appoved | |
| 65 | - def approved? | |
| 66 | - self.status == Task::Status::FINISHED | |
| 67 | - end | |
| 68 | - | |
| 69 | - def target_notification_description | |
| 70 | - _('%{requestor} wants to create software %{subject}') % | |
| 71 | - {:requestor => requestor.name, :subject => subject} | |
| 72 | - end | |
| 73 | - | |
| 74 | - def target_notification_message | |
| 75 | - _("User \"%{user}\" just requested to create software %{software}. | |
| 76 | - You have to approve or reject it through the \"Pending Validations\" | |
| 77 | - section in your control panel.\n") % | |
| 78 | - { :user => self.requestor.name, :software => self.name } | |
| 79 | - end | |
| 80 | - | |
| 81 | - def task_created_message | |
| 82 | - _("Your request for registering software %{software} at %{environment} was | |
| 83 | - just sent. Environment administrator will receive it and will approve or | |
| 84 | - reject your request according to his methods and criteria. | |
| 85 | - | |
| 86 | - You will be notified as soon as environment administrator has a position | |
| 87 | - about your request.") % | |
| 88 | - { :software => self.name, :environment => self.target } | |
| 89 | - end | |
| 90 | - | |
| 91 | - def task_cancelled_message | |
| 92 | - _("Your request for registering software %{software} at %{environment} was | |
| 93 | - not approved by the environment administrator. The following explanation | |
| 94 | - was given: \n\n%{explanation}") % | |
| 95 | - { :software => self.name, | |
| 96 | - :environment => self.environment, | |
| 97 | - :explanation => self.reject_explanation } | |
| 98 | - end | |
| 99 | - | |
| 100 | - def task_finished_message | |
| 101 | - _('Your request for registering the software "%{software}" was approved. | |
| 102 | - You can access %{url} and finish the registration of your software.') % | |
| 103 | - { :software => self.name, :url => mount_url } | |
| 104 | - end | |
| 105 | - | |
| 106 | - private | |
| 107 | - | |
| 108 | - def mount_url | |
| 109 | - identifier = Community.where(:name => self.name).first.identifier | |
| 110 | - # The use of url_for doesn't allow the /social within the Public Software | |
| 111 | - # portal. That's why the url is mounted so 'hard coded' | |
| 112 | - url = "#{environment.top_url}/myprofile/#{identifier}/profile_editor/edit_software_community" | |
| 113 | - end | |
| 114 | - | |
| 115 | -end |
src/noosfero-spb/software_communities/lib/database_description.rb
| ... | ... | @@ -1,15 +0,0 @@ |
| 1 | -class DatabaseDescription < ActiveRecord::Base | |
| 2 | - | |
| 3 | - SEARCHABLE_SOFTWARE_FIELDS = { | |
| 4 | - :name => 1 | |
| 5 | - } | |
| 6 | - | |
| 7 | - attr_accessible :name | |
| 8 | - | |
| 9 | - has_many :software_databases | |
| 10 | - has_many :software_infos, :through => :software_databases | |
| 11 | - | |
| 12 | - validates_presence_of :name | |
| 13 | - validates_uniqueness_of :name | |
| 14 | - | |
| 15 | -end |
src/noosfero-spb/software_communities/lib/database_helper.rb
| ... | ... | @@ -1,77 +0,0 @@ |
| 1 | -class DatabaseHelper < DynamicTableHelper | |
| 2 | - MODEL_NAME ="database" | |
| 3 | - FIELD_NAME = "database_description_id" | |
| 4 | - | |
| 5 | - def self.valid_database? database | |
| 6 | - return false if SoftwareHelper.all_table_is_empty?(database) | |
| 7 | - | |
| 8 | - database_description_id_list = DatabaseDescription.select(:id). | |
| 9 | - collect {|dd| dd.id} | |
| 10 | - | |
| 11 | - return database_description_id_list.include?( | |
| 12 | - database[:database_description_id].to_i | |
| 13 | - ) | |
| 14 | - end | |
| 15 | - | |
| 16 | - def self.list_database new_databases | |
| 17 | - return [] if new_databases.nil? or new_databases.length == 0 | |
| 18 | - list_databases = [] | |
| 19 | - | |
| 20 | - new_databases.each do |new_database| | |
| 21 | - if valid_database? new_database | |
| 22 | - database = SoftwareDatabase.new | |
| 23 | - | |
| 24 | - database.database_description_id = | |
| 25 | - new_database[:database_description_id] | |
| 26 | - | |
| 27 | - database.version = new_database[:version] | |
| 28 | - list_databases << database | |
| 29 | - end | |
| 30 | - end | |
| 31 | - | |
| 32 | - list_databases | |
| 33 | - end | |
| 34 | - | |
| 35 | - def self.valid_list_database? list_databases | |
| 36 | - return false if list_databases.nil? or list_databases.length == 0 | |
| 37 | - return !list_databases.any?{|database| !database.valid?} | |
| 38 | - end | |
| 39 | - | |
| 40 | - def self.database_as_tables(list_databases, disabled=false) | |
| 41 | - model_list = list_databases | |
| 42 | - model_list ||= [{:database_description_id => "", :version => ""}] | |
| 43 | - | |
| 44 | - models_as_tables model_list, "database_html_structure", disabled | |
| 45 | - end | |
| 46 | - | |
| 47 | - def self.database_html_structure(database_data, disabled) | |
| 48 | - database_id = database_data[:database_description_id] | |
| 49 | - database_name = database_id.blank? ? "" : DatabaseDescription.find( | |
| 50 | - database_data[:database_description_id], | |
| 51 | - :select=>"name" | |
| 52 | - ).name | |
| 53 | - | |
| 54 | - data = { | |
| 55 | - model_name: MODEL_NAME, | |
| 56 | - field_name: FIELD_NAME, | |
| 57 | - name: { | |
| 58 | - value: database_name, | |
| 59 | - id: database_id, | |
| 60 | - hidden: true, | |
| 61 | - autocomplete: true, | |
| 62 | - select_field: false | |
| 63 | - }, | |
| 64 | - version: { | |
| 65 | - value: database_data[:version], | |
| 66 | - hidden: true, | |
| 67 | - delete: true | |
| 68 | - } | |
| 69 | - } | |
| 70 | - DATA[:license].delete(:value) | |
| 71 | - table_html_structure(data, disabled) | |
| 72 | - end | |
| 73 | - | |
| 74 | - def self.add_dynamic_table | |
| 75 | - database_as_tables(nil).first.call | |
| 76 | - end | |
| 77 | -end |
src/noosfero-spb/software_communities/lib/download.rb
| ... | ... | @@ -1,51 +0,0 @@ |
| 1 | -#FIX ME: Turn this into a proper model(next release) | |
| 2 | -class Download | |
| 3 | - def initialize data | |
| 4 | - @name = data[:name] | |
| 5 | - @link = data[:link] | |
| 6 | - @software_description = data[:software_description] | |
| 7 | - @minimum_requirements = data[:minimum_requirements] | |
| 8 | - @size = data[:size] | |
| 9 | - | |
| 10 | - @total_downloads = if data[:total_downloads] | |
| 11 | - data[:total_downloads] | |
| 12 | - else | |
| 13 | - 0 | |
| 14 | - end | |
| 15 | - end | |
| 16 | - | |
| 17 | - def self.validate_download_list download_list | |
| 18 | - download_list.select! do |download| | |
| 19 | - not download[:name].blank? | |
| 20 | - end | |
| 21 | - | |
| 22 | - download_list.map do |download| | |
| 23 | - Download.new(download).to_hash | |
| 24 | - end | |
| 25 | - end | |
| 26 | - | |
| 27 | - def to_hash | |
| 28 | - { | |
| 29 | - :name => @name, | |
| 30 | - :link => @link, | |
| 31 | - :software_description => @software_description, | |
| 32 | - :minimum_requirements => @minimum_requirements, | |
| 33 | - :size => @size, | |
| 34 | - :total_downloads => @total_downloads | |
| 35 | - } | |
| 36 | - end | |
| 37 | - | |
| 38 | - def total_downloads= value | |
| 39 | - if value.is_a? Integer | |
| 40 | - @total_downloads = value | |
| 41 | - end | |
| 42 | - end | |
| 43 | - | |
| 44 | - def total_downloads | |
| 45 | - @total_downloads | |
| 46 | - end | |
| 47 | - | |
| 48 | - def link | |
| 49 | - @link | |
| 50 | - end | |
| 51 | -end |
src/noosfero-spb/software_communities/lib/download_block.rb
| ... | ... | @@ -1,36 +0,0 @@ |
| 1 | -class DownloadBlock < Block | |
| 2 | - | |
| 3 | - attr_accessible :show_name, :downloads | |
| 4 | - | |
| 5 | - settings_items :show_name, :type => :boolean, :default => false | |
| 6 | - settings_items :downloads, :type => Array, :default => [] | |
| 7 | - | |
| 8 | - validate :download_values | |
| 9 | - | |
| 10 | - def download_values | |
| 11 | - self.downloads = Download.validate_download_list(self.downloads) | |
| 12 | - end | |
| 13 | - | |
| 14 | - def self.description | |
| 15 | - _('Download Stable Version') | |
| 16 | - end | |
| 17 | - | |
| 18 | - def help | |
| 19 | - _('This block displays the stable version of a software.') | |
| 20 | - end | |
| 21 | - | |
| 22 | - def content(args={}) | |
| 23 | - block = self | |
| 24 | - s = show_name | |
| 25 | - lambda do |object| | |
| 26 | - render( | |
| 27 | - :file => 'blocks/download', | |
| 28 | - :locals => { :block => block, :show_name => s } | |
| 29 | - ) | |
| 30 | - end | |
| 31 | - end | |
| 32 | - | |
| 33 | - def cacheable? | |
| 34 | - false | |
| 35 | - end | |
| 36 | -end |
src/noosfero-spb/software_communities/lib/dynamic_table_helper.rb
| ... | ... | @@ -1,153 +0,0 @@ |
| 1 | -class DynamicTableHelper | |
| 2 | - extend( | |
| 3 | - ActionView::Helpers::TagHelper, | |
| 4 | - ActionView::Helpers::FormTagHelper, | |
| 5 | - ActionView::Helpers::FormOptionsHelper, | |
| 6 | - ActionView::Helpers::UrlHelper, | |
| 7 | - ApplicationHelper | |
| 8 | - ) | |
| 9 | - | |
| 10 | - COLLUMN_NAME = { | |
| 11 | - name: "name", | |
| 12 | - version: "version", | |
| 13 | - license: "license" | |
| 14 | - } | |
| 15 | - | |
| 16 | - LABEL_TEXT = { | |
| 17 | - :name => _("Name"), | |
| 18 | - :version => _("Version"), | |
| 19 | - :license => _("License") | |
| 20 | - } | |
| 21 | - | |
| 22 | - DATA = { | |
| 23 | - name: { | |
| 24 | - label: LABEL_TEXT[:name], | |
| 25 | - name: COLLUMN_NAME[:name] | |
| 26 | - }, | |
| 27 | - version: { | |
| 28 | - label: LABEL_TEXT[:version], | |
| 29 | - name: COLLUMN_NAME[:version] | |
| 30 | - } , | |
| 31 | - license: { | |
| 32 | - label: LABEL_TEXT[:license], | |
| 33 | - name: COLLUMN_NAME[:license], | |
| 34 | - delete: true | |
| 35 | - } | |
| 36 | - } | |
| 37 | - @@disabled = false | |
| 38 | - | |
| 39 | - def self.table_html_structure data={}, disabled=false | |
| 40 | - @@disabled = disabled | |
| 41 | - Proc::new do | |
| 42 | - content_tag :table , generate_table_lines(data), :class => "dynamic-table" | |
| 43 | - end | |
| 44 | - end | |
| 45 | - | |
| 46 | - def self.generate_table_lines data={} | |
| 47 | - @@model = data[:model_name] | |
| 48 | - @@field_name = data[:field_name] | |
| 49 | - @@hidden_label = data[:name][:value] | |
| 50 | - @@hidden_id = data[:name][:id] | |
| 51 | - | |
| 52 | - row_data = prepare_row_data data | |
| 53 | - | |
| 54 | - table_line_data = [ | |
| 55 | - self.table_line(row_data[:name]), | |
| 56 | - self.table_line(row_data[:version]) | |
| 57 | - ] | |
| 58 | - | |
| 59 | - if row_data[:license].has_key?(:value) | |
| 60 | - table_line_data << self.table_line(row_data[:license]) | |
| 61 | - end | |
| 62 | - | |
| 63 | - table_line_data.join() | |
| 64 | - end | |
| 65 | - | |
| 66 | - def self.table_line row_data={} | |
| 67 | - unless row_data.blank? | |
| 68 | - content_tag :tr, [ | |
| 69 | - self.label_collumn(row_data[:label]), | |
| 70 | - self.value_collumn( | |
| 71 | - row_data[:value], | |
| 72 | - row_data[:name], | |
| 73 | - row_data[:autocomplete], | |
| 74 | - row_data[:select_field], | |
| 75 | - row_data[:options] | |
| 76 | - ), | |
| 77 | - self.hidden_collumn(row_data[:delete], row_data[:hidden]) | |
| 78 | - ].join() | |
| 79 | - end | |
| 80 | - end | |
| 81 | - | |
| 82 | - def self.label_collumn label="" | |
| 83 | - content_tag :td, label_tag(label) | |
| 84 | - end | |
| 85 | - | |
| 86 | - def self.value_collumn value="", name="", autocomplete=false, select_field=false, options=[] | |
| 87 | - html_options = | |
| 88 | - if autocomplete | |
| 89 | - { | |
| 90 | - :class => "#{@@model}_autocomplete", | |
| 91 | - :placeholder => _("Autocomplete field, type something") | |
| 92 | - } | |
| 93 | - else | |
| 94 | - {} | |
| 95 | - end | |
| 96 | - | |
| 97 | - html_options[:disabled] = @@disabled | |
| 98 | - | |
| 99 | - content = if select_field | |
| 100 | - select_tag("#{@@model}[][#{@@field_name}]", options, html_options) | |
| 101 | - elsif autocomplete | |
| 102 | - text_field_tag("#{@@model}_autocomplete", value, html_options) | |
| 103 | - else | |
| 104 | - text_field_tag("#{@@model}[][#{name}]", value, html_options) | |
| 105 | - end | |
| 106 | - | |
| 107 | - content_tag :td, content | |
| 108 | - end | |
| 109 | - | |
| 110 | - def self.hidden_collumn delete=false, hidden_data=false | |
| 111 | - value = | |
| 112 | - if @@disabled | |
| 113 | - nil | |
| 114 | - elsif delete | |
| 115 | - button_without_text( | |
| 116 | - :delete, _('Delete'), "#" , :class=>"delete-dynamic-table" | |
| 117 | - ) | |
| 118 | - elsif hidden_data | |
| 119 | - hidden_field_tag( | |
| 120 | - "#{@@model}[][#{@@field_name}]", | |
| 121 | - @@hidden_id, | |
| 122 | - :class => "#{@@field_name}", | |
| 123 | - :data => {:label => @@hidden_label } #check how to get the name of an object of the current model | |
| 124 | - ) | |
| 125 | - else | |
| 126 | - nil | |
| 127 | - end | |
| 128 | - | |
| 129 | - content_tag(:td, value, :align => 'right') | |
| 130 | - end | |
| 131 | - | |
| 132 | - def self.prepare_row_data data | |
| 133 | - row_data = { | |
| 134 | - name: DATA[:name], | |
| 135 | - version: DATA[:version], | |
| 136 | - license: DATA[:license] | |
| 137 | - } | |
| 138 | - | |
| 139 | - row_data[:name].merge! data[:name] | |
| 140 | - row_data[:version].merge! data[:version] | |
| 141 | - row_data[:license].merge! data[:license] if data.has_key? :license | |
| 142 | - | |
| 143 | - row_data | |
| 144 | - end | |
| 145 | - | |
| 146 | - def self.models_as_tables models, callback, disabled=false | |
| 147 | - lambdas_list = [] | |
| 148 | - | |
| 149 | - models.map do |model| | |
| 150 | - send(callback, model, disabled) | |
| 151 | - end | |
| 152 | - end | |
| 153 | -end | |
| 154 | 0 | \ No newline at end of file |
src/noosfero-spb/software_communities/lib/library.rb
| ... | ... | @@ -1,10 +0,0 @@ |
| 1 | -class Library < ActiveRecord::Base | |
| 2 | - attr_accessible :name, :version, :license, :software_info_id | |
| 3 | - | |
| 4 | - validates :name, :version, :license, | |
| 5 | - presence: { message: _("can't be blank") }, | |
| 6 | - length: { | |
| 7 | - maximum: 20, | |
| 8 | - too_long: _("Too long (maximum is 20 characters)") | |
| 9 | - } | |
| 10 | -end |
src/noosfero-spb/software_communities/lib/library_helper.rb
| ... | ... | @@ -1,57 +0,0 @@ |
| 1 | -class LibraryHelper < DynamicTableHelper | |
| 2 | - MODEL_NAME = "library" | |
| 3 | - | |
| 4 | - def self.list_library new_libraries | |
| 5 | - return [] if new_libraries.nil? or new_libraries.length == 0 | |
| 6 | - list_libraries = [] | |
| 7 | - | |
| 8 | - new_libraries.each do |new_library| | |
| 9 | - unless SoftwareHelper.all_table_is_empty? new_library | |
| 10 | - library = Library.new | |
| 11 | - library.name = new_library[:name] | |
| 12 | - library.version = new_library[:version] | |
| 13 | - library.license = new_library[:license] | |
| 14 | - list_libraries << library | |
| 15 | - end | |
| 16 | - end | |
| 17 | - | |
| 18 | - list_libraries | |
| 19 | - end | |
| 20 | - | |
| 21 | - def self.valid_list_library? list_libraries | |
| 22 | - return true if list_libraries.nil? or list_libraries.length == 0 | |
| 23 | - return !list_libraries.any?{|library| !library.valid?} | |
| 24 | - end | |
| 25 | - | |
| 26 | - def self.libraries_as_tables list_libraries, disabled=false | |
| 27 | - model_list = list_libraries | |
| 28 | - model_list ||= [{:name=>"", :version=>"", :license=>""}] | |
| 29 | - | |
| 30 | - models_as_tables model_list, "library_html_structure", disabled | |
| 31 | - end | |
| 32 | - | |
| 33 | - def self.library_html_structure library_data, disabled | |
| 34 | - data = { | |
| 35 | - model_name: MODEL_NAME, | |
| 36 | - name: { | |
| 37 | - value: library_data[:name], | |
| 38 | - hidden: false, | |
| 39 | - autocomplete: false, | |
| 40 | - select_field: false | |
| 41 | - }, | |
| 42 | - version: { | |
| 43 | - value: library_data[:version], | |
| 44 | - delete: false | |
| 45 | - }, | |
| 46 | - license: { | |
| 47 | - value: library_data[:license] | |
| 48 | - } | |
| 49 | - } | |
| 50 | - | |
| 51 | - table_html_structure(data, disabled) | |
| 52 | - end | |
| 53 | - | |
| 54 | - def self.add_dynamic_table | |
| 55 | - libraries_as_tables(nil).first.call | |
| 56 | - end | |
| 57 | -end |
src/noosfero-spb/software_communities/lib/license_helper.rb
| ... | ... | @@ -1,9 +0,0 @@ |
| 1 | -module LicenseHelper | |
| 2 | - def self.find_licenses query | |
| 3 | - licenses = LicenseInfo.where("version ILIKE ?", "%#{query}%").select("id, version") | |
| 4 | - licenses.reject!{|license| license.version == "Another"} | |
| 5 | - license_another = LicenseInfo.find_by_version("Another") | |
| 6 | - licenses << license_another if license_another | |
| 7 | - licenses | |
| 8 | - end | |
| 9 | -end |
src/noosfero-spb/software_communities/lib/license_info.rb
src/noosfero-spb/software_communities/lib/operating_system.rb
| ... | ... | @@ -1,14 +0,0 @@ |
| 1 | -class OperatingSystem < ActiveRecord::Base | |
| 2 | - attr_accessible :version | |
| 3 | - | |
| 4 | - belongs_to :software_info | |
| 5 | - belongs_to :operating_system_name | |
| 6 | - | |
| 7 | - validates :operating_system_name, presence: true | |
| 8 | - validates :version, | |
| 9 | - presence: true, | |
| 10 | - length: { | |
| 11 | - maximum: 20, | |
| 12 | - too_long: _('too long (maximum is 20 characters)') | |
| 13 | - } | |
| 14 | -end |
src/noosfero-spb/software_communities/lib/operating_system_helper.rb
| ... | ... | @@ -1,67 +0,0 @@ |
| 1 | -class OperatingSystemHelper < DynamicTableHelper | |
| 2 | - MODEL_NAME = "operating_system" | |
| 3 | - FIELD_NAME = "operating_system_name_id" | |
| 4 | - | |
| 5 | - def self.list_operating_system new_operating_systems | |
| 6 | - return [] if new_operating_systems.nil? or new_operating_systems.length == 0 | |
| 7 | - list_operating_system = [] | |
| 8 | - | |
| 9 | - new_operating_systems.each do |new_operating_system| | |
| 10 | - unless SoftwareHelper.all_table_is_empty?( | |
| 11 | - new_operating_system, | |
| 12 | - ["operating_system_name_id"] | |
| 13 | - ) | |
| 14 | - | |
| 15 | - operating_system = OperatingSystem.new | |
| 16 | - operating_system.operating_system_name = OperatingSystemName.find( | |
| 17 | - new_operating_system[:operating_system_name_id] | |
| 18 | - ) | |
| 19 | - | |
| 20 | - operating_system.version = new_operating_system[:version] | |
| 21 | - list_operating_system << operating_system | |
| 22 | - end | |
| 23 | - end | |
| 24 | - list_operating_system | |
| 25 | - end | |
| 26 | - | |
| 27 | - def self.valid_list_operating_system? list_operating_system | |
| 28 | - return false if (list_operating_system.nil? || list_operating_system.length == 0) | |
| 29 | - return !list_operating_system.any?{|os| !os.valid?} | |
| 30 | - end | |
| 31 | - | |
| 32 | - def self.operating_system_as_tables(list_operating_system, disabled=false) | |
| 33 | - model_list = list_operating_system | |
| 34 | - model_list ||= [{:operating_system_name_id => "", :version => ""}] | |
| 35 | - | |
| 36 | - models_as_tables model_list, "operating_system_html_structure", disabled | |
| 37 | - end | |
| 38 | - | |
| 39 | - def self.operating_system_html_structure (operating_system_data, disabled) | |
| 40 | - select_options = options_for_select( | |
| 41 | - OperatingSystemName.all.collect {|osn| [osn.name, osn.id]}, | |
| 42 | - operating_system_data[:operating_system_name_id] | |
| 43 | - ) | |
| 44 | - | |
| 45 | - data = { | |
| 46 | - model_name: MODEL_NAME, | |
| 47 | - field_name: FIELD_NAME, | |
| 48 | - name: { | |
| 49 | - hidden: false, | |
| 50 | - autocomplete: false, | |
| 51 | - select_field: true, | |
| 52 | - options: select_options | |
| 53 | - }, | |
| 54 | - version: { | |
| 55 | - value: operating_system_data[:version], | |
| 56 | - hidden: true, | |
| 57 | - delete: true | |
| 58 | - } | |
| 59 | - } | |
| 60 | - DATA[:license].delete(:value) | |
| 61 | - table_html_structure(data, disabled) | |
| 62 | - end | |
| 63 | - | |
| 64 | - def self.add_dynamic_table | |
| 65 | - operating_system_as_tables(nil).first.call | |
| 66 | - end | |
| 67 | -end |
src/noosfero-spb/software_communities/lib/operating_system_name.rb
src/noosfero-spb/software_communities/lib/programming_language.rb
| ... | ... | @@ -1,15 +0,0 @@ |
| 1 | -class ProgrammingLanguage < ActiveRecord::Base | |
| 2 | - | |
| 3 | - SEARCHABLE_SOFTWARE_FIELDS = { | |
| 4 | - :name => 1 | |
| 5 | - } | |
| 6 | - | |
| 7 | - attr_accessible :name | |
| 8 | - | |
| 9 | - validates_presence_of :name | |
| 10 | - validates_uniqueness_of :name | |
| 11 | - | |
| 12 | - has_many :software_languages | |
| 13 | - has_many :software_infos, :through => :software_languages | |
| 14 | - | |
| 15 | -end |
src/noosfero-spb/software_communities/lib/repository_block.rb
| ... | ... | @@ -1,29 +0,0 @@ |
| 1 | -class RepositoryBlock < Block | |
| 2 | - | |
| 3 | - attr_accessible :show_name | |
| 4 | - | |
| 5 | - settings_items :show_name, :type => :boolean, :default => false | |
| 6 | - | |
| 7 | - def self.description | |
| 8 | - _('Repository Link') | |
| 9 | - end | |
| 10 | - | |
| 11 | - def help | |
| 12 | - _('This block displays the repository link of a software.') | |
| 13 | - end | |
| 14 | - | |
| 15 | - def content(args={}) | |
| 16 | - block = self | |
| 17 | - s = show_name | |
| 18 | - lambda do |object| | |
| 19 | - render( | |
| 20 | - :file => 'blocks/repository', | |
| 21 | - :locals => { :block => block, :show_name => s } | |
| 22 | - ) | |
| 23 | - end | |
| 24 | - end | |
| 25 | - | |
| 26 | - def cacheable? | |
| 27 | - false | |
| 28 | - end | |
| 29 | -end |
src/noosfero-spb/software_communities/lib/search_catalog_block.rb
| ... | ... | @@ -1,29 +0,0 @@ |
| 1 | -class SearchCatalogBlock < Block | |
| 2 | - | |
| 3 | - attr_accessible :show_name | |
| 4 | - | |
| 5 | - settings_items :show_name, :type => :boolean, :default => false | |
| 6 | - | |
| 7 | - def self.description | |
| 8 | - _('Search Softwares catalog') | |
| 9 | - end | |
| 10 | - | |
| 11 | - def help | |
| 12 | - _('This block displays the search categories field ') | |
| 13 | - end | |
| 14 | - | |
| 15 | - def content(args={}) | |
| 16 | - block = self | |
| 17 | - s = show_name | |
| 18 | - lambda do |object| | |
| 19 | - render( | |
| 20 | - :file => 'blocks/search_catalog', | |
| 21 | - :locals => { :block => block, :show_name => s } | |
| 22 | - ) | |
| 23 | - end | |
| 24 | - end | |
| 25 | - | |
| 26 | - def cacheable? | |
| 27 | - false | |
| 28 | - end | |
| 29 | -end |
src/noosfero-spb/software_communities/lib/software_communities_plugin.rb
| ... | ... | @@ -33,17 +33,17 @@ class SoftwareCommunitiesPlugin < Noosfero::Plugin |
| 33 | 33 | |
| 34 | 34 | def self.extra_blocks |
| 35 | 35 | { |
| 36 | - SoftwaresBlock => { :type => [Environment, Person] }, | |
| 37 | - SoftwareInformationBlock => { :type => [Community] }, | |
| 38 | - DownloadBlock => { :type => [Community] }, | |
| 39 | - RepositoryBlock => { :type => [Community] }, | |
| 40 | - CategoriesAndTagsBlock => { :type => [Community] }, | |
| 41 | - CategoriesSoftwareBlock => { :type => [Environment] }, | |
| 42 | - SearchCatalogBlock => { :type => [Environment] }, | |
| 43 | - SoftwareHighlightsBlock => { :type => [Environment] }, | |
| 44 | - SoftwareTabDataBlock => {:type => [Community], :position => 1}, | |
| 45 | - WikiBlock => {:type => [Community]}, | |
| 46 | - StatisticBlock => { :type => [Community] } | |
| 36 | + SoftwareCommunitiesPlugin::SoftwaresBlock => { :type => [Environment, Person] }, | |
| 37 | + SoftwareCommunitiesPlugin::SoftwareInformationBlock => { :type => [Community] }, | |
| 38 | + SoftwareCommunitiesPlugin::DownloadBlock => { :type => [Community] }, | |
| 39 | + SoftwareCommunitiesPlugin::RepositoryBlock => { :type => [Community] }, | |
| 40 | + SoftwareCommunitiesPlugin::CategoriesAndTagsBlock => { :type => [Community] }, | |
| 41 | + SoftwareCommunitiesPlugin::CategoriesSoftwareBlock => { :type => [Environment] }, | |
| 42 | + SoftwareCommunitiesPlugin::SearchCatalogBlock => { :type => [Environment] }, | |
| 43 | + SoftwareCommunitiesPlugin::SoftwareHighlightsBlock => { :type => [Environment] }, | |
| 44 | + SoftwareCommunitiesPlugin::SoftwareTabDataBlock => {:type => [Community], :position => 1}, | |
| 45 | + SoftwareCommunitiesPlugin::WikiBlock => {:type => [Community]}, | |
| 46 | + SoftwareCommunitiesPlugin::StatisticBlock => { :type => [Community] } | |
| 47 | 47 | } |
| 48 | 48 | end |
| 49 | 49 | |
| ... | ... | @@ -117,7 +117,7 @@ class SoftwareCommunitiesPlugin < Noosfero::Plugin |
| 117 | 117 | protected |
| 118 | 118 | |
| 119 | 119 | def software_info_transaction |
| 120 | - SoftwareInfo.transaction do | |
| 120 | + SoftwareCommunitiesPlugin::SoftwareInfo.transaction do | |
| 121 | 121 | context.profile. |
| 122 | 122 | software_info. |
| 123 | 123 | update_attributes!(context.params[:software_info]) |
| ... | ... | @@ -125,7 +125,7 @@ class SoftwareCommunitiesPlugin < Noosfero::Plugin |
| 125 | 125 | end |
| 126 | 126 | |
| 127 | 127 | def license_transaction |
| 128 | - license = LicenseInfo.find(context.params[:version]) | |
| 128 | + license = SoftwareCommunitiesPlugin::LicenseInfo.find(context.params[:version]) | |
| 129 | 129 | context.profile.software_info.license_info = license |
| 130 | 130 | context.profile.software_info.save! |
| 131 | 131 | end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/categories_and_tags_block.rb
0 → 100644
| ... | ... | @@ -0,0 +1,29 @@ |
| 1 | +class SoftwareCommunitiesPlugin::CategoriesAndTagsBlock < Block | |
| 2 | + | |
| 3 | + attr_accessible :show_name | |
| 4 | + | |
| 5 | + settings_items :show_name, :type => :boolean, :default => false | |
| 6 | + | |
| 7 | + def self.description | |
| 8 | + _('Categories and Tags') | |
| 9 | + end | |
| 10 | + | |
| 11 | + def help | |
| 12 | + _('This block displays the categories and tags of a software.') | |
| 13 | + end | |
| 14 | + | |
| 15 | + def content(args={}) | |
| 16 | + block = self | |
| 17 | + s = show_name | |
| 18 | + lambda do |object| | |
| 19 | + render( | |
| 20 | + :file => 'blocks/categories_and_tags', | |
| 21 | + :locals => { :block => block, :show_name => s } | |
| 22 | + ) | |
| 23 | + end | |
| 24 | + end | |
| 25 | + | |
| 26 | + def cacheable? | |
| 27 | + false | |
| 28 | + end | |
| 29 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/categories_software_block.rb
0 → 100644
| ... | ... | @@ -0,0 +1,35 @@ |
| 1 | +class SoftwareCommunitiesPlugin::CategoriesSoftwareBlock < Block | |
| 2 | + | |
| 3 | + attr_accessible :show_name | |
| 4 | + | |
| 5 | + settings_items :show_name, :type => :boolean, :default => false | |
| 6 | + | |
| 7 | + def self.description | |
| 8 | + _('Categories Softwares') | |
| 9 | + end | |
| 10 | + | |
| 11 | + def help | |
| 12 | + _('This block displays the categories and the amount of softwares for | |
| 13 | + each category.') | |
| 14 | + end | |
| 15 | + | |
| 16 | + def content(args={}) | |
| 17 | + block = self | |
| 18 | + s = show_name | |
| 19 | + | |
| 20 | + software_category = Category.find_by_name("Software") | |
| 21 | + categories = [] | |
| 22 | + categories = software_category.children.sort if software_category | |
| 23 | + | |
| 24 | + lambda do |object| | |
| 25 | + render( | |
| 26 | + :file => 'blocks/categories_software', | |
| 27 | + :locals => { :block => block, :show_name => s, :categories => categories } | |
| 28 | + ) | |
| 29 | + end | |
| 30 | + end | |
| 31 | + | |
| 32 | + def cacheable? | |
| 33 | + false | |
| 34 | + end | |
| 35 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/create_software.rb
0 → 100644
| ... | ... | @@ -0,0 +1,115 @@ |
| 1 | +class SoftwareCommunitiesPlugin::CreateSoftware < Task | |
| 2 | + include Rails.application.routes.url_helpers | |
| 3 | + | |
| 4 | + validates_presence_of :requestor_id, :target_id | |
| 5 | + validates_presence_of :name, :finality | |
| 6 | + | |
| 7 | + attr_accessible :name, :finality, :repository_link, :requestor, :environment, | |
| 8 | + :reject_explanation, :license_info, :identifier, :target | |
| 9 | + | |
| 10 | + alias :environment :target | |
| 11 | + alias :environment= :target= | |
| 12 | + | |
| 13 | + DATA_FIELDS = ['name', 'identifier', 'finality', 'license_info', 'repository_link'] | |
| 14 | + DATA_FIELDS.each do |field| | |
| 15 | + settings_items field.to_sym | |
| 16 | + end | |
| 17 | + | |
| 18 | + def perform | |
| 19 | + software_template = SoftwareCommunitiesPlugin::SoftwareHelper.software_template | |
| 20 | + template_id = software_template.blank? ? nil : software_template.id | |
| 21 | + | |
| 22 | + identifier = self.identifier | |
| 23 | + identifier ||= self.name.to_slug | |
| 24 | + | |
| 25 | + community = Community.create!(:name => self.name, | |
| 26 | + :identifier => identifier, | |
| 27 | + :template_id => template_id) | |
| 28 | + | |
| 29 | + community.environment = self.environment | |
| 30 | + community.add_admin(self.requestor) | |
| 31 | + | |
| 32 | + software = SoftwareCommunitiesPlugin::SoftwareInfo.create!(:finality => self.finality, | |
| 33 | + :repository_link => self.repository_link, :community_id => community.id, | |
| 34 | + :license_info => self.license_info) | |
| 35 | + end | |
| 36 | + | |
| 37 | + def title | |
| 38 | + _("New software") | |
| 39 | + end | |
| 40 | + | |
| 41 | + def subject | |
| 42 | + name | |
| 43 | + end | |
| 44 | + | |
| 45 | + def information | |
| 46 | + message = _('%{requestor} wants to create software %{subject} with') | |
| 47 | + if finality.blank? | |
| 48 | + { :message => message + _(' no finality.') } | |
| 49 | + else | |
| 50 | + { :message => message + _(' this finality:<p><em>%{finality}</em></p>'), | |
| 51 | + :variables => {:finality => finality} } | |
| 52 | + end | |
| 53 | + end | |
| 54 | + | |
| 55 | + def reject_details | |
| 56 | + true | |
| 57 | + end | |
| 58 | + | |
| 59 | + # tells if this request was rejected | |
| 60 | + def rejected? | |
| 61 | + self.status == Task::Status::CANCELLED | |
| 62 | + end | |
| 63 | + | |
| 64 | + # tells if this request was appoved | |
| 65 | + def approved? | |
| 66 | + self.status == Task::Status::FINISHED | |
| 67 | + end | |
| 68 | + | |
| 69 | + def target_notification_description | |
| 70 | + _('%{requestor} wants to create software %{subject}') % | |
| 71 | + {:requestor => requestor.name, :subject => subject} | |
| 72 | + end | |
| 73 | + | |
| 74 | + def target_notification_message | |
| 75 | + _("User \"%{user}\" just requested to create software %{software}. | |
| 76 | + You have to approve or reject it through the \"Pending Validations\" | |
| 77 | + section in your control panel.\n") % | |
| 78 | + { :user => self.requestor.name, :software => self.name } | |
| 79 | + end | |
| 80 | + | |
| 81 | + def task_created_message | |
| 82 | + _("Your request for registering software %{software} at %{environment} was | |
| 83 | + just sent. Environment administrator will receive it and will approve or | |
| 84 | + reject your request according to his methods and criteria. | |
| 85 | + | |
| 86 | + You will be notified as soon as environment administrator has a position | |
| 87 | + about your request.") % | |
| 88 | + { :software => self.name, :environment => self.target } | |
| 89 | + end | |
| 90 | + | |
| 91 | + def task_cancelled_message | |
| 92 | + _("Your request for registering software %{software} at %{environment} was | |
| 93 | + not approved by the environment administrator. The following explanation | |
| 94 | + was given: \n\n%{explanation}") % | |
| 95 | + { :software => self.name, | |
| 96 | + :environment => self.environment, | |
| 97 | + :explanation => self.reject_explanation } | |
| 98 | + end | |
| 99 | + | |
| 100 | + def task_finished_message | |
| 101 | + _('Your request for registering the software "%{software}" was approved. | |
| 102 | + You can access %{url} and finish the registration of your software.') % | |
| 103 | + { :software => self.name, :url => mount_url } | |
| 104 | + end | |
| 105 | + | |
| 106 | + private | |
| 107 | + | |
| 108 | + def mount_url | |
| 109 | + identifier = Community.where(:name => self.name).first.identifier | |
| 110 | + # The use of url_for doesn't allow the /social within the Public Software | |
| 111 | + # portal. That's why the url is mounted so 'hard coded' | |
| 112 | + url = "#{environment.top_url}/myprofile/#{identifier}/profile_editor/edit_software_community" | |
| 113 | + end | |
| 114 | + | |
| 115 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/database_description.rb
0 → 100644
| ... | ... | @@ -0,0 +1,15 @@ |
| 1 | +class SoftwareCommunitiesPlugin::DatabaseDescription < ActiveRecord::Base | |
| 2 | + | |
| 3 | + SEARCHABLE_SOFTWARE_FIELDS = { | |
| 4 | + :name => 1 | |
| 5 | + } | |
| 6 | + | |
| 7 | + attr_accessible :name | |
| 8 | + | |
| 9 | + has_many :software_databases, :class_name => 'SoftwareCommunitiesPlugin::SoftwareDatabase' | |
| 10 | + has_many :software_infos, :through => :software_databases, :class_name => 'SoftwareCommunitiesPlugin::SoftwareInfo' | |
| 11 | + | |
| 12 | + validates_presence_of :name | |
| 13 | + validates_uniqueness_of :name | |
| 14 | + | |
| 15 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/database_helper.rb
0 → 100644
| ... | ... | @@ -0,0 +1,77 @@ |
| 1 | +class SoftwareCommunitiesPlugin::DatabaseHelper < SoftwareCommunitiesPlugin::DynamicTableHelper | |
| 2 | + MODEL_NAME ="database" | |
| 3 | + FIELD_NAME = "database_description_id" | |
| 4 | + | |
| 5 | + def self.valid_database? database | |
| 6 | + return false if SoftwareCommunitiesPlugin::SoftwareHelper.all_table_is_empty?(database) | |
| 7 | + | |
| 8 | + database_description_id_list = SoftwareCommunitiesPlugin::DatabaseDescription.select(:id). | |
| 9 | + collect {|dd| dd.id} | |
| 10 | + | |
| 11 | + return database_description_id_list.include?( | |
| 12 | + database[:database_description_id].to_i | |
| 13 | + ) | |
| 14 | + end | |
| 15 | + | |
| 16 | + def self.list_database new_databases | |
| 17 | + return [] if new_databases.nil? or new_databases.length == 0 | |
| 18 | + list_databases = [] | |
| 19 | + | |
| 20 | + new_databases.each do |new_database| | |
| 21 | + if valid_database? new_database | |
| 22 | + database = SoftwareCommunitiesPlugin::SoftwareDatabase.new | |
| 23 | + | |
| 24 | + database.database_description_id = | |
| 25 | + new_database[:database_description_id] | |
| 26 | + | |
| 27 | + database.version = new_database[:version] | |
| 28 | + list_databases << database | |
| 29 | + end | |
| 30 | + end | |
| 31 | + | |
| 32 | + list_databases | |
| 33 | + end | |
| 34 | + | |
| 35 | + def self.valid_list_database? list_databases | |
| 36 | + return false if list_databases.nil? or list_databases.length == 0 | |
| 37 | + return !list_databases.any?{|database| !database.valid?} | |
| 38 | + end | |
| 39 | + | |
| 40 | + def self.database_as_tables(list_databases, disabled=false) | |
| 41 | + model_list = list_databases | |
| 42 | + model_list ||= [{:database_description_id => "", :version => ""}] | |
| 43 | + | |
| 44 | + models_as_tables model_list, "database_html_structure", disabled | |
| 45 | + end | |
| 46 | + | |
| 47 | + def self.database_html_structure(database_data, disabled) | |
| 48 | + database_id = database_data[:database_description_id] | |
| 49 | + database_name = database_id.blank? ? "" : SoftwareCommunitiesPlugin::DatabaseDescription.find( | |
| 50 | + database_data[:database_description_id], | |
| 51 | + :select=>"name" | |
| 52 | + ).name | |
| 53 | + | |
| 54 | + data = { | |
| 55 | + model_name: MODEL_NAME, | |
| 56 | + field_name: FIELD_NAME, | |
| 57 | + name: { | |
| 58 | + value: database_name, | |
| 59 | + id: database_id, | |
| 60 | + hidden: true, | |
| 61 | + autocomplete: true, | |
| 62 | + select_field: false | |
| 63 | + }, | |
| 64 | + version: { | |
| 65 | + value: database_data[:version], | |
| 66 | + hidden: true, | |
| 67 | + delete: true | |
| 68 | + } | |
| 69 | + } | |
| 70 | + DATA[:license].delete(:value) | |
| 71 | + table_html_structure(data, disabled) | |
| 72 | + end | |
| 73 | + | |
| 74 | + def self.add_dynamic_table | |
| 75 | + database_as_tables(nil).first.call | |
| 76 | + end | |
| 77 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/download.rb
0 → 100644
| ... | ... | @@ -0,0 +1,51 @@ |
| 1 | +#FIX ME: Turn this into a proper model(next release) | |
| 2 | +class SoftwareCommunitiesPlugin::Download | |
| 3 | + def initialize data | |
| 4 | + @name = data[:name] | |
| 5 | + @link = data[:link] | |
| 6 | + @software_description = data[:software_description] | |
| 7 | + @minimum_requirements = data[:minimum_requirements] | |
| 8 | + @size = data[:size] | |
| 9 | + | |
| 10 | + @total_downloads = if data[:total_downloads] | |
| 11 | + data[:total_downloads] | |
| 12 | + else | |
| 13 | + 0 | |
| 14 | + end | |
| 15 | + end | |
| 16 | + | |
| 17 | + def self.validate_download_list download_list | |
| 18 | + download_list.select! do |download| | |
| 19 | + not download[:name].blank? | |
| 20 | + end | |
| 21 | + | |
| 22 | + download_list.map do |download| | |
| 23 | + SoftwareCommunitiesPlugin::Download.new(download).to_hash | |
| 24 | + end | |
| 25 | + end | |
| 26 | + | |
| 27 | + def to_hash | |
| 28 | + { | |
| 29 | + :name => @name, | |
| 30 | + :link => @link, | |
| 31 | + :software_description => @software_description, | |
| 32 | + :minimum_requirements => @minimum_requirements, | |
| 33 | + :size => @size, | |
| 34 | + :total_downloads => @total_downloads | |
| 35 | + } | |
| 36 | + end | |
| 37 | + | |
| 38 | + def total_downloads= value | |
| 39 | + if value.is_a? Integer | |
| 40 | + @total_downloads = value | |
| 41 | + end | |
| 42 | + end | |
| 43 | + | |
| 44 | + def total_downloads | |
| 45 | + @total_downloads | |
| 46 | + end | |
| 47 | + | |
| 48 | + def link | |
| 49 | + @link | |
| 50 | + end | |
| 51 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/download_block.rb
0 → 100644
| ... | ... | @@ -0,0 +1,36 @@ |
| 1 | +class SoftwareCommunitiesPlugin::DownloadBlock < Block | |
| 2 | + | |
| 3 | + attr_accessible :show_name, :downloads | |
| 4 | + | |
| 5 | + settings_items :show_name, :type => :boolean, :default => false | |
| 6 | + settings_items :downloads, :type => Array, :default => [] | |
| 7 | + | |
| 8 | + validate :download_values | |
| 9 | + | |
| 10 | + def download_values | |
| 11 | + self.downloads = SoftwareCommunitiesPlugin::Download.validate_download_list(self.downloads) | |
| 12 | + end | |
| 13 | + | |
| 14 | + def self.description | |
| 15 | + _('Download Stable Version') | |
| 16 | + end | |
| 17 | + | |
| 18 | + def help | |
| 19 | + _('This block displays the stable version of a software.') | |
| 20 | + end | |
| 21 | + | |
| 22 | + def content(args={}) | |
| 23 | + block = self | |
| 24 | + s = show_name | |
| 25 | + lambda do |object| | |
| 26 | + render( | |
| 27 | + :file => 'blocks/download', | |
| 28 | + :locals => { :block => block, :show_name => s } | |
| 29 | + ) | |
| 30 | + end | |
| 31 | + end | |
| 32 | + | |
| 33 | + def cacheable? | |
| 34 | + false | |
| 35 | + end | |
| 36 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/dynamic_table_helper.rb
0 → 100644
| ... | ... | @@ -0,0 +1,153 @@ |
| 1 | +class SoftwareCommunitiesPlugin::DynamicTableHelper | |
| 2 | + extend( | |
| 3 | + ActionView::Helpers::TagHelper, | |
| 4 | + ActionView::Helpers::FormTagHelper, | |
| 5 | + ActionView::Helpers::FormOptionsHelper, | |
| 6 | + ActionView::Helpers::UrlHelper, | |
| 7 | + ApplicationHelper | |
| 8 | + ) | |
| 9 | + | |
| 10 | + COLLUMN_NAME = { | |
| 11 | + name: "name", | |
| 12 | + version: "version", | |
| 13 | + license: "license" | |
| 14 | + } | |
| 15 | + | |
| 16 | + LABEL_TEXT = { | |
| 17 | + :name => _("Name"), | |
| 18 | + :version => _("Version"), | |
| 19 | + :license => _("License") | |
| 20 | + } | |
| 21 | + | |
| 22 | + DATA = { | |
| 23 | + name: { | |
| 24 | + label: LABEL_TEXT[:name], | |
| 25 | + name: COLLUMN_NAME[:name] | |
| 26 | + }, | |
| 27 | + version: { | |
| 28 | + label: LABEL_TEXT[:version], | |
| 29 | + name: COLLUMN_NAME[:version] | |
| 30 | + } , | |
| 31 | + license: { | |
| 32 | + label: LABEL_TEXT[:license], | |
| 33 | + name: COLLUMN_NAME[:license], | |
| 34 | + delete: true | |
| 35 | + } | |
| 36 | + } | |
| 37 | + @@disabled = false | |
| 38 | + | |
| 39 | + def self.table_html_structure data={}, disabled=false | |
| 40 | + @@disabled = disabled | |
| 41 | + Proc::new do | |
| 42 | + content_tag :table , generate_table_lines(data), :class => "dynamic-table" | |
| 43 | + end | |
| 44 | + end | |
| 45 | + | |
| 46 | + def self.generate_table_lines data={} | |
| 47 | + @@model = data[:model_name] | |
| 48 | + @@field_name = data[:field_name] | |
| 49 | + @@hidden_label = data[:name][:value] | |
| 50 | + @@hidden_id = data[:name][:id] | |
| 51 | + | |
| 52 | + row_data = prepare_row_data data | |
| 53 | + | |
| 54 | + table_line_data = [ | |
| 55 | + self.table_line(row_data[:name]), | |
| 56 | + self.table_line(row_data[:version]) | |
| 57 | + ] | |
| 58 | + | |
| 59 | + if row_data[:license].has_key?(:value) | |
| 60 | + table_line_data << self.table_line(row_data[:license]) | |
| 61 | + end | |
| 62 | + | |
| 63 | + table_line_data.join() | |
| 64 | + end | |
| 65 | + | |
| 66 | + def self.table_line row_data={} | |
| 67 | + unless row_data.blank? | |
| 68 | + content_tag :tr, [ | |
| 69 | + self.label_collumn(row_data[:label]), | |
| 70 | + self.value_collumn( | |
| 71 | + row_data[:value], | |
| 72 | + row_data[:name], | |
| 73 | + row_data[:autocomplete], | |
| 74 | + row_data[:select_field], | |
| 75 | + row_data[:options] | |
| 76 | + ), | |
| 77 | + self.hidden_collumn(row_data[:delete], row_data[:hidden]) | |
| 78 | + ].join() | |
| 79 | + end | |
| 80 | + end | |
| 81 | + | |
| 82 | + def self.label_collumn label="" | |
| 83 | + content_tag :td, label_tag(label) | |
| 84 | + end | |
| 85 | + | |
| 86 | + def self.value_collumn value="", name="", autocomplete=false, select_field=false, options=[] | |
| 87 | + html_options = | |
| 88 | + if autocomplete | |
| 89 | + { | |
| 90 | + :class => "#{@@model}_autocomplete", | |
| 91 | + :placeholder => _("Autocomplete field, type something") | |
| 92 | + } | |
| 93 | + else | |
| 94 | + {} | |
| 95 | + end | |
| 96 | + | |
| 97 | + html_options[:disabled] = @@disabled | |
| 98 | + | |
| 99 | + content = if select_field | |
| 100 | + select_tag("#{@@model}[][#{@@field_name}]", options, html_options) | |
| 101 | + elsif autocomplete | |
| 102 | + text_field_tag("#{@@model}_autocomplete", value, html_options) | |
| 103 | + else | |
| 104 | + text_field_tag("#{@@model}[][#{name}]", value, html_options) | |
| 105 | + end | |
| 106 | + | |
| 107 | + content_tag :td, content | |
| 108 | + end | |
| 109 | + | |
| 110 | + def self.hidden_collumn delete=false, hidden_data=false | |
| 111 | + value = | |
| 112 | + if @@disabled | |
| 113 | + nil | |
| 114 | + elsif delete | |
| 115 | + button_without_text( | |
| 116 | + :delete, _('Delete'), "#" , :class=>"delete-dynamic-table" | |
| 117 | + ) | |
| 118 | + elsif hidden_data | |
| 119 | + hidden_field_tag( | |
| 120 | + "#{@@model}[][#{@@field_name}]", | |
| 121 | + @@hidden_id, | |
| 122 | + :class => "#{@@field_name}", | |
| 123 | + :data => {:label => @@hidden_label } #check how to get the name of an object of the current model | |
| 124 | + ) | |
| 125 | + else | |
| 126 | + nil | |
| 127 | + end | |
| 128 | + | |
| 129 | + content_tag(:td, value, :align => 'right') | |
| 130 | + end | |
| 131 | + | |
| 132 | + def self.prepare_row_data data | |
| 133 | + row_data = { | |
| 134 | + name: DATA[:name], | |
| 135 | + version: DATA[:version], | |
| 136 | + license: DATA[:license] | |
| 137 | + } | |
| 138 | + | |
| 139 | + row_data[:name].merge! data[:name] | |
| 140 | + row_data[:version].merge! data[:version] | |
| 141 | + row_data[:license].merge! data[:license] if data.has_key? :license | |
| 142 | + | |
| 143 | + row_data | |
| 144 | + end | |
| 145 | + | |
| 146 | + def self.models_as_tables models, callback, disabled=false | |
| 147 | + lambdas_list = [] | |
| 148 | + | |
| 149 | + models.map do |model| | |
| 150 | + send(callback, model, disabled) | |
| 151 | + end | |
| 152 | + end | |
| 153 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/library.rb
0 → 100644
| ... | ... | @@ -0,0 +1,10 @@ |
| 1 | +class SoftwareCommunitiesPlugin::Library < ActiveRecord::Base | |
| 2 | + attr_accessible :name, :version, :license, :software_info_id | |
| 3 | + | |
| 4 | + validates :name, :version, :license, | |
| 5 | + presence: { message: _("can't be blank") }, | |
| 6 | + length: { | |
| 7 | + maximum: 20, | |
| 8 | + too_long: _("Too long (maximum is 20 characters)") | |
| 9 | + } | |
| 10 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/library_helper.rb
0 → 100644
| ... | ... | @@ -0,0 +1,59 @@ |
| 1 | +class SoftwareCommunitiesPlugin::LibraryHelper < SoftwareCommunitiesPlugin::DynamicTableHelper | |
| 2 | + #FIXME Verify this name. | |
| 3 | + MODEL_NAME = "software_communities_plugin/library" | |
| 4 | + | |
| 5 | + def self.list_library new_libraries | |
| 6 | + return [] if new_libraries.nil? or new_libraries.length == 0 | |
| 7 | + list_libraries = [] | |
| 8 | + | |
| 9 | + new_libraries.each do |new_library| | |
| 10 | + unless SoftwareCommunitiesPlugin::SoftwareHelper.all_table_is_empty? new_library | |
| 11 | + library = SoftwareCommunitiesPlugin::Library.new | |
| 12 | + library.name = new_library[:name] | |
| 13 | + library.version = new_library[:version] | |
| 14 | + library.license = new_library[:license] | |
| 15 | + list_libraries << library | |
| 16 | + end | |
| 17 | + end | |
| 18 | + | |
| 19 | + list_libraries | |
| 20 | + end | |
| 21 | + | |
| 22 | + def self.valid_list_library? list_libraries | |
| 23 | + return true if list_libraries.nil? or list_libraries.length == 0 | |
| 24 | + return !list_libraries.any?{|library| !library.valid?} | |
| 25 | + end | |
| 26 | + | |
| 27 | + def self.libraries_as_tables list_libraries, disabled=false | |
| 28 | + model_list = list_libraries | |
| 29 | + model_list ||= [{:name=>"", :version=>"", :license=>""}] | |
| 30 | + | |
| 31 | + models_as_tables model_list, "library_html_structure", disabled | |
| 32 | + end | |
| 33 | + | |
| 34 | + def self.library_html_structure library_data, disabled | |
| 35 | + data = { | |
| 36 | + #FIXME Verify MODEL_NAME | |
| 37 | + model_name: MODEL_NAME, | |
| 38 | + name: { | |
| 39 | + value: library_data[:name], | |
| 40 | + hidden: false, | |
| 41 | + autocomplete: false, | |
| 42 | + select_field: false | |
| 43 | + }, | |
| 44 | + version: { | |
| 45 | + value: library_data[:version], | |
| 46 | + delete: false | |
| 47 | + }, | |
| 48 | + license: { | |
| 49 | + value: library_data[:license] | |
| 50 | + } | |
| 51 | + } | |
| 52 | + | |
| 53 | + table_html_structure(data, disabled) | |
| 54 | + end | |
| 55 | + | |
| 56 | + def self.add_dynamic_table | |
| 57 | + libraries_as_tables(nil).first.call | |
| 58 | + end | |
| 59 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/license_helper.rb
0 → 100644
| ... | ... | @@ -0,0 +1,9 @@ |
| 1 | +module SoftwareCommunitiesPlugin::LicenseHelper | |
| 2 | + def self.find_licenses query | |
| 3 | + licenses = SoftwareCommunitiesPlugin::LicenseInfo.where("version ILIKE ?", "%#{query}%").select("id, version") | |
| 4 | + licenses.reject!{|license| license.version == "Another"} | |
| 5 | + license_another = SoftwareCommunitiesPlugin::LicenseInfo.find_by_version("Another") | |
| 6 | + licenses << license_another if license_another | |
| 7 | + licenses | |
| 8 | + end | |
| 9 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/license_info.rb
0 → 100644
src/noosfero-spb/software_communities/lib/software_communities_plugin/operating_system.rb
0 → 100644
| ... | ... | @@ -0,0 +1,14 @@ |
| 1 | +class SoftwareCommunitiesPlugin::OperatingSystem < ActiveRecord::Base | |
| 2 | + attr_accessible :version | |
| 3 | + | |
| 4 | + belongs_to :software_info, :class_name => 'SoftwareCommunitiesPlugin::SoftwareInfo' | |
| 5 | + belongs_to :operating_system_name, :class_name => 'SoftwareCommunitiesPlugin::OperatingSystemName' | |
| 6 | + | |
| 7 | + validates :operating_system_name, presence: true | |
| 8 | + validates :version, | |
| 9 | + presence: true, | |
| 10 | + length: { | |
| 11 | + maximum: 20, | |
| 12 | + too_long: _('too long (maximum is 20 characters)') | |
| 13 | + } | |
| 14 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/operating_system_helper.rb
0 → 100644
| ... | ... | @@ -0,0 +1,69 @@ |
| 1 | +class SoftwareCommunitiesPlugin::OperatingSystemHelper < SoftwareCommunitiesPlugin::DynamicTableHelper | |
| 2 | + #FIXME Verify model_name | |
| 3 | + MODEL_NAME = "software_communities_plugin/operating_system" | |
| 4 | + FIELD_NAME = "operating_system_name_id" | |
| 5 | + | |
| 6 | + def self.list_operating_system new_operating_systems | |
| 7 | + return [] if new_operating_systems.nil? or new_operating_systems.length == 0 | |
| 8 | + list_operating_system = [] | |
| 9 | + | |
| 10 | + new_operating_systems.each do |new_operating_system| | |
| 11 | + unless SoftwareCommunitiesPlugin::SoftwareHelper.all_table_is_empty?( | |
| 12 | + new_operating_system, | |
| 13 | + ["operating_system_name_id"] | |
| 14 | + ) | |
| 15 | + | |
| 16 | + operating_system = SoftwareCommunitiesPlugin::OperatingSystem.new | |
| 17 | + operating_system.operating_system_name = SoftwareCommunitiesPlugin::OperatingSystemName.find( | |
| 18 | + new_operating_system[:operating_system_name_id] | |
| 19 | + ) | |
| 20 | + | |
| 21 | + operating_system.version = new_operating_system[:version] | |
| 22 | + list_operating_system << operating_system | |
| 23 | + end | |
| 24 | + end | |
| 25 | + list_operating_system | |
| 26 | + end | |
| 27 | + | |
| 28 | + def self.valid_list_operating_system? list_operating_system | |
| 29 | + return false if (list_operating_system.nil? || list_operating_system.length == 0) | |
| 30 | + return !list_operating_system.any?{|os| !os.valid?} | |
| 31 | + end | |
| 32 | + | |
| 33 | + def self.operating_system_as_tables(list_operating_system, disabled=false) | |
| 34 | + model_list = list_operating_system | |
| 35 | + model_list ||= [{:operating_system_name_id => "", :version => ""}] | |
| 36 | + | |
| 37 | + models_as_tables model_list, "operating_system_html_structure", disabled | |
| 38 | + end | |
| 39 | + | |
| 40 | + def self.operating_system_html_structure (operating_system_data, disabled) | |
| 41 | + select_options = options_for_select( | |
| 42 | + SoftwareCommunitiesPlugin::OperatingSystemName.all.collect {|osn| [osn.name, osn.id]}, | |
| 43 | + operating_system_data[:operating_system_name_id] | |
| 44 | + ) | |
| 45 | + | |
| 46 | + data = { | |
| 47 | + #FIXME Verify model_name | |
| 48 | + model_name: MODEL_NAME, | |
| 49 | + field_name: FIELD_NAME, | |
| 50 | + name: { | |
| 51 | + hidden: false, | |
| 52 | + autocomplete: false, | |
| 53 | + select_field: true, | |
| 54 | + options: select_options | |
| 55 | + }, | |
| 56 | + version: { | |
| 57 | + value: operating_system_data[:version], | |
| 58 | + hidden: true, | |
| 59 | + delete: true | |
| 60 | + } | |
| 61 | + } | |
| 62 | + DATA[:license].delete(:value) | |
| 63 | + table_html_structure(data, disabled) | |
| 64 | + end | |
| 65 | + | |
| 66 | + def self.add_dynamic_table | |
| 67 | + operating_system_as_tables(nil).first.call | |
| 68 | + end | |
| 69 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/operating_system_name.rb
0 → 100644
| ... | ... | @@ -0,0 +1,10 @@ |
| 1 | +class SoftwareCommunitiesPlugin::OperatingSystemName < ActiveRecord::Base | |
| 2 | + attr_accessible :name | |
| 3 | + | |
| 4 | + validates_presence_of :name | |
| 5 | + validates_uniqueness_of :name | |
| 6 | + | |
| 7 | + has_many :operating_systems, :class_name => 'SoftwareCommunitiesPlugin::OperatingSystem' | |
| 8 | + has_many :software_infos, :through => :operating_systems, :class_name => 'SoftwareCommunitiesPlugin::SoftwareInfo' | |
| 9 | + | |
| 10 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/programming_language.rb
0 → 100644
| ... | ... | @@ -0,0 +1,15 @@ |
| 1 | +class SoftwareCommunitiesPlugin::ProgrammingLanguage < ActiveRecord::Base | |
| 2 | + | |
| 3 | + SEARCHABLE_SOFTWARE_FIELDS = { | |
| 4 | + :name => 1 | |
| 5 | + } | |
| 6 | + | |
| 7 | + attr_accessible :name | |
| 8 | + | |
| 9 | + validates_presence_of :name | |
| 10 | + validates_uniqueness_of :name | |
| 11 | + | |
| 12 | + has_many :software_languages, :class_name => 'SoftwareCommunitiesPlugin::SoftwareLanguage' | |
| 13 | + has_many :software_infos, :through => :software_languages, :class_name => 'SoftwareCommunitiesPlugin::SoftwareInfo' | |
| 14 | + | |
| 15 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/repository_block.rb
0 → 100644
| ... | ... | @@ -0,0 +1,29 @@ |
| 1 | +class SoftwareCommunitiesPlugin::RepositoryBlock < Block | |
| 2 | + | |
| 3 | + attr_accessible :show_name | |
| 4 | + | |
| 5 | + settings_items :show_name, :type => :boolean, :default => false | |
| 6 | + | |
| 7 | + def self.description | |
| 8 | + _('Repository Link') | |
| 9 | + end | |
| 10 | + | |
| 11 | + def help | |
| 12 | + _('This block displays the repository link of a software.') | |
| 13 | + end | |
| 14 | + | |
| 15 | + def content(args={}) | |
| 16 | + block = self | |
| 17 | + s = show_name | |
| 18 | + lambda do |object| | |
| 19 | + render( | |
| 20 | + :file => 'blocks/repository', | |
| 21 | + :locals => { :block => block, :show_name => s } | |
| 22 | + ) | |
| 23 | + end | |
| 24 | + end | |
| 25 | + | |
| 26 | + def cacheable? | |
| 27 | + false | |
| 28 | + end | |
| 29 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/search_catalog_block.rb
0 → 100644
| ... | ... | @@ -0,0 +1,29 @@ |
| 1 | +class SoftwareCommunitiesPlugin::SearchCatalogBlock < Block | |
| 2 | + | |
| 3 | + attr_accessible :show_name | |
| 4 | + | |
| 5 | + settings_items :show_name, :type => :boolean, :default => false | |
| 6 | + | |
| 7 | + def self.description | |
| 8 | + _('Search Softwares catalog') | |
| 9 | + end | |
| 10 | + | |
| 11 | + def help | |
| 12 | + _('This block displays the search categories field ') | |
| 13 | + end | |
| 14 | + | |
| 15 | + def content(args={}) | |
| 16 | + block = self | |
| 17 | + s = show_name | |
| 18 | + lambda do |object| | |
| 19 | + render( | |
| 20 | + :file => 'blocks/search_catalog', | |
| 21 | + :locals => { :block => block, :show_name => s } | |
| 22 | + ) | |
| 23 | + end | |
| 24 | + end | |
| 25 | + | |
| 26 | + def cacheable? | |
| 27 | + false | |
| 28 | + end | |
| 29 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/software_database.rb
0 → 100644
| ... | ... | @@ -0,0 +1,20 @@ |
| 1 | +class SoftwareCommunitiesPlugin::SoftwareDatabase < ActiveRecord::Base | |
| 2 | + attr_accessible :version | |
| 3 | + | |
| 4 | + belongs_to :software_info, :class_name => 'SoftwareCommunitiesPlugin::SoftwareInfo' | |
| 5 | + belongs_to :database_description, :class_name => 'SoftwareCommunitiesPlugin::DatabaseDescription' | |
| 6 | + | |
| 7 | + validates_presence_of :database_description_id, :version | |
| 8 | + | |
| 9 | + validates_length_of( | |
| 10 | + :version, | |
| 11 | + :maximum => 20, | |
| 12 | + :too_long => _("Software database is too long (maximum is 20 characters)") | |
| 13 | + ) | |
| 14 | + | |
| 15 | + validates( | |
| 16 | + :database_description_id, | |
| 17 | + :numericality => {:greater_than_or_equal_to => 1} | |
| 18 | + ) | |
| 19 | + | |
| 20 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/software_helper.rb
0 → 100644
| ... | ... | @@ -0,0 +1,43 @@ |
| 1 | +module SoftwareCommunitiesPlugin::SoftwareHelper | |
| 2 | + def self.select_options programming_languages, selected = 0 | |
| 3 | + value = "" | |
| 4 | + | |
| 5 | + programming_languages.each do |language| | |
| 6 | + selected = selected == language.id ? 'selected' : '' | |
| 7 | + value += "<option value=#{language.id} #{selected}> | |
| 8 | + #{language.name} | |
| 9 | + </option>" | |
| 10 | + end | |
| 11 | + | |
| 12 | + value | |
| 13 | + end | |
| 14 | + | |
| 15 | + def self.create_list_with_file file_name, model | |
| 16 | + list_file = File.open file_name, "r" | |
| 17 | + | |
| 18 | + list_file.each_line do |line| | |
| 19 | + model.create(:name=>line.strip) | |
| 20 | + end | |
| 21 | + | |
| 22 | + list_file.close | |
| 23 | + end | |
| 24 | + | |
| 25 | + def self.all_table_is_empty? table, ignored_fields=[] | |
| 26 | + return !table.keys.any?{|key| ignored_fields.include?(key) ? false : !table[key].empty?} | |
| 27 | + end | |
| 28 | + | |
| 29 | + def self.software_template | |
| 30 | + identifier = SoftwareCommunitiesPlugin::SoftwareHelper.software_template_identifier | |
| 31 | + | |
| 32 | + software_template = Community[identifier] | |
| 33 | + if !software_template.blank? && software_template.is_template | |
| 34 | + software_template | |
| 35 | + else | |
| 36 | + nil | |
| 37 | + end | |
| 38 | + end | |
| 39 | + | |
| 40 | + def self.software_template_identifier | |
| 41 | + identifier = YAML::load(File.open(SoftwareCommunitiesPlugin.root_path + 'config.yml'))['software_template'] | |
| 42 | + end | |
| 43 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/software_highlights_block.rb
0 → 100644
| ... | ... | @@ -0,0 +1,20 @@ |
| 1 | +class SoftwareCommunitiesPlugin::SoftwareHighlightsBlock < HighlightsBlock | |
| 2 | + | |
| 3 | + def self.description | |
| 4 | + _('Software Highlights Block') | |
| 5 | + end | |
| 6 | + | |
| 7 | + def help | |
| 8 | + _('This block displays the softwares icon into a highlight') | |
| 9 | + end | |
| 10 | + | |
| 11 | + def content(args={}) | |
| 12 | + softwares = self.settings[:images].collect {|h| h[:address].split('/').last} | |
| 13 | + block = self | |
| 14 | + proc do | |
| 15 | + render :file => 'blocks/software_communities_plugin/software_highlights', :locals => { :block => block, :softwares => softwares} | |
| 16 | + end | |
| 17 | + end | |
| 18 | + | |
| 19 | + | |
| 20 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/software_info.rb
0 → 100644
| ... | ... | @@ -0,0 +1,261 @@ |
| 1 | +class SoftwareCommunitiesPlugin::SoftwareInfo < ActiveRecord::Base | |
| 2 | + acts_as_having_settings :field => :settings | |
| 3 | + | |
| 4 | + SEARCHABLE_SOFTWARE_FIELDS = { | |
| 5 | + :acronym => 1, | |
| 6 | + :finality => 2, | |
| 7 | + } | |
| 8 | + | |
| 9 | + SEARCHABLE_SOFTWARE_CLASSES = [ | |
| 10 | + SoftwareCommunitiesPlugin::SoftwareInfo, | |
| 11 | + SoftwareCommunitiesPlugin::Community, | |
| 12 | + SoftwareCommunitiesPlugin::ProgrammingLanguage, | |
| 13 | + SoftwareCommunitiesPlugin::DatabaseDescription | |
| 14 | + ] | |
| 15 | + | |
| 16 | + scope :search_by_query, lambda { |query = ""| | |
| 17 | + filtered_query = query.gsub(/[\|\(\)\\\/\s\[\]'"*%&!:]/,' ').split.map{|w| w += ":*"}.join('|') | |
| 18 | + search_fields = SoftwareCommunitiesPlugin::SoftwareInfo.pg_search_plugin_fields | |
| 19 | + | |
| 20 | + if query.empty? | |
| 21 | + SoftwareInfo.joins(:community).where("profiles.visible = ?", true) | |
| 22 | + else | |
| 23 | + searchable_software_objects = SoftwareCommunitiesPlugin::SoftwareInfo.transform_list_in_methods_list(SEARCHABLE_SOFTWARE_CLASSES) | |
| 24 | + includes(searchable_software_objects).where("to_tsvector('simple', #{search_fields}) @@ to_tsquery('#{filtered_query}')").where("profiles.visible = ?", true) | |
| 25 | + end | |
| 26 | + } | |
| 27 | + | |
| 28 | + def self.transform_list_in_methods_list list | |
| 29 | + methods_list = [] | |
| 30 | + | |
| 31 | + list.each do |element| | |
| 32 | + if SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(element.to_s.underscore.to_sym) | |
| 33 | + methods_list << element.to_s.underscore.to_sym | |
| 34 | + elsif SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(element.to_s.underscore.pluralize.to_sym) | |
| 35 | + methods_list << element.to_s.underscore.pluralize.to_sym | |
| 36 | + end | |
| 37 | + end | |
| 38 | + | |
| 39 | + methods_list | |
| 40 | + end | |
| 41 | + | |
| 42 | + def self.pg_search_plugin_fields | |
| 43 | + SEARCHABLE_SOFTWARE_CLASSES.collect { |one_class| | |
| 44 | + self.get_searchable_fields(one_class) | |
| 45 | + }.join(" || ' ' || ") | |
| 46 | + end | |
| 47 | + | |
| 48 | + def self.get_searchable_fields one_class | |
| 49 | + searchable_fields = one_class::SEARCHABLE_SOFTWARE_FIELDS.keys.map(&:to_s).sort.map {|f| "coalesce(#{one_class.table_name}.#{f}, '')"}.join(" || ' ' || ") | |
| 50 | + searchable_fields | |
| 51 | + end | |
| 52 | + | |
| 53 | + SEARCH_FILTERS = { | |
| 54 | + :order => %w[], | |
| 55 | + :display => %w[full] | |
| 56 | + } | |
| 57 | + | |
| 58 | + def self.default_search_display | |
| 59 | + 'full' | |
| 60 | + end | |
| 61 | + | |
| 62 | + attr_accessible :e_mag, :icp_brasil, :intern, :e_ping, :e_arq, | |
| 63 | + :operating_platform | |
| 64 | + | |
| 65 | + attr_accessible :demonstration_url, :acronym, :objectives, :features, | |
| 66 | + :license_info | |
| 67 | + | |
| 68 | + attr_accessible :community_id, :finality, :repository_link, :public_software, | |
| 69 | + :first_edit | |
| 70 | + | |
| 71 | + has_many :libraries, :dependent => :destroy, :class_name => 'SoftwareCommunitiesPlugin::Library' | |
| 72 | + has_many :software_databases, :class_name => 'SoftwareCommunitiesPlugin::SoftwareDatabase' | |
| 73 | + has_many :database_descriptions, :through => :software_databases, :class_name => 'SoftwareCommunitiesPlugin::DatabaseDescription' | |
| 74 | + has_many :software_languages, :class_name => 'SoftwareCommunitiesPlugin::SoftwareLanguage' | |
| 75 | + has_many :operating_systems, :class_name => 'SoftwareCommunitiesPlugin::OperatingSystem' | |
| 76 | + has_many :programming_languages, :through => :software_languages, :class_name => 'SoftwareCommunitiesPlugin::ProgrammingLanguage' | |
| 77 | + has_many :operating_system_names, :through => :operating_systems, :class_name => 'SoftwareCommunitiesPlugin::OperatingSystemName' | |
| 78 | + | |
| 79 | + belongs_to :community, :dependent => :destroy | |
| 80 | + belongs_to :license_info, :class_name => 'SoftwareCommunitiesPlugin::LicenseInfo' | |
| 81 | + | |
| 82 | + validates_length_of :finality, :maximum => 120 | |
| 83 | + validates_length_of :objectives, :maximum => 4000 | |
| 84 | + validates_length_of :features, :maximum => 4000 | |
| 85 | + validates_presence_of :finality, :community | |
| 86 | + | |
| 87 | + validate :validate_acronym | |
| 88 | + | |
| 89 | + settings_items :another_license_version, :another_license_link | |
| 90 | + | |
| 91 | + # used on find_by_contents | |
| 92 | + scope :like_search, lambda{ |name| | |
| 93 | + joins(:community).where( | |
| 94 | + "name ILIKE ? OR acronym ILIKE ? OR finality ILIKE ?", | |
| 95 | + "%#{name}%", "%#{name}%", "%#{name}%" | |
| 96 | + ) | |
| 97 | + } | |
| 98 | + | |
| 99 | + scope :search, lambda { |name="", database_description_id = "", | |
| 100 | + programming_language_id = "", operating_system_name_id = "", | |
| 101 | + license_info_id = "", e_ping = "", e_mag = "", internacionalizable = "", | |
| 102 | + icp_brasil = "", e_arq = "", software_categories = "" | | |
| 103 | + | |
| 104 | + like_sql = "" | |
| 105 | + values = [] | |
| 106 | + | |
| 107 | + unless name.blank? | |
| 108 | + like_sql << "name ILIKE ? OR identifier ILIKE ? AND " | |
| 109 | + values << "%#{name}%" << "%#{name}%" | |
| 110 | + end | |
| 111 | + | |
| 112 | + like_sql = like_sql[0..like_sql.length-5] | |
| 113 | + | |
| 114 | + { | |
| 115 | + :joins => [:community], | |
| 116 | + :conditions=>[like_sql, *values] | |
| 117 | + } | |
| 118 | + } | |
| 119 | + | |
| 120 | + def license_info | |
| 121 | + license = SoftwareCommunitiesPlugin::LicenseInfo.find_by_id self.license_info_id | |
| 122 | + license_another = SoftwareCommunitiesPlugin::LicenseInfo.find_by_version("Another") | |
| 123 | + | |
| 124 | + if license_another && license.id == license_another.id | |
| 125 | + LicenseInfo.new( | |
| 126 | + :version => self.another_license_version, | |
| 127 | + :link => self.another_license_link | |
| 128 | + ) | |
| 129 | + else | |
| 130 | + license | |
| 131 | + end | |
| 132 | + end | |
| 133 | + | |
| 134 | + def another_license(version, link) | |
| 135 | + license_another = SoftwareCommunitiesPlugin::LicenseInfo.find_by_version("Another") | |
| 136 | + | |
| 137 | + if license_another | |
| 138 | + self.another_license_version = version | |
| 139 | + self.another_license_link = link | |
| 140 | + self.license_info = license_another | |
| 141 | + self.save! | |
| 142 | + end | |
| 143 | + end | |
| 144 | + | |
| 145 | + def validate_name_lenght | |
| 146 | + if self.community.name.size > 100 | |
| 147 | + self.errors.add( | |
| 148 | + :base, | |
| 149 | + _("Name is too long (maximum is %{count} characters)") | |
| 150 | + ) | |
| 151 | + false | |
| 152 | + end | |
| 153 | + true | |
| 154 | + end | |
| 155 | + | |
| 156 | + # if create_after_moderation receive a model object, would be possible to reuse core method | |
| 157 | + def self.create_after_moderation(requestor, attributes = {}) | |
| 158 | + environment = attributes.delete(:environment) | |
| 159 | + name = attributes.delete(:name) | |
| 160 | + identifier = attributes.delete(:identifier) | |
| 161 | + image_builder = attributes.delete(:image_builder) | |
| 162 | + license_info = attributes.delete(:license_info) | |
| 163 | + another_license_version = attributes.delete(:another_license_version) | |
| 164 | + another_license_link = attributes.delete(:another_license_link) | |
| 165 | + | |
| 166 | + software_info = SoftwareCommunitiesPlugin::SoftwareInfo.new(attributes) | |
| 167 | + unless environment.admins.include? requestor | |
| 168 | + SoftwareCommunitiesPlugin::CreateSoftware.create!( | |
| 169 | + attributes.merge( | |
| 170 | + :requestor => requestor, | |
| 171 | + :environment => environment, | |
| 172 | + :name => name, | |
| 173 | + :identifier => identifier, | |
| 174 | + :license_info => license_info | |
| 175 | + ) | |
| 176 | + ) | |
| 177 | + else | |
| 178 | + software_template = SoftwareCommunitiesPlugin::SoftwareHelper.software_template | |
| 179 | + | |
| 180 | + community_hash = {:name => name} | |
| 181 | + community_hash[:identifier] = identifier | |
| 182 | + community_hash[:image_builder] = image_builder if image_builder | |
| 183 | + | |
| 184 | + community = Community.new(community_hash) | |
| 185 | + community.environment = environment | |
| 186 | + | |
| 187 | + unless software_template.blank? | |
| 188 | + community.template_id = software_template.id | |
| 189 | + end | |
| 190 | + | |
| 191 | + community.save! | |
| 192 | + community.add_admin(requestor) | |
| 193 | + | |
| 194 | + software_info.community = community | |
| 195 | + software_info.license_info = license_info | |
| 196 | + software_info.save! | |
| 197 | + end | |
| 198 | + | |
| 199 | + software_info.verify_license_info(another_license_version, another_license_link) | |
| 200 | + software_info.save | |
| 201 | + software_info | |
| 202 | + end | |
| 203 | + | |
| 204 | + def verify_license_info another_license_version, another_license_link | |
| 205 | + license_another = SoftwareCommunitiesPlugin::LicenseInfo.find_by_version("Another") | |
| 206 | + | |
| 207 | + if license_another && self.license_info_id == license_another.id | |
| 208 | + version = another_license_version | |
| 209 | + link = another_license_link | |
| 210 | + | |
| 211 | + self.another_license(version, link) | |
| 212 | + end | |
| 213 | + end | |
| 214 | + | |
| 215 | + | |
| 216 | + def validate_acronym | |
| 217 | + self.acronym = "" if self.acronym.nil? | |
| 218 | + if self.acronym.length > 10 && self.errors.messages[:acronym].nil? | |
| 219 | + self.errors.add(:acronym, _("can't have more than 10 characteres")) | |
| 220 | + false | |
| 221 | + elsif self.acronym.match(/\s+/) | |
| 222 | + self.errors.add(:acronym, _("can't have whitespaces")) | |
| 223 | + false | |
| 224 | + end | |
| 225 | + true | |
| 226 | + end | |
| 227 | + | |
| 228 | + def valid_operating_systems | |
| 229 | + if self.operating_systems.empty? | |
| 230 | + self.errors.add(:operating_system, _(": at least one must be filled")) | |
| 231 | + end | |
| 232 | + end | |
| 233 | + | |
| 234 | + def valid_software_info | |
| 235 | + if self.software_languages.empty? | |
| 236 | + self.errors.add(:software_languages, _(": at least one must be filled")) | |
| 237 | + end | |
| 238 | + end | |
| 239 | + | |
| 240 | + def valid_databases | |
| 241 | + if self.software_databases.empty? | |
| 242 | + self.errors.add(:software_databases, _(": at least one must be filled")) | |
| 243 | + end | |
| 244 | + end | |
| 245 | + | |
| 246 | + def visible? | |
| 247 | + self.community.visible? | |
| 248 | + end | |
| 249 | + | |
| 250 | + def name | |
| 251 | + self.community.name | |
| 252 | + end | |
| 253 | + | |
| 254 | + def short_name | |
| 255 | + self.community.short_name | |
| 256 | + end | |
| 257 | + | |
| 258 | + def identifier | |
| 259 | + self.community.identifier | |
| 260 | + end | |
| 261 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/software_information_block.rb
0 → 100644
| ... | ... | @@ -0,0 +1,37 @@ |
| 1 | +class SoftwareCommunitiesPlugin::SoftwareInformationBlock < Block | |
| 2 | + | |
| 3 | + attr_accessible :show_name | |
| 4 | + | |
| 5 | + settings_items :show_name, :type => :boolean, :default => false | |
| 6 | + | |
| 7 | + def self.description | |
| 8 | + _('Basic Software Information') | |
| 9 | + end | |
| 10 | + | |
| 11 | + def help | |
| 12 | + _('This block displays the basic information of a software profile.') | |
| 13 | + end | |
| 14 | + | |
| 15 | + def content(args={}) | |
| 16 | + block = self | |
| 17 | + s = show_name | |
| 18 | + | |
| 19 | + lambda do |object| | |
| 20 | + render( | |
| 21 | + :file => 'blocks/software_information', | |
| 22 | + :locals => { :block => block, :show_name => s} | |
| 23 | + ) | |
| 24 | + end | |
| 25 | + end | |
| 26 | + | |
| 27 | + def cacheable? | |
| 28 | + false | |
| 29 | + end | |
| 30 | + | |
| 31 | + private | |
| 32 | + | |
| 33 | + def owner_has_ratings? | |
| 34 | + ratings = OrganizationRating.where(community_id: block.owner.id) | |
| 35 | + !ratings.empty? | |
| 36 | + end | |
| 37 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/software_language.rb
0 → 100644
| ... | ... | @@ -0,0 +1,14 @@ |
| 1 | +class SoftwareCommunitiesPlugin::SoftwareLanguage < ActiveRecord::Base | |
| 2 | + attr_accessible :version | |
| 3 | + | |
| 4 | + belongs_to :software_info, :class => "SoftwareCommunitiesPlugin::SoftwareInfo" | |
| 5 | + belongs_to :programming_language, :class => "SoftwareCommunitiesPlugin::ProgrammingLanguage" | |
| 6 | + | |
| 7 | + validates_length_of( | |
| 8 | + :version, | |
| 9 | + :maximum => 20, | |
| 10 | + :too_long => _("Software language is too long (maximum is 20 characters)") | |
| 11 | + ) | |
| 12 | + | |
| 13 | + validates_presence_of :version, :programming_language | |
| 14 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/software_language_helper.rb
0 → 100644
| ... | ... | @@ -0,0 +1,85 @@ |
| 1 | +class SoftwareCommunitiesPlugin::SoftwareLanguageHelper < DynamicTableHelper | |
| 2 | + #FIX verify MODEL_NAME | |
| 3 | + MODEL_NAME = "language" | |
| 4 | + FIELD_NAME = "programming_language_id" | |
| 5 | + | |
| 6 | + def self.valid_language? language | |
| 7 | + return false if SoftwareCommunitiesPlugin::SoftwareHelper.all_table_is_empty?(language) | |
| 8 | + | |
| 9 | + programming_language_id_list = SoftwareCommunitiesPlugin::ProgrammingLanguage. | |
| 10 | + select(:id). | |
| 11 | + collect { |dd| dd.id } | |
| 12 | + | |
| 13 | + return programming_language_id_list.include?( | |
| 14 | + language[:programming_language_id].to_i | |
| 15 | + ) | |
| 16 | + end | |
| 17 | + | |
| 18 | + def self.list_language new_languages | |
| 19 | + return [] if new_languages.nil? or new_languages.length == 0 | |
| 20 | + list_languages = [] | |
| 21 | + | |
| 22 | + new_languages.each do |new_language| | |
| 23 | + if valid_language? new_language | |
| 24 | + language = SoftwareCommunitiesPlugin::SoftwareLanguage.new | |
| 25 | + language.programming_language = | |
| 26 | + SoftwareCommunitiesPlugin::ProgrammingLanguage.find(new_language[:programming_language_id]) | |
| 27 | + language.version = new_language[:version] | |
| 28 | + list_languages << language | |
| 29 | + end | |
| 30 | + end | |
| 31 | + | |
| 32 | + list_languages | |
| 33 | + end | |
| 34 | + | |
| 35 | + def self.valid_list_language? list_languages | |
| 36 | + return false if list_languages.nil? or list_languages.length == 0 | |
| 37 | + | |
| 38 | + list_languages.each do |language| | |
| 39 | + return false unless language.valid? | |
| 40 | + end | |
| 41 | + | |
| 42 | + true | |
| 43 | + end | |
| 44 | + | |
| 45 | + def self.language_as_tables(list_languages, disabled=false) | |
| 46 | + model_list = list_languages | |
| 47 | + model_list ||= [{:programming_language_id => "", :version => ""}] | |
| 48 | + | |
| 49 | + models_as_tables model_list, "language_html_structure", disabled | |
| 50 | + end | |
| 51 | + | |
| 52 | + def self.language_html_structure(language_data, disabled) | |
| 53 | + language_id = language_data[:programming_language_id] | |
| 54 | + language_name = "" | |
| 55 | + unless language_data[:programming_language_id].blank? | |
| 56 | + language_name = SoftwareCommunitiesPlugin::ProgrammingLanguage.find( | |
| 57 | + language_data[:programming_language_id], | |
| 58 | + :select=>"name" | |
| 59 | + ).name | |
| 60 | + end | |
| 61 | + | |
| 62 | + data = { | |
| 63 | + model_name: MODEL_NAME, | |
| 64 | + field_name: FIELD_NAME, | |
| 65 | + name: { | |
| 66 | + value: language_name, | |
| 67 | + id: language_id, | |
| 68 | + hidden: true, | |
| 69 | + autocomplete: true, | |
| 70 | + select_field: false | |
| 71 | + }, | |
| 72 | + version: { | |
| 73 | + value: language_data[:version], | |
| 74 | + hidden: true, | |
| 75 | + delete: true | |
| 76 | + } | |
| 77 | + } | |
| 78 | + DATA[:license].delete(:value) | |
| 79 | + table_html_structure(data, disabled) | |
| 80 | + end | |
| 81 | + | |
| 82 | + def self.add_dynamic_table | |
| 83 | + language_as_tables(nil).first.call | |
| 84 | + end | |
| 85 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/software_tab_data_block.rb
0 → 100644
| ... | ... | @@ -0,0 +1,48 @@ |
| 1 | +class SoftwareCommunitiesPlugin::SoftwareTabDataBlock < Block | |
| 2 | + attr_accessible :show_name, :displayed_blog | |
| 3 | + | |
| 4 | + settings_items :show_name, :type => :boolean, :default => false | |
| 5 | + settings_items :displayed_blog, :type => :integer, :default => 0 | |
| 6 | + | |
| 7 | + TOTAL_POSTS_DYSPLAYED = 5 | |
| 8 | + | |
| 9 | + def self.description | |
| 10 | + _('Software Tab Data') | |
| 11 | + end | |
| 12 | + | |
| 13 | + def help | |
| 14 | + _('This block is used by colab to insert data into Noosfero') | |
| 15 | + end | |
| 16 | + | |
| 17 | + def content(args={}) | |
| 18 | + block = self | |
| 19 | + | |
| 20 | + lambda do |object| | |
| 21 | + render( | |
| 22 | + :file => 'blocks/software_tab_data', | |
| 23 | + :locals => { | |
| 24 | + :block => block | |
| 25 | + } | |
| 26 | + ) | |
| 27 | + end | |
| 28 | + end | |
| 29 | + | |
| 30 | + def blogs | |
| 31 | + self.owner.blogs | |
| 32 | + end | |
| 33 | + | |
| 34 | + def actual_blog | |
| 35 | + # As :displayed_blog default value is 0, it falls to the first one | |
| 36 | + blogs.find_by_id(self.displayed_blog) || blogs.first | |
| 37 | + end | |
| 38 | + | |
| 39 | + def posts | |
| 40 | + blog = actual_blog | |
| 41 | + | |
| 42 | + if blog and (not blog.posts.empty?) | |
| 43 | + blog.posts.limit(TOTAL_POSTS_DYSPLAYED) | |
| 44 | + else | |
| 45 | + [] | |
| 46 | + end | |
| 47 | + end | |
| 48 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/softwares_block.rb
0 → 100644
| ... | ... | @@ -0,0 +1,105 @@ |
| 1 | +class SoftwareCommunitiesPlugin::SoftwaresBlock < CommunitiesBlock | |
| 2 | + | |
| 3 | + settings_items :software_type, :default => "All" | |
| 4 | + attr_accessible :accessor_id, :accessor_type, :role_id, | |
| 5 | + :resource_id, :resource_type, :software_type | |
| 6 | + | |
| 7 | + def self.description | |
| 8 | + _('Softwares') | |
| 9 | + end | |
| 10 | + | |
| 11 | + def default_title | |
| 12 | + if self.software_type == "Generic" | |
| 13 | + return n_('{#} generic software', '{#} generic softwares', profile_count) | |
| 14 | + elsif self.software_type == "Public" | |
| 15 | + return n_('{#} public software', '{#} public softwares', profile_count) | |
| 16 | + else | |
| 17 | + return n_('{#} software', '{#} softwares', profile_count) | |
| 18 | + end | |
| 19 | + end | |
| 20 | + | |
| 21 | + def help | |
| 22 | + _('This block displays the softwares in which the user is a member.') | |
| 23 | + end | |
| 24 | + | |
| 25 | + def footer | |
| 26 | + self.software_type ||= "All" | |
| 27 | + owner = self.owner | |
| 28 | + case owner | |
| 29 | + when Profile | |
| 30 | + lambda do |context| | |
| 31 | + link_to s_('softwares|View all'), :profile => owner.identifier, | |
| 32 | + :controller => 'profile', :action => 'communities', | |
| 33 | + :type => 'Software' | |
| 34 | + end | |
| 35 | + when Environment | |
| 36 | + lambda do |context| | |
| 37 | + link_to s_('softwares|View all'), :controller => 'search', | |
| 38 | + :action => 'software_infos' | |
| 39 | + end | |
| 40 | + else | |
| 41 | + '' | |
| 42 | + end | |
| 43 | + end | |
| 44 | + | |
| 45 | + def profile_count | |
| 46 | + profile_list.count | |
| 47 | + end | |
| 48 | + | |
| 49 | + def profiles | |
| 50 | + owner.communities | |
| 51 | + end | |
| 52 | + | |
| 53 | + def profile_list | |
| 54 | + profiles = get_visible_profiles | |
| 55 | + | |
| 56 | + software_profiles = profiles.select do |profile| | |
| 57 | + profile.class == Community && profile.software? | |
| 58 | + end | |
| 59 | + | |
| 60 | + block_softwares = if self.software_type == "Public" | |
| 61 | + software_profiles.select { |profile| profile.software_info.public_software? } | |
| 62 | + elsif self.software_type == "Generic" | |
| 63 | + software_profiles.select { |profile| !profile.software_info.public_software? } | |
| 64 | + else # All | |
| 65 | + software_profiles | |
| 66 | + end | |
| 67 | + | |
| 68 | + block_softwares.slice(0..get_limit-1) | |
| 69 | + end | |
| 70 | + | |
| 71 | + def content(arg={}) | |
| 72 | + if self.box.owner_type == "Environment" && self.box.position == 1 | |
| 73 | + block = self | |
| 74 | + | |
| 75 | + proc do | |
| 76 | + render :file => 'blocks/main_area_softwares', | |
| 77 | + :locals => {:profiles=> block.profile_list(), :block => block} | |
| 78 | + end | |
| 79 | + else | |
| 80 | + super(arg) | |
| 81 | + end | |
| 82 | + end | |
| 83 | + | |
| 84 | + protected | |
| 85 | + | |
| 86 | + def get_visible_profiles | |
| 87 | + profile_include_list = [:image, :domains, :preferred_domain, :environment] | |
| 88 | + visible_profiles = profiles.visible.includes(profile_include_list) | |
| 89 | + | |
| 90 | + if !prioritize_profiles_with_image | |
| 91 | + visible_profiles.all( :limit => get_limit, | |
| 92 | + :order => 'profiles.updated_at DESC' | |
| 93 | + ).sort_by{ rand } | |
| 94 | + elsif profiles.visible.with_image.count >= get_limit | |
| 95 | + visible_profiles.with_image.all( :limit => get_limit * 5, | |
| 96 | + :order => 'profiles.updated_at DESC' | |
| 97 | + ).sort_by{ rand } | |
| 98 | + else | |
| 99 | + visible_profiles.with_image.sort_by{ rand } + | |
| 100 | + visible_profiles.without_image.all( :limit => get_limit * 5, | |
| 101 | + :order => 'profiles.updated_at DESC' | |
| 102 | + ).sort_by{ rand } | |
| 103 | + end | |
| 104 | + end | |
| 105 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/statistic_block.rb
0 → 100644
| ... | ... | @@ -0,0 +1,52 @@ |
| 1 | +class SoftwareCommunitiesPlugin::StatisticBlock < Block | |
| 2 | + | |
| 3 | + settings_items :benefited_people, :type => :integer, :default => 0 | |
| 4 | + settings_items :saved_resources, :type => :float, :default => 0.0 | |
| 5 | + | |
| 6 | + attr_accessible :benefited_people, :saved_resources | |
| 7 | + | |
| 8 | + def self.description | |
| 9 | + _('Software Statistics') | |
| 10 | + end | |
| 11 | + | |
| 12 | + def help | |
| 13 | + _('This block displays software statistics.') | |
| 14 | + end | |
| 15 | + | |
| 16 | + def content(args={}) | |
| 17 | + download_blocks = get_profile_download_blocks(self.owner) | |
| 18 | + downloads = download_blocks.map do |download_block| | |
| 19 | + get_downloads_from_block(download_block) | |
| 20 | + end | |
| 21 | + | |
| 22 | + block = self | |
| 23 | + | |
| 24 | + lambda do |object| | |
| 25 | + render( | |
| 26 | + :file => 'blocks/software_statistics', | |
| 27 | + :locals => { | |
| 28 | + :block => block, | |
| 29 | + :total_downloads => downloads.sum | |
| 30 | + } | |
| 31 | + ) | |
| 32 | + end | |
| 33 | + end | |
| 34 | + | |
| 35 | + def cacheable? | |
| 36 | + false | |
| 37 | + end | |
| 38 | + | |
| 39 | + private | |
| 40 | + | |
| 41 | + def get_profile_download_blocks profile | |
| 42 | + SoftwareCommunitiesPlugin::DownloadBlock.joins(:box).where("boxes.owner_id = ?", profile.id) | |
| 43 | + end | |
| 44 | + | |
| 45 | + def get_downloads_from_block download_block | |
| 46 | + downloads = download_block.downloads.map do |download| | |
| 47 | + download[:total_downloads] unless download[:total_downloads].nil? | |
| 48 | + end | |
| 49 | + downloads.select! {|value| not value.nil? } | |
| 50 | + downloads.sum | |
| 51 | + end | |
| 52 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin/wiki_block.rb
0 → 100644
| ... | ... | @@ -0,0 +1,30 @@ |
| 1 | +class SoftwareCommunitiesPlugin::WikiBlock < Block | |
| 2 | + | |
| 3 | + attr_accessible :show_name, :wiki_link | |
| 4 | + settings_items :show_name, :type => :boolean, :default => false | |
| 5 | + settings_items :wiki_link, :type => :string, :default => "" | |
| 6 | + | |
| 7 | + def self.description | |
| 8 | + _('Wiki Link') | |
| 9 | + end | |
| 10 | + | |
| 11 | + def help | |
| 12 | + _('This block displays a link to the software wiki.') | |
| 13 | + end | |
| 14 | + | |
| 15 | + def content(args={}) | |
| 16 | + block = self | |
| 17 | + s = show_name | |
| 18 | + | |
| 19 | + lambda do |object| | |
| 20 | + render( | |
| 21 | + :file => 'blocks/wiki', | |
| 22 | + :locals => { :block => block, :show_name => s } | |
| 23 | + ) | |
| 24 | + end | |
| 25 | + end | |
| 26 | + | |
| 27 | + def cacheable? | |
| 28 | + true | |
| 29 | + end | |
| 30 | +end | ... | ... |
src/noosfero-spb/software_communities/lib/software_database.rb
| ... | ... | @@ -1,20 +0,0 @@ |
| 1 | -class SoftwareDatabase < ActiveRecord::Base | |
| 2 | - attr_accessible :version | |
| 3 | - | |
| 4 | - belongs_to :software_info | |
| 5 | - belongs_to :database_description | |
| 6 | - | |
| 7 | - validates_presence_of :database_description_id, :version | |
| 8 | - | |
| 9 | - validates_length_of( | |
| 10 | - :version, | |
| 11 | - :maximum => 20, | |
| 12 | - :too_long => _("Software database is too long (maximum is 20 characters)") | |
| 13 | - ) | |
| 14 | - | |
| 15 | - validates( | |
| 16 | - :database_description_id, | |
| 17 | - :numericality => {:greater_than_or_equal_to => 1} | |
| 18 | - ) | |
| 19 | - | |
| 20 | -end |
src/noosfero-spb/software_communities/lib/software_helper.rb
| ... | ... | @@ -1,43 +0,0 @@ |
| 1 | -module SoftwareHelper | |
| 2 | - def self.select_options programming_languages, selected = 0 | |
| 3 | - value = "" | |
| 4 | - | |
| 5 | - programming_languages.each do |language| | |
| 6 | - selected = selected == language.id ? 'selected' : '' | |
| 7 | - value += "<option value=#{language.id} #{selected}> | |
| 8 | - #{language.name} | |
| 9 | - </option>" | |
| 10 | - end | |
| 11 | - | |
| 12 | - value | |
| 13 | - end | |
| 14 | - | |
| 15 | - def self.create_list_with_file file_name, model | |
| 16 | - list_file = File.open file_name, "r" | |
| 17 | - | |
| 18 | - list_file.each_line do |line| | |
| 19 | - model.create(:name=>line.strip) | |
| 20 | - end | |
| 21 | - | |
| 22 | - list_file.close | |
| 23 | - end | |
| 24 | - | |
| 25 | - def self.all_table_is_empty? table, ignored_fields=[] | |
| 26 | - return !table.keys.any?{|key| ignored_fields.include?(key) ? false : !table[key].empty?} | |
| 27 | - end | |
| 28 | - | |
| 29 | - def self.software_template | |
| 30 | - identifier = SoftwareHelper.software_template_identifier | |
| 31 | - | |
| 32 | - software_template = Community[identifier] | |
| 33 | - if !software_template.blank? && software_template.is_template | |
| 34 | - software_template | |
| 35 | - else | |
| 36 | - nil | |
| 37 | - end | |
| 38 | - end | |
| 39 | - | |
| 40 | - def self.software_template_identifier | |
| 41 | - identifier = YAML::load(File.open(SoftwareCommunitiesPlugin.root_path + 'config.yml'))['software_template'] | |
| 42 | - end | |
| 43 | -end |
src/noosfero-spb/software_communities/lib/software_highlights_block.rb
| ... | ... | @@ -1,20 +0,0 @@ |
| 1 | -class SoftwareHighlightsBlock < HighlightsBlock | |
| 2 | - | |
| 3 | - def self.description | |
| 4 | - _('Software Highlights Block') | |
| 5 | - end | |
| 6 | - | |
| 7 | - def help | |
| 8 | - _('This block displays the softwares icon into a highlight') | |
| 9 | - end | |
| 10 | - | |
| 11 | - def content(args={}) | |
| 12 | - softwares = self.settings[:images].collect {|h| h[:address].split('/').last} | |
| 13 | - block = self | |
| 14 | - proc do | |
| 15 | - render :file => 'blocks/software_highlights', :locals => { :block => block, :softwares => softwares} | |
| 16 | - end | |
| 17 | - end | |
| 18 | - | |
| 19 | - | |
| 20 | -end |
src/noosfero-spb/software_communities/lib/software_info.rb
| ... | ... | @@ -1,263 +0,0 @@ |
| 1 | -class SoftwareInfo < ActiveRecord::Base | |
| 2 | - acts_as_having_settings :field => :settings | |
| 3 | - | |
| 4 | - SEARCHABLE_SOFTWARE_FIELDS = { | |
| 5 | - :acronym => 1, | |
| 6 | - :finality => 2, | |
| 7 | - } | |
| 8 | - | |
| 9 | - SEARCHABLE_SOFTWARE_CLASSES = [ | |
| 10 | - SoftwareInfo, | |
| 11 | - Community, | |
| 12 | - ProgrammingLanguage, | |
| 13 | - DatabaseDescription | |
| 14 | - ] | |
| 15 | - | |
| 16 | - scope :search_by_query, lambda { |query = ""| | |
| 17 | - filtered_query = query.gsub(/[\|\(\)\\\/\s\[\]'"*%&!:]/,' ').split.map{|w| w += ":*"}.join('|') | |
| 18 | - search_fields = SoftwareInfo.pg_search_plugin_fields | |
| 19 | - | |
| 20 | - if query.empty? | |
| 21 | - SoftwareInfo.joins(:community).where("profiles.visible = ?", true) | |
| 22 | - else | |
| 23 | - searchable_software_objects = SoftwareInfo.transform_list_in_methods_list(SEARCHABLE_SOFTWARE_CLASSES) | |
| 24 | - includes(searchable_software_objects).where("to_tsvector('simple', #{search_fields}) @@ to_tsquery('#{filtered_query}')").where("profiles.visible = ?", true) | |
| 25 | - end | |
| 26 | - } | |
| 27 | - | |
| 28 | - def self.transform_list_in_methods_list list | |
| 29 | - methods_list = [] | |
| 30 | - | |
| 31 | - list.each do |element| | |
| 32 | - if SoftwareInfo.instance_methods.include?(element.to_s.underscore.to_sym) | |
| 33 | - methods_list << element.to_s.underscore.to_sym | |
| 34 | - elsif SoftwareInfo.instance_methods.include?(element.to_s.underscore.pluralize.to_sym) | |
| 35 | - methods_list << element.to_s.underscore.pluralize.to_sym | |
| 36 | - end | |
| 37 | - end | |
| 38 | - | |
| 39 | - methods_list | |
| 40 | - end | |
| 41 | - | |
| 42 | - def self.pg_search_plugin_fields | |
| 43 | - SEARCHABLE_SOFTWARE_CLASSES.collect { |one_class| | |
| 44 | - self.get_searchable_fields(one_class) | |
| 45 | - }.join(" || ' ' || ") | |
| 46 | - end | |
| 47 | - | |
| 48 | - def self.get_searchable_fields one_class | |
| 49 | - searchable_fields = one_class::SEARCHABLE_SOFTWARE_FIELDS.keys.map(&:to_s).sort.map {|f| "coalesce(#{one_class.table_name}.#{f}, '')"}.join(" || ' ' || ") | |
| 50 | - searchable_fields | |
| 51 | - end | |
| 52 | - | |
| 53 | - SEARCH_FILTERS = { | |
| 54 | - :order => %w[], | |
| 55 | - :display => %w[full] | |
| 56 | - } | |
| 57 | - | |
| 58 | - def self.default_search_display | |
| 59 | - 'full' | |
| 60 | - end | |
| 61 | - | |
| 62 | - attr_accessible :e_mag, :icp_brasil, :intern, :e_ping, :e_arq, | |
| 63 | - :operating_platform | |
| 64 | - | |
| 65 | - attr_accessible :demonstration_url, :acronym, :objectives, :features, | |
| 66 | - :license_info | |
| 67 | - | |
| 68 | - attr_accessible :community_id, :finality, :repository_link, :public_software, | |
| 69 | - :first_edit | |
| 70 | - | |
| 71 | - has_many :libraries, :dependent => :destroy | |
| 72 | - has_many :software_databases | |
| 73 | - has_many :database_descriptions, :through => :software_databases | |
| 74 | - has_many :software_languages | |
| 75 | - has_many :operating_systems | |
| 76 | - has_many :programming_languages, :through => :software_languages | |
| 77 | - has_many :operating_system_names, :through => :operating_systems | |
| 78 | - | |
| 79 | - belongs_to :community, :dependent => :destroy | |
| 80 | - belongs_to :license_info | |
| 81 | - | |
| 82 | - has_one :software_categories | |
| 83 | - | |
| 84 | - validates_length_of :finality, :maximum => 120 | |
| 85 | - validates_length_of :objectives, :maximum => 4000 | |
| 86 | - validates_length_of :features, :maximum => 4000 | |
| 87 | - validates_presence_of :finality, :community | |
| 88 | - | |
| 89 | - validate :validate_acronym | |
| 90 | - | |
| 91 | - settings_items :another_license_version, :another_license_link | |
| 92 | - | |
| 93 | - # used on find_by_contents | |
| 94 | - scope :like_search, lambda{ |name| | |
| 95 | - joins(:community).where( | |
| 96 | - "name ILIKE ? OR acronym ILIKE ? OR finality ILIKE ?", | |
| 97 | - "%#{name}%", "%#{name}%", "%#{name}%" | |
| 98 | - ) | |
| 99 | - } | |
| 100 | - | |
| 101 | - scope :search, lambda { |name="", database_description_id = "", | |
| 102 | - programming_language_id = "", operating_system_name_id = "", | |
| 103 | - license_info_id = "", e_ping = "", e_mag = "", internacionalizable = "", | |
| 104 | - icp_brasil = "", e_arq = "", software_categories = "" | | |
| 105 | - | |
| 106 | - like_sql = "" | |
| 107 | - values = [] | |
| 108 | - | |
| 109 | - unless name.blank? | |
| 110 | - like_sql << "name ILIKE ? OR identifier ILIKE ? AND " | |
| 111 | - values << "%#{name}%" << "%#{name}%" | |
| 112 | - end | |
| 113 | - | |
| 114 | - like_sql = like_sql[0..like_sql.length-5] | |
| 115 | - | |
| 116 | - { | |
| 117 | - :joins => [:community], | |
| 118 | - :conditions=>[like_sql, *values] | |
| 119 | - } | |
| 120 | - } | |
| 121 | - | |
| 122 | - def license_info | |
| 123 | - license = LicenseInfo.find_by_id self.license_info_id | |
| 124 | - license_another = LicenseInfo.find_by_version("Another") | |
| 125 | - | |
| 126 | - if license_another && license.id == license_another.id | |
| 127 | - LicenseInfo.new( | |
| 128 | - :version => self.another_license_version, | |
| 129 | - :link => self.another_license_link | |
| 130 | - ) | |
| 131 | - else | |
| 132 | - license | |
| 133 | - end | |
| 134 | - end | |
| 135 | - | |
| 136 | - def another_license(version, link) | |
| 137 | - license_another = LicenseInfo.find_by_version("Another") | |
| 138 | - | |
| 139 | - if license_another | |
| 140 | - self.another_license_version = version | |
| 141 | - self.another_license_link = link | |
| 142 | - self.license_info = license_another | |
| 143 | - self.save! | |
| 144 | - end | |
| 145 | - end | |
| 146 | - | |
| 147 | - def validate_name_lenght | |
| 148 | - if self.community.name.size > 100 | |
| 149 | - self.errors.add( | |
| 150 | - :base, | |
| 151 | - _("Name is too long (maximum is %{count} characters)") | |
| 152 | - ) | |
| 153 | - false | |
| 154 | - end | |
| 155 | - true | |
| 156 | - end | |
| 157 | - | |
| 158 | - # if create_after_moderation receive a model object, would be possible to reuse core method | |
| 159 | - def self.create_after_moderation(requestor, attributes = {}) | |
| 160 | - environment = attributes.delete(:environment) | |
| 161 | - name = attributes.delete(:name) | |
| 162 | - identifier = attributes.delete(:identifier) | |
| 163 | - image_builder = attributes.delete(:image_builder) | |
| 164 | - license_info = attributes.delete(:license_info) | |
| 165 | - another_license_version = attributes.delete(:another_license_version) | |
| 166 | - another_license_link = attributes.delete(:another_license_link) | |
| 167 | - | |
| 168 | - software_info = SoftwareInfo.new(attributes) | |
| 169 | - unless environment.admins.include? requestor | |
| 170 | - CreateSoftware.create!( | |
| 171 | - attributes.merge( | |
| 172 | - :requestor => requestor, | |
| 173 | - :environment => environment, | |
| 174 | - :name => name, | |
| 175 | - :identifier => identifier, | |
| 176 | - :license_info => license_info | |
| 177 | - ) | |
| 178 | - ) | |
| 179 | - else | |
| 180 | - software_template = SoftwareHelper.software_template | |
| 181 | - | |
| 182 | - community_hash = {:name => name} | |
| 183 | - community_hash[:identifier] = identifier | |
| 184 | - community_hash[:image_builder] = image_builder if image_builder | |
| 185 | - | |
| 186 | - community = Community.new(community_hash) | |
| 187 | - community.environment = environment | |
| 188 | - | |
| 189 | - unless software_template.blank? | |
| 190 | - community.template_id = software_template.id | |
| 191 | - end | |
| 192 | - | |
| 193 | - community.save! | |
| 194 | - community.add_admin(requestor) | |
| 195 | - | |
| 196 | - software_info.community = community | |
| 197 | - software_info.license_info = license_info | |
| 198 | - software_info.save! | |
| 199 | - end | |
| 200 | - | |
| 201 | - software_info.verify_license_info(another_license_version, another_license_link) | |
| 202 | - software_info.save | |
| 203 | - software_info | |
| 204 | - end | |
| 205 | - | |
| 206 | - def verify_license_info another_license_version, another_license_link | |
| 207 | - license_another = LicenseInfo.find_by_version("Another") | |
| 208 | - | |
| 209 | - if license_another && self.license_info_id == license_another.id | |
| 210 | - version = another_license_version | |
| 211 | - link = another_license_link | |
| 212 | - | |
| 213 | - self.another_license(version, link) | |
| 214 | - end | |
| 215 | - end | |
| 216 | - | |
| 217 | - | |
| 218 | - def validate_acronym | |
| 219 | - self.acronym = "" if self.acronym.nil? | |
| 220 | - if self.acronym.length > 10 && self.errors.messages[:acronym].nil? | |
| 221 | - self.errors.add(:acronym, _("can't have more than 10 characteres")) | |
| 222 | - false | |
| 223 | - elsif self.acronym.match(/\s+/) | |
| 224 | - self.errors.add(:acronym, _("can't have whitespaces")) | |
| 225 | - false | |
| 226 | - end | |
| 227 | - true | |
| 228 | - end | |
| 229 | - | |
| 230 | - def valid_operating_systems | |
| 231 | - if self.operating_systems.empty? | |
| 232 | - self.errors.add(:operating_system, _(": at least one must be filled")) | |
| 233 | - end | |
| 234 | - end | |
| 235 | - | |
| 236 | - def valid_software_info | |
| 237 | - if self.software_languages.empty? | |
| 238 | - self.errors.add(:software_languages, _(": at least one must be filled")) | |
| 239 | - end | |
| 240 | - end | |
| 241 | - | |
| 242 | - def valid_databases | |
| 243 | - if self.software_databases.empty? | |
| 244 | - self.errors.add(:software_databases, _(": at least one must be filled")) | |
| 245 | - end | |
| 246 | - end | |
| 247 | - | |
| 248 | - def visible? | |
| 249 | - self.community.visible? | |
| 250 | - end | |
| 251 | - | |
| 252 | - def name | |
| 253 | - self.community.name | |
| 254 | - end | |
| 255 | - | |
| 256 | - def short_name | |
| 257 | - self.community.short_name | |
| 258 | - end | |
| 259 | - | |
| 260 | - def identifier | |
| 261 | - self.community.identifier | |
| 262 | - end | |
| 263 | -end |
src/noosfero-spb/software_communities/lib/software_information_block.rb
| ... | ... | @@ -1,37 +0,0 @@ |
| 1 | -class SoftwareInformationBlock < Block | |
| 2 | - | |
| 3 | - attr_accessible :show_name | |
| 4 | - | |
| 5 | - settings_items :show_name, :type => :boolean, :default => false | |
| 6 | - | |
| 7 | - def self.description | |
| 8 | - _('Basic Software Information') | |
| 9 | - end | |
| 10 | - | |
| 11 | - def help | |
| 12 | - _('This block displays the basic information of a software profile.') | |
| 13 | - end | |
| 14 | - | |
| 15 | - def content(args={}) | |
| 16 | - block = self | |
| 17 | - s = show_name | |
| 18 | - | |
| 19 | - lambda do |object| | |
| 20 | - render( | |
| 21 | - :file => 'blocks/software_information', | |
| 22 | - :locals => { :block => block, :show_name => s} | |
| 23 | - ) | |
| 24 | - end | |
| 25 | - end | |
| 26 | - | |
| 27 | - def cacheable? | |
| 28 | - false | |
| 29 | - end | |
| 30 | - | |
| 31 | - private | |
| 32 | - | |
| 33 | - def owner_has_ratings? | |
| 34 | - ratings = CommunityRating.where(community_id: block.owner.id) | |
| 35 | - !ratings.empty? | |
| 36 | - end | |
| 37 | -end |
src/noosfero-spb/software_communities/lib/software_language.rb
| ... | ... | @@ -1,14 +0,0 @@ |
| 1 | -class SoftwareLanguage < ActiveRecord::Base | |
| 2 | - attr_accessible :version | |
| 3 | - | |
| 4 | - belongs_to :software_info | |
| 5 | - belongs_to :programming_language | |
| 6 | - | |
| 7 | - validates_length_of( | |
| 8 | - :version, | |
| 9 | - :maximum => 20, | |
| 10 | - :too_long => _("Software language is too long (maximum is 20 characters)") | |
| 11 | - ) | |
| 12 | - | |
| 13 | - validates_presence_of :version,:programming_language | |
| 14 | -end |
src/noosfero-spb/software_communities/lib/software_language_helper.rb
| ... | ... | @@ -1,84 +0,0 @@ |
| 1 | -class SoftwareLanguageHelper < DynamicTableHelper | |
| 2 | - MODEL_NAME ="language" | |
| 3 | - FIELD_NAME = "programming_language_id" | |
| 4 | - | |
| 5 | - def self.valid_language? language | |
| 6 | - return false if SoftwareHelper.all_table_is_empty?(language) | |
| 7 | - | |
| 8 | - programming_language_id_list = ProgrammingLanguage. | |
| 9 | - select(:id). | |
| 10 | - collect { |dd| dd.id } | |
| 11 | - | |
| 12 | - return programming_language_id_list.include?( | |
| 13 | - language[:programming_language_id].to_i | |
| 14 | - ) | |
| 15 | - end | |
| 16 | - | |
| 17 | - def self.list_language new_languages | |
| 18 | - return [] if new_languages.nil? or new_languages.length == 0 | |
| 19 | - list_languages = [] | |
| 20 | - | |
| 21 | - new_languages.each do |new_language| | |
| 22 | - if valid_language? new_language | |
| 23 | - language = SoftwareLanguage.new | |
| 24 | - language.programming_language = | |
| 25 | - ProgrammingLanguage.find(new_language[:programming_language_id]) | |
| 26 | - language.version = new_language[:version] | |
| 27 | - list_languages << language | |
| 28 | - end | |
| 29 | - end | |
| 30 | - | |
| 31 | - list_languages | |
| 32 | - end | |
| 33 | - | |
| 34 | - def self.valid_list_language? list_languages | |
| 35 | - return false if list_languages.nil? or list_languages.length == 0 | |
| 36 | - | |
| 37 | - list_languages.each do |language| | |
| 38 | - return false unless language.valid? | |
| 39 | - end | |
| 40 | - | |
| 41 | - true | |
| 42 | - end | |
| 43 | - | |
| 44 | - def self.language_as_tables(list_languages, disabled=false) | |
| 45 | - model_list = list_languages | |
| 46 | - model_list ||= [{:programming_language_id => "", :version => ""}] | |
| 47 | - | |
| 48 | - models_as_tables model_list, "language_html_structure", disabled | |
| 49 | - end | |
| 50 | - | |
| 51 | - def self.language_html_structure(language_data, disabled) | |
| 52 | - language_id = language_data[:programming_language_id] | |
| 53 | - language_name = "" | |
| 54 | - unless language_data[:programming_language_id].blank? | |
| 55 | - language_name = ProgrammingLanguage.find( | |
| 56 | - language_data[:programming_language_id], | |
| 57 | - :select=>"name" | |
| 58 | - ).name | |
| 59 | - end | |
| 60 | - | |
| 61 | - data = { | |
| 62 | - model_name: MODEL_NAME, | |
| 63 | - field_name: FIELD_NAME, | |
| 64 | - name: { | |
| 65 | - value: language_name, | |
| 66 | - id: language_id, | |
| 67 | - hidden: true, | |
| 68 | - autocomplete: true, | |
| 69 | - select_field: false | |
| 70 | - }, | |
| 71 | - version: { | |
| 72 | - value: language_data[:version], | |
| 73 | - hidden: true, | |
| 74 | - delete: true | |
| 75 | - } | |
| 76 | - } | |
| 77 | - DATA[:license].delete(:value) | |
| 78 | - table_html_structure(data, disabled) | |
| 79 | - end | |
| 80 | - | |
| 81 | - def self.add_dynamic_table | |
| 82 | - language_as_tables(nil).first.call | |
| 83 | - end | |
| 84 | -end |
src/noosfero-spb/software_communities/lib/software_tab_data_block.rb
| ... | ... | @@ -1,48 +0,0 @@ |
| 1 | -class SoftwareTabDataBlock < Block | |
| 2 | - attr_accessible :show_name, :displayed_blog | |
| 3 | - | |
| 4 | - settings_items :show_name, :type => :boolean, :default => false | |
| 5 | - settings_items :displayed_blog, :type => :integer, :default => 0 | |
| 6 | - | |
| 7 | - TOTAL_POSTS_DYSPLAYED = 5 | |
| 8 | - | |
| 9 | - def self.description | |
| 10 | - _('Software Tab Data') | |
| 11 | - end | |
| 12 | - | |
| 13 | - def help | |
| 14 | - _('This block is used by colab to insert data into Noosfero') | |
| 15 | - end | |
| 16 | - | |
| 17 | - def content(args={}) | |
| 18 | - block = self | |
| 19 | - | |
| 20 | - lambda do |object| | |
| 21 | - render( | |
| 22 | - :file => 'blocks/software_tab_data', | |
| 23 | - :locals => { | |
| 24 | - :block => block | |
| 25 | - } | |
| 26 | - ) | |
| 27 | - end | |
| 28 | - end | |
| 29 | - | |
| 30 | - def blogs | |
| 31 | - self.owner.blogs | |
| 32 | - end | |
| 33 | - | |
| 34 | - def actual_blog | |
| 35 | - # As :displayed_blog default value is 0, it falls to the first one | |
| 36 | - blogs.find_by_id(self.displayed_blog) || blogs.first | |
| 37 | - end | |
| 38 | - | |
| 39 | - def posts | |
| 40 | - blog = actual_blog | |
| 41 | - | |
| 42 | - if blog and (not blog.posts.empty?) | |
| 43 | - blog.posts.limit(TOTAL_POSTS_DYSPLAYED) | |
| 44 | - else | |
| 45 | - [] | |
| 46 | - end | |
| 47 | - end | |
| 48 | -end |
src/noosfero-spb/software_communities/lib/softwares_block.rb
| ... | ... | @@ -1,105 +0,0 @@ |
| 1 | -class SoftwaresBlock < CommunitiesBlock | |
| 2 | - | |
| 3 | - settings_items :software_type, :default => "All" | |
| 4 | - attr_accessible :accessor_id, :accessor_type, :role_id, | |
| 5 | - :resource_id, :resource_type, :software_type | |
| 6 | - | |
| 7 | - def self.description | |
| 8 | - _('Softwares') | |
| 9 | - end | |
| 10 | - | |
| 11 | - def default_title | |
| 12 | - if self.software_type == "Generic" | |
| 13 | - return n_('{#} generic software', '{#} generic softwares', profile_count) | |
| 14 | - elsif self.software_type == "Public" | |
| 15 | - return n_('{#} public software', '{#} public softwares', profile_count) | |
| 16 | - else | |
| 17 | - return n_('{#} software', '{#} softwares', profile_count) | |
| 18 | - end | |
| 19 | - end | |
| 20 | - | |
| 21 | - def help | |
| 22 | - _('This block displays the softwares in which the user is a member.') | |
| 23 | - end | |
| 24 | - | |
| 25 | - def footer | |
| 26 | - self.software_type ||= "All" | |
| 27 | - owner = self.owner | |
| 28 | - case owner | |
| 29 | - when Profile | |
| 30 | - lambda do |context| | |
| 31 | - link_to s_('softwares|View all'), :profile => owner.identifier, | |
| 32 | - :controller => 'profile', :action => 'communities', | |
| 33 | - :type => 'Software' | |
| 34 | - end | |
| 35 | - when Environment | |
| 36 | - lambda do |context| | |
| 37 | - link_to s_('softwares|View all'), :controller => 'search', | |
| 38 | - :action => 'software_infos' | |
| 39 | - end | |
| 40 | - else | |
| 41 | - '' | |
| 42 | - end | |
| 43 | - end | |
| 44 | - | |
| 45 | - def profile_count | |
| 46 | - profile_list.count | |
| 47 | - end | |
| 48 | - | |
| 49 | - def profiles | |
| 50 | - owner.communities | |
| 51 | - end | |
| 52 | - | |
| 53 | - def profile_list | |
| 54 | - profiles = get_visible_profiles | |
| 55 | - | |
| 56 | - software_profiles = profiles.select do |profile| | |
| 57 | - profile.class == Community && profile.software? | |
| 58 | - end | |
| 59 | - | |
| 60 | - block_softwares = if self.software_type == "Public" | |
| 61 | - software_profiles.select { |profile| profile.software_info.public_software? } | |
| 62 | - elsif self.software_type == "Generic" | |
| 63 | - software_profiles.select { |profile| !profile.software_info.public_software? } | |
| 64 | - else # All | |
| 65 | - software_profiles | |
| 66 | - end | |
| 67 | - | |
| 68 | - block_softwares.slice(0..get_limit-1) | |
| 69 | - end | |
| 70 | - | |
| 71 | - def content(arg={}) | |
| 72 | - if self.box.owner_type == "Environment" && self.box.position == 1 | |
| 73 | - block = self | |
| 74 | - | |
| 75 | - proc do | |
| 76 | - render :file => 'blocks/main_area_softwares', | |
| 77 | - :locals => {:profiles=> block.profile_list(), :block => block} | |
| 78 | - end | |
| 79 | - else | |
| 80 | - super(arg) | |
| 81 | - end | |
| 82 | - end | |
| 83 | - | |
| 84 | - protected | |
| 85 | - | |
| 86 | - def get_visible_profiles | |
| 87 | - profile_include_list = [:image, :domains, :preferred_domain, :environment] | |
| 88 | - visible_profiles = profiles.visible.includes(profile_include_list) | |
| 89 | - | |
| 90 | - if !prioritize_profiles_with_image | |
| 91 | - visible_profiles.all( :limit => get_limit, | |
| 92 | - :order => 'profiles.updated_at DESC' | |
| 93 | - ).sort_by{ rand } | |
| 94 | - elsif profiles.visible.with_image.count >= get_limit | |
| 95 | - visible_profiles.with_image.all( :limit => get_limit * 5, | |
| 96 | - :order => 'profiles.updated_at DESC' | |
| 97 | - ).sort_by{ rand } | |
| 98 | - else | |
| 99 | - visible_profiles.with_image.sort_by{ rand } + | |
| 100 | - visible_profiles.without_image.all( :limit => get_limit * 5, | |
| 101 | - :order => 'profiles.updated_at DESC' | |
| 102 | - ).sort_by{ rand } | |
| 103 | - end | |
| 104 | - end | |
| 105 | -end |
src/noosfero-spb/software_communities/lib/statistic_block.rb
| ... | ... | @@ -1,52 +0,0 @@ |
| 1 | -class StatisticBlock < Block | |
| 2 | - | |
| 3 | - settings_items :benefited_people, :type => :integer, :default => 0 | |
| 4 | - settings_items :saved_resources, :type => :float, :default => 0.0 | |
| 5 | - | |
| 6 | - attr_accessible :benefited_people, :saved_resources | |
| 7 | - | |
| 8 | - def self.description | |
| 9 | - _('Software Statistics') | |
| 10 | - end | |
| 11 | - | |
| 12 | - def help | |
| 13 | - _('This block displays software statistics.') | |
| 14 | - end | |
| 15 | - | |
| 16 | - def content(args={}) | |
| 17 | - download_blocks = get_profile_download_blocks(self.owner) | |
| 18 | - downloads = download_blocks.map do |download_block| | |
| 19 | - get_downloads_from_block(download_block) | |
| 20 | - end | |
| 21 | - | |
| 22 | - block = self | |
| 23 | - | |
| 24 | - lambda do |object| | |
| 25 | - render( | |
| 26 | - :file => 'blocks/software_statistics', | |
| 27 | - :locals => { | |
| 28 | - :block => block, | |
| 29 | - :total_downloads => downloads.sum | |
| 30 | - } | |
| 31 | - ) | |
| 32 | - end | |
| 33 | - end | |
| 34 | - | |
| 35 | - def cacheable? | |
| 36 | - false | |
| 37 | - end | |
| 38 | - | |
| 39 | - private | |
| 40 | - | |
| 41 | - def get_profile_download_blocks profile | |
| 42 | - DownloadBlock.joins(:box).where("boxes.owner_id = ?", profile.id) | |
| 43 | - end | |
| 44 | - | |
| 45 | - def get_downloads_from_block download_block | |
| 46 | - downloads = download_block.downloads.map do |download| | |
| 47 | - download[:total_downloads] unless download[:total_downloads].nil? | |
| 48 | - end | |
| 49 | - downloads.select! {|value| not value.nil? } | |
| 50 | - downloads.sum | |
| 51 | - end | |
| 52 | -end |
src/noosfero-spb/software_communities/lib/wiki_block.rb
| ... | ... | @@ -1,30 +0,0 @@ |
| 1 | -class WikiBlock < Block | |
| 2 | - | |
| 3 | - attr_accessible :show_name, :wiki_link | |
| 4 | - settings_items :show_name, :type => :boolean, :default => false | |
| 5 | - settings_items :wiki_link, :type => :string, :default => "" | |
| 6 | - | |
| 7 | - def self.description | |
| 8 | - _('Wiki Link') | |
| 9 | - end | |
| 10 | - | |
| 11 | - def help | |
| 12 | - _('This block displays a link to the software wiki.') | |
| 13 | - end | |
| 14 | - | |
| 15 | - def content(args={}) | |
| 16 | - block = self | |
| 17 | - s = show_name | |
| 18 | - | |
| 19 | - lambda do |object| | |
| 20 | - render( | |
| 21 | - :file => 'blocks/wiki', | |
| 22 | - :locals => { :block => block, :show_name => s } | |
| 23 | - ) | |
| 24 | - end | |
| 25 | - end | |
| 26 | - | |
| 27 | - def cacheable? | |
| 28 | - true | |
| 29 | - end | |
| 30 | -end |