Commit 8d4c86eaa2f89eccf9b2c9e3e457604688506aa8

Authored by Rodrigo Souto
Committed by Luciano Prestes
1 parent f73553ab

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,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,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,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,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,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,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,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,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 \ No newline at end of file 0 \ No newline at end of file
src/noosfero-spb/software_communities/lib/library.rb
@@ -1,10 +0,0 @@ @@ -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,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,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
@@ -1,8 +0,0 @@ @@ -1,8 +0,0 @@
1 -class LicenseInfo < ActiveRecord::Base  
2 - attr_accessible :version, :link  
3 -  
4 - validates_presence_of :version  
5 -  
6 - has_many :software_info  
7 -  
8 -end  
src/noosfero-spb/software_communities/lib/operating_system.rb
@@ -1,14 +0,0 @@ @@ -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,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
@@ -1,10 +0,0 @@ @@ -1,10 +0,0 @@
1 -class OperatingSystemName < ActiveRecord::Base  
2 - attr_accessible :name  
3 -  
4 - validates_presence_of :name  
5 - validates_uniqueness_of :name  
6 -  
7 - has_many :operating_systems  
8 - has_many :software_infos, :through => :operating_systems  
9 -  
10 -end  
src/noosfero-spb/software_communities/lib/programming_language.rb
@@ -1,15 +0,0 @@ @@ -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,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,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 &lt; Noosfero::Plugin @@ -33,17 +33,17 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin
33 33
34 def self.extra_blocks 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 end 48 end
49 49
@@ -117,7 +117,7 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin @@ -117,7 +117,7 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin
117 protected 117 protected
118 118
119 def software_info_transaction 119 def software_info_transaction
120 - SoftwareInfo.transaction do 120 + SoftwareCommunitiesPlugin::SoftwareInfo.transaction do
121 context.profile. 121 context.profile.
122 software_info. 122 software_info.
123 update_attributes!(context.params[:software_info]) 123 update_attributes!(context.params[:software_info])
@@ -125,7 +125,7 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin @@ -125,7 +125,7 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin
125 end 125 end
126 126
127 def license_transaction 127 def license_transaction
128 - license = LicenseInfo.find(context.params[:version]) 128 + license = SoftwareCommunitiesPlugin::LicenseInfo.find(context.params[:version])
129 context.profile.software_info.license_info = license 129 context.profile.software_info.license_info = license
130 context.profile.software_info.save! 130 context.profile.software_info.save!
131 end 131 end
src/noosfero-spb/software_communities/lib/software_communities_plugin/categories_and_tags_block.rb 0 → 100644
@@ -0,0 +1,29 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +class SoftwareCommunitiesPlugin::LicenseInfo < ActiveRecord::Base
  2 + attr_accessible :version, :link
  3 +
  4 + validates_presence_of :version
  5 +
  6 + has_many :software_info, :class_name => 'SoftwareCommunitiesPlugin::SoftwareInfo'
  7 +
  8 +end
src/noosfero-spb/software_communities/lib/software_communities_plugin/operating_system.rb 0 → 100644
@@ -0,0 +1,14 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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,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,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,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,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,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,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,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,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,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,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,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