Commit f77c83ab00c7ac8f9cfa37bbffc372147b81c0a7

Authored by Thiago Ribeiro
2 parents dce5c218 ca88bc8c

Fix css/html in institution modal

Showing 88 changed files with 1470 additions and 382 deletions   Show diff stats
Makefile 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +%:
  2 + $(MAKE) -C src/ $@
... ...
README.chef.md 0 → 100644
... ... @@ -0,0 +1,96 @@
  1 +# Software Público - configuration management
  2 +
  3 +## Requirements
  4 +
  5 +* [chake](https://rubygems.org/gems/chake)
  6 +* rake
  7 +
  8 +For development
  9 +
  10 +* vagrant
  11 +* shunit2
  12 +* moreutils
  13 +* redir
  14 +
  15 +## Configuration parameters
  16 +
  17 +All configuration parameters are defined in `nodes.yaml`, with exception of IP
  18 +addresses, which are defined in different files:
  19 +
  20 +- for local development, the IP addresses of the Vagrant VMs are defined in
  21 + config/local/ips.yaml.
  22 +
  23 +- for production, you need to create a new file called
  24 + `config/production/ips.yaml`
  25 +
  26 +You will probably not need to change nodes.yaml unless you are developing the
  27 +deployment process.
  28 +
  29 +## Deploy
  30 +
  31 +### Development
  32 +
  33 +First you have to bring up the development virtual machines:
  34 +
  35 +```bash
  36 +$ vagrant up
  37 +$ rake preconfig
  38 +$ rake bootstrap_common
  39 +```
  40 +
  41 +Right now there are 5 VM's, so this might take a while. The basic commands for
  42 +deployment:
  43 +
  44 +```bash
  45 +$ rake # deploys all servers
  46 +$ rake nodes # lists all servers
  47 +$ rake converge:$server # deploys only $server
  48 +```
  49 +
  50 +### Production
  51 +
  52 +* TODO: document adding the SSL key and certificate
  53 +* TODO: document creation of `prod.yaml`.
  54 +* TODO: document SSH configuration
  55 +
  56 +The very first step is
  57 +
  58 +```
  59 +$ rake preconfig SPB_ENV=production
  60 +```
  61 +
  62 +This will perform some initial configuration to the system that is required
  63 +before doing the actual deployment.
  64 +
  65 +After that:
  66 +
  67 +```bash
  68 +$ rake SPB_ENV=production # deploys all servers
  69 +$ rake nodes SPB_ENV=production # lists all servers
  70 +$ rake converge:$server SPB_ENV=production # deploys only $server
  71 +```
  72 +
  73 +You can also do `export SPB_ENV=production` in your shell and omit it in the
  74 +`rake` calls.
  75 +
  76 +See the output of `rake -T` for other tasks.
  77 +
  78 +## Viewing the running site when developping locally
  79 +
  80 +Run:
  81 +
  82 +```bash
  83 +./server
  84 +```
  85 +
  86 +Follow the on-screen instructions an browse to
  87 +[http://softwarepublico.dev/](http://softwarepublico.dev/).
  88 +
  89 +Note: this requires that your system will resolve `\*.dev` to `localhost`.
  90 +Google DNS servers will do that automatically, otherwise you might add the following entries to `/etc/hosts`:
  91 +
  92 +```
  93 +127.0.53.53 softwarepublico.dev
  94 +127.0.53.53 listas.softwarepublico.dev
  95 +```
  96 +
... ...
README.md
1   -# Software Público - configuration management
  1 +# Software Público Brasileiro - desenvolvimento
2 2  
3   -## Requirements
  3 +## Organização
4 4  
5   -* [chake](https://rubygems.org/gems/chake)
6   -* rake
  5 +Este repositório contém tanto o código fonte desenvolvimento especificamente
  6 +para o SPB, quando o código de gestão de configuração necessário para implantar
  7 +o ambiente do SPB.
7 8  
8   -For development
  9 +O código fonte dos componentes e pacotes desenvolvidos está no diretório
  10 +`src/`. Os demais diretórios contém código de gestão de configuração,
  11 +documentação, utilitários etc.
9 12  
10   -* vagrant
11   -* shunit2
12   -* moreutils
13   -* redir
  13 +## Fazendo um release
14 14  
15   -## Configuration parameters
  15 +* Atualize o número de versão no arquivo VERSION
  16 +* Execute `make release`.
16 17  
17   -All configuration parameters are defined in `nodes.yaml`, with exception of IP
18   -addresses, which are defined in different files:
19   -
20   -- for local development, the IP addresses of the Vagrant VMs are defined in
21   - config/local/ips.yaml.
22   -
23   -- for production, you need to create a new file called
24   - `config/production/ips.yaml`
25   -
26   -You will probably not need to change nodes.yaml unless you are developing the
27   -deployment process.
28   -
29   -## Deploy
30   -
31   -### Development
32   -
33   -First you have to bring up the development virtual machines:
34   -
35   -```bash
36   -$ vagrant up
37   -$ rake preconfig
38   -$ rake bootstrap_common
39   -```
40   -
41   -Right now there are 5 VM's, so this might take a while. The basic commands for
42   -deployment:
43   -
44   -```bash
45   -$ rake # deploys all servers
46   -$ rake nodes # lists all servers
47   -$ rake converge:$server # deploys only $server
48   -```
49   -
50   -### Production
51   -
52   -* TODO: document adding the SSL key and certificate
53   -* TODO: document creation of `prod.yaml`.
54   -* TODO: document SSH configuration
55   -
56   -The very first step is
57   -
58   -```
59   -$ rake preconfig SPB_ENV=production
60   -```
61   -
62   -This will perform some initial configuration to the system that is required
63   -before doing the actual deployment.
64   -
65   -After that:
66   -
67   -```bash
68   -$ rake SPB_ENV=production # deploys all servers
69   -$ rake nodes SPB_ENV=production # lists all servers
70   -$ rake converge:$server SPB_ENV=production # deploys only $server
71   -```
72   -
73   -You can also do `export SPB_ENV=production` in your shell and omit it in the
74   -`rake` calls.
75   -
76   -See the output of `rake -T` for other tasks.
77   -
78   -## Viewing the running site when developping locally
79   -
80   -Run:
81   -
82   -```bash
83   -./server
84   -```
85   -
86   -Follow the on-screen instructions an browse to
87   -[http://softwarepublico.dev/](http://softwarepublico.dev/).
88   -
89   -Note: this requires that your system will resolve `\*.dev` to `localhost`.
90   -Google DNS servers will do that automatically, otherwise you might add the following entries to `/etc/hosts`:
91   -
92   -```
93   -127.0.53.53 softwarepublico.dev
94   -127.0.53.53 listas.softwarepublico.dev
95   -```
  18 +## Implantação
96 19  
  20 +Veja as instruções em README.chef.md.
... ...
VERSION 0 → 100644
... ... @@ -0,0 +1 @@
  1 +5.0a0
... ...
cookbooks/colab/recipes/default.rb
... ... @@ -21,6 +21,11 @@ package 'colab-spb-theme' do
21 21 notifies :restart, 'service[colab]'
22 22 end
23 23  
  24 +package 'colab-spb-theme' do
  25 + action :upgrade
  26 + notifies :restart, 'service[colab]'
  27 +end
  28 +
24 29 directory '/etc/colab' do
25 30 owner 'root'
26 31 group 'root'
... ...
cookbooks/colab/templates/gitlab.py.erb
... ... @@ -9,6 +9,7 @@ verbose_name = 'Gitlab Plugin'
9 9 upstream = 'http://<%= node['peers']['integration'] %>:81/gitlab/'
10 10  
11 11 private_token = '<%= @get_private_token.call %>'
  12 +verify_ssl = False
12 13  
13 14 urls = {
14 15 'include': 'colab_gitlab.urls',
... ...
cookbooks/colab/templates/noosfero.py.erb
... ... @@ -27,6 +27,8 @@ menu_urls = (
27 27 kwargs={'path': 'search/people'}, auth=False),
28 28 url(display=_('Communities'), viewname='noosfero',
29 29 kwargs={'path': 'search/communities'}, auth=False),
  30 + url(display=_('Institutions'), viewname='noosfero',
  31 + kwargs={'path': 'search/institutions'}, auth=False),
30 32 url(display=_('Profile'), viewname='noosfero',
31 33 kwargs={'path': 'profile/~/'}, auth=True),
32 34 url(display=_('Control Panel'), viewname='noosfero',
... ...
cookbooks/noosfero/files/noosfero-create-api-user
... ... @@ -5,13 +5,19 @@ email = ARGV[1]
5 5 password = SecureRandom.random_number.to_s
6 6  
7 7 user = User.find_by_login(login)
8   -exit(0) if user
9   -
10   -user = User.create!(
11   - login: login,
12   - email: email,
13   - password: password,
14   - password_confirmation: password
15   -)
16   -user.activate
17   -user.generate_private_token!
  8 +if user
  9 + if user.private_token_expired?
  10 + user.generate_private_token!
  11 + else
  12 + exit(0)
  13 + end
  14 +else
  15 + user = User.create!(
  16 + login: login,
  17 + email: email,
  18 + password: password,
  19 + password_confirmation: password
  20 + )
  21 + user.activate
  22 + user.generate_private_token!
  23 +end
... ...
cookbooks/reverse_proxy/templates/reverse_proxy.conf.erb
... ... @@ -42,7 +42,7 @@ server {
42 42 proxy_set_header REMOTE_USER '';
43 43 }
44 44  
45   - location /doc/ {
  45 + location /doc {
46 46 root /srv;
47 47 }
48 48  
... ...
docs/apoio.rst.in
... ... @@ -65,6 +65,42 @@ Caso os ambientes já tenham sido convergidos anteriormente, não será possíve
65 65  
66 66 O output do comando acima é a sua chave pública, ela deverá ser copiada e colada, manualmente, em ``~/.ssh/authorized_keys`` do usuário desejado. Esse procedimento deve ser repetido em todas as máquinas listadas em ``config/@@SPB_ENV@@/ips.yaml``.
67 67  
  68 +Git push com HTTPS
  69 +-----------------
  70 +
  71 +Para a utilização do git com protocolo HTTPS é necessário configurar a senha do perfil do seu usuário na ferramenta Gitlab, pois a senha do seu usuário do portal não é configurada no Gitlab já que a autenticação é feita via REMOTE_USER (cabeçalho HTTP). Para configurar a sua senha no Gitlab é necessário que já exista um usuário válido no portal e o mesmo esteja logado, em seguida, siga os passos a seguir:
  72 +
  73 +1- No menu, clique no botão "Desenvolvimento" para que apareça novas opções
  74 +2- Nas opções apresentadas, clique em "Perfil" para ser direcionado para o seu perfil do Gitlab
  75 +3- No seu perfil será apresentado um novo menu abaixo do menu do portal, nesse menu clique na aba "Password"
  76 +4- Na aba "Password", indique que você esqueceu a sua senha clicando no link "Forgot your password?"
  77 +5- Um email será enviado para o seu endereço de email configurado no seu usuário do portal
  78 +6- Abra o email recebido e clique no link "Change my password", que irá redirecionar para uma página de configuração de uma nova senha
  79 +7- Na página de configuração de uma nova senha digite a sua senha e a confirme (sugere-se que use a mesma senha do portal), finalizando a operação de configuração da senha do seu perfil no Gitlab
  80 +
  81 +Com a senha do seu perfil do Gitlab configurada pode-se utlizar normalmente o git com protocolo HTTPS, onde será solcitado o seu usuário e senha durante as operações. Lembrando que o usuário será o seu usuário do portal e a senha será a que foi configurada com o processo descrito anteriormente.
  82 +
  83 +No Portal do Software Público Brasileiro, assim como em outros portais do governo, temos problemas com o certificado digital. Para o git conseguir realizar as operções usando HTTPS é necessário ignorar o certificado, para isso, abra o terminal (com o git instalado) e execute o seguinte comando::
  84 +
  85 + $ cd <caminho-do-diretório-do-projeto>
  86 + $ git config http.sslVerify "false"
  87 +
  88 +
  89 +Integração manual entre repositórios
  90 +---------------------------------
  91 +
  92 +Para empurrar modificações para mais de um repositório, por exemplo os repositórios do Portal do Software Público Brasileiro e Github, é necessário fazer algumas modificações nas configurações no git localmente (lado do cliente). Para isso, vamos configurar um apelido (alias) que aponte para as URLs dos nossos repositórios, e quando o comando ``git push <alias> <branch>`` for executado, as modificações serão empurradas para todos os nossos repositórios previamente configurados. Ou seja, apenas um comando será executado e todos os repositórios serão atualizados.
  93 +
  94 +Para realizar essa configuração é necessário que tenha o git instalado com um bash(terminal) e o repositório do seu projeto clonado localmente. Tendo isso, abra o bash e execute os comandos a seguir::
  95 +
  96 + $ cd <caminho-do-diretório-do-projeto>
  97 + $ git remote set-url --add --push <apelido> <URL-repo1>
  98 + $ git remote set-url --add --push <apelido> <URL-repo2>
  99 + $ git remote set-url --add --push <apelido> <URL-repo3>
  100 +
  101 +Lembrando que o <apelido> de todos deve ser o mesmo, usualmente é usado o apelido "origin". Com isso, ao empurrar as suas modificações todos os repositórios configurados serão atualizados.
  102 +
  103 +
68 104 Gerenciando listas de email
69 105 ---------------------------
70 106 O Mailman fornece alguns scripts para administração das listas de email, tais programas podem ser encontrados na máquina ``integration`` em ``/usr/lib/mailman/bin``.
... ...
src/Makefile 0 → 100644
... ... @@ -0,0 +1,49 @@
  1 +VERSION = $(shell cat ../VERSION)
  2 +subdirs = colab-spb-plugin colab-spb-theme-plugin noosfero-spb
  3 +
  4 +dist_all = $(patsubst %, %-dist, $(subdirs))
  5 +dist: $(dist_all)
  6 +$(dist_all): %-dist : %
  7 + if [ -f $*/Makefile ]; then make -C $* dist; fi
  8 + if [ -f $*/setup.py ]; then (cd $* && python setup.py sdist); fi
  9 +
  10 +clean_all = $(patsubst %, %-clean, $(subdirs))
  11 +clean: $(clean_all)
  12 + $(MAKE) -C pkg-rpm/ clean
  13 +
  14 +$(clean_all): %-clean : %
  15 + if [ -f $*/Makefile ]; then make -C $* clean; fi
  16 + if [ -f $*/setup.py ]; then rm -rf $*/dist; fi
  17 +
  18 +release:
  19 + @if git tag | grep -q '^v$(VERSION)$$'; then \
  20 + echo "E: version $(VERSION) already tagged. You need a new version number"; \
  21 + false; \
  22 + fi
  23 + echo '$(VERSION)' > colab-spb-plugin/VERSION
  24 + echo '$(VERSION)' > colab-spb-theme-plugin/VERSION
  25 + echo '$(VERSION)' > noosfero-spb/VERSION
  26 + $(MAKE) dist
  27 + cp noosfero-spb/dist/*.tar.* pkg-rpm/noosfero-spb/
  28 + cp colab-spb-theme-plugin/dist/*.tar.* pkg-rpm/colab-spb-theme/
  29 + cp colab-spb-plugin/dist/*.tar.* pkg-rpm/colab-spb-plugin/
  30 + sed -i -e 's/^\(Version:\s*\).*/\1$(VERSION)/' \
  31 + pkg-rpm/colab-spb-theme/colab-spb-theme.spec \
  32 + pkg-rpm/colab-spb-plugin/colab-spb-plugin.spec \
  33 + pkg-rpm/noosfero-spb/noosfero-spb.spec
  34 + git diff
  35 + @printf "Confirm release? [y/N]"; \
  36 + read confirm; \
  37 + if [ "$$confirm" = 'y' -o "$$confirm" = 'Y' ]; then \
  38 + echo "SPB release $(VERSION)" > .commit_template; \
  39 + git commit * --file .commit_template; \
  40 + rm -f .commit_template; \
  41 + else \
  42 + echo 'Aborting at your request!'; \
  43 + git checkout -- colab-spb-theme-plugin/VERSION noosfero-spb/VERSION colab-spb-plugin/VERSION ; \
  44 + git checkout -- pkg-rpm/colab-spb-theme/ pkg-rpm/noosfero-spb/ pkg-rpm/colab-spb-plugin/ ; \
  45 + false; \
  46 + fi
  47 + # TODO add pkg-rpm/colab-spb-plugin to the git checkout all above
  48 + $(MAKE) -C pkg-rpm/ noosfero-spb-upload colab-spb-theme-upload colab-spb-plugin-upload
  49 + git tag $(VERSION) -s -m 'SPB Release $(VERSION)'
... ...
src/colab-spb-plugin/.gitignore
... ... @@ -2,3 +2,4 @@
2 2 *.pyc
3 3 *.sw[po]
4 4 *~
  5 +dist/
... ...
src/colab-spb-plugin/MANIFEST.in
1 1 include README.rst
2 2 include MANIFEST.in
  3 +include VERSION
3 4 recursive-include src/colab_spb/static *
4 5 recursive-include src/colab_spb/locale *
5 6 recursive-include src/colab_spb/templates *
... ...
src/colab-spb-plugin/VERSION 0 → 100644
... ... @@ -0,0 +1 @@
  1 +5.0a0
... ...
src/colab-spb-plugin/setup.py
... ... @@ -11,9 +11,11 @@ install_requires = [&#39;colab&#39;, &#39;colab_noosfero&#39;, &#39;colab_gitlab&#39;]
11 11  
12 12 tests_require = [ ]
13 13  
  14 +version = open('VERSION').read().strip()
  15 +
14 16 setup(
15   - name='colab-spb',
16   - version='0.1.0',
  17 + name='colab-spb-plugin',
  18 + version=version,
17 19 author='Macartur Sousa',
18 20 author_email='macartur.sc@gmail.com',
19 21 url='https://portal.softwarepublico.gov.br/gitlab/softwarepublico/colab-spb-plugin/',
... ...
src/colab-spb-plugin/src/colab_spb/apps.py
... ... @@ -5,3 +5,4 @@ from django.apps import AppConfig
5 5 class SpbAppConfig(AppConfig):
6 6 name = 'colab_spb'
7 7 verbose_name = 'SPB'
  8 + namespace = 'spb'
... ...
src/colab-spb-plugin/tests/plugins.d/gitlab.py
... ... @@ -14,7 +14,6 @@ upstream = &#39;localhost&#39;
14 14  
15 15 urls = {
16 16 'include': 'colab_gitlab.urls',
17   - 'namespace': 'gitlab', # TODO: do not allow to change namespace
18 17 'prefix': 'gitlab',
19 18 }
20 19  
... ...
src/colab-spb-plugin/tests/plugins.d/noosfero.py
... ... @@ -14,7 +14,6 @@ upstream = &#39;localhost&#39;
14 14  
15 15 urls = {
16 16 'include': 'colab_noosfero.urls',
17   - 'namespace': 'noosfero', # TODO: do not allow to change namespace
18 17 'prefix': 'social',
19 18 }
20 19  
... ...
src/colab-spb-plugin/tests/plugins.d/spb.py
... ... @@ -6,7 +6,6 @@ verbose_name = &quot;SPB Plugin&quot;
6 6 middlewares = ['colab_spb.middleware.ForceLangMiddleware']
7 7  
8 8 urls = {"include": "colab_spb.urls",
9   - "prefix": '^spb/',
10   - "namespace": "colab_spb"}
  9 + "prefix": '^spb/',}
11 10  
12 11 url = colab_url_factory('colab_spb')
... ...
src/colab-spb-theme-plugin/Makefile
1 1 PACKAGE = colab-spb-theme
2   -VERSION = 0.2.0
  2 +VERSION = $(shell cat VERSION)
3 3 DISTDIR = dist
4 4 PACKAGE_NAME = $(PACKAGE)-$(VERSION)
5 5 TARBALL = $(PACKAGE_NAME).tar.gz
... ... @@ -10,10 +10,10 @@ all:
10 10 colab_dir=/usr/lib/colab
11 11  
12 12 dist: clean
13   - mkdir -p $(DISTDIR)/$(PACKAGE_NAME)
14   - tar --exclude=.git --exclude=$(DISTDIR) -cf - * | (cd $(DISTDIR)/$(PACKAGE_NAME) && tar xzf -)
  13 + mkdir -p $(DISTDIR)/$(PACKAGE_NAME)
  14 + tar --exclude=.git --exclude=$(DISTDIR) -cf - * | (cd $(DISTDIR)/$(PACKAGE_NAME) && tar xf -)
15 15 cd $(DISTDIR) && tar -czf $(TARBALL) $(PACKAGE_NAME)
16   - rm -r $(DISTDIR)/$(PACKAGE_NAME)
  16 + rm -r $(DISTDIR)/$(PACKAGE_NAME)
17 17 clean:
18 18 $(RM) $(TARBALL)
19 19 $(RM) -r $(DISTDIR)
... ...
src/colab-spb-theme-plugin/VERSION 0 → 100644
... ... @@ -0,0 +1 @@
  1 +5.0a0
... ...
src/noosfero-spb/.gitignore
1   -*.tar.gz
2   -/noosfero-spb-*
  1 +dist/
... ...
src/noosfero-spb/Makefile
1 1 PACKAGE = noosfero-spb
2   -VERSION = 4.2.1
  2 +VERSION = $(shell cat VERSION)
3 3 DISTDIR = $(PACKAGE)-$(VERSION)
4 4 TARBALL = $(DISTDIR).tar.gz
5 5  
... ... @@ -11,13 +11,13 @@ themes_dir=/usr/lib/noosfero/public/designs/themes
11 11 noosfero_dir=/usr/lib/noosfero
12 12  
13 13 dist: clean
14   - mkdir $(DISTDIR)
15   - tar --exclude=.git --exclude=$(DISTDIR) -cf - * | (cd $(DISTDIR) && tar xaf -)
16   - tar --exclude=.git -czf $(TARBALL) $(DISTDIR)
  14 + mkdir -p dist/$(DISTDIR)
  15 + tar --exclude=.git --exclude=$(DISTDIR) -cf - * | (cd dist/$(DISTDIR) && tar xaf -)
  16 + cd dist && tar --exclude=.git -czf $(TARBALL) $(DISTDIR)
  17 + $(RM) -r dist/$(DISTDIR)
17 18  
18 19 clean:
19   - $(RM) $(TARBALL)
20   - $(RM) -r $(DISTDIR)
  20 + $(RM) -r dist/
21 21  
22 22 install:
23 23 install -d -m 0755 $(DESTDIR)/$(plugins_dir)/software_communities
... ...
src/noosfero-spb/VERSION 0 → 100644
... ... @@ -0,0 +1 @@
  1 +5.0a0
... ...
src/noosfero-spb/gov_user/lib/gov_user_plugin.rb
... ... @@ -9,6 +9,10 @@ class GovUserPlugin &lt; Noosfero::Plugin
9 9 include ActionDispatch::Routing
10 10 include Rails.application.routes.url_helpers
11 11  
  12 + def self.api_mount_points
  13 + [GovUserPlugin::API]
  14 + end
  15 +
12 16 def self.plugin_name
13 17 "GovUserPlugin"
14 18 end
... ...
src/noosfero-spb/gov_user/lib/gov_user_plugin/api.rb 0 → 100644
... ... @@ -0,0 +1,23 @@
  1 +require File.dirname(__FILE__) + '/../../../../../lib/noosfero/api/helpers'
  2 +require_relative 'api_entities'
  3 +
  4 +class GovUserPlugin::API < Grape::API
  5 +
  6 + include Noosfero::API::APIHelpers
  7 +
  8 + resource :gov_user do
  9 + get 'institutions' do
  10 + authenticate!
  11 + institutions = select_filtered_collection_of(environment,'communities',params).joins(:institution)
  12 + present institutions.map{|o|o.institution}, :with => Entities::Institution
  13 + end
  14 +
  15 + get 'institutions/:id' do
  16 + authenticate!
  17 + institution = Institution.find_by_id(params[:id])
  18 + present institution, :with => Entities::Institution
  19 + end
  20 +
  21 + end
  22 +end
  23 +
... ...
src/noosfero-spb/gov_user/lib/gov_user_plugin/api_entities.rb 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +module Entities
  2 + class Institution < Noosfero::API::Entity
  3 + root 'institutions', 'institution'
  4 + expose :name, :acronym, :unit_code, :parent_code, :unit_type,
  5 + :sub_juridical_nature, :normalization_level,
  6 + :version, :cnpj, :type, :governmental_power,
  7 + :governmental_sphere, :sisp, :juridical_nature,
  8 + :corporate_name, :siorg_code, :id
  9 + expose :community_id do |institution,options|
  10 + institution.community.id
  11 + end
  12 + end
  13 +end
... ...
src/noosfero-spb/gov_user/test/unit/api_test.rb 0 → 100644
... ... @@ -0,0 +1,51 @@
  1 +require File.dirname(__FILE__) + '/../../../../test/unit/api/test_helper'
  2 +require File.dirname(__FILE__) + '/../helpers/plugin_test_helper'
  3 +
  4 +class GovUserApiTest < ActiveSupport::TestCase
  5 +
  6 + include PluginTestHelper
  7 +
  8 + def setup
  9 + login_api
  10 + environment = Environment.default
  11 + environment.enable_plugin(GovUserPlugin)
  12 + @gov_power = GovernmentalPower.create(:name=>"Some Gov Power")
  13 + @gov_sphere = GovernmentalSphere.create(:name=>"Some Gov Sphere")
  14 + @juridical_nature = JuridicalNature.create(:name => "Autarquia")
  15 + @institution = create_public_institution(
  16 + "Ministerio Publico da Uniao",
  17 + "MPU",
  18 + "BR",
  19 + "DF",
  20 + "Gama",
  21 + @juridical_nature,
  22 + @gov_power,
  23 + @gov_sphere,
  24 + "11.222.333/4444-55")
  25 + end
  26 +
  27 + should 'list all institutions' do
  28 + @institution1 = create_public_institution(
  29 + "Instituicao bacana",
  30 + "IB",
  31 + "BR",
  32 + "DF",
  33 + "Gama",
  34 + @juridical_nature,
  35 + @gov_power,
  36 + @gov_sphere,
  37 + "11.222.333/4444-56"
  38 + )
  39 +
  40 + get "/api/v1/gov_user/institutions?#{params.to_query}"
  41 + json = JSON.parse(last_response.body)
  42 + assert_equivalent [@institution.id, @institution1.id], json['institutions'].map {|c| c['id']}
  43 + end
  44 +
  45 + should 'get institution by id' do
  46 + get "/api/v1/gov_user/institutions/#{@institution.id}?#{params.to_query}"
  47 + json = JSON.parse(last_response.body)
  48 + assert_equal @institution.id, json["institution"]["id"]
  49 + end
  50 +
  51 +end
... ...
src/noosfero-spb/noosfero-spb-theme/README.md
... ... @@ -3,4 +3,154 @@ PSB Theme for Noosfero
3 3  
4 4 Noosfero theme for the _Portal do Software Público_ project.
5 5  
6   -Install on /public/designs/themes/noosfero-spb-theme
7 6 \ No newline at end of file
  7 +Install on /public/designs/themes/noosfero-spb-theme
  8 +
  9 +================================
  10 +
  11 +# Passos para configurar o tema a partir do spb/spb
  12 +
  13 +## Considerando que o clone do noosfero está na pasta home
  14 +
  15 +```bash
  16 +rm -r ~/noosfero/public/design/theme/noosfero-spb-theme
  17 +cd ~
  18 +git clone git@softwarepublico.gov.br:softwarepublico/softwarepublico.git
  19 +cd softwarepublico/src/noosfero-spb/
  20 +ln -sr noosfero-spb-theme/ ~/noosfero/public/designs/themes/
  21 +ln -sr software_communities ~/noosfero/plugins/
  22 +ln -sr gov_user ~/noosfero/plugins/
  23 +git remote add theme git@softwarepublico.gov.br:softwarepublico/noosfero-spb-theme.git
  24 +```
  25 +
  26 +# Para instalar o Colab
  27 +
  28 +```bash
  29 +cd ~
  30 +git clone https://github.com/colab/colab
  31 +```
  32 +
  33 +## Configuração
  34 +
  35 +Seguir [tutorial](https://github.com/colab/colab/blob/master/README.rst) do próprio Colab
  36 +
  37 +## Arquivos de configuração Colab
  38 +
  39 +Estando com o ambiente do vagrant levantado `(vagrant up && vagrant ssh)`,
  40 +e "trabalhando" com o colab `(workon colab)`:
  41 +
  42 +## Clone os repositórios:
  43 +
  44 +```bash
  45 +cd ~
  46 +git clone git@softwarepublico.gov.br:softwarepublico/softwarepublico.git
  47 +git clone https://github.com/colab/colab-gitlab-plugin
  48 +git clone https://github.com/colab/colab-noosfero-plugin
  49 +```
  50 +
  51 +## Criando diretórios - Plugins do Colab
  52 +
  53 +```bash
  54 +mkdir /etc/colab/plugins.d/
  55 +cd plugins.d
  56 +```
  57 +
  58 +## Crie os arquivos
  59 +
  60 +### gitlab.py
  61 +
  62 +```bash
  63 +vim gitlab.py
  64 +```
  65 +
  66 +#### Conteúdo do gitlab.py
  67 +
  68 +```python
  69 +from django.utils.translation import ugettext_lazy as _
  70 +from colab.plugins.utils.menu import colab_url_factory
  71 +
  72 +name = "colab_gitlab"
  73 +verbose_name = "Gitlab"
  74 +
  75 +upstream = ''
  76 +private_token = ''
  77 +
  78 +urls = {
  79 + "include":"colab_gitlab.urls",
  80 + "prefix": 'gitlab/',
  81 + "namespace":"gitlab"
  82 + }
  83 +
  84 +url = colab_url_factory('gitlab')
  85 +```
  86 +
  87 +### noosfero.py
  88 +
  89 +```bash
  90 +vim noosfero.py
  91 +```
  92 +
  93 +#### Conteúdo do noosfero.py
  94 +
  95 +```python
  96 +from django.utils.translation import ugettext_lazy as _
  97 +from colab.plugins.utils.menu import colab_url_factory
  98 +
  99 +name = "colab_noosfero"
  100 +verbose_name = "Noosfero"
  101 +private_token = ""
  102 +
  103 +upstream = 'http://<IP DA SUA MÁQUINA AQUI>:8080/social'
  104 +
  105 +urls = {
  106 + "include":"colab_noosfero.urls",
  107 + "prefix": '^social/',
  108 + "namespace":"social"
  109 + }
  110 +
  111 +url = colab_url_factory('social')
  112 +```
  113 +
  114 +### spb.py
  115 +
  116 +```bash
  117 +vim spb.py
  118 +```
  119 +
  120 +#### Conteúdo do spb.py
  121 +
  122 +```python
  123 +from django.utils.translation import ugettext_lazy as _
  124 +from colab.plugins.utils.menu import colab_url_factory
  125 +
  126 +name = "colab_spb"
  127 +verbose_name = "SPB Plugin"
  128 +urls = {
  129 + "include":"colab_spb.urls",
  130 + "prefix": '^spb/',
  131 + "namespace":"colab_spb"
  132 + }
  133 +
  134 +url = colab_url_factory('colab_spb')
  135 +```
  136 +### Execuntando scripts de instalação
  137 +
  138 +```bash
  139 +cd ~/softwarepublico/config/
  140 +pip install -e .
  141 +cd ~/softwarepublico/src/colab-spb-plugin/
  142 +pip install -e .
  143 +colab-admin migrate
  144 +colab-admin migrate colab_spb
  145 +cd ~/colab-gitlab-plugin/
  146 +pip install -e .
  147 +cd ~/softwarepublico/src/colab-spb-plugin/
  148 +pip install -e .
  149 +colab-admin migrate
  150 +```
  151 +
  152 +## Finalizando
  153 +
  154 +Execute o noosfero seja no ambiente local, ou schroot,
  155 +com o comando `RAILS_RELATIVE_URL_ROOT=/social unicorn`
  156 +
  157 +No vagrant, execute `colab-admin runserver 0.0.0.0:8000`
... ...
src/noosfero-spb/noosfero-spb-theme/css/community-pages.css
... ... @@ -409,18 +409,19 @@
409 409 }
410 410  
411 411 #content #blog-tab .blog .blog-post h1{
412   - margin: 0px 0px 10px 0px;
  412 + margin: 0px 0px 4px 0px;
413 413 padding: 0px 0px 0px 0px;
414   - max-width: 555px;
  414 + max-width: 100%;
415 415 max-height: 40px;
416 416 border: none;
417 417 font: normal normal bold 16px/20px Arial;
418 418 overflow: hidden;
419   - display: inline-block;
  419 + display: block;
  420 + text-align: left;
420 421 }
421 422  
422 423 #content #blog-tab .blog .blog-post .post-pic{
423   - margin:0 20px 5px 0px;
  424 + margin:0 20px 25px 0px;
424 425 border-radius: 4px;
425 426 height: 62px;
426 427 width: 19%;
... ... @@ -477,6 +478,7 @@
477 478 color: #172738;
478 479 padding-left:0px;
479 480 text-align: left;
  481 + display: inline-block;
480 482 }
481 483 #content #blog-tab .blog .blog-post.position-1 .date{
482 484 padding-left:0px;
... ... @@ -492,6 +494,10 @@ float: left;
492 494 }
493 495  
494 496 /* Read more button*/
  497 +#content #blog-tab .blog .blog-post .read-more{
  498 + display: none;
  499 +}
  500 +
495 501 #content #blog-tab .blog .read-more{
496 502 text-align: right;
497 503 display: block;
... ... @@ -541,6 +547,31 @@ float: left;
541 547 }
542 548  
543 549 /*Block with Community information - Need to develop solution - Only display on profile page */
  550 +#agenda-toolbar a.button{
  551 + opacity: 1.0;
  552 +}
  553 +
  554 +#content .software-events-block{
  555 + display: none;
  556 +}
  557 +
  558 +.action-profile_design-index #content .software-events-block,
  559 +.profile-type-is-community .action-profile-index #content .software-events-block{
  560 + display: block;
  561 +}
  562 +
  563 +/*** Right bar ***/
  564 +
  565 +.template-default.profile-type-is-community .action-profile-index #content .box-3 .software-events-block,
  566 +.template-lefttopright.profile-type-is-community .action-profile-index #content .box-2 .software-events-block{
  567 + display: none;
  568 +}
  569 +
  570 +.template-lefttopright.profile-type-is-community .action-content_viewer-view_page #content .box-2 .software-events-block{
  571 + display: block;
  572 +}
  573 +
  574 +/*Block with Community information - Need to develop solution - Only display on profile page */
544 575  
545 576 .profile-type-is-community .block.community-block{
546 577 display: none;
... ... @@ -1151,7 +1182,7 @@ float: left;
1151 1182 overflow: hidden;
1152 1183 }
1153 1184  
1154   -/*** Events ***/
  1185 +/*** Events internal page ***/
1155 1186  
1156 1187 #content .article-body-event .event-card{
1157 1188 border-top: 1px dotted #D3D6D3;
... ... @@ -1189,7 +1220,7 @@ float: left;
1189 1220 letter-spacing: 0.48px;
1190 1221 }
1191 1222  
1192   -#content .article-body-event .event-link a{
  1223 +#content .box-1 .article-body-event .event-link a{
1193 1224 text-decoration: underline;
1194 1225 }
1195 1226  
... ... @@ -1206,3 +1237,77 @@ float: left;
1206 1237 font-family: Arial;
1207 1238 line-height: 22px;
1208 1239 }
  1240 +
  1241 +/*software-events-block box-1*/
  1242 +
  1243 +.box-1 .software-events-block ul.software-community-events-list {
  1244 + border: 1px solid #D3D6DE;
  1245 + border-radius: 8px;
  1246 + width: 100%;
  1247 +}
  1248 +
  1249 +.box-1 .software-events-block li.software-events-list-item {
  1250 + border-bottom: 1px dotted #D3D6DE;
  1251 + font-size: 14px;
  1252 + padding: 7px 0px;
  1253 + padding-left: 16px;
  1254 +}
  1255 +
  1256 +.box-1 .software-events-block li.software-events-list-item:last-child{
  1257 + border:none;
  1258 +}
  1259 +
  1260 +.box-1 .software-events-block .software-events-list-item-calendar {
  1261 + background-image: url("../images/calendar-icon.png");
  1262 + background-repeat: no-repeat;
  1263 + width: 14px;
  1264 + height: 14px;
  1265 + float: left;
  1266 + margin-top: 2px;
  1267 +}
  1268 +
  1269 +.box-1 .software-events-block .software-events-list-item-date {
  1270 + padding-left: 5px;
  1271 + font-weight: 700;
  1272 +}
  1273 +
  1274 +.box-1 .software-events-block .software-events-list-item-title {
  1275 + padding-left: 1px;
  1276 +}
  1277 +
  1278 +/*software-events-block - sidebar - box2*/
  1279 +
  1280 +#content .box-2 .software-events-block .software-community-events-block{
  1281 + border:1px solid #C0C1C1;
  1282 + border-radius:4px;
  1283 + background-color:#ECEDF1;
  1284 +}
  1285 +
  1286 +#content .box-2 .software-events-block .software-events-list-item{
  1287 + padding:10px 15px;
  1288 + border-bottom:1px dotted #C0C1C1;
  1289 + color:#2C4B6B;
  1290 + font-size: 15px;
  1291 + font-weight: 500;
  1292 +}
  1293 +
  1294 +#content .box-2 .software-events-block .software-events-list-item-date{
  1295 + font-weight: 800;
  1296 +}
  1297 +
  1298 +#content .box-2 .software-events-block .software-events-list-item-title a,
  1299 +#content .box-2 .software-events-block .software-events-list-item-title a:visited{
  1300 + color:#2C4B6B;
  1301 +}
  1302 +
  1303 +#content .box-2 .software-events-block .software-events-list-item:first-child{
  1304 + color:#172738;
  1305 + font-weight: 800;
  1306 + text-transform: uppercase;
  1307 + border-bottom: 1px solid #C0C1C1;
  1308 + padding:10px 15px;
  1309 +}
  1310 +
  1311 +#content .box-2 .software-events-block .software-events-list-item:last-child{
  1312 + border:none;
  1313 +}
... ...
src/noosfero-spb/noosfero-spb-theme/css/home-page.css
... ... @@ -283,9 +283,9 @@
283 283 .action-home-index #content .display-content-block .image{
284 284 padding-right: 25px;
285 285 padding: 0px 25px 0px 0px;
286   - border: 0px solid #c0c1c1;
287   - width: 150px;
  286 + max-width: 150px;
288 287 display: table-cell;
  288 + vertical-align: top;
289 289 }
290 290  
291 291 .controller-environment_design #content .display-content-block .image a,
... ... @@ -298,7 +298,6 @@
298 298  
299 299 .controller-environment_design #content .display-content-block .image img,
300 300 .action-home-index #content .display-content-block .image img{
301   - border: 0px solid #c0c1c1;
302 301 max-width: 150px;
303 302 }
304 303  
... ...
src/noosfero-spb/noosfero-spb-theme/css/news-page.css
... ... @@ -57,13 +57,14 @@
57 57  
58 58 #content .blog .blog-post h1.title {
59 59 margin: 0px 0px 10px 0px;
60   - padding: 0px 0px 0px 0px;
61   - max-width: 555px;
  60 + padding: 0px;
  61 + max-width: 100%;
62 62 max-height: 40px;
63 63 border: none;
64 64 font: normal normal bold 16px/20px arial;
65 65 overflow: hidden;
66   - display: inline-block;
  66 + display: block;
  67 + white-space: normal;
67 68 }
68 69  
69 70 #content .blog .blog-post h1.title a {
... ... @@ -148,15 +149,24 @@
148 149  
149 150  
150 151 /** Secondary News' Block **/
  152 +
  153 +#content .blog .page-1 .position-1 .title,
  154 +#content .blog .page-1 .position-2 .title,
  155 +#content .blog .page-1 .position-3 .title,
  156 +#content .blog .page-1 .position-4 .title {
  157 + display: inline-block;
  158 +}
  159 +
151 160 #content .blog .page-1 .position-2,
152 161 #content .blog .page-1 .position-3,
153 162 #content .blog .page-1 .position-4 {
154   - margin: 0px 0px 0px 0px;
155   - padding: 20px 21px 45px 0px;
156   - height: 235px;
  163 + margin: 0px;
  164 + padding: 20px 4.2% 5px 0px;
  165 + height: auto;
157 166 width: 30.5%;
158 167 display: block;
159 168 float: left;
  169 + border-bottom: none;
160 170 }
161 171  
162 172 #content .blog .page-1 .position-2 p,
... ... @@ -173,7 +183,7 @@
173 183 #content .blog .page-1 .position-2 .post-pic,
174 184 #content .blog .page-1 .position-3 .post-pic,
175 185 #content .blog .page-1 .position-4 .post-pic {
176   - margin-top: 12px;
  186 + margin-bottom: 12px;
177 187 top: 10px;
178 188 height: 120px;
179 189 width: 100%;
... ... @@ -200,6 +210,10 @@
200 210 /* This rule serves to maintain the element in position-5 clear the
201 211 * configurations of float.
202 212 */
  213 +#content .blog .page-1 .blog-post.position-5{
  214 + border-top:1px solid #ccc;
  215 +}
  216 +
203 217 #content .blog .blog-post.position-5 {
204 218 clear: both;
205 219 }
... ...
src/noosfero-spb/noosfero-spb-theme/css/notifications.css
... ... @@ -51,13 +51,14 @@
51 51 color: #8a6d3b;
52 52 }
53 53  
54   -.environment-notification-plugin-notification-bar .warningnotification p a,
55   -.environment-notification-plugin-notification-notification-modal .warningnotification p a{
  54 +#content .environment-notification-plugin-notification-bar .warningnotification p a,
  55 +#content .environment-notification-plugin-notification-bar .warningnotification p a:visited,
  56 +#content .environment-notification-plugin-notification-notification-modal .warningnotification p a
  57 +#content .environment-notification-plugin-notification-notification-modal .warningnotification p a:visited{
56 58 font-weight: bold;
57 59 color: #8a6d3b;
58 60 }
59 61  
60   -
61 62 .environment-notification-plugin-notification-bar .informationnotification,
62 63 .environment-notification-plugin-notification-notification-modal .informationnotification{
63 64 background: #d9edf7;
... ...
src/noosfero-spb/noosfero-spb-theme/css/search-pages.css
... ... @@ -2,7 +2,8 @@
2 2  
3 3 .action-search-index #content form #search-header,
4 4 .action-search-people #content form #search-header,
5   -.action-search-communities #content form #search-header {
  5 +.action-search-communities #content form #search-header,
  6 +.action-search-institutions #content form #search-header {
6 7 float: right;
7 8 border: none;
8 9 }
... ... @@ -12,12 +13,14 @@
12 13 }
13 14  
14 15 .action-search-people #content form #search-header,
15   -.action-search-communities #content form #search-header {
16   - margin: 0 0 15px 0 ;
  16 +.action-search-communities #content form #search-header,
  17 +.action-search-institutions #content form #search-header {
  18 + margin: 0 0 15px 0;
17 19 }
18 20  
19 21 .action-search-people #content form #search-header #search-filters .sod_select,
20   -.action-search-communities #content form #search-header #search-filters .sod_select {
  22 +.action-search-communities #content form #search-header #search-filters .sod_select,
  23 +.action-search-institutions #content form #search-header #search-filters .sod_select {
21 24 color: #3E67B1;
22 25 border: 1px solid #3E67B1;
23 26 border-radius: 4px;
... ... @@ -28,7 +31,8 @@
28 31 }
29 32  
30 33 .action-search-people #content form #search-header #search-filters .sod_select .sod_list,
31   -.action-search-communities #content form #search-header #search-filters .sod_select .sod_list {
  34 +.action-search-communities #content form #search-header #search-filters .sod_select .sod_list,
  35 +.action-search-institutions #content form #search-header #search-filters .sod_select .sod_list {
32 36 margin: -2px 0 0 -1px;
33 37 color: #3E67B1;
34 38 border: 1px solid #3E67B1;
... ... @@ -40,34 +44,41 @@
40 44 }
41 45  
42 46 .action-search-people #content form #search-header #search-filters .sod_select .sod_list .active,
43   -.action-search-communities #content form #search-header #search-filters .sod_select .sod_list .active {
  47 +.action-search-communities #content form #search-header #search-filters .sod_select .sod_list .active,
  48 +.action-search-institutions #content form #search-header #search-filters .sod_select .sod_list .active {
44 49 border-radius: 0px 0px 4px 4px;
45 50 }
46 51  
47 52 .action-search-people #content form #search-header #search-filters .sod_select .sod_list .selected,
48   -.action-search-communities #content form #search-header #search-filters .sod_select .sod_list .selected {
  53 +.action-search-communities #content form #search-header #search-filters .sod_select .sod_list .selected,
  54 +.action-search-institutions #content form #search-header #search-filters .sod_select .sod_list .selected {
49 55 padding-right: 21px;
50 56 }
51 57  
52 58 .action-search-people #content form #search-subheader .sod_select,
53   -.action-search-communities #content form #search-subheader .sod_select {
  59 +.action-search-communities #content form #search-subheader .sod_select,
  60 +.action-search-institutions #content form #search-subheader .sod_select {
54 61 line-height: 15px;
55 62 }
56 63  
57 64 .action-search-index #content form .search-field,
58 65 .action-search-people #content form .search-field,
59   -.action-search-communities #content form .search-field{
  66 +.action-search-communities #content form .search-field,
  67 +.action-search-institutions #content form .search-field {
60 68 margin-bottom: 30px;
61 69 }
62 70  
63 71 .action-search-index #content form .search-field .formfield,
64 72 .action-search-people #content form .search-field .formfield,
65   -.action-search-communities #content form .search-field .formfield{
  73 +.action-search-communities #content form .search-field .formfield,
  74 +.action-search-institutions #content form .search-field .formfield {
66 75 width: 99%;
67 76 }
  77 +
68 78 .action-search-index #content form .search-field .formfield input,
69 79 .action-search-people #content form .search-field .formfield input,
70   -.action-search-communities #content form .search-field .formfield input {
  80 +.action-search-communities #content form .search-field .formfield input,
  81 +.action-search-institutions #content form .search-field .formfield input {
71 82 margin-top: 0px;
72 83 padding: 6px;
73 84 height: 19px;
... ... @@ -81,7 +92,8 @@
81 92  
82 93 .action-search-index #content form input.button.submit,
83 94 .action-search-people #content form input.button.submit,
84   -.action-search-communities #content form input.button.submit {
  95 +.action-search-communities #content form input.button.submit,
  96 +.action-search-institutions #content form input.button.submit {
85 97 background: #3E67B1;
86 98 color: #FFF;
87 99 border-radius: 4px;
... ... @@ -94,12 +106,14 @@
94 106  
95 107 .action-search-index #content form input.button.submit:hover,
96 108 .action-search-people #content form input.button.submit:hover,
97   -.action-search-communities #content form input.button.submit:hover {
  109 +.action-search-communities #content form input.button.submit:hover,
  110 +.action-search-institutions #content form input.button.submit:hover {
98 111 background: #5E82C6;
99 112 }
100 113  
101 114 .action-search-people #search-results .search-results-type-people,
102   -.action-search-communities #search-results .search-results-type-community {
  115 +.action-search-communities #search-results .search-results-type-community,
  116 +.action-search-institutions #search-results .search-results-type-institution {
103 117 background: none;
104 118 border: 1px solid #ccc;
105 119 border-radius: 10px;
... ... @@ -119,3 +133,31 @@
119 133 background: none;
120 134 border: 1px solid #ccc;
121 135 }
  136 +
  137 +.search-software-item .search-software-content-block .search-content-result a {
  138 + color: #172738 !important;
  139 +}
  140 +
  141 +.action-search-institutions .common-profile-list-block .vcard a.profile_link, .comment-actions .vcard a.profile_link{
  142 + height: 108px;
  143 + max-height: 108px;
  144 +}
  145 +
  146 +.action-search-institutions #content .search-results-box .vcard{
  147 + margin: 8.5px
  148 +}
  149 +
  150 +.action-search-institutions .menu-submenu-content{
  151 + height: auto;
  152 +}
  153 +
  154 +.action-search-institutions #content .menu-submenu h4{
  155 + text-align: center;
  156 +}
  157 +
  158 +.action-search-institutions #content .menu-submenu-content ul a{
  159 + padding-left: 0;
  160 + text-align: center;
  161 +}
  162 +
  163 +
... ...
src/noosfero-spb/noosfero-spb-theme/css/software-catalog-page.css
... ... @@ -53,7 +53,7 @@
53 53 margin: 0 0 0 15px;
54 54 }
55 55  
56   - It's TEMPORARY
  56 + It's TEMPORARY
57 57 .action-search-software_infos #content .search-form .doubts-catalog-software {
58 58 display: none;
59 59 }*/
... ... @@ -65,7 +65,7 @@
65 65 line-height: 20px;
66 66 position:absolute;
67 67 }
68   -.action-search-software_infos .search-form label,
  68 +.action-search-software_infos .search-form label,
69 69 .action-search-software_infos .search-form label{
70 70 margin:0px 3px 4px 32px;
71 71 line-height: 22px;
... ... @@ -310,9 +310,9 @@
310 310  
311 311 /* Column left */
312 312  
313   -.action-search-software_infos #search-results .search-software-item-column-left{
314   - width: 130px;
315   - height: 130px;
  313 +.action-search-software_infos #search-results .search-software-item-column-left {
  314 + width: 140px;
  315 + height: 140px;
316 316 float: left;
317 317 border-right: 1px dotted #ccc;
318 318 }
... ... @@ -359,7 +359,7 @@
359 359 }
360 360  
361 361 .action-search-software_infos #search-results .search-software-item-column-left .extra_info {
362   - width: 130px;
  362 + width: 140px;
363 363 padding-right: 20px;
364 364 top: 0px;
365 365 position: absolute;
... ... @@ -370,18 +370,32 @@
370 370 opacity: inherit;
371 371 }
372 372  
373   -.action-search-software_infos #search-results .search-software-item-column-left .extra_info::before{
  373 +.action-search-software_infos #search-results .search-software-item-column-left .software-date {
  374 + margin-top: 20px;
  375 + width: 130px;
  376 +}
  377 +
  378 +.action-search-software_infos #search-results .search-software-item-column-left .software-date::before{
374 379 content: url("../images/ic-calendar.png");
375   - margin: 6px 10px 20px 0;
  380 + margin: 0px 7px 20px 0;
376 381 float: left;
377 382 }
378 383  
  384 +.action-search-software_infos #search-results .search-software-item-column-left .star-container.catalog_rating_block {
  385 + width: 140px;
  386 + margin-left: 0px;
  387 +}
  388 +
  389 +.action-search-software_infos #search-results .search-software-item-column-left .software-date-value {
  390 + margin-left: 23px;
  391 +}
  392 +
379 393 /* Column Right */
380 394  
381 395 .action-search-software_infos #search-results .search-software-item-column-right {
382   - width: 70%;
  396 + width: 65%;
383 397 float: left;
384   - margin-left: 130px;
  398 + margin-left: 140px;
385 399 padding: 0 0 0 8px;
386 400 font-size: 15px;
387 401 font-family: Arial;
... ... @@ -439,3 +453,5 @@
439 453 font-size: 13px;
440 454 text-decoration: underline;
441 455 }
  456 +
  457 +
... ...
src/noosfero-spb/noosfero-spb-theme/css/software-pages.css
... ... @@ -89,14 +89,15 @@
89 89 display: block;
90 90 }
91 91  
92   -#content .download-block .download-button #download-size {
93   - border: 1px solid #1a397d;
94   - border-radius: 0px 0px 8px 8px;
95   - background-color: #1a397d;
96   - color: #ffffff;
97   - font-size: 12px;
  92 +#content .download-block .download-button .download-size {
98 93 text-align: center;
99   - display: none;
  94 + display: block;
  95 + background: rgb(0, 40, 140) none repeat scroll 0% 0%;
  96 + color: rgb(255, 255, 255);
  97 + border-bottom-left-radius: 5px;
  98 + border-bottom-right-radius: 5px;
  99 + margin-top: -15px;
  100 + line-height: 20px;
100 101 }
101 102  
102 103 #content .download-block .download-info {
... ... @@ -208,9 +209,7 @@
208 209 }
209 210  
210 211 #content .box-1 .categories-and-tags-block .category_cloud{
211   - display: inline-flex;
212 212 margin: 13px 0 10px 0;
213   - max-width: 87%;
214 213 }
215 214  
216 215 #content .box-1 .categories-and-tags-block .category_cloud a{
... ... @@ -590,7 +589,7 @@
590 589 padding: 45px 40px 4px 10px;
591 590 border: 1px solid #2C66CE;
592 591 border-radius: 4px;
593   - background: #2C66CE url("../images/download-mini_icon.png") center center no-repeat;
  592 + background: #2C66CE url("../images/history-mini_icon.png") center center no-repeat;
594 593 display: block;
595 594 float: left;
596 595 }
... ...
src/noosfero-spb/noosfero-spb-theme/css/use-report.css
... ... @@ -322,8 +322,12 @@
322 322 padding-right: 6px;
323 323 }
324 324  
  325 +/*FIX_ME - tmp css solution for development tmp solution, remove when fixed on plugin*/
  326 +
325 327 #content .star-rate-form .star-comment-container .comments-software-extra-fields #organization_rating_people_benefited,
326   -#content .star-rate-form .star-comment-container .comments-software-extra-fields #organization_rating_saved_value {
  328 +#content .star-rate-form .star-comment-container .comments-software-extra-fields #organization_rating_saved_value,
  329 +#content .star-rate-form .star-comment-container .comments-software-extra-fields #people_benefited_tmp,
  330 +#content .star-rate-form .star-comment-container .comments-software-extra-fields #saved_value_tmp {
327 331 display: block;
328 332 height: 19px;
329 333 width: 155px;
... ... @@ -344,13 +348,17 @@
344 348 #content .star-rate-form .star-comment-container .star-tooltip {
345 349 cursor: default;
346 350 content: '?';
347   - border-radius: 90%;
348   - font-size: 12px;
349   - font-weight: 700;
350   - background: #3867b7;
351   - color: #fff;
352   - margin-left: 4px;
353   - padding: 0px 6px;
  351 + padding-top: 2px;
  352 + background-color: #3867b7;
  353 + color: #ffffff;
  354 + font-weight: bold;
  355 + cursor: pointer;
  356 + height: 15px;
  357 + font-family: arial;
  358 + width: 17px;
  359 + display: inline-block;
  360 + text-align: center;
  361 + border-radius: 50%
354 362 }
355 363  
356 364 .ratings-list {
... ...
src/noosfero-spb/noosfero-spb-theme/images/history-mini_icon.png 0 → 100644

476 Bytes

src/noosfero-spb/noosfero-spb-theme/images/ic-doc.png 0 → 100644

268 Bytes

src/noosfero-spb/noosfero-spb-theme/theme.js
... ... @@ -268,10 +268,15 @@ $(&#39;#link-buscar&#39;).click(function(e) {
268 268 }
269 269 }
270 270  
  271 + function move_breadcrumbs() {
  272 + $('.breadcrumbs-plugin_content-breadcrumbs-block').prependTo('#wrap-2');
  273 + }
  274 +
271 275 $(document).ready(function(){
272 276 add_tooltips();
273 277 add_popovers();
274 278 move_article_buttons();
  279 + move_breadcrumbs();
275 280 insert_notice_div();
276 281 set_uploaded_files_names();
277 282 set_tooltip_content();
... ...
src/noosfero-spb/software_communities/controllers/software_communities_plugin_controller.rb
... ... @@ -5,11 +5,9 @@ class SoftwareCommunitiesPluginController &lt; ApplicationController
5 5 def get_license_data
6 6 return render :json=>{} if !request.xhr? || params[:query].nil?
7 7  
8   - data = if params[:query].empty?
9   - LicenseInfo.all
10   - else
11   - LicenseInfo.where("version ILIKE ?", "%#{params[:query]}%").select("id, version")
12   - end
  8 + data = LicenseHelper.find_licenses(params[:query]) if params[:query]
  9 + data ||= LicenseInfo.all
  10 +
13 11 render :json=> data.collect { |license|
14 12 {:id=>license.id, :label=>license.version}
15 13 }
... ... @@ -44,11 +42,7 @@ class SoftwareCommunitiesPluginController &lt; ApplicationController
44 42 protected
45 43  
46 44 def get_model_by_params_field
47   - case params[:field]
48   - when "software_language"
49   - return ProgrammingLanguage
50   - else
51   - return DatabaseDescription
52   - end
  45 + return DatabaseDescription unless params[:field] == "software_language"
  46 + return ProgrammingLanguage
53 47 end
54 48 end
... ...
src/noosfero-spb/software_communities/controllers/software_communities_plugin_myprofile_controller.rb
... ... @@ -9,13 +9,13 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
9 9  
10 10 @community = Community.new(params[:community])
11 11 @community.environment = environment
12   - @software_info = SoftwareInfo.new(params[:software_info])
13 12  
14   - @license_info = if params[:license].blank? or params[:license][:license_infos_id].blank?
15   - LicenseInfo.new
16   - else
17   - LicenseInfo.find(params[:license][:license_infos_id])
18   - end
  13 + @license_info = LicenseInfo.find_by_id(params[:license][:license_infos_id]) if params[:license]
  14 + @license_info ||= LicenseInfo.new
  15 +
  16 + @software_info = SoftwareInfo.new(params[:software_info])
  17 + @software_info.community = @community
  18 + @software_info.license_info = @license_info
19 19  
20 20 control_software_creation
21 21 update_new_software_errors
... ... @@ -26,14 +26,15 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
26 26  
27 27 return unless request.post?
28 28  
29   - @software_info = constroy_software
  29 + @software_info = create_software
30 30 software_info_insert_models.call(@list_libraries, 'libraries')
31 31 software_info_insert_models.call(@list_languages, 'software_languages')
32 32 software_info_insert_models.call(@list_databases, 'software_databases')
33 33 software_info_insert_models.call(@list_operating_systems, 'operating_systems')
34 34  
35 35 begin
36   - @software_info.save!
  36 + raise NotAdminException unless can_change_public_software?
  37 + @software_info.update_attributes!(params[:software])
37 38  
38 39 @community = @software_info.community
39 40 @community.update_attributes!(params[:community])
... ... @@ -44,31 +45,50 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
44 45 redirect_to :controller => 'profile_editor', :action => 'index'
45 46 session[:notice] = _('Software updated successfully')
46 47 end
47   - rescue ActiveRecord::RecordInvalid => invalid
  48 + rescue NotAdminException, ActiveRecord::RecordInvalid => invalid
48 49 update_new_software_errors
49 50 session[:notice] = _('Could not update software')
50 51 end
51 52 end
52 53  
53   - def disabled_public_software_field
54   - !environment.admins.include?(current_user.person)
55   - end
56   -
57 54 private
58 55  
  56 + def can_change_public_software?
  57 + if !user.is_admin?(environment)
  58 + if params[:software][:public_software]
  59 + @software_info.errors.add(:public_software, _("You don't have permission to change public software status"))
  60 + return false
  61 + end
  62 +
  63 + if params[:software].keys.any?{|key| ["e_ping","e_mag","icp_brasil","e_arq","intern"].include?(key)}
  64 + @software_info.errors.add(:base, _("You don't have permission to change public software attributes"))
  65 + return false
  66 + end
  67 + end
  68 + return true
  69 + end
  70 +
59 71 def add_software_erros
60 72 @errors = []
61   - @errors |= @community.errors.full_messages if @community
  73 + if @community
  74 + error = @community.errors.delete(:identifier)
  75 + @errors |= [_("Domain %s") % error.first ] if error
  76 + @errors |= @community.errors.full_messages
  77 + end
62 78 @errors |= @software_info.errors.full_messages if @software_info
63 79 @errors |= @license_info.errors.full_messages if @license_info
64 80 end
65 81  
66 82 def control_software_creation
67   - valid_models = request.post? && (@community.valid? && @software_info.valid? && @license_info.valid?)
68   - if valid_models
69   - send_software_to_moderation
70   - else
71   - add_software_erros
  83 + if request.post?
  84 + valid_models = @community.valid?
  85 + valid_models &= @software_info.valid?
  86 + valid_models &= @license_info.valid?
  87 + if valid_models
  88 + send_software_to_moderation
  89 + else
  90 + add_software_erros
  91 + end
72 92 end
73 93 end
74 94  
... ... @@ -79,16 +99,14 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
79 99 }
80 100 end
81 101  
82   - def constroy_software
  102 + def create_software
83 103 @software_info = @profile.software_info
84   - params[:software][:public_software] ||= false unless @software_info.public_software?
85   - @license = LicenseInfo.find(params[:license][:license_infos_id])
86   - @software_info.license_info = @license
87   - @software_info.update_attributes(params[:software])
88   -
89 104 another_license_version = nil
90 105 another_license_link = nil
91 106 if params[:license]
  107 + @license = LicenseInfo.find(params[:license][:license_infos_id])
  108 + @software_info.license_info = @license
  109 +
92 110 another_license_version = params[:license][:version]
93 111 another_license_link = params[:license][:link]
94 112 end
... ... @@ -126,7 +144,7 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
126 144  
127 145 add_admin_to_community
128 146  
129   - if !environment.admins.include?(current_user.person)
  147 + if !environment.admins.include?(current_user.person)
130 148 session[:notice] = _('Your new software request will be evaluated by an'\
131 149 'administrator. You will be notified.')
132 150 redirect_to user.admin_url
... ... @@ -143,7 +161,7 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
143 161 @list_databases = @software_info.software_databases
144 162 @list_languages = @software_info.software_languages
145 163 @list_operating_systems = @software_info.operating_systems
146   - @disabled_public_software_field = disabled_public_software_field
  164 + @non_admin_status = 'disabled' unless user.is_admin?(environment)
147 165  
148 166 @license_version = @software_info.license_info.version
149 167 @license_id = @software_info.license_info.id
... ... @@ -184,7 +202,6 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
184 202 add_software_erros
185 203 end
186 204  
187   -
188 205 @error_community_name = @community.errors.include?(:name) ? "highlight-error" : "" if @community
189 206 @error_software_acronym = @software_info.errors.include?(:acronym) ? "highlight-error" : "" if @software_info
190 207 @error_software_domain = @community.errors.include?(:identifier) ? "highlight-error" : "" if @community
... ... @@ -192,3 +209,5 @@ class SoftwareCommunitiesPluginMyprofileController &lt; MyProfileController
192 209 @error_software_license = @license_info.errors.include?(:version) ? "highlight-error" : "" if @license_info
193 210 end
194 211 end
  212 +
  213 +class NotAdminException < Exception; end
... ...
src/noosfero-spb/software_communities/features/software_catalog.feature
... ... @@ -80,3 +80,33 @@ Feature: Search software
80 80 Then I should see "Software One"
81 81 And I should see "Software Two"
82 82 And I should see "Software Three"
  83 +
  84 + @selenium
  85 + Scenario: See software rating on catalog
  86 + Given plugin "OrganizationRatings" is enabled on environment
  87 + And I am logged in as mpog_admin
  88 + And I go to /admin/plugins
  89 + And I check "Organization Ratings"
  90 + And I press "Save changes"
  91 + And I go to /admin/admin_panel/site_info
  92 + And I select "Software Público" from "environment_theme"
  93 + And I press "Save"
  94 + And I go to /account/logout
  95 + Given the following user
  96 + | login | name |
  97 + | joaosilva | Joao Silva |
  98 + And the following blocks
  99 + | owner | type |
  100 + | software-two | AverageRatingBlock |
  101 + | software-two | OrganizationRatingsBlock |
  102 + And the environment domain is "localhost"
  103 + And I am logged in as "joaosilva"
  104 + And I go to /profile/software-two/plugin/organization_ratings/new_rating
  105 + And I press "Enviar"
  106 + And I go to /search/software_infos
  107 + When I select "Favorites" from "sort"
  108 + And I sleep for 3 seconds
  109 + Then I should see "Software Two" before "Software One"
  110 + And there should be 1 div with class "small-star-positive"
  111 + And there should be 4 divs with class "small-star-negative"
  112 +
... ...
src/noosfero-spb/software_communities/features/step_definitions/software_communities_steps.rb
... ... @@ -194,7 +194,7 @@ Given /^the user &quot;([^&quot;]*)&quot; has &quot;([^&quot;]*)&quot; as secondary e\-mail$/ do |login, email
194 194 end
195 195  
196 196 Given /^I click on anything with selector "([^"]*)"$/ do |selector|
197   - evaluate_script "jQuery('#{selector}').trigger('click') && true"
  197 + page.evaluate_script("jQuery('##{selector}').click();")
198 198 end
199 199  
200 200 Given /^I should see "([^"]*)" of this selector "([^"]*)"$/ do |quantity, selector|
... ... @@ -243,3 +243,7 @@ Given /^I keyup on selector &quot;([^&quot;]*)&quot;$/ do |selector|
243 243 selector_founded = evaluate_script("jQuery('#{selector}').trigger('keyup').length != 0")
244 244 selector_founded.should be_true
245 245 end
  246 +
  247 +Then /^there should be (\d+) divs? with class "([^"]*)"$/ do |count, klass|
  248 + should have_selector("div.#{klass}", :count => count)
  249 +end
... ...
src/noosfero-spb/software_communities/features/use_report.feature 0 → 100644
... ... @@ -0,0 +1,56 @@
  1 +Feature: Use report
  2 + As a user
  3 + I want to make a use report of a software
  4 + to give my feedback about a software.
  5 +
  6 + Background:
  7 + Given "SoftwareCommunitiesPlugin" plugin is enabled
  8 + Given "OrganizationRatings" plugin is enabled
  9 + And I am logged in as mpog_admin
  10 + And I go to /admin/plugins
  11 + And I check "SoftwareCommunitiesPlugin"
  12 + And I press "Save changes"
  13 + And the following softwares
  14 + | name | public_software | finality |
  15 + | Noosfero | true | some finality |
  16 +
  17 + Scenario: Add Organization Ratings Block
  18 + Given I go to Noosfero's control panel
  19 + And I follow "Edit sideboxes"
  20 + When I follow "Add a block"
  21 + And I choose "Organization Ratings"
  22 + And I press "Add"
  23 + Then I should see "Report your experiences"
  24 +
  25 + Scenario: Add Average Rating Block
  26 + Given I go to Noosfero's control panel
  27 + And I follow "Edit sideboxes"
  28 + When I follow "Add a block"
  29 + And I choose "Organization Average Rating"
  30 + And I press "Add"
  31 + Then I should see "Be the first to rate!"
  32 +
  33 + @selenium
  34 + Scenario: Test Additional Fields JavaScript
  35 + Given I go to /profile/noosfero/plugin/organization_ratings/new_rating
  36 + Then I should not see "Number of Beneficiaries"
  37 + And I should not see "Saved Resources"
  38 + When I click on anything with selector "comments-additional-information"
  39 + Then I should see "Number of Beneficiaries"
  40 + And I should see "Saved Resources"
  41 +
  42 + @selenium
  43 + Scenario: Validate Use Report fields format
  44 + Given I go to Noosfero's control panel
  45 + Given I follow "Edit sideboxes"
  46 + When I follow "Add a block"
  47 + And I choose "Organization Ratings"
  48 + And I press "Add"
  49 + And I am on Noosfero's homepage
  50 + And I follow "Rate Community"
  51 + When I click on anything with selector "comments-additional-information"
  52 + And I fill in "organization_rating_people_benefited" with "123123"
  53 + And I fill in "organization_rating_saved_value" with "7654321"
  54 + And I press "Save"
  55 + Then I should see "Benefited People: 123.123"
  56 + And I should see "Saved Resources: $ 76,543.21"
... ...
src/noosfero-spb/software_communities/lib/create_software.rb
... ... @@ -5,12 +5,14 @@ class CreateSoftware &lt; Task
5 5 validates_presence_of :name
6 6  
7 7 attr_accessible :name, :finality, :repository_link, :requestor, :environment,
8   - :reject_explanation, :license_info
  8 + :reject_explanation, :license_info, :identifier, :another_license_version,
  9 + :another_license_link
9 10  
10 11 alias :environment :target
11 12 alias :environment= :target=
12 13  
13   - DATA_FIELDS = ['name', 'finality', 'license_info', 'repository_link']
  14 + DATA_FIELDS = ['name', 'identifier', 'finality', 'license_info', 'repository_link',
  15 + 'another_license_version', 'another_license_link']
14 16 DATA_FIELDS.each do |field|
15 17 settings_items field.to_sym
16 18 end
... ... @@ -21,15 +23,21 @@ class CreateSoftware &lt; Task
21 23 template_id = software_template.id
22 24 end
23 25  
  26 + identifier = self.identifier
  27 + identifier ||= self.name.to_slug
  28 +
24 29 community = Community.create!(:name => self.name,
  30 + :identifier => identifier,
25 31 :template_id => template_id)
26 32  
27 33 community.environment = self.environment
28 34 community.add_admin(self.requestor)
29 35  
30   - software = SoftwareInfo.create!(:finality => self.finality,
  36 + software = SoftwareInfo.new(:finality => self.finality,
31 37 :repository_link => self.repository_link, :community_id => community.id,
32 38 :license_info => self.license_info)
  39 + software.verify_license_info(self.another_license_version, self.another_license_link)
  40 + software.save!
33 41 end
34 42  
35 43 def title
... ...
src/noosfero-spb/software_communities/lib/database_helper.rb
... ... @@ -34,12 +34,7 @@ class DatabaseHelper &lt; DynamicTableHelper
34 34  
35 35 def self.valid_list_database? list_databases
36 36 return false if list_databases.nil? or list_databases.length == 0
37   -
38   - list_databases.each do |database|
39   - return false unless database.valid?
40   - end
41   -
42   - true
  37 + return !list_databases.any?{|database| !database.valid?}
43 38 end
44 39  
45 40 def self.database_as_tables(list_databases, disabled=false)
... ... @@ -51,14 +46,10 @@ class DatabaseHelper &lt; DynamicTableHelper
51 46  
52 47 def self.database_html_structure(database_data, disabled)
53 48 database_id = database_data[:database_description_id]
54   - database_name = if database_data[:database_description_id].blank?
55   - ""
56   - else
57   - DatabaseDescription.find(
  49 + database_name = database_id.blank? ? "" : DatabaseDescription.find(
58 50 database_data[:database_description_id],
59 51 :select=>"name"
60 52 ).name
61   - end
62 53  
63 54 data = {
64 55 model_name: MODEL_NAME,
... ... @@ -83,4 +74,4 @@ class DatabaseHelper &lt; DynamicTableHelper
83 74 def self.add_dynamic_table
84 75 database_as_tables(nil).first.call
85 76 end
86   -end
87 77 \ No newline at end of file
  78 +end
... ...
src/noosfero-spb/software_communities/lib/ext/search_controller.rb
... ... @@ -105,6 +105,8 @@ class SearchController
105 105 communities_list.reverse!
106 106 elsif params[:sort] && params[:sort] == "relevance"
107 107 communities_list = sort_by_relevance(communities_list, params[:query]){ |community| [community.software_info.finality, community.name] }
  108 + elsif params[:sort] && params[:sort] == "rating"
  109 + communities_list = sort_by_average_rating(communities_list)
108 110 end
109 111 communities_list
110 112 end
... ...
src/noosfero-spb/software_communities/lib/ext/search_helper.rb
... ... @@ -30,4 +30,16 @@ module SearchHelper
30 30 list
31 31 end
32 32  
  33 + def sort_by_average_rating list
  34 + list.sort! do |a, b|
  35 + rating_a = OrganizationRating.average_rating(a.id)
  36 + rating_a = 0 if rating_a.nil?
  37 + rating_b = OrganizationRating.average_rating(b.id)
  38 + rating_b = 0 if rating_b.nil?
  39 + rating_a - rating_b
  40 + end
  41 +
  42 + list.reverse!
  43 + end
  44 +
33 45 end
... ...
src/noosfero-spb/software_communities/lib/library_helper.rb
... ... @@ -20,12 +20,7 @@ class LibraryHelper &lt; DynamicTableHelper
20 20  
21 21 def self.valid_list_library? list_libraries
22 22 return true if list_libraries.nil? or list_libraries.length == 0
23   -
24   - list_libraries.each do |library|
25   - return false unless library.valid?
26   - end
27   -
28   - true
  23 + return !list_libraries.any?{|library| !library.valid?}
29 24 end
30 25  
31 26 def self.libraries_as_tables list_libraries, disabled=false
... ... @@ -59,4 +54,4 @@ class LibraryHelper &lt; DynamicTableHelper
59 54 def self.add_dynamic_table
60 55 libraries_as_tables(nil).first.call
61 56 end
62   -end
63 57 \ No newline at end of file
  58 +end
... ...
src/noosfero-spb/software_communities/lib/license_helper.rb
1 1 module LicenseHelper
2   - def self.getListLicenses
3   - LicenseInfo.all
  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
4 8 end
5   -end
6 9 \ No newline at end of file
  10 +end
... ...
src/noosfero-spb/software_communities/lib/operating_system_helper.rb
... ... @@ -25,12 +25,8 @@ class OperatingSystemHelper &lt; DynamicTableHelper
25 25 end
26 26  
27 27 def self.valid_list_operating_system? list_operating_system
28   - return !(list_operating_system.nil? || list_operating_system.length == 0)
29   -
30   - list_operating_system.each do |operating_system|
31   - return false unless operating_system.valid?
32   - end
33   - true
  28 + return false if (list_operating_system.nil? || list_operating_system.length == 0)
  29 + return !list_operating_system.any?{|os| !os.valid?}
34 30 end
35 31  
36 32 def self.operating_system_as_tables(list_operating_system, disabled=false)
... ...
src/noosfero-spb/software_communities/lib/software_communities_plugin.rb
... ... @@ -17,9 +17,13 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin
17 17 _('Add Public Software and MPOG features.')
18 18 end
19 19  
  20 + def self.api_mount_points
  21 + [SoftwareCommunitiesPlugin::API]
  22 + end
  23 +
20 24 def profile_tabs
21   - if context.profile.community?
22   - return profile_tabs_software if context.profile.software?
  25 + if context.profile.community? && context.profile.software?
  26 + return profile_tabs_software
23 27 end
24 28 end
25 29  
... ... @@ -43,7 +47,8 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin
43 47 SoftwareHighlightsBlock => { :type => [Environment] },
44 48 SoftwareTabDataBlock => {:type => [Community], :position => 1},
45 49 WikiBlock => {:type => [Community]},
46   - StatisticBlock => { :type => [Community] }
  50 + StatisticBlock => { :type => [Community] },
  51 + SoftwareEventsBlock => { :type => [Community] }
47 52 }
48 53 end
49 54  
... ... @@ -102,7 +107,6 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin
102 107 is_admin ||= user_rating.organization.admins.include?(current_user.person)
103 108  
104 109 if is_admin and profile.software?
105   -
106 110 render :file => 'organization_ratings_extra_fields_show_data',
107 111 :locals => {:user_rating => user_rating}
108 112 end
... ...
src/noosfero-spb/software_communities/lib/software_communities_plugin/api.rb 0 → 100644
... ... @@ -0,0 +1,23 @@
  1 +require File.dirname(__FILE__) + '/../../../../../lib/noosfero/api/helpers'
  2 +require_relative 'api_entities'
  3 +
  4 +class SoftwareCommunitiesPlugin::API < Grape::API
  5 +
  6 + include Noosfero::API::APIHelpers
  7 +
  8 + resource :software_communities do
  9 + get do
  10 + authenticate!
  11 + softwares = select_filtered_collection_of(environment,'communities',params).joins(:software_info)
  12 + present softwares.map{|o|o.software_info}, :with => Entities::SoftwareInfo
  13 + end
  14 +
  15 + get ':id' do
  16 + authenticate!
  17 + software = SoftwareInfo.find_by_id(params[:id])
  18 + present software, :with => Entities::SoftwareInfo
  19 + end
  20 +
  21 + end
  22 +end
  23 +
... ...
src/noosfero-spb/software_communities/lib/software_communities_plugin/api_entities.rb 0 → 100644
... ... @@ -0,0 +1,10 @@
  1 +module Entities
  2 + class SoftwareInfo < Noosfero::API::Entity
  3 + root 'software_infos', 'software_info'
  4 + expose :id, :finality, :repository_link, :public_software, :acronym, :objectives,
  5 + :features,:license_info, :software_languages, :software_databases, :operating_system_names
  6 + expose :community_id do |software_info,options|
  7 + software_info.community.id
  8 + end
  9 + end
  10 +end
... ...
src/noosfero-spb/software_communities/lib/software_events_block.rb 0 → 100644
... ... @@ -0,0 +1,44 @@
  1 +class SoftwareEventsBlock < Block
  2 +
  3 + def self.description
  4 + _('Software community events')
  5 + end
  6 +
  7 + def help
  8 + _('This block displays the software community events in a list.')
  9 + end
  10 +
  11 + def content(args={})
  12 + block = self
  13 +
  14 + lambda do |object|
  15 + render(
  16 + :file => 'blocks/software_events',
  17 + :locals => { :block => block }
  18 + )
  19 + end
  20 + end
  21 +
  22 + def cacheable?
  23 + false
  24 + end
  25 +
  26 + def get_events
  27 + today = DateTime.now.beginning_of_day
  28 + self.owner.events.where("end_date >= ?", today).order(:start_date)
  29 + end
  30 +
  31 + def get_events_except event_slug=""
  32 + event_slug = "" if event_slug.nil?
  33 +
  34 + get_events.where("slug NOT IN (?)", event_slug)
  35 + end
  36 +
  37 + def has_events_to_display?
  38 + not get_events.empty?
  39 + end
  40 +
  41 + def should_display_title?
  42 + self.box.position != 1
  43 + end
  44 +end
... ...
src/noosfero-spb/software_communities/lib/software_helper.rb
... ... @@ -23,22 +23,6 @@ module SoftwareHelper
23 23 end
24 24  
25 25 def self.all_table_is_empty? table, ignored_fields=[]
26   - filled_fields = []
27   -
28   - table.each do |key, value|
29   - unless ignored_fields.include? key
30   - filled_fields << if value.empty?
31   - false
32   - else
33   - true
34   - end
35   - end
36   - end
37   -
38   - if filled_fields.include? true
39   - false
40   - else
41   - true
42   - end
  26 + return !table.keys.any?{|key| ignored_fields.include?(key) ? false : !table[key].empty?}
43 27 end
44 28 end
... ...
src/noosfero-spb/software_communities/lib/software_info.rb
... ... @@ -84,19 +84,19 @@ class SoftwareInfo &lt; ActiveRecord::Base
84 84 validates_length_of :finality, :maximum => 120
85 85 validates_length_of :objectives, :maximum => 4000
86 86 validates_length_of :features, :maximum => 4000
87   - validates_presence_of :finality
  87 + validates_presence_of :finality, :community
88 88  
89 89 validate :validate_acronym
90 90  
91 91 settings_items :another_license_version, :another_license_link
92 92  
93 93 # used on find_by_contents
94   - scope :like_search, lambda{ |name|
  94 + def self.like_search name
95 95 joins(:community).where(
96 96 "name ILIKE ? OR acronym ILIKE ? OR finality ILIKE ?",
97 97 "%#{name}%", "%#{name}%", "%#{name}%"
98 98 )
99   - }
  99 + end
100 100  
101 101 scope :search, lambda { |name="", database_description_id = "",
102 102 programming_language_id = "", operating_system_name_id = "",
... ... @@ -166,13 +166,16 @@ class SoftwareInfo &lt; ActiveRecord::Base
166 166 another_license_link = attributes.delete(:another_license_link)
167 167  
168 168 software_info = SoftwareInfo.new(attributes)
169   - if !environment.admins.include? requestor
  169 + unless environment.admins.include? requestor
170 170 CreateSoftware.create!(
171 171 attributes.merge(
172 172 :requestor => requestor,
173 173 :environment => environment,
174 174 :name => name,
175   - :license_info => license_info
  175 + :identifier => identifier,
  176 + :license_info => license_info,
  177 + :another_license_version => another_license_version,
  178 + :another_license_link => another_license_link
176 179 )
177 180 )
178 181 else
... ... @@ -189,15 +192,15 @@ class SoftwareInfo &lt; ActiveRecord::Base
189 192 community.template_id = software_template.id
190 193 end
191 194  
192   - software_info.license_info = license_info
193   - software_info.save
194   - community.software_info = software_info
195 195 community.save!
196 196 community.add_admin(requestor)
  197 +
  198 + software_info.community = community
  199 + software_info.license_info = license_info
  200 + software_info.verify_license_info(another_license_version, another_license_link)
  201 + software_info.save!
197 202 end
198 203  
199   - software_info.verify_license_info(another_license_version, another_license_link)
200   - software_info.save!
201 204 software_info
202 205 end
203 206  
... ...
src/noosfero-spb/software_communities/lib/software_language_helper.rb
... ... @@ -50,10 +50,9 @@ class SoftwareLanguageHelper &lt; DynamicTableHelper
50 50  
51 51 def self.language_html_structure(language_data, disabled)
52 52 language_id = language_data[:programming_language_id]
53   - language_name = if language_data[:programming_language_id].blank?
54   - ""
55   - else
56   - ProgrammingLanguage.find(
  53 + language_name = ""
  54 + unless language_data[:programming_language_id].blank?
  55 + language_name = ProgrammingLanguage.find(
57 56 language_data[:programming_language_id],
58 57 :select=>"name"
59 58 ).name
... ...
src/noosfero-spb/software_communities/public/style.css
... ... @@ -114,3 +114,6 @@
114 114 overflow: auto;
115 115 }
116 116  
  117 +.catalog_rating_block {
  118 + margin-top: 5px;
  119 +}
... ...
src/noosfero-spb/software_communities/public/vendor/jquery.maskedinput.min.js
1   -/*
2   - Masked Input plugin for jQuery
3   - Copyright (c) 2007-2013 Josh Bush (digitalbush.com)
4   - Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)
5   - Version: 1.3.1
6   -*/
7   -(function(e){function t(){var e=document.createElement("input"),t="onpaste";return e.setAttribute(t,""),"function"==typeof e[t]?"paste":"input"}var n,a=t()+".mask",r=navigator.userAgent,i=/iphone/i.test(r),o=/android/i.test(r);e.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn",placeholder:"_"},e.fn.extend({caret:function(e,t){var n;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof e?(t="number"==typeof t?t:e,this.each(function(){this.setSelectionRange?this.setSelectionRange(e,t):this.createTextRange&&(n=this.createTextRange(),n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",e),n.select())})):(this[0].setSelectionRange?(e=this[0].selectionStart,t=this[0].selectionEnd):document.selection&&document.selection.createRange&&(n=document.selection.createRange(),e=0-n.duplicate().moveStart("character",-1e5),t=e+n.text.length),{begin:e,end:t})},unmask:function(){return this.trigger("unmask")},mask:function(t,r){var c,l,s,u,f,h;return!t&&this.length>0?(c=e(this[0]),c.data(e.mask.dataName)()):(r=e.extend({placeholder:e.mask.placeholder,completed:null},r),l=e.mask.definitions,s=[],u=h=t.length,f=null,e.each(t.split(""),function(e,t){"?"==t?(h--,u=e):l[t]?(s.push(RegExp(l[t])),null===f&&(f=s.length-1)):s.push(null)}),this.trigger("unmask").each(function(){function c(e){for(;h>++e&&!s[e];);return e}function d(e){for(;--e>=0&&!s[e];);return e}function m(e,t){var n,a;if(!(0>e)){for(n=e,a=c(t);h>n;n++)if(s[n]){if(!(h>a&&s[n].test(R[a])))break;R[n]=R[a],R[a]=r.placeholder,a=c(a)}b(),x.caret(Math.max(f,e))}}function p(e){var t,n,a,i;for(t=e,n=r.placeholder;h>t;t++)if(s[t]){if(a=c(t),i=R[t],R[t]=n,!(h>a&&s[a].test(i)))break;n=i}}function g(e){var t,n,a,r=e.which;8===r||46===r||i&&127===r?(t=x.caret(),n=t.begin,a=t.end,0===a-n&&(n=46!==r?d(n):a=c(n-1),a=46===r?c(a):a),k(n,a),m(n,a-1),e.preventDefault()):27==r&&(x.val(S),x.caret(0,y()),e.preventDefault())}function v(t){var n,a,i,l=t.which,u=x.caret();t.ctrlKey||t.altKey||t.metaKey||32>l||l&&(0!==u.end-u.begin&&(k(u.begin,u.end),m(u.begin,u.end-1)),n=c(u.begin-1),h>n&&(a=String.fromCharCode(l),s[n].test(a)&&(p(n),R[n]=a,b(),i=c(n),o?setTimeout(e.proxy(e.fn.caret,x,i),0):x.caret(i),r.completed&&i>=h&&r.completed.call(x))),t.preventDefault())}function k(e,t){var n;for(n=e;t>n&&h>n;n++)s[n]&&(R[n]=r.placeholder)}function b(){x.val(R.join(""))}function y(e){var t,n,a=x.val(),i=-1;for(t=0,pos=0;h>t;t++)if(s[t]){for(R[t]=r.placeholder;pos++<a.length;)if(n=a.charAt(pos-1),s[t].test(n)){R[t]=n,i=t;break}if(pos>a.length)break}else R[t]===a.charAt(pos)&&t!==u&&(pos++,i=t);return e?b():u>i+1?(x.val(""),k(0,h)):(b(),x.val(x.val().substring(0,i+1))),u?t:f}var x=e(this),R=e.map(t.split(""),function(e){return"?"!=e?l[e]?r.placeholder:e:void 0}),S=x.val();x.data(e.mask.dataName,function(){return e.map(R,function(e,t){return s[t]&&e!=r.placeholder?e:null}).join("")}),x.attr("readonly")||x.one("unmask",function(){x.unbind(".mask").removeData(e.mask.dataName)}).bind("focus.mask",function(){clearTimeout(n);var e;S=x.val(),e=y(),n=setTimeout(function(){b(),e==t.length?x.caret(0,e):x.caret(e)},10)}).bind("blur.mask",function(){y(),x.val()!=S&&x.change()}).bind("keydown.mask",g).bind("keypress.mask",v).bind(a,function(){setTimeout(function(){var e=y(!0);x.caret(e),r.completed&&e==x.val().length&&r.completed.call(x)},0)}),y()}))}})})(jQuery);
8 1 \ No newline at end of file
  2 +// jQuery Mask Plugin v1.13.4
  3 +// github.com/igorescobar/jQuery-Mask-Plugin
  4 +(function(b){"function"===typeof define&&define.amd?define(["jquery"],b):"object"===typeof exports?module.exports=b(require("jquery")):b(jQuery||Zepto)})(function(b){var y=function(a,c,d){a=b(a);var g=this,k=a.val(),l;c="function"===typeof c?c(a.val(),void 0,a,d):c;var e={invalid:[],getCaret:function(){try{var q,b=0,e=a.get(0),f=document.selection,c=e.selectionStart;if(f&&-1===navigator.appVersion.indexOf("MSIE 10"))q=f.createRange(),q.moveStart("character",a.is("input")?-a.val().length:-a.text().length),
  5 +b=q.text.length;else if(c||"0"===c)b=c;return b}catch(d){}},setCaret:function(q){try{if(a.is(":focus")){var b,c=a.get(0);c.setSelectionRange?c.setSelectionRange(q,q):c.createTextRange&&(b=c.createTextRange(),b.collapse(!0),b.moveEnd("character",q),b.moveStart("character",q),b.select())}}catch(f){}},events:function(){a.on("input.mask keyup.mask",e.behaviour).on("paste.mask drop.mask",function(){setTimeout(function(){a.keydown().keyup()},100)}).on("change.mask",function(){a.data("changed",!0)}).on("blur.mask",
  6 +function(){k===a.val()||a.data("changed")||a.triggerHandler("change");a.data("changed",!1)}).on("blur.mask",function(){k=a.val()}).on("focus.mask",function(a){!0===d.selectOnFocus&&b(a.target).select()}).on("focusout.mask",function(){d.clearIfNotMatch&&!l.test(e.val())&&e.val("")})},getRegexMask:function(){for(var a=[],b,e,f,d,h=0;h<c.length;h++)(b=g.translation[c.charAt(h)])?(e=b.pattern.toString().replace(/.{1}$|^.{1}/g,""),f=b.optional,(b=b.recursive)?(a.push(c.charAt(h)),d={digit:c.charAt(h),
  7 +pattern:e}):a.push(f||b?e+"?":e)):a.push(c.charAt(h).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"));a=a.join("");d&&(a=a.replace(new RegExp("("+d.digit+"(.*"+d.digit+")?)"),"($1)?").replace(new RegExp(d.digit,"g"),d.pattern));return new RegExp(a)},destroyEvents:function(){a.off("input keydown keyup paste drop blur focusout ".split(" ").join(".mask "))},val:function(b){var c=a.is("input")?"val":"text";if(0<arguments.length){if(a[c]()!==b)a[c](b);c=a}else c=a[c]();return c},getMCharsBeforeCount:function(a,
  8 +b){for(var e=0,f=0,d=c.length;f<d&&f<a;f++)g.translation[c.charAt(f)]||(a=b?a+1:a,e++);return e},caretPos:function(a,b,d,f){return g.translation[c.charAt(Math.min(a-1,c.length-1))]?Math.min(a+d-b-f,d):e.caretPos(a+1,b,d,f)},behaviour:function(a){a=a||window.event;e.invalid=[];var c=a.keyCode||a.which;if(-1===b.inArray(c,g.byPassKeys)){var d=e.getCaret(),f=e.val().length,n=d<f,h=e.getMasked(),k=h.length,m=e.getMCharsBeforeCount(k-1)-e.getMCharsBeforeCount(f-1);e.val(h);!n||65===c&&a.ctrlKey||(8!==
  9 +c&&46!==c&&(d=e.caretPos(d,f,k,m)),e.setCaret(d));return e.callbacks(a)}},getMasked:function(a){var b=[],k=e.val(),f=0,n=c.length,h=0,l=k.length,m=1,p="push",u=-1,t,w;d.reverse?(p="unshift",m=-1,t=0,f=n-1,h=l-1,w=function(){return-1<f&&-1<h}):(t=n-1,w=function(){return f<n&&h<l});for(;w();){var x=c.charAt(f),v=k.charAt(h),r=g.translation[x];if(r)v.match(r.pattern)?(b[p](v),r.recursive&&(-1===u?u=f:f===t&&(f=u-m),t===u&&(f-=m)),f+=m):r.optional?(f+=m,h-=m):r.fallback?(b[p](r.fallback),f+=m,h-=m):e.invalid.push({p:h,
  10 +v:v,e:r.pattern}),h+=m;else{if(!a)b[p](x);v===x&&(h+=m);f+=m}}a=c.charAt(t);n!==l+1||g.translation[a]||b.push(a);return b.join("")},callbacks:function(b){var g=e.val(),l=g!==k,f=[g,b,a,d],n=function(a,b,c){"function"===typeof d[a]&&b&&d[a].apply(this,c)};n("onChange",!0===l,f);n("onKeyPress",!0===l,f);n("onComplete",g.length===c.length,f);n("onInvalid",0<e.invalid.length,[g,b,a,e.invalid,d])}};g.mask=c;g.options=d;g.remove=function(){var b=e.getCaret();e.destroyEvents();e.val(g.getCleanVal());e.setCaret(b-
  11 +e.getMCharsBeforeCount(b));return a};g.getCleanVal=function(){return e.getMasked(!0)};g.init=function(c){c=c||!1;d=d||{};g.byPassKeys=b.jMaskGlobals.byPassKeys;g.translation=b.jMaskGlobals.translation;g.translation=b.extend({},g.translation,d.translation);g=b.extend(!0,{},g,d);l=e.getRegexMask();!1===c?(d.placeholder&&a.attr("placeholder",d.placeholder),b("input").length&&!1==="oninput"in b("input")[0]&&"on"===a.attr("autocomplete")&&a.attr("autocomplete","off"),e.destroyEvents(),e.events(),c=e.getCaret(),
  12 +e.val(e.getMasked()),e.setCaret(c+e.getMCharsBeforeCount(c,!0))):(e.events(),e.val(e.getMasked()))};g.init(!a.is("input"))};b.maskWatchers={};var A=function(){var a=b(this),c={},d=a.attr("data-mask");a.attr("data-mask-reverse")&&(c.reverse=!0);a.attr("data-mask-clearifnotmatch")&&(c.clearIfNotMatch=!0);"true"===a.attr("data-mask-selectonfocus")&&(c.selectOnFocus=!0);if(z(a,d,c))return a.data("mask",new y(this,d,c))},z=function(a,c,d){d=d||{};var g=b(a).data("mask"),k=JSON.stringify;a=b(a).val()||
  13 +b(a).text();try{return"function"===typeof c&&(c=c(a)),"object"!==typeof g||k(g.options)!==k(d)||g.mask!==c}catch(l){}};b.fn.mask=function(a,c){c=c||{};var d=this.selector,g=b.jMaskGlobals,k=b.jMaskGlobals.watchInterval,l=function(){if(z(this,a,c))return b(this).data("mask",new y(this,a,c))};b(this).each(l);d&&""!==d&&g.watchInputs&&(clearInterval(b.maskWatchers[d]),b.maskWatchers[d]=setInterval(function(){b(document).find(d).each(l)},k));return this};b.fn.unmask=function(){clearInterval(b.maskWatchers[this.selector]);
  14 +delete b.maskWatchers[this.selector];return this.each(function(){var a=b(this).data("mask");a&&a.remove().removeData("mask")})};b.fn.cleanVal=function(){return this.data("mask").getCleanVal()};b.applyDataMask=function(a){a=a||b.jMaskGlobals.maskElements;(a instanceof b?a:b(a)).filter(b.jMaskGlobals.dataMaskAttr).each(A)};var p={maskElements:"input,td,span,div",dataMaskAttr:"*[data-mask]",dataMask:!0,watchInterval:300,watchInputs:!0,watchDataMask:!1,byPassKeys:[9,16,17,18,36,37,38,39,40,91],translation:{0:{pattern:/\d/},
  15 +9:{pattern:/\d/,optional:!0},"#":{pattern:/\d/,recursive:!0},A:{pattern:/[a-zA-Z0-9]/},S:{pattern:/[a-zA-Z]/}}};b.jMaskGlobals=b.jMaskGlobals||{};p=b.jMaskGlobals=b.extend(!0,{},p,b.jMaskGlobals);p.dataMask&&b.applyDataMask();setInterval(function(){b.jMaskGlobals.watchDataMask&&b.applyDataMask()},p.watchInterval)});
  16 +
... ...
src/noosfero-spb/software_communities/public/views/comments-software-extra-fields.js
... ... @@ -15,6 +15,24 @@ modulejs.define(&#39;CommentsSoftwareExtraFields&#39;, [&#39;jquery&#39;], function($) {
15 15 $(".comments-software-extra-fields div").hide();
16 16 }
17 17 });
  18 + var organization_rating_saved_value = $("#organization_rating_saved_value");
  19 + var organization_rating_people_benefited = $("#organization_rating_people_benefited");
  20 + var people_benefited_tmp = $("#people_benefited_tmp");
  21 + var saved_value_tmp = $("#saved_value_tmp");
  22 +
  23 + saved_value_tmp.mask("#.##0,00", {reverse: true});
  24 + people_benefited_tmp.mask("000.000.000", {reverse: true});
  25 +
  26 + organization_rating_saved_value.closest("form").submit(function( event ) {
  27 + var unformated_saved_value = saved_value_tmp.val();
  28 + unformated_saved_value = unformated_saved_value.split(".").join("");
  29 + unformated_saved_value = unformated_saved_value.replace(",",".");
  30 + organization_rating_saved_value.val(unformated_saved_value);
  31 +
  32 + var unformated_people_benefited = people_benefited_tmp.val();
  33 + unformated_people_benefited = unformated_people_benefited.split(".").join("");
  34 + organization_rating_people_benefited.val(unformated_people_benefited);
  35 + });
18 36 }
19 37  
20 38 return {
... ...
src/noosfero-spb/software_communities/test/functional/software_communities_plugin_myprofile_controller_test.rb
1   -require File.dirname(__FILE__) + '/../../../../test/test_helper'
2   -require File.dirname(__FILE__) + '/../helpers/software_test_helper'
3   -require(
4   - File.dirname(__FILE__) +
5   - '/../../controllers/software_communities_plugin_myprofile_controller'
  1 +require 'test_helper'
  2 +require_relative '../helpers/software_test_helper'
  3 +require_relative(
  4 + '../../controllers/software_communities_plugin_myprofile_controller'
6 5 )
7 6  
8 7 class SoftwareCommunitiesPluginMyprofileController; def rescue_action(e) raise e end;
... ... @@ -93,7 +92,11 @@ class SoftwareCommunitiesPluginMyprofileControllerTest &lt; ActionController::TestC
93 92 assert_equal SoftwareInfo.last.acronym, "test"
94 93 end
95 94  
96   - should 'upgrade a generic software to a public software' do
  95 + should 'only admin upgrade a generic software to a public software' do
  96 + admin_person = create_user('admin').person
  97 + @environment.add_admin(admin_person)
  98 +
  99 + login_as(admin_person.user_login)
97 100 fields_software = software_fields
98 101 fields = software_edit_specific_fields
99 102  
... ... @@ -103,15 +106,69 @@ class SoftwareCommunitiesPluginMyprofileControllerTest &lt; ActionController::TestC
103 106 post(
104 107 :edit_software,
105 108 :profile => software.community.identifier,
106   - :library => fields[0],
107   - :language => fields[1],
108   - :database => fields[2],
109 109 :operating_system => fields[3],
110 110 :software => fields[4],
111   - :license => fields[5]
112 111 )
113 112  
114   - assert_equal true, SoftwareInfo.last.public_software?
  113 + assert SoftwareInfo.last.public_software?
  114 + end
  115 +
  116 + should 'not upgrade a generic software to a public software if user is not an admin' do
  117 + fields_software = software_fields
  118 + fields = software_edit_specific_fields
  119 +
  120 + fields[4]['public_software'] = true
  121 + software = create_software fields_software
  122 +
  123 + post(
  124 + :edit_software,
  125 + :profile => software.community.identifier,
  126 + :software => fields[4]
  127 + )
  128 +
  129 + refute SoftwareInfo.last.public_software?
  130 + end
  131 +
  132 + ["e_ping","e_mag","icp_brasil","e_arq","intern"].map do |attr|
  133 + define_method "test_should_#{attr}_not_be_changed_by_not_admin" do
  134 + fields_software = software_fields
  135 + fields = software_edit_specific_fields
  136 +
  137 + fields[4][attr]=true
  138 +
  139 + software = create_software fields_software
  140 +
  141 + post(
  142 + :edit_software,
  143 + :profile => software.community.identifier,
  144 + :software => fields[4]
  145 + )
  146 +
  147 + refute SoftwareInfo.last.send(attr)
  148 + end
  149 + end
  150 +
  151 + ["e_ping","e_mag","icp_brasil","e_arq","intern"].map do |attr|
  152 + define_method "test_should_#{attr}_be_changed_by_admin" do
  153 + admin_person = create_user('admin').person
  154 + @environment.add_admin(admin_person)
  155 + login_as(admin_person.user_login)
  156 +
  157 + fields_software = software_fields
  158 + fields = software_edit_specific_fields
  159 +
  160 + fields[4][attr]=true
  161 +
  162 + software = create_software fields_software
  163 +
  164 + post(
  165 + :edit_software,
  166 + :profile => software.community.identifier,
  167 + :software => fields[4]
  168 + )
  169 +
  170 + assert SoftwareInfo.last.send(attr)
  171 + end
115 172 end
116 173  
117 174 should "create software_info with existing license_info" do
... ... @@ -146,9 +203,100 @@ class SoftwareCommunitiesPluginMyprofileControllerTest &lt; ActionController::TestC
146 203 :profile => @person.identifier
147 204 )
148 205  
149   - assert_equal SoftwareInfo.last.license_info_id, license_another.id
150   - assert_equal SoftwareInfo.last.license_info.id, nil
151   - assert_equal SoftwareInfo.last.license_info.version, another_license_version
152   - assert_equal SoftwareInfo.last.license_info.link, another_license_link
  206 + assert_equal license_another.id, SoftwareInfo.last.license_info_id
  207 + assert_equal nil, SoftwareInfo.last.license_info.id
  208 + assert_equal another_license_version, SoftwareInfo.last.license_info.version
  209 + assert_equal another_license_link, SoftwareInfo.last.license_info.link
  210 + end
  211 +
  212 + should "create software_info after finish task with 'Another' license_info" do
  213 + license_another = LicenseInfo.create(:version => "Another", :link => "#")
  214 +
  215 + another_license_version = "Different License"
  216 + another_license_link = "http://diferent.link"
  217 +
  218 + post(
  219 + :new_software,
  220 + :community => { :name => "New Software", :identifier => "new-software" },
  221 + :software_info => { :finality => "something", :repository_link => "" },
  222 + :license => { :license_infos_id => license_another.id,
  223 + :version => another_license_version,
  224 + :link=> another_license_link
  225 + },
  226 + :profile => @person.identifier
  227 + )
  228 +
  229 + @environment.add_admin(@person)
  230 + Task.last.send('finish', @person)
  231 +
  232 + assert_equal license_another.id, SoftwareInfo.last.license_info_id
  233 + assert_equal nil, SoftwareInfo.last.license_info.id
  234 + assert_equal another_license_version, SoftwareInfo.last.license_info.version
  235 + assert_equal another_license_link, SoftwareInfo.last.license_info.link
  236 + end
  237 +
  238 + should "show error messages on create software_info" do
  239 + post(
  240 + :new_software,
  241 + :community => {},
  242 + :software_info => {},
  243 + :license => {},
  244 + :profile => @person.identifier
  245 + )
  246 + assert_includes @response.body, "Domain can't be blank"
  247 + assert_includes @response.body, "Name can't be blank"
  248 + assert_includes @response.body, "Finality can't be blank"
  249 + assert_includes @response.body, "Version can't be blank"
153 250 end
  251 +
  252 + should "show domain not available error" do
  253 + @environment.add_admin(@person)
  254 +
  255 + post(
  256 + :new_software,
  257 + :community => {:name =>"New Software", :identifier => "new-software"},
  258 + :software_info => {:finality => "something", :repository_link => ""},
  259 + :license =>{:license_infos_id => LicenseInfo.last.id},
  260 + :profile => @person.identifier
  261 + )
  262 + post(
  263 + :new_software,
  264 + :community => {:name =>"New Software", :identifier => "new-software"},
  265 + :software_info => {:finality => "something", :repository_link => ""},
  266 + :license =>{:license_infos_id => LicenseInfo.last.id},
  267 + :profile => @person.identifier
  268 + )
  269 +
  270 + assert_includes @response.body, "Domain is not available"
  271 + end
  272 +
  273 + should "create software with admin moderation" do
  274 + @environment.enable('admin_must_approve_new_communities')
  275 +
  276 + post(
  277 + :new_software,
  278 + :community => {:name =>"New Software", :identifier => "new-software"},
  279 + :software_info => {:finality => "something", :repository_link => ""},
  280 + :license =>{:license_infos_id => LicenseInfo.last.id},
  281 + :profile => @person.identifier
  282 + )
  283 +
  284 + @environment.add_admin(@person)
  285 + Task.last.send('finish', @person)
  286 +
  287 + assert_equal "New Software", Task.last.data[:name]
  288 + assert_equal "New Software", SoftwareInfo.last.community.name
  289 + end
  290 +
  291 + should "dont create software without accept task" do
  292 + assert_no_difference 'SoftwareInfo.count' do
  293 + post(
  294 + :new_software,
  295 + :community => {:name =>"New Software", :identifier => "new-software"},
  296 + :software_info => {:finality => "something", :repository_link => ""},
  297 + :license =>{:license_infos_id => LicenseInfo.last.id},
  298 + :profile => @person.identifier
  299 + )
  300 + end
  301 + end
154 302 end
... ...
src/noosfero-spb/software_communities/test/unit/api_test.rb 0 → 100644
... ... @@ -0,0 +1,31 @@
  1 +require File.dirname(__FILE__) + '/../../../../test/unit/api/test_helper'
  2 +require File.dirname(__FILE__) + '/../helpers/plugin_test_helper'
  3 +
  4 +class SoftwareCommunitiesApiTest < ActiveSupport::TestCase
  5 +
  6 + include PluginTestHelper
  7 +
  8 + def setup
  9 + login_api
  10 + environment = Environment.default
  11 + environment.enable_plugin(SoftwareCommunitiesPlugin)
  12 + end
  13 +
  14 + should 'list all softwares' do
  15 + @software_info = create_software_info("software_test")
  16 + @software_info2 = create_software_info("software_test2")
  17 +
  18 + get "/api/v1/software_communities?#{params.to_query}"
  19 + json = JSON.parse(last_response.body)
  20 + assert_equivalent [@software_info.id, @software_info2.id], json['software_infos'].map {|c| c['id']}
  21 + end
  22 +
  23 + should 'get software by id' do
  24 + @software_info = create_software_info("software_test")
  25 + get "/api/v1/software_communities/#{@software_info.id}?#{params.to_query}"
  26 +
  27 + json = JSON.parse(last_response.body)
  28 + assert_equal @software_info.id, json["software_info"]["id"]
  29 + end
  30 +
  31 +end
... ...
src/noosfero-spb/software_communities/test/unit/software_events_block_test.rb 0 → 100644
... ... @@ -0,0 +1,63 @@
  1 +require File.dirname(__FILE__) + '/../../../../test/test_helper'
  2 +require File.dirname(__FILE__) + '/../helpers/plugin_test_helper'
  3 +
  4 +class SoftwareEventsBlockTest < ActiveSupport::TestCase
  5 + include PluginTestHelper
  6 +
  7 + def setup
  8 + @community = create_community("A new community")
  9 + @software_events_block = SoftwareEventsBlock.new
  10 +
  11 + box = Box.new
  12 + box.position = 1
  13 + box.owner = @community
  14 + box.blocks << @software_events_block
  15 + box.save!
  16 +
  17 + @e1 = Event.new :name=>"Event 1", :body=>"Event 1 body",
  18 + :start_date=>DateTime.now, :end_date=>(DateTime.now + 1.month)
  19 +
  20 + @e2 = Event.new :name=>"Event 2", :body=>"Event 2 body",
  21 + :start_date=>(DateTime.now - 10.days), :end_date=>(DateTime.now + 10.days)
  22 +
  23 + @e3 = Event.new :name=>"Event 3", :body=>"Event 3 body",
  24 + :start_date=>(DateTime.now - 20.days), :end_date=>(DateTime.now - 10.days)
  25 +
  26 + @community.events << @e1
  27 + @community.events << @e2
  28 + @community.events << @e3
  29 + @community.save!
  30 + end
  31 +
  32 + should "give community events that have not yet finished ordered by start date" do
  33 + events = @software_events_block.get_events
  34 +
  35 + assert_equal false, events.include?(@e3)
  36 + assert_equal @e2, events.first
  37 + assert_equal @e1, events.last
  38 + end
  39 +
  40 + should "give community events except by a event with a given slug" do
  41 + events = @software_events_block.get_events_except(@e1.slug)
  42 +
  43 + assert_equal false, events.include?(@e1)
  44 + end
  45 +
  46 + should "tell if there are events to be displayed" do
  47 + assert_equal true, @software_events_block.has_events_to_display?
  48 +
  49 + @community.events.update_all :start_date => (DateTime.now - 2.days),
  50 + :end_date => (DateTime.now - 1.day)
  51 +
  52 + assert_equal false, @software_events_block.has_events_to_display?
  53 + end
  54 +
  55 + should "tell that the block must show the title in other areas that are no the main area" do
  56 + assert_equal false, @software_events_block.should_display_title?
  57 +
  58 + @software_events_block.box.position = 3
  59 + @software_events_block.save!
  60 +
  61 + assert_equal true, @software_events_block.should_display_title?
  62 + end
  63 +end
... ...
src/noosfero-spb/software_communities/test/unit/software_info_validation_test.rb
... ... @@ -49,6 +49,7 @@ class SoftwareInfoValidationTest &lt; ActiveSupport::TestCase
49 49  
50 50 @software_info.features = "Do a lot of things"
51 51 @software_info.objectives = "All tests should pass !"
  52 + @software_info.community = @community
52 53 end
53 54  
54 55 def teardown
... ...
src/noosfero-spb/software_communities/views/_main_software_editor_extras.html.erb
... ... @@ -1,32 +0,0 @@
1   -<h2><%= _('Software Information') %></h2>
2   -
3   -<%= label_tag("name", _('Name'), {:class => 'formlabel'}) %>
4   -
5   -<div id='software-name-field' class='formfield'>
6   - <span id='software-hostname'><%= context.profile.environment.default_hostname %>/</span>
7   - <%= text_field_tag(:name, context.profile.software_info.community.name) %>
8   -</div>
9   -
10   -<h3> <%= _("Finality") %> </h3>
11   -<div id="finality">
12   - <%= text_field_tag(:finality, context.profile.software_info.finality) %>
13   -</div>
14   -
15   -<h3> <%= _("Licenses") %> </h3>
16   -<div id='licenses'>
17   - <%= select_tag(:id, options_for_select(LicenseHelper.getListLicenses.collect{|l| [l.version, l.id]}, :selected => context.profile.software_info.license_info.id), :onchange => "get_license_link('version')") %>
18   - <br />
19   -
20   - <h4> <%= _("License link") %> </h4>
21   - <% LicenseHelper.getListLicenses.each do | license | %>
22   - <input type="hidden" id = "version_<%=license.id %>" value = "<%=license.link%>">
23   - <% end %>
24   -
25   - <a id = "version_link" href="<%= context.profile.software_info.license_info.link %>" target="BLANK"> <%= context.profile.software_info.license_info.link %> </a>
26   -</div>
27   -
28   -<div class="formfieldline formfield type-text">
29   - <%= label_tag "repository_url", _("Link to Repository: ") %>
30   - <%= text_field_tag(:reository_url) %>
31   -</div>
32   -
src/noosfero-spb/software_communities/views/blocks/_software_events_list_item.html.erb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +<div class="software-events-list-item-calendar"></div>
  2 +
  3 +<span class="software-events-list-item-date">
  4 + <%= event.start_date.strftime "%d/%m - " %>
  5 +</span>
  6 +
  7 +<span class="software-events-list-item-title">
  8 + <%= link_to event.title, event.url %>
  9 +</span>
... ...
src/noosfero-spb/software_communities/views/blocks/software_events.html.erb 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +<div class="software-community-events-block">
  2 + <% if block.has_events_to_display? %>
  3 + <ul class="software-community-events-list">
  4 +
  5 + <% if block.should_display_title? %>
  6 + <li class="software-events-list-item">
  7 + <span class="software-events-list-item-title">
  8 + <%= block.title %>
  9 + </span>
  10 + </li>
  11 + <% end %>
  12 +
  13 + <% block.get_events_except(params[:page]).each do |event| %>
  14 + <li class="software-events-list-item">
  15 + <%= render :partial=>"blocks/software_events_list_item",
  16 + :locals => {:event => event} %>
  17 + </li>
  18 + <% end %>
  19 +
  20 + </ul>
  21 + <% end %>
  22 +</div>
... ...
src/noosfero-spb/software_communities/views/comments_extra_fields.html.erb
... ... @@ -7,7 +7,6 @@
7 7 </div>
8 8  
9 9 <div class="comments-software-extra-fields">
10   -
11 10 <div class="extra-fields-container">
12 11 <div class="comments-software-people-benefited">
13 12 <%= label_tag "comments_people_benefited", _("Number of Beneficiaries")%>
... ...
src/noosfero-spb/software_communities/views/organization_ratings_extra_fields_show_data.html.erb
1 1 <div class="aditional-informations">
2 2 <div class="comments-people-benefited">
3   - <span><%=_("Benefited People")%> :</span> <%= user_rating.people_benefited unless user_rating.nil? %>
  3 + <span><%=_("Benefited People")%>:</span> <%= number_with_delimiter(user_rating.people_benefited, :separator => environment.currency_separator, :delimiter => environment.currency_delimiter) unless user_rating.nil? %>
4 4 </div>
5 5  
6 6 <div class="comments-saved-value">
7   - <span><%=_("Saved Resources")%> :</span> <%= user_rating.saved_value unless user_rating.nil? %>
  7 + <span><%=_("Saved Resources")%>:</span> <%= float_to_currency(user_rating.saved_value) unless user_rating.nil? %>
8 8 </div>
9 9 </div>
10 10  
... ...
src/noosfero-spb/software_communities/views/search/_full_community.html.erb
1 1 <% software = community.software_info %>
2 2 <li class="search-software-item">
  3 + <% organization_average_rating = '' %>
  4 + <% unless community.organization_ratings.empty?%>
  5 + <% organization_average_rating = render :partial => 'shared/organization_average_rating_block', :locals => {:community => community}%>
  6 + <% end %>
  7 +
  8 + <% software_publish_date = render :partial => 'shared/software_publish_date', :locals => {:community => community, :order => @order} %>
  9 +
3 10 <div class="search-software-item-column-left">
4   - <%= profile_image_link community, :portrait, 'div', community.send(@order + '_label') + show_date(community.created_at) %>
  11 + <%= profile_image_link community, :portrait, 'div', organization_average_rating + software_publish_date %>
5 12 </div>
6 13  
7 14 <div class="search-software-item-column-right">
... ...
src/noosfero-spb/software_communities/views/search/_software_search_form.html.erb
... ... @@ -51,7 +51,8 @@
51 51 [
52 52 [_("Name A-Z"), 'asc'],
53 53 [_("Name Z-A"), 'desc'],
54   - [_("Relevance"), 'relevance']
  54 + [_("Relevance"), 'relevance'],
  55 + [_("Favorites"), 'rating']
55 56 ], :selected=>params[:sort])
56 57 ) %>
57 58 </div>
... ...
src/noosfero-spb/software_communities/views/shared/_organization_average_rating_block.html.erb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +<div class="star-container catalog_rating_block">
  2 + <% (1..5).each do |rate_number| %>
  3 + <% if rate_number <= OrganizationRating.average_rating(community.id) %>
  4 + <div class="medium-star-positive"></div>
  5 + <% else %>
  6 + <div class="medium-star-negative"></div>
  7 + <% end %>
  8 + <% end %>
  9 +</div>
... ...
src/noosfero-spb/software_communities/views/shared/_software_publish_date.html.erb 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +<span class="software-date">
  2 + <div class="software-date-label"><%= community.send(order + '_label') %></div>
  3 + <div class="software-date-value"><%= show_date(community.created_at) %></div>
  4 +</span>
  5 +
... ...
src/noosfero-spb/software_communities/views/software_communities_plugin_myprofile/_license_info_fields.html.erb
1   -<% LicenseHelper.getListLicenses.each do | license | %>
2   - <input type="hidden" id = "version_<%=license.id %>" value = "<%=license.link%>">
3   -<% end %>
4   -
5 1 <%= text_field_tag "license_info[version]", license_version, :id=>"license_info_version", :class=>"license_info_version", :placeholder=>_('Autocomplete field, type some license') %>
6 2 <%= hidden_field_tag "license[license_infos_id]", license_id, :id=>"license_info_id", :class=>"license_info_id", :data => {:label=>license_version} %>
7 3  
... ...
src/noosfero-spb/software_communities/views/software_communities_plugin_myprofile/_main_software_editor_extras.html.erb
... ... @@ -5,7 +5,7 @@
5 5 </div>
6 6  
7 7 <div class= <%= @error_software_acronym %> >
8   - <%= label_tag("software[acronym]", _('Short Name'), {:class => 'formlabel mandatory'}) %>
  8 + <%= label_tag("software[acronym]", _('Short Name'), {:class => 'formlabel'}) %>
9 9 <%= text_field_tag("software[acronym]", @profile.software_info.acronym, :id => 'software_acronym_id', :maxlength=>"10") %>
10 10 </div>
11 11  
... ...
src/noosfero-spb/software_communities/views/software_communities_plugin_myprofile/_public_software_info.html.erb
1 1 <div id = "public_software">
2   - <% if @disabled_public_software_field == true %>
3   - <%= check_box_tag("software[public_software]", "true", @software_info.public_software?, :disabled => "disabled") %>
4   - <%= label_tag _("Public Software"), _("Public software"), :class => "public_software_disabled" %>
5   - <% else %>
6   - <%= check_box_tag("software[public_software]", "true", @software_info.public_software?) %>
7   - <%= label_tag _("Public Software"), _("Public software"), :class => "public_software_enabled" %>
8   - <% end %>
  2 + <%= check_box_tag("software[public_software]", "true", @software_info.public_software?, :disabled => @non_admin_status) %>
  3 + <%= label_tag _("Public Software"), _("Public software") %>
9 4 <div class="public-software-fields">
10 5 <h4> <%= _("Public Software") %> </h4>
11 6 <div class="formfieldline">
12 7 <%= label_tag _("Adherent to e-PING ?") %>
13 8  
14 9 <%= label_tag "e_ping_true", "Yes" %>
15   - <%= radio_button_tag("software[e_ping]", true, @software_info.e_ping)%>
  10 + <%= radio_button_tag("software[e_ping]", true, @software_info.e_ping, :disabled => @non_admin_status) %>
16 11 <%= label_tag "e_ping_false", "No"%>
17   - <%= radio_button_tag("software[e_ping]", false, !@software_info.e_ping)%>
  12 + <%= radio_button_tag("software[e_ping]", false, !@software_info.e_ping, :disabled => @non_admin_status) %>
18 13 </div>
19 14  
20 15 <div class="formfieldline">
21 16 <%= label_tag _("Adherent to e-MAG ?") %>
22 17  
23 18 <%= label_tag "e_mag_true", "Yes"%>
24   - <%= radio_button_tag("software[e_mag]", true, @software_info.e_mag)%>
  19 + <%= radio_button_tag("software[e_mag]", true, @software_info.e_mag, :disabled => @non_admin_status) %>
25 20 <%= label_tag "e_mag_false", "No"%>
26   - <%= radio_button_tag("software[e_mag]", false, !@software_info.e_mag)%>
  21 + <%= radio_button_tag("software[e_mag]", false, !@software_info.e_mag, :disabled => @non_admin_status) %>
27 22 </div>
28 23  
29 24 <div class="formfieldline">
30 25 <%= label_tag _("Adherent to ICP-Brasil ?") %>
31 26  
32 27 <%= label_tag "icp_brasil_true", "Yes"%>
33   - <%= radio_button_tag("software[icp_brasil]", true, @software_info.icp_brasil)%>
  28 + <%= radio_button_tag("software[icp_brasil]", true, @software_info.icp_brasil, :disabled => @non_admin_status) %>
34 29 <%= label_tag "icp_brasil_false", "No"%>
35   - <%= radio_button_tag("software[icp_brasil]", false, !@software_info.icp_brasil)%>
  30 + <%= radio_button_tag("software[icp_brasil]", false, !@software_info.icp_brasil, :disabled => @non_admin_status) %>
36 31 </div>
37 32  
38 33 <div class="formfieldline">
39 34 <%= label_tag _("Adherent to e-ARQ ?") %>
40 35  
41 36 <%= label_tag "e_arq_true", "Yes"%>
42   - <%= radio_button_tag("software[e_arq]", true, @software_info.e_arq)%>
  37 + <%= radio_button_tag("software[e_arq]", true, @software_info.e_arq, :disabled => @non_admin_status) %>
43 38 <%= label_tag "e_arq_false", "No"%>
44   - <%= radio_button_tag("software[e_arq]", false, !@software_info.e_arq)%>
  39 + <%= radio_button_tag("software[e_arq]", false, !@software_info.e_arq, :disabled => @non_admin_status) %>
45 40 </div>
46 41  
47 42 <div class="formfieldline">
48 43 <%= label_tag _("Internacionalizable ?") %>
49 44  
50 45 <%= label_tag "intern_true", "Yes" %>
51   - <%= radio_button_tag("software[intern]", true, @software_info.intern)%>
  46 + <%= radio_button_tag("software[intern]", true, @software_info.intern, :disabled => @non_admin_status) %>
52 47 <%= label_tag "intern_false", "No"%>
53   - <%= radio_button_tag("software[intern]", false, !@software_info.intern)%>
  48 + <%= radio_button_tag("software[intern]", false, !@software_info.intern, :disabled => @non_admin_status) %>
54 49 </div>
55 50 </div>
56 51 </div>
... ...
src/noosfero-spb/spb_migrations/db/migrate/20151106172419_remove_softwares_without_community.rb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +class RemoveSoftwaresWithoutCommunity < ActiveRecord::Migration
  2 + def up
  3 + execute('DELETE FROM software_infos where community_id NOT IN (SELECT id FROM profiles)')
  4 + end
  5 +
  6 + def down
  7 + say "This migration can't be reverted!"
  8 + end
  9 +end
... ...
src/pkg-rpm/.gitignore
1 1 /.obs
2 2 /.config.mk
  3 +*/*.tar.*
  4 +/.virtualenv
... ...
src/pkg-rpm/Makefile
1 1 OBSPROJECT = isv:spb:devel
2 2 COPR_PROJECT = softwarepublico/v5
3   -LOCAL_BUILD_DIR = $(PWD)/build
  3 +LOCAL_BUILD_DIR = $(CURDIR)/build
4 4  
5 5 # Vagrant environment does not accept links from/to shared folder
6   -ifeq "$(PWD)" "/vagrant"
  6 +ifeq "/vagrant" "$(shell ls -1d /vagrant 2>/dev/null)"
7 7 LOCAL_BUILD_DIR = /home/vagrant/rpmbuild
8 8 endif
9 9  
... ... @@ -57,7 +57,7 @@ checkout_packages_obs = $(patsubst %, %-checkout-obs, $(packages))
57 57 upload_packages_obs = $(patsubst %, %-upload-obs, $(packages))
58 58 diff_packages_obs = $(patsubst %, %-diff-obs, $(packages))
59 59  
60   -.PHONY: $(build_packages) $(checkout_packages_obs) $(upload_packages_obs) $(diff_packages_obs)
  60 +.PHONY: $(build_packages) $(checkout_packages_obs) $(upload_packages_obs) $(diff_packages_obs) copr-cli
61 61  
62 62 ### Targets
63 63  
... ... @@ -76,8 +76,14 @@ $(build_src_packages): %-build-src : %
76 76 rm -f $(LOCAL_BUILD_DIR)/SRPMS/$*-*.src.rpm
77 77 cd $* && $(BUILD_PREFIX) rpmbuild --define "_topdir $(LOCAL_BUILD_DIR)" -bs $*.spec --nodeps
78 78  
79   -$(upload_packages): %-upload : %-build-src %
80   - copr-cli build $(COPR_PROJECT) $(LOCAL_BUILD_DIR)/SRPMS/$*-*.src.rpm --nowait
  79 +$(upload_packages): %-upload : %-build-src % copr-cli
  80 + .virtualenv/bin/copr-cli build $(COPR_PROJECT) $(LOCAL_BUILD_DIR)/SRPMS/$*-*.src.rpm --nowait
  81 +
  82 +copr-cli: .virtualenv/bin/copr-cli
  83 +
  84 +.virtualenv/bin/copr-cli:
  85 + virtualenv .virtualenv
  86 + .virtualenv/bin/pip install copr-cli
81 87  
82 88 ### OBS targets (deprecated)
83 89  
... ... @@ -102,3 +108,8 @@ diff-obs: $(diff_packages_obs)
102 108  
103 109 status-obs st-obs:
104 110 @$(MAKE) diff | diffstat -C
  111 +
  112 +clean:
  113 + rm -rf */*.tar.*
  114 + rm -rf build/
  115 + rm -rf .virtualenv/
... ...
src/pkg-rpm/colab-deps/colab-deps.spec
1 1 Summary: Collaboration platform for communities (Python dependencies)
2 2 Name: colab-deps
3   -Version: 1.11.3
4   -Release: 25.1
  3 +Version: 1.11.6
  4 +Release: 1
5 5 Source0: colab-deps-%{version}.tar.gz
6 6 License: Various
7 7 Group: Development/Tools
... ...
src/pkg-rpm/colab-spb-plugin/colab-spb-plugin.spec 0 → 100644
... ... @@ -0,0 +1,45 @@
  1 +Name: colab-spb-plugin
  2 +Version: 5.0a0
  3 +Release: 1
  4 +Summary: SPB-specific Colab plugin
  5 +License: GPL-3.0
  6 +Group: Applications/Publishing
  7 +Url: https://softwarepublico.gov.br/gitlab/softwarepublico/softwarepublico
  8 +Source0: %{name}-%{version}.tar.gz
  9 +Requires: colab >= 1.11
  10 +BuildArch: noarch
  11 +BuildRequires: colab, colab-deps >= 1.11.4, python-virtualenv
  12 +
  13 +%description
  14 +This package contains Colab plugin for the Software Público Brasileiro platform.
  15 +
  16 +%prep
  17 +%setup -q
  18 +
  19 +%build
  20 +# install colab and colab-des into virtualenv
  21 +rm -rf virtualenv
  22 +cp -r /usr/lib/colab virtualenv
  23 +PATH=$(pwd)/virtualenv/bin:$PATH pip install --use-wheel --no-index .
  24 +virtualenv --relocatable virtualenv
  25 +
  26 +rpm -ql colab-deps colab | sed '/^\/usr\/lib\/colab\// !d; s#/usr/lib/colab/##' > cleanup.list
  27 +while read f; do
  28 + if [ -f "virtualenv/$f" ]; then
  29 + rm -f "virtualenv/$f"
  30 + fi
  31 +done < cleanup.list
  32 +rm -f cleanup.list
  33 +find virtualenv -type d -empty -delete
  34 +rm -rf virtualenv/bin
  35 +rm -rf virtualenv/include
  36 +
  37 +%install
  38 +
  39 +install -d -m 0755 %{buildroot}/usr/lib
  40 +rm -rf %{buildroot}/usr/lib/colab
  41 +cp -r virtualenv %{buildroot}/usr/lib/colab
  42 +
  43 +%files
  44 +%defattr(-,root,root)
  45 +/usr/lib/colab
... ...
src/pkg-rpm/colab-spb-theme/colab-spb-theme.spec
1 1  
2 2 Name: colab-spb-theme
3   -Version: 0.2.0
  3 +Version: 5.0a0
4 4 Release: 9.1
5 5 Summary: SPB-specific Colab theme
6 6 License: GPL-3.0
... ...
src/pkg-rpm/colab/colab.spec
1 1 %define name colab
2   -%define version 1.11.3
3   -%define default_release 0
4   -%{!?release: %define release %{default_release}}
  2 +%define version 1.11.4
5 3 %define buildvenv /var/tmp/%{name}-%{version}
6 4  
7 5 Summary: Collaboration platform for communities
8 6 Name: %{name}
9 7 Version: %{version}
10   -Release: 19
  8 +Release: 1
11 9 Source0: %{name}-%{version}.tar.gz
12 10 License: GPLv2
13 11 Group: Development/Tools
... ... @@ -16,9 +14,9 @@ Prefix: %{_prefix}
16 14 Vendor: Sergio Oliveira <sergio@tracy.com.br>
17 15 Url: https://github.com/colab/colab
18 16 BuildArch: noarch
19   -BuildRequires: colab-deps >= 1.11.3, python-virtualenv
  17 +BuildRequires: colab-deps >= 1.11.6, python-virtualenv
20 18 # FIXME colab should not depend on nginx!
21   -Requires: colab-deps >= 1.11.3, solr, mailman-api >= 0.3rc3, nginx
  19 +Requires: colab-deps >= 1.11.6, solr, mailman-api >= 0.3rc3, nginx
22 20  
23 21 %description
24 22 Integrated software development platform.
... ... @@ -227,6 +225,10 @@ if [ $1 -gt 1 ]; then
227 225 systemctl try-restart colab
228 226 fi
229 227  
  228 +colab-admin build_solr_schema > /var/tmp/schema.xml
  229 +mv -f /var/tmp/schema.xml /usr/share/solr/example/solr/collection1/conf/schema.xml
  230 +systemctl restart solr
  231 +
230 232 systemctl daemon-reload
231 233  
232 234 %preun
... ...
src/pkg-rpm/kalibro-configurations-deps/kalibro-configurations-deps.spec
1 1 Name: kalibro-configurations-deps
2 2 Version: 1.0
  3 +Release: 0
3 4 Summary: Ruby dependencies for kalibro-configurations
4 5 Group: Development/Tools
5 6 License: Various
... ...
src/pkg-rpm/prezento-spb-deps/prezento-spb-deps.spec
1 1 Name: prezento-spb-deps
2 2 Version: 0.8.3.colab
  3 +Release: 1
3 4 Summary: Ruby dependencies for prezento
4 5 Group: Development/Tools
5 6 License: Various
... ...
test/colab_test.sh
... ... @@ -5,7 +5,7 @@ test_database_connectivity() {
5 5 }
6 6  
7 7 test_colab_config_is_in_place() {
8   - assertTrue 'colab settings.yml is in place' 'run_on integration test -f /etc/colab/settings.yaml'
  8 + assertTrue 'colab settings.py is in place' 'run_on integration test -f /etc/colab/settings.py'
9 9 }
10 10  
11 11 test_colab_running() {
... ...